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.4GB | 8GB以上推奨 | 日本語・マルチモーダル対応(テキスト・画像)。256Kコンテキスト。Thinking Mode対応 |
gemma4:e4b |
4B相当 | 約3.0GB | 8GB以上推奨 | Google製マルチモーダルモデル。128Kコンテキスト。Thinking Mode対応 |
phi4-mini:3.8b |
3.8B | 約2.5GB | 8GB以上推奨 | Microsoft製高効率モデル。英語・コーディングタスクで高いパフォーマンス |
qwen3.5:9b |
9B | 約6.0GB | 16GB以上推奨 | 4Bより性能向上。RAGや長文生成に向く |
gemma4:27b |
27B (MoE) | 約17GB | 32GB以上推奨 | 高い汎用性。マルチモーダルを活かしたい場合に有力 |
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システムが構成できます。