ローカルLLMをOllamaで動かす:始め方とメモリの壁
Ollamaを使えば、ローカルLLMは3コマンドで動きます。 しかもOpenAI互換のエンドポイントを持っているので、既存のコードは接続先を変えるだけで繋がります。
ただし「動く」と「実務で使える」の間にはメモリの壁があります。この記事では、始め方を最短で示したうえで、その壁がどこにあるかを計算式で示します。
3コマンドで動かす
# 1. インストール(macOS)
brew install ollama
# 2. サーバーを起動
ollama serve
# 3. モデルを取得して実行
ollama run qwen3:8b
Linuxなら公式のインストールスクリプト、Windowsならインストーラーがあります。ollama run は初回だけモデルをダウンロードし、以降はローカルから読み込みます。
対話を抜けるには /bye です。取得済みのモデルは ollama list で確認できます。
OpenAI互換で既存コードを繋ぐ
ここがOllamaのいちばん実用的な点です。http://localhost:11434/v1 がOpenAI互換のエンドポイントになっています。
from openai import OpenAI
client = OpenAI(
api_key="ollama", # 何でもよい(検証されない)
base_url="http://localhost:11434/v1",
)
resp = client.chat.completions.create(
model="qwen3:8b",
messages=[{"role": "user", "content": "こんにちは"}],
)
print(resp.choices[0].message.content)
base_url と model を差し替えるだけです。OpenAI互換APIで書いたとおり、この形式に寄せておくと接続先を自由に付け替えられます。ローカルで試して、そのままクラウドのAPIに切り替える、という流れがコードの変更なしにできます。
メモリの壁:必要量は計算できる
ローカルLLMで最初にぶつかるのがメモリです。必要量はおおよそ次の計算で出ます。
必要メモリ ≈ パラメータ数 × 1パラメータあたりのバイト数
量子化(重みを低いビット数で持つ圧縮)でバイト数が決まります。
| 精度 | 1パラメータ | 8Bモデル | 32Bモデル | 70Bモデル |
|---|---|---|---|---|
| fp16(無圧縮) | 2バイト | 約16GB | 約64GB | 約140GB |
| 8bit | 1バイト | 約8GB | 約32GB | 約70GB |
| 4bit | 0.5バイト | 約4GB | 約16GB | 約35GB |
これは重みだけの数字で、実際にはコンテキスト(KVキャッシュ)とOS側の使用分が上に乗ります。実務では2〜3割の余裕を見てください。
読み方はこうなります。
- 8Bクラス — 4bitで約4GB。ほとんどのノートPCで動きます
- 32Bクラス — 4bitで約16GB。32GBメモリのマシンなら現実的です
- 70Bクラス — 4bitでも約35GB。64GB以上のマシンが要ります
- それ以上 — フロンティア級のモデルは、そもそも個人のマシンに載りません
Apple Siliconのユニファイドメモリは、この用途では有利です。GPUメモリとシステムメモリが共有されるため、搭載メモリの多くをモデルに回せます。
量子化は無料ではない
「4bitにすれば載る」は正しいのですが、圧縮すれば出力品質は落ちます。 4bitは多くの用途で実用的ですが、長い文脈での一貫性や、細かい指示の追従で差が出ます。
重要なのは、同じモデル名でも量子化の度合いによって別物になるという点です。「ローカルで動かしたら評判ほど賢くなかった」の多くは、モデルの問題ではなく量子化の問題です。ベンチマークのスコアは通常、無圧縮に近い状態で測られています。
ローカルが向く用途・向かない用途
向いている
- 機密データ — 外部に一切出せないデータを扱う。これがローカル最大の理由です
- オフライン — ネットワークがない環境
- 大量の単純処理 — 分類やタグ付けを何万件も回すなら、電気代だけで済みます
- 学習・実験 — モデルの挙動を触って理解する
向いていない
- 最高品質が要る仕事 — フロンティア級のモデルは個人のマシンに載りません
- たまにしか使わない — 使わない時間もハードウェアの費用は発生します
- 同時アクセス — ローカルは基本的に1リクエストずつです。バッチ処理の効率でクラウドに大きく負けます
- 最新モデルをすぐ試したい — 手元へのダウンロードと環境整備が毎回必要です
損益分岐の考え方はローカルLLM vs ホスト型APIと比較ページで、前提を明示したグラフ付きで整理しています。
現実的な使い分け
どちらか一方を選ぶ必要はありません。 接続先を変えるだけで切り替わるので、性質で振り分けるのが実務的です。
from openai import OpenAI
local = OpenAI(api_key="ollama", base_url="http://localhost:11434/v1")
cloud = OpenAI(api_key="<FASTMETAL_API_KEY>", base_url="https://api.fastmetal.ai/v1")
def ask(text: str, sensitive: bool = False):
client, model = (local, "qwen3:8b") if sensitive else (cloud, "anthropic-claude-sonnet-5")
r = client.chat.completions.create(
model=model, max_tokens=500,
messages=[{"role": "user", "content": text}],
)
return r.choices[0].message.content
機密データはローカル、品質が要る仕事はクラウド。同じ関数の中で分岐できます。
なおクラウド側では、ローカルで動かすのと同じオープンモデルも使えます。「オープンモデルを使いたいが手元のメモリに載らない」という場合、ホスト型のオープンモデルが素直な答えになることが多いはずです。モデルカタログで確認してください。
つまずきやすい点
メモリ不足で極端に遅くなる モデルがメモリに収まらないとスワップが始まり、実用にならない速度になります。エラーではなく「ものすごく遅い」という形で現れるので、まず必要メモリを計算してください。
api_key を空にする
OpenAI SDKはキーが空だとエラーになります。Ollama側は検証しないので、何か文字列を入れておけば通ります。
モデル名のタグを省く
qwen3 と qwen3:8b は別物です。タグを省くと既定のサイズが選ばれます。
コンテキスト長がクラウドと違う ローカルのモデルは既定のコンテキスト長が短く設定されていることがあります。長い入力を扱うなら設定を確認してください(コンテキストウィンドウとは)。
サーバーを起動していない
ollama serve が動いていないと接続が拒否されます。
よくある質問
Q. ローカルLLMは無料ですか? ソフトウェアとモデルは無料ですが、ハードウェアと電気代はかかります。使わない時間もその費用は発生するので、利用量が少ないうちは従量課金のAPIのほうが安くなります。
Q. どれくらいのメモリが必要ですか? おおよそ「パラメータ数 × 1パラメータあたりのバイト数」です。4bit量子化なら8Bで約4GB、32Bで約16GB、70Bで約35GB。加えてコンテキストとOS分の余裕を2〜3割見てください。
Q. ローカルのモデルはクラウドのモデルと同じ品質ですか? 同じモデルでも量子化で品質は落ちます。さらにフロンティア級のモデルは個人のマシンに載らないため、上限そのものが違います。
Q. OllamaのコードをそのままクラウドのAPIに切り替えられますか?
できます。どちらもOpenAI互換なので、base_url と model を変えるだけです。
まとめ
Ollamaならローカルの導入は3コマンドで、OpenAI互換なのでコードもそのまま使えます。判断の分かれ目はメモリで、「パラメータ数 × バイト数」で必要量が計算できます。4bitでも70Bクラスは約35GB、フロンティア級は載りません。
機密データや大量の単純処理はローカル、品質が要る仕事はAPI——接続先を変えるだけで切り替わるので、両方持つのがいちばん現実的です。クラウド側の選択肢はモデルカタログから確認できます。