← 기사 목록
日本語https://zenn.dev/topics/llm/feed

OllamaでローカルLLMを動かす:MacのGPUを使ってQwen3.5・Gemma4・Phi-4 Miniを動かすまでの手順

추출된 키워드

43
ローカルLLM·5Mac·5Ollama·5qwen3.5:4b·4phi4-mini:3.8b·4gemma4:e4b·4Metal GPU加速·4Phi-4 Mini·4Apple Silicon·4GPU·4Qwen3.5·4Gemma4·4gemma4:27b·3RAG·3OllamaEmbeddings·3ChatOllama·3langchain-ollama·3ollamaパッケージ·3openaiライブラリ·3統合メモリアーキテクチャ·3Thinking Mode·3qwen3.5:9b·3OpenAI SDK·3OpenAI互換API·3Homebrew·3LangChain·3Python·3Rosetta·2macOS 14 Sonoma·2GGUF形式·2CUDA環境·2ベクトルストア·2ChromaDB·2nomic-embed-text·2LCEL·2GPT-4o·2Claude Sonnet·2llama.cpp·2Activity Monitor·2MoE·2LM Studio·2Jan·2Text Generation WebUI·2

원문

15,808
OllamaでローカルLLMを動かす:MacのGPUを使ってQwen3.5・Gemma4・Phi-4 Miniを動かすまでの手順

OllamaでローカルLLMを動かす:MacのGPUを使ってQwen3.5・Gemma4・Phi-4 Miniを動かすまでの手順

クラウドのLLM APIを使うたびにコストが気になる。プロトタイプ段階で外部サーバにデータを送りたくない。社内の機密資料を使って試したいが、APIに流すのは避けたい——こうした場面でローカルLLMが選択肢になります。

問題は「ローカルで動かす」と聞いたとき、環境構築の複雑さを想像して手が止まることです。CUDA環境の構築、Pythonの依存関係、GGUF形式の変換——こういったことが連想されれば、試す前に諦めたくなります。

Ollamaはその複雑さを一切省略しています。インストールからモデルのダウンロード・実行まで、コマンド3本で完結します。特にApple Silicon(M1〜M4)のMacでは、Metal GPU加速が自動で有効になります。設定ファイルの変更もドライバのインストールも不要です。

本記事では、HomebrewでのインストールからGPU使用状況の確認、Python・LangChainからの呼び出し、よくあるトラブルへの対処まで、実際に動くコマンドとコードで手順を整理します。

ローカルLLMを使う理由と、OllamaがMacで最も簡単な理由

ローカルLLMを選ぶ理由は大きく3つに分類されます。

コスト:GPT-4oやClaude Sonnetは入力・出力トークン単価が発生します。プロトタイプ段階で大量に呼び出す場合、月のAPI費用が予算を圧迫します。ローカルモデルは初期のダウンロード以外にランニングコストがありません。

プライバシー:顧客データ・社内文書・個人情報を含むテキストをクラウドAPIに送ることには法的・規約上のリスクが伴います。ローカルLLMはネットワークに出ないため、データが外部サーバに送られることがありません。

オフライン実行:インターネット接続なしで動作するため、出張先・機内・セキュアな開発環境でも使えます。

OllamaがMacで最も簡単な理由

ローカルLLMのランタイムには llama.cpp、LM Studio、Jan、Text Generation WebUI など複数の選択肢があります。Ollamaが特に開発者向けに優れている理由は以下の3点です。

  • セットアップの簡潔さ:Homebrew 1コマンドでインストールが完了します。CUDA環境の構築やGGUF変換は不要です
  • OpenAI互換APIの内蔵
    http://localhost:11434/v1
    でOpenAI SDK互換のHTTPエンドポイントが立ち上がります。既存のOpenAI実装を最小限の変更でローカルに差し替えられます
  • Apple Silicon最適化:M1〜M4チップのMetal GPU加速(統合メモリアーキテクチャ)が自動で使われます。追加設定は不要です

インストール手順(Homebrew)

macOS 14 Sonoma 以降が必要です。Homebrewがインストール済みであれば、以下の手順で完了します。

# Homebrewでインストール
brew install ollama

# インストール確認
ollama --version
# -> ollama version 0.x.x

brew install ollama
はコマンドラインツールをインストールします。GUIのメニューバーアプリが必要な場合は
brew install --cask ollama
を使います。ただし、Python・LangChainから呼び出すだけであればCLI版で十分です。

インストール後、Ollamaのサーバプロセスを起動します。

ollama serve

macOSのデスクトップアプリ版(Cask版)を使っている場合は自動起動されますが、CLI版は明示的に起動が必要です。起動済みの場合は

address already in use
エラーが出ます(正常な状態です)。

モデルの選び方と起動コマンド

Ollamaのモデルライブラリ(ollama.com/library)には数百のモデルが登録されています。実務での用途とMacのRAM容量を基準に選ぶのが合理的です。

代表的な3モデルの比較

モデルパラメータ数ダウンロードサイズ必要RAM目安特徴
qwen3.5:4b
4B約3.4GB8GB以上推奨日本語・マルチモーダル対応(テキスト・画像)。256Kコンテキスト。Thinking Mode対応
gemma4:e4b
4B相当約3.0GB8GB以上推奨Google製マルチモーダルモデル。128Kコンテキスト。Thinking Mode対応
phi4-mini:3.8b
3.8B約2.5GB8GB以上推奨Microsoft製高効率モデル。英語・コーディングタスクで高いパフォーマンス
qwen3.5:9b
9B約6.0GB16GB以上推奨4Bより性能向上。RAGや長文生成に向く
gemma4:27b
27B (MoE)約17GB32GB以上推奨高い汎用性。マルチモーダルを活かしたい場合に有力

RAMとモデルサイズの関係:Apple Siliconの統合メモリアーキテクチャではCPUとGPUがメモリを共有します。8GBモデルのMacなら3〜4GBのモデルが実用速度で動きます。16GBなら9B前後、32GB以上なら27B(MoE含む)も快適に扱えます。

モデルのダウンロードと起動

# Qwen3.5:4bをダウンロード(約3.4GB)
ollama pull qwen3.5:4b

# ダウンロード済みモデルの確認
ollama list

# 対話モードで起動
ollama run qwen3.5:4b
# >>> こんにちは
# こんにちは!何かお手伝いできることはありますか?
# >>> /bye で終了

Gemma4とPhi-4 Miniも同じ手順です。

ollama pull gemma4:e4b
ollama pull phi4-mini:3.8b

# 対話モードで起動
ollama run gemma4:e4b
ollama run phi4-mini:3.8b

Qwen3.5のThinking Mode:Qwen3.5は

/think
/no_think
コマンドで推論の詳細表示を切り替えられます。複雑な推論タスクでは
/think
を使うことで、モデルが内部でどのように考えているかを確認できます。Gemma4も同様にThinking Modeに対応しています。
ollama run qwen3.5:4b
>>> /think
>>> このコードのバグを探してください:[コードを貼り付け]

GPU使用状況の確認方法

Apple SiliconのMacでは、Ollamaはデフォルトでメタルフレームワーク(Metal GPU)を使います。ただし「実際にGPUが使われているか」を確認しておくことは重要です。モデルサイズがRAMに収まらない場合はCPUフォールバックが発生し、速度が大幅に低下します。

方法1:ollama ps コマンド

最も直接的な確認方法です。モデルを起動した状態で別のターミナルから実行します。

ollama ps
# NAME          ID              SIZE    PROCESSOR    UNTIL
# qwen3.5:4b      a3b5c1d2e3f4    3.4 GB  100% GPU     4 minutes from now

PROCESSOR
列の見方:
表示意味
100% GPU
MetalでGPU推論している(正常)
100% CPU
GPUが使われていない(要確認)
89% GPU, 11% CPU
モデルの一部がRAMに乗らずCPUに分散している

方法2:Activity Monitor

アクティビティモニタ(

Cmd + Space
→ "Activity Monitor" で起動)を開き、「ウインドウ」メニューから「GPU使用率」を選択します。Ollamaで推論リクエストを実行した際にGPU使用率が上昇していれば、Metalが有効です。

方法3:デバッグログで確認

Ollamaの起動ログにGPU検出情報が出力されます。

OLLAMA_DEBUG=1 ollama serve 2>&1 | grep -i "gpu\|metal\|discovering"
# -> discovering available GPUs...
# -> METAL GPU detected: Apple M2 Pro (19-core, 16384 MB)

METAL GPU detected
の行が出ていれば、GPUが認識されています。

OpenAI互換APIとして使う(Pythonコード)

Ollamaはサーバ起動時に

http://localhost:11434/v1
でOpenAI互換のREST APIを提供します。これの利点は「既存のOpenAI SDKコードをほぼそのままローカルに差し替えられる」点です。

openaiライブラリでOllamaを叩く

pip install openai
from openai import OpenAI

# OllamaのローカルエンドポイントをベースURLに指定
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # 任意の文字列でよい(ローカル認証は不要)
)

response = client.chat.completions.create(
    model="qwen3.5:4b",
    messages=[
        {"role": "system", "content": "あなたは親切なアシスタントです。"},
        {"role": "user", "content": "RAGとFine-tuningの違いを200字以内で説明してください"}
    ]
)

print(response.choices[0].message.content)

OpenAI APIと切り替える場合は

base_url
api_key
の2行、および
model
名を変えるだけです。

ストリーミングレスポンス

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",
)

# stream=True でトークンを逐次受け取る
stream = client.chat.completions.create(
    model="qwen3.5:4b",
    messages=[
        {"role": "user", "content": "Pythonでフィボナッチ数列を生成するコードを書いてください"}
    ],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta
    if delta.content:
        print(delta.content, end="", flush=True)
print()

ollamaパッケージを直接使う方法

OpenAI SDKを使わず、Ollama公式のPythonパッケージを使う方法もあります。

pip install ollama
import ollama

# 基本的なチャット呼び出し
response = ollama.chat(
    model="qwen3.5:4b",
    messages=[
        {"role": "user", "content": "Pythonでフィボナッチ数列を生成するコードを書いてください"}
    ]
)
print(response["message"]["content"])

# ストリーミング
for chunk in ollama.chat(
    model="qwen3.5:4b",
    messages=[{"role": "user", "content": "Pythonでフィボナッチ数列を生成するコードを書いてください"}],
    stream=True,
):
    print(chunk["message"]["content"], end="", flush=True)
print()

ollama.chat()
はシンプルなスクリプトに向いています。OpenAI SDK互換インターフェースは既存のコードベースにOllamaを差し込む場合に向いています。

LangChainからOllamaを使う実装例

LangChainのエコシステム(LCEL・RAG・エージェント)でOllamaを使うには

langchain-ollama
パッケージを使います。
pip install langchain-ollama langchain-core

基本的な呼び出し

from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage, SystemMessage

llm = ChatOllama(
    model="qwen3.5:4b",
    temperature=0,
)

messages = [
    SystemMessage(content="あなたはPythonの専門家です。"),
    HumanMessage(content="リスト内包表記とmapの使い分けを教えてください"),
]

response = llm.invoke(messages)
print(response.content)

LCELチェーンでの利用

from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

llm = ChatOllama(model="qwen3.5:4b", temperature=0)

prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたはデータサイエンスの専門家です。"),
    ("human", "{question}"),
])

chain = prompt | llm | StrOutputParser()

result = chain.invoke({"question": "過学習を防ぐ正則化手法を3つ挙げてください"})
print(result)

RAGパイプラインへの組み込み

LangChainのRAGパイプラインにOllamaを組み込む場合、LLMを差し替えるだけで動きます。埋め込みモデルもOllamaで動かす場合は

OllamaEmbeddings
を使います。
from langchain_ollama import ChatOllama, OllamaEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 埋め込みモデル(ローカル)
embeddings = OllamaEmbeddings(model="nomic-embed-text")

# チャットモデル(ローカル)
llm = ChatOllama(model="qwen3.5:4b", temperature=0)

# RAGプロンプト
rag_prompt = ChatPromptTemplate.from_messages([
    ("system", """以下のコンテキストに基づいて質問に答えてください。
コンテキスト:
{context}

コンテキストに情報がない場合は「情報がありません」と答えてください。"""),
    ("human", "{question}"),
])

# retrieverはChromaDB等のベクトルストアから取得したものを使う
# chain = (
#     {"context": retriever | format_docs, "question": RunnablePassthrough()}
#     | rag_prompt
#     | llm
#     | StrOutputParser()
# )

OpenAIの

ChatOpenAI
OpenAIEmbeddings
ChatOllama
OllamaEmbeddings
に置き換えるだけで、ローカル完結のRAGが構成できます。

Qwen3.5のThinking Modeをオン・オフする

Qwen3.5は

thinking=True/False
で内部推論モードを切り替えられます。複雑な推論タスクには有効ですが、レイテンシが上がります。
from langchain_ollama import ChatOllama

# Thinking Modeオフ(速度優先)
llm_fast = ChatOllama(model="qwen3.5:4b", temperature=0, thinking=False)

# Thinking Modeオン(精度優先)
llm_think = ChatOllama(model="qwen3.5:4b", temperature=0, thinking=True)

question = "n=100まで実行したとき、バブルソートと挿入ソートのどちらが平均的に速いですか?"

print("=== Thinking Mode OFF ===")
print(llm_fast.invoke(question).content)

print("\n=== Thinking Mode ON ===")
response = llm_think.invoke(question)
print(response.content)

よくあるトラブルシューティング

モデルの推論が異常に遅い

原因:モデルがRAMに収まらず、スワップ(仮想メモリ)が発生している。

確認手順

# モデル起動中に実行
ollama ps
# PROCESSOR 列が 100% CPU なら GPU フォールバックが発生している

対処

# より小さいモデルに切り替える
ollama pull phi4-mini:3.8b    # 約2.5GB(8GB Macでも快適)
ollama pull qwen3.5:4b       # 約3.4GB

# コンテキスト長を短くして使用メモリを削減する
# (OLLAMA_NUM_CTX 環境変数で指定)
OLLAMA_NUM_CTX=2048 ollama run qwen3.5:4b

目安:8GB MacはモデルサイズをRAMの50〜60%以内に抑えるのが実用的です。

GPUが使われていない(100% CPU になる)

原因1:Homebrewでインストールしたollamaがx86バイナリをRosetta経由で動作している。

確認

file $(which ollama)
# -> ollama: Mach-O 64-bit executable arm64  ← ARM正常
# -> ollama: Mach-O 64-bit executable x86_64 ← x86・Rosetta経由

対処:x86バイナリが入っている場合は一度削除してアンインストールし、ollama.comの公式サイトからmacOS向けpkgインストーラを使って再インストールします。

brew uninstall ollama
# 公式サイト https://ollama.com/download/mac からpkgをダウンロードして再インストール

原因2:Ollamaの特定バージョンでGPUフォールバックのバグが発生することがある。

対処

brew upgrade ollama

最新バージョンに更新して再試行します。それでも解消しない場合はデバッグログを確認します。

OLLAMA_DEBUG=1 ollama serve 2>&1 | grep -i "gpu\|metal\|error"

メモリ不足エラーが出る

症状

ollama run
実行時にエラーが出てモデルが起動しない、または起動直後にクラッシュする。

対処

# 使っていないモデルをアンロード(メモリを解放)
ollama stop qwen3.5:9b

# 不要なモデルを削除
ollama rm gemma4:27b

# 現在起動中のモデルを確認
ollama ps

Activity Monitorの「メモリ」タブで「メモリ圧力」グラフが赤くなっている場合は、他のアプリを終了してRAMを確保してから再試行します。

モデルのダウンロードが途中で止まる

原因:ネットワークのタイムアウト。

対処:同じ

ollama pull
コマンドを再実行します。ダウンロードは途中から再開されます。
ollama pull qwen3.5:4b  # 再実行で途中から再開

まとめ

Ollamaを使えば、APIキーなし・コストゼロで手元のMacでLLMの挙動を確認できます。本記事で扱った内容を整理します。

手順のまとめ:

  • brew install ollama
    でインストール。
    ollama serve
    でサーバ起動
  • ollama pull qwen3.5:4b
    (または
    gemma4:e4b
    phi4-mini:3.8b
    )でモデルをダウンロード
  • ollama ps
    PROCESSOR
    列で
    100% GPU
    を確認。CPUフォールバックが出たら原因を確認する
  • OpenAI SDKから呼ぶ場合は
    base_url="http://localhost:11434/v1"
    api_key="ollama"
    の2行を変更するだけ
  • LangChainから使う場合は
    ChatOllama
    OllamaEmbeddings
    でOpenAI実装をそのまま差し替えられる

ローカルLLMをプロトタイプに使いこなすと、アイデアを試すサイクルが速くなります。クラウドAPIへの「お伺い」なしに、手元のデータで自由に実験できるのがローカルの最大の価値です。次のステップとして、OllamaのモデルをRAGパイプラインに組み込み、ChromaDBなどのローカルベクトルDBと組み合わせることで、完全オフライン動作のRAGシステムが構成できます。