言語を切り替える
テーマを切り替える

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ほぼ劣化なし最高品質を追求、ビデオメモリ十分
FP161x約 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)ビデオメモリ使用量
512455.2GB
1024726.1GB
2048987.4GB

num_batch を 512 から 1024 に上げると、スループットが 60% 向上し、ビデオメモリは 1GB も増えません。これはお得です。

三、メモリチューニング — OOM 解決の 3 つの戦略

3.1 GPU メモリ割り当てメカニズム

Ollama の GPU メモリ管理は、実は賢いです。自動で判断します:

  1. ビデオメモリはモデルを載せるのに十分か?
  2. 十分なら、全部 GPU に載せる
  3. 不足なら、一部の層を 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)OOM12GB(溢れた)
3018 tokens/s9.2GB
2012 tokens/s6.5GB
0(純CPU)4 tokens/s0.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 306012GB52コスパの王様
RTX 308010GB68安定選択
RTX 309024GB9514B Q4 可能
RTX 4070 Ti12GB78新アーキテクチャの恩恵
RTX 409024GB120富豪構成

NVIDIA グラフィックボード(14B モデル Q4_K_M)

グラフィックボードビデオメモリtokens/s備考
RTX 306012GB28やっと動く
RTX 308010GBOOMCPU offload 必要
RTX 309024GB55快適
RTX 409024GB72爆速

Apple Silicon(Metal アクセラレーション)

デバイスモデルメモリ7B tokens/s14B tokens/s
M2 Air 8GB8GB35OOM
M2 Pro 16GB16GB4822
M2 Max 32GB32GB5832
M2 Ultra 64GB64GB6545

Apple Silicon の利点はユニファイドメモリで、ビデオメモリが大きいこと。でもシングルコア性能はハイエンド GPU に劣ります。

純 CPU 推論

CPU モデルメモリ7B tokens/s14B tokens/s
i7-12700K32GB63
Ryzen 9 7950X64GB84
M2 Max(CPU only)32GB126

動くけど、遅い。バッチ処理タスクに適していて、リアルタイム会話には向かない。

4.2 バッチ処理スループット向上データ

この表は異なる num_batch 設定がスループットに与える影響を示しています:

テスト環境:RTX 3080、7B Q4_K_M、複数同時リクエスト

num_batch単一リクエストレイテンシ同時スループットビデオメモリ使用量
51222ms/token45 tokens/s5.2GB
102422ms/token72 tokens/s6.1GB
204822ms/token98 tokens/s7.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日

コメント

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

関連記事