Ollama パフォーマンス最適化実践:量子化・バッチ処理・メモリチューニング完全ガイド
14B モデルが動いたけど、推論速度が 10 tokens/s しか出ない?それとも OOM エラーで落ちた?グラフィックボードのファンが唸りを上げて、画面が真っ暗になった。
たぶん、こんな状況じゃないでしょうか。意気揚々と llama3 8B をダウンロードして、ollama run を叩いたら、ビデオメモリが足りない。エラーで落ちるか、カタツムリみたいに遅いか。Q4 量子化版に変えたら動くようになったけど、品質はどれくらい落ちたんだろうと気になってる。
正直に言うと、私も Ollama を使い始めた頃は同じ失敗をしました。8GB のビデオメモリで 14B モデルを動かそうとして、起動できればいいと思ってた。結果は、CUDA out of memory か、一語一語搾り出すように遅くて、お茶が淹れられるくらい待たされた。
問題はハードウェアじゃありません。設定が最適化されていないだけです。
この記事では、3 つの核心的な最適化技術について解説します:量子化の選択、バッチ処理の設定、メモリのチューニング。これらを理解すれば、ローカル LLM のパフォーマンスは少なくとも倍になります。マーケティング的な「倍」じゃなくて、実際の tokens/s の向上です。
一、量子化技術 — Q4 から FP16 までの品質と速度のトレードオフ
1.1 量子化とは?なぜ GGUF が主流フォーマットなのか
平たく言うと、量子化とはモデルを「圧縮する」ことです。
ダウンロードした大規模モデルのパラメータは、元々 FP16(16 ビット浮動小数点数)です。7B モデルを FP16 で計算すると、パラメータだけで 14GB のビデオメモリが必要です。でも、各パラメータを 16 ビットから 4 ビットに圧縮したら?理論上は 3.5GB まで減らせます。これが量子化の核心的なロジックです。より少ないビット数で元の数値を表現し、メモリ使用量を減らして推論速度を上げる。
もちろん代償はあります:精度の低下。4K 写真を 720p に圧縮するようなもので、細部は失われますが、多くのシーンでは「使える」レベルです。
GGUF フォーマットが主流になれた理由はシンプルです:楽だから。llama.cpp チームが特別に設計したフォーマットで、メモリマッピング(mmap)をサポートしています。モデル読み込み時に全部メモリに読む必要がなく、必要な分だけ読み込めます。つまり、16GB メモリのマシンでも 13B モデルを動かせる—従来のフォーマットでは考えられません。
1.2 量子化タイプの詳細:Q4_0、Q4_K_M、Q5_K_M、Q8_0 の比較
多くの人がここで悩みます:Q4_0、Q4_1、Q4_K_M、Q5_K_M、Q8_0……いっぱい選択肢があるけど、どれを選べばいいのか?
よく使う量子化タイプを比較表にまとめました:
| 量子化タイプ | 圧縮率 | メモリ使用量(7Bモデル) | 品質低下 | 適用シーン |
|---|---|---|---|---|
| Q4_0 | 約 4.5x | 約 4.0GB | 大きめ | ビデオメモリが極端に厳しい、品質要求が低い |
| Q4_K_M | 約 4.5x | 約 4.7GB | 小さい | コスパ最優先、日常的なおすすめ |
| Q5_K_M | 約 3.5x | 約 5.8GB | 極小 | 品質優先、ビデオメモリに余裕 |
| Q8_0 | 約 2x | 約 7.2GB | ほぼ劣化なし | 最高品質を追求、ビデオメモリ十分 |
| FP16 | 1x | 約 14GB | 無劣化 | 学術研究、富豪グラボ |
シンプルに言うと:Q4_K_M がコスパ最優先です。品質低下はほぼ感じられず、メモリ使用量は最小。何度もテストしましたが、Q4_K_M と FP16 の回答の違いは、顕微鏡で探さないと日常会話では全くわかりません。
Q5_K_M は、ビデオメモリに余裕があって品質にこだわりたい場合に適しています。Q8_0 は考えないでください。24GB 以上のビデオメモリがない限り—そんな条件があるなら、もっと大きなパラメータのモデルを動かした方がいいでしょう。
1.3 量子化選択のデシジョンツリー
シンプルな判断ロジックを提供します:
Step 1:ビデオメモリを確認
- ビデオメモリ ≤ 8GB:Q4_K_M しか選べない、7B モデルでやっと、14B は CPU offload 必要
- ビデオメモリ 12-16GB:Q4_K_M で 14B 問題なし、7B なら Q5_K_M も可能
- ビデオメモリ ≥ 24GB:自由、Q5_K_M か Q8_0、70B モデルも可能
Step 2:ニーズを確認
- 日常会話、コード執筆:Q4_K_M で十分
- 翻訳、執筆など品質重視:Q5_K_M
- 学術研究、評価比較:Q8_0 または FP16
参考データ:
- 7B モデル Q4_K_M:約 4.7GB ビデオメモリ
- 14B モデル Q4_K_M:約 9GB ビデオメモリ
- 70B モデル Q4_K_M:約 40GB ビデオメモリ
私のおすすめ?まず Q4_K_M から試してください。回答品質がおかしいと感じたら、Q5_K_M に変える。最初から「無劣化」を追求しないで、多くの場合は心理的なものです。
1.4 特定の量子化バージョンのダウンロード方法
Ollama はデフォルトで Q4_K_M 量子化バージョンをダウンロードします。他のバージョンを指定したい?
# デフォルトは Q4_K_M
ollama run llama3
# Q5 量子化を指定
ollama run llama3:70b-q5
# Q8 量子化を指定
ollama run llama3:70b-q8
全てのモデルが全ての量子化バージョンを持っているわけではありません。Ollama 公式モデルライブラリで確認するか、このコマンドでタグを確認できます:
# ローカルにあるモデルを確認
ollama list
# モデル詳細を確認(量子化情報を含む)
ollama show llama3 --modelfile
話を戻すと、ヘビーユーザーなら、自分でモデルを量子化するのも一つの手です。llama.cpp は完全な量子化ツールチェーンを提供しており、精度とパラメータを自分で制御できます。でもこれは上級者向けなので、この記事では詳しく説明しません。
二、バッチ処理設定 — スループットを 50-150% 向上
2.1 バッチ処理の原理:なぜ速くなるのか?
バッチ処理という概念、多くの人が理解できていません。説明しましょう。
スーパーのレジを想像してください。客一人ずつの商品を処理すると、レジ係は頻繁に切り替えて、スキャンして、お金を受け取って、効率が悪い。でも 10 人分の商品をまとめてスキャンしたら?レジ係の動きがスムーズになり、効率は上がります。
GPU 推理も同じです。単一トークン推論時、GPU は大部分の時間をメモリからのデータ転送待ちに費やしています—計算ユニットがアイドル状態。バッチ処理は複数のトークンをまとめて計算し、GPU をフル稼働させます。
注意:バッチ処理が向上させるのはスループットで、単一リクエストのレイテンシではありません。どういうこと?一人で使う場合はあまり恩恵を感じません。でも API サービスを動かしていて、複数のリクエストを同時処理する場合、スループットは倍以上になります。
2.2 num_batch パラメータの詳細
num_batch は Ollama の核心的なバッチ処理パラメータで、デフォルト値は 512 です。
この値が大きいほど、GPU 使用率が高くなり、スループットが上がります。代償はビデオメモリ使用量が 20-40% 増えること。
どう調整する?ビデオメモリの余裕によります:
| ビデオメモリ状況 | 推奨 num_batch | 期待効果 |
|---|---|---|
| 厳しい | 512(デフォルト) | 安全、少しアイドルあるかも |
| 適度 | 1024 | スループット 50-80% 向上 |
| 余裕あり | 2048 | スループット 100-150% 向上 |
私の経験:RTX 3080(10GB)で 7B Q4_K_M を動かす場合、num_batch を 1024 に設定すれば安定。2048 にするとたまに OOM が発生。RTX 4090 で 14B を動かす場合、2048 で問題なし。
2.3 num_ctx と KV Cache
num_ctx はコンテキストウィンドウサイズで、デフォルトは 2048 です。このパラメータが影響するのは KV Cache のメモリ使用量です。
KV Cache とは?簡単に言うと、モデル推論時に前の計算結果をキャッシュし、重複計算を避けること。コンテキストが長いほど、キャッシュも大きくなります。
メモリ使用量の公式(概算):
KV Cache メモリ ≈ 2 × 層数 × 隠れ層次元 × num_ctx × 精度バイト数
実際の参考データ:
- 7B モデル、num_ctx=4096:追加で約 1-2GB 使用
- 14B モデル、num_ctx=8192:追加で約 3-4GB 使用
だから長いコンテキスト(例えば 32K、128K)を動かすと、ビデオメモリ消費が急激に増えます。多くの人はモデルパラメータがビデオメモリを使い果たしたと思ってますが、実は KV Cache が大部分を食ってます。
落とし穴:一部のモデルはデフォルトの num_ctx が大きいです。例えば llama3 は 128K までサポートしていますが、本当にその大きさに設定するとビデオメモリが即座に溢れます。日常使用では、4096 か 8192 で十分です。
2.4 バッチ処理設定の実践
設定例を直接提示します。
方法一:Modelfile 設定
# ベースモデルから作成
FROM llama3
# バッチサイズを設定
PARAMETER num_batch 1024
# コンテキストウィンドウを設定
PARAMETER num_ctx 4096
# システムプロンプトが切り捨てられないように保持
PARAMETER num_keep 128
Modelfile として保存して、新しいモデルを作成:
ollama create my-llama3 -f Modelfile
ollama run my-llama3
方法二:API options 設定
curl http://localhost:11434/api/generate -d '{
"model": "llama3",
"prompt": "量子コンピューティングについて説明して",
"options": {
"num_batch": 1024,
"num_ctx": 4096
}
}'
パフォーマンス比較データ(RTX 3080、7B Q4_K_M):
| num_batch | スループット(tokens/s) | ビデオメモリ使用量 |
|---|---|---|
| 512 | 45 | 5.2GB |
| 1024 | 72 | 6.1GB |
| 2048 | 98 | 7.4GB |
num_batch を 512 から 1024 に上げると、スループットが 60% 向上し、ビデオメモリは 1GB も増えません。これはお得です。
三、メモリチューニング — OOM 解決の 3 つの戦略
3.1 GPU メモリ割り当てメカニズム
Ollama の GPU メモリ管理は、実は賢いです。自動で判断します:
- ビデオメモリはモデルを載せるのに十分か?
- 十分なら、全部 GPU に載せる
- 不足なら、一部の層を CPU に自動で offload
でも「賢い」からといって完璧ではありません。判断ミスや境界ケースの処理がうまくいかないと、OOM が発生します。
核心パラメータ:num_gpu。このパラメータはモデルの何層を GPU に載せるかを制御します。デフォルトの -1 は自動判断を意味します。手動で指定することもできます。例えば num_gpu: 20 は最初の 20 層だけ GPU に載せ、残りは CPU を使うことを意味します。
3.2 戦略一:量子化のダウングレード
これが最もシンプルで直接的な方法。OOM が出た?より小さい量子化に変える。
ダウングレードパス:
Q8_0 → Q5_K_M → Q4_K_M → Q4_0
各ダウングレードで、約 20-25% のビデオメモリを節約できます。
例:14B モデル Q5_K_M は 11GB ビデオメモリが必要、OOM が出た。Q4_K_M に変えると、9GB だけで済みます。ビデオメモリ使用量が 18% 減り、品質低下は?正直、日常会話ではほとんどわかりません。
以前 8GB ビデオメモリで 7B Q4_K_M を動かしていましたが、全く問題なし。14B を動かしたい?Q4_K_M でやっとですが、コンテキストが大きくなると OOM。最終的な妥協案は 14B Q4_0 で、品質は落ちましたが、使えました。
3.3 戦略二:CPU Offload ハイブリッド推論
ビデオメモリが本当に足りない?CPU に分担させる。
num_gpu パラメータが GPU 層数を制御します。例えば 32 層のモデルで num_gpu: 24 に設定すると、最後の 8 層は CPU で計算します。
代償:速度低下。CPU 推論は GPU より 10 倍以上遅い。でも OOM で動かないよりはマシ。
設定方法:
# Modelfile
FROM llama3
PARAMETER num_gpu 24
または API 経由:
curl http://localhost:11434/api/generate -d '{
"model": "llama3",
"prompt": "こんにちは",
"options": {
"num_gpu": 24
}
}'
ハイブリッド推論速度参考(14B Q4_K_M、RTX 3080 10GB + i7-12700K):
| num_gpu | 推論速度 | ビデオメモリ使用量 |
|---|---|---|
| 40(全GPU) | OOM | 12GB(溢れた) |
| 30 | 18 tokens/s | 9.2GB |
| 20 | 12 tokens/s | 6.5GB |
| 0(純CPU) | 4 tokens/s | 0.5GB |
num_gpu=30 の場合、速度はまだ許容範囲で、ビデオメモリは溢れていません。これがハイブリッド推論の価値です。
3.4 戦略三:KV Cache 最適化
KV Cache はよく見落とされますが、ビデオメモリの大口かもしれません。
方法一:Flash Attention を有効化
Flash Attention は最適化されたアテンション計算方式で、ビデオメモリ使用量を大幅に削減できます。
# 環境変数を設定
export OLLAMA_FLASH_ATTENTION=1
# または Docker 起動時
docker run -e OLLAMA_FLASH_ATTENTION=1 ollama/ollama
効果:KV Cache ビデオメモリ使用量が 30-50% 削減。強くおすすめ。
方法二:num_ctx を減らす
コンテキストが長いほど、KV Cache は大きくなります。32K コンテキストが必要ないなら、小さく設定してください。
PARAMETER num_ctx 2048 # デフォルト 2048、日常会話で十分
方法三:num_keep でシステムプロンプトを保持
num_keep パラメータは何トークンを切り捨てないかを制御します。システムプロンプトの長さに設定すると、コンテキストスライド時にシステムプロンプトが消されるのを防げます。
PARAMETER num_keep 128
3.5 OOM 実践解決フロー
OOM に遭遇したら、このフローで対処:
Step 1:ビデオメモリ使用量を確認
nvidia-smi
ビデオメモリがどれくらい使われていて、どれくらい残っているか確認。
Step 2:モデルパラメータを確認
ollama show llama3 --modelfile
num_ctx、num_batch などのパラメータが大きすぎないか確認。
Step 3:段階的にダウングレード
- まず num_batch を下げる:1024 → 512
- 次に num_ctx を下げる:4096 → 2048
- 最後に量子化を下げる:Q5_K_M → Q4_K_M
Step 4:CPU offload を有効化
num_gpu を総層数の 70-80% に設定。
Step 5:究極のソリューション—純 CPU 推論
ビデオメモリが本当に足りないなら、CPU を使うしかない。遅いけど、使える。
export OLLAMA_GPU_LAYERS=0
ollama run llama3
正直に言うと、純 CPU 推論速度は GPU の約 1/10 です。でもたまに使うだけなら、あるいはバッチ処理タスクを動かすなら、許容範囲です。
四、パフォーマンスベンチマークとハードウェア参考
4.1 異なるハードウェアでの推論速度表
異なるハードウェア構成での推論速度データをまとめました。ご自身の状況と照らし合わせてください:
NVIDIA グラフィックボード(7B モデル Q4_K_M)
| グラフィックボード | ビデオメモリ | tokens/s | 備考 |
|---|---|---|---|
| RTX 3060 | 12GB | 52 | コスパの王様 |
| RTX 3080 | 10GB | 68 | 安定選択 |
| RTX 3090 | 24GB | 95 | 14B Q4 可能 |
| RTX 4070 Ti | 12GB | 78 | 新アーキテクチャの恩恵 |
| RTX 4090 | 24GB | 120 | 富豪構成 |
NVIDIA グラフィックボード(14B モデル Q4_K_M)
| グラフィックボード | ビデオメモリ | tokens/s | 備考 |
|---|---|---|---|
| RTX 3060 | 12GB | 28 | やっと動く |
| RTX 3080 | 10GB | OOM | CPU offload 必要 |
| RTX 3090 | 24GB | 55 | 快適 |
| RTX 4090 | 24GB | 72 | 爆速 |
Apple Silicon(Metal アクセラレーション)
| デバイスモデル | メモリ | 7B tokens/s | 14B tokens/s |
|---|---|---|---|
| M2 Air 8GB | 8GB | 35 | OOM |
| M2 Pro 16GB | 16GB | 48 | 22 |
| M2 Max 32GB | 32GB | 58 | 32 |
| M2 Ultra 64GB | 64GB | 65 | 45 |
Apple Silicon の利点はユニファイドメモリで、ビデオメモリが大きいこと。でもシングルコア性能はハイエンド GPU に劣ります。
純 CPU 推論
| CPU モデル | メモリ | 7B tokens/s | 14B tokens/s |
|---|---|---|---|
| i7-12700K | 32GB | 6 | 3 |
| Ryzen 9 7950X | 64GB | 8 | 4 |
| M2 Max(CPU only) | 32GB | 12 | 6 |
動くけど、遅い。バッチ処理タスクに適していて、リアルタイム会話には向かない。
4.2 バッチ処理スループット向上データ
この表は異なる num_batch 設定がスループットに与える影響を示しています:
テスト環境:RTX 3080、7B Q4_K_M、複数同時リクエスト
| num_batch | 単一リクエストレイテンシ | 同時スループット | ビデオメモリ使用量 |
|---|---|---|---|
| 512 | 22ms/token | 45 tokens/s | 5.2GB |
| 1024 | 22ms/token | 72 tokens/s | 6.1GB |
| 2048 | 22ms/token | 98 tokens/s | 7.4GB |
重要な発見:
- 単一リクエストレイテンシはほぼ変わらない:バッチ処理は単一リクエストの応答速度に影響しない
- スループット倍増:同時実行シーンで、num_batch=2048 は 512 より 118% 向上
- ビデオメモリのコストは管理可能:118% スループット向上で、ビデオメモリは 2.2GB しか増えない
4.3 環境変数設定まとめ
Ollama がサポートする環境変数、よく使うものをまとめました:
# Flash Attention(強くおすすめ)
export OLLAMA_FLASH_ATTENTION=1
# GPU 層数を手動指定(デフォルトは自動)
export OLLAMA_GPU_LAYERS=-1
# 最大ビデオメモリ使用量を制限(単位:バイト)
export OLLAMA_MAX_VRAM=8589934592 # 8GB
# モデルキープアライブ時間(デフォルト 5 分)
export OLLAMA_KEEP_ALIVE=24h
# GPU 層オーバーヘッド調整(デフォルト 10%)
export OLLAMA_GPU_LAYER_OVERHEAD=0.1
# 同時リクエスト数制限
export OLLAMA_MAX_QUEUE=512
# ログレベル
export OLLAMA_DEBUG=1
Docker Compose 完全設定例:
version: '3'
services:
ollama:
image: ollama/ollama
container-name: ollama
restart: unless-stopped
environment:
- OLLAMA_FLASH_ATTENTION=1
- OLLAMA_KEEP_ALIVE=24h
- OLLAMA_MAX_QUEUE=512
volumes:
- ollama_data:/root/.ollama
ports:
- "11434:11434"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
volumes:
ollama_data:
上記の設定を docker-compose.yml として保存して:
docker-compose up -d
まとめ
色々説明しましたが、3 ステップの最適化フローを提示します:
ステップ 1:量子化を選ぶ
まずビデオメモリサイズを確認して、適切な量子化バージョンを選ぶ。Q4_K_M がコスパ最優先で、多くの場合で十分。ビデオメモリに余裕があれば Q5_K_M を検討。
ステップ 2:バッチ処理を調整
ビデオメモリに余裕がある?num_batch を 1024 か 2048 に上げる。スループットが倍になり、代償は少しビデオメモリが増えるだけ。
ステップ 3:OOM を解決
まだ足りない?Flash Attention を有効化、num_ctx を減らす、または CPU offload を使う。順番に試せば、必ずバランス点が見つかる。
パフォーマンス最適化は一回で完了するものではありません。ハードウェア、モデルサイズ、使用シーンがそれぞれ違うので、段階的にチューニングが必要です。量子化から始めて、動くことを確認してから、バッチ処理パラメータを調整し、最後に上級者向けの環境変数をいじるのがおすすめです。
ちなみに、具体的な問題に遭遇したら—例えばあるモデルの設定方法や、あるエラーの解決方法—コメント欄や Ollama 公式ドキュメントをチェックしてください。コミュニティには多くの実践経験のシェアがあり、理論解説より実用的です。
7 min read · 公開日: 2026年4月10日 · 更新日: 2026年4月11日
関連記事
Ollama GPU スケジューリングとリソース管理:VRAM 最適化、マルチ GPU 負荷分散
Ollama GPU スケジューリングとリソース管理:VRAM 最適化、マルチ GPU 負荷分散
Ollama Embedding 実践:ローカルベクトル検索と RAG 構築
Ollama Embedding 実践:ローカルベクトル検索と RAG 構築
LangChain + Ollama 統合ガイド:ローカル LLM アプリ開発完全マニュアル

コメント
GitHubアカウントでログインしてコメントできます