Ollama マルチ GPU メモ:VRAM の合算、GPU 選択、よくある誤解

Ollama のマルチ GPU 利用について、いつモデルが複数 GPU に分散されるのか、CUDA_VISIBLE_DEVICES / ROCR_VISIBLE_DEVICES で GPU を制限する方法、VRAM を合算できるのか、異なる GPU を混在できるのか、Docker、PCIe 帯域、性能面の注意点を整理します。

Ollama でローカル推論を試していると、よく次のような疑問が出てきます。今 1 枚 GPU があり、マザーボードに空き PCIe スロットがある場合、GPU を追加すると Ollama に効果があるのか。複数 GPU は同じ型番でなければならないのか。VRAM は合算できるのか。学習フレームワークのようにマルチ GPU で推論速度が大きく上がるのか。

この記事では、Ollama のマルチ GPU 動作を整理します。先に結論を書くと次の通りです。

  • Ollama は複数 GPU をサポートします。
  • 複数 GPU の主な価値は、より大きなモデルを合計 VRAM に載せやすくすることであり、token/s が線形に伸びることではありません。
  • デフォルトでは、モデルが 1 枚の GPU に完全に収まる場合、Ollama は単一 GPU に載せる傾向があります。
  • モデルが 1 枚の GPU に収まらない場合、Ollama は利用可能な GPU にモデルを分散できます。
  • 異なる型番の GPU も Ollama から見える場合がありますが、性能や配置が理想的とは限りません。
  • SLI / NVLink は必須ではありません。
  • Ollama が使う GPU を制限したい場合は、CUDA_VISIBLE_DEVICESROCR_VISIBLE_DEVICESGGML_VK_VISIBLE_DEVICES を使います。

公式の挙動:まず単一 GPU、入らなければ複数 GPU

Ollama FAQ では、マルチ GPU のロードロジックが比較的明確に説明されています。新しいモデルをロードするとき、Ollama は必要な VRAM を見積もり、現在利用可能な VRAM と比較します。モデルがどれか 1 枚の GPU に完全に収まる場合、その GPU にロードします。1 枚に収まらない場合、利用可能なすべての GPU に分散されます。

この戦略の理由は性能です。単一 GPU に載せることで、推論時の PCIe バス越しのデータ転送を減らせるため、通常はそのほうが速くなります。

そのため、Ollama のマルチ GPU を「GPU が増えれば自動で数倍速くなる」と考えないほうがよいです。より正確には次のように理解できます。

  • 小さいモデルが単一 GPU に入る:通常は単一 GPU で動く。
  • 大きいモデルが単一 GPU に入らない:複数 GPU に分層ロードされる。
  • それでも VRAM が足りない:一部がシステムメモリに落ち、速度が大きく低下する。

モデルがどこにロードされたかは、次のコマンドで確認できます。

1
ollama ps

出力の PROCESSOR には、たとえば次のように表示されます。

1
2
3
100% GPU
48%/52% CPU/GPU
100% CPU

48%/52% CPU/GPU と表示される場合、一部がすでにシステムメモリにあります。この場合、CPU/RAM に頼り続けるより、GPU を増やすか、より大容量 VRAM の GPU に替えるほうが有効なことが多いです。

マルチ GPU は単純な計算力の合算ではない

ローカル LLM 推論は、ゲームにおける SLI とは別物です。Ollama のマルチ GPU では、モデルの異なる層やテンソルを別々のデバイスに置く形が一般的です。これにより複数 GPU の VRAM を使って大きなモデルを載せられますが、推論中にはデバイス間でデータを渡す必要が出る場合があります。

したがって、マルチ GPU の利点は通常 2 種類です。

  • VRAM 面の利点:大きなモデルを載せやすくなり、CPU/RAM への退避を避けやすくなる。
  • 性能面の利点:単一 GPU に入らない、または CPU との混在が深刻な場合に目立ちやすい。

8B や 14B のモデルが 1 枚の RTX 3090 に完全に入る場合、それを 2 枚の GPU に無理に分割しても速くなるとは限りません。むしろ GPU 間転送で遅くなる可能性があります。Ollama のデフォルトの「入るなら単一 GPU」戦略は、この不要な PCIe コストを避けるためのものです。

Ollama のマルチ GPU は SLI に依存しません。通常の PCIe GPU が複数あり、ドライバと Ollama が認識できれば、スケジューリング対象になります。

NVLink やより高い PCIe 帯域は、一部の GPU 間分散シナリオで役立つ可能性がありますが、前提条件ではありません。中古 GPU サーバーやワークステーションでも、普通の PCIe マルチ GPU で動かせます。

本当に注意すべきなのは PCIe 帯域です。x1x4x8x16 の差は、モデルを VRAM にロードする速度に影響します。大きなモデルを頻繁に切り替える場合、PCIe リンクはボトルネックになりやすくなります。モデルのロード後、生成時の影響は通常小さくなりますが、GPU 間分散には追加コストが残る可能性があります。

無難な考え方は次の通りです。

  • 可能なら x16 / x8 を使い、マイニング用 x1 riser は避ける。
  • 大きなモデルを頻繁に切り替えるなら、PCIe 帯域はより重要。
  • モデルを長時間 VRAM に常駐させる場合、PCIe 帯域の影響は相対的に小さくなる。
  • マルチ GPU 機では、マザーボードの PCIe トポロジーと CPU 直結レーンを確認する。

Ollama が使う NVIDIA GPU を制限する

NVIDIA のマルチ GPU 環境では、CUDA_VISIBLE_DEVICES で Ollama から見える GPU を制御します。

一時的に実行する場合:

1
CUDA_VISIBLE_DEVICES=0,1 ollama serve

2 枚目の GPU だけを使う場合:

1
CUDA_VISIBLE_DEVICES=1 ollama serve

NVIDIA GPU を使わせない場合は、無効な ID を指定できます。

1
CUDA_VISIBLE_DEVICES=-1 ollama serve

公式ドキュメントでは、数値 ID の順序は変わる可能性があるため、GPU UUID のほうが信頼できるとされています。まず UUID を確認します。

1
nvidia-smi -L

出力例:

1
2
GPU 0: NVIDIA GeForce RTX 3090 (UUID: GPU-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
GPU 1: NVIDIA GeForce RTX 3070 (UUID: GPU-yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy)

その後、UUID を指定します。

1
CUDA_VISIBLE_DEVICES=GPU-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ollama serve

Linux の systemd サービスとして Ollama をインストールしている場合は、サービス環境変数に書きます。

1
sudo systemctl edit ollama.service

追加内容:

1
2
[Service]
Environment="CUDA_VISIBLE_DEVICES=0,1"

再読み込みして再起動します。

1
2
sudo systemctl daemon-reload
sudo systemctl restart ollama

AMD と Vulkan の選択変数

AMD ROCm 環境では、ROCR_VISIBLE_DEVICES で見える GPU を制御します。

1
ROCR_VISIBLE_DEVICES=0,1 ollama serve

ROCm GPU を使わせない場合も、無効な ID を指定できます。

1
ROCR_VISIBLE_DEVICES=-1 ollama serve

Ollama の GPU ドキュメントでは、実験的な Vulkan サポートも触れられています。Vulkan GPU を選ぶには GGML_VK_VISIBLE_DEVICES を使います。

1
OLLAMA_VULKAN=1 GGML_VK_VISIBLE_DEVICES=0 ollama serve

Vulkan デバイスで問題が出る場合は無効化できます。

1
GGML_VK_VISIBLE_DEVICES=-1 ollama serve

AMD のマルチ GPU は、NVIDIA よりもドライバ、ROCm バージョン、GFX バージョンの互換性問題に遭遇しやすいです。公式ドキュメントでも Linux の ROCm ドライバ要件や HSA_OVERRIDE_GFX_VERSION などの互換性設定が説明されています。異なる世代の AMD GPU を混在させる場合は、まず各カードが単独で動くことを確認してからマルチ GPU を試すのが安全です。

Docker で複数 GPU を見せる

Docker で Ollama を動かす場合、NVIDIA 環境では通常 nvidia-container-toolkit を入れ、--gpus でデバイスを公開します。

すべての GPU を公開:

1
2
3
4
5
6
docker run -d \
  --gpus=all \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

指定した GPU だけを公開:

1
2
3
4
5
6
docker run -d \
  --gpus '"device=0,1"' \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

環境変数と組み合わせることもできます。

1
2
3
4
5
6
7
docker run -d \
  --gpus=all \
  -e CUDA_VISIBLE_DEVICES=0,1 \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

コンテナ内で nvidia-smi が GPU を見られない場合、Ollama も GPU を使えません。まず Docker の GPU passthrough を確認し、その後 Ollama を確認します。

OLLAMA_SCHED_SPREAD とは

マルチ GPU 設定では、OLLAMA_SCHED_SPREAD=1OLLAMA_SCHED_SPREAD=true を見かけることがあります。これは Ollama のスケジューラに関係する設定で、モデルやリクエストを複数 GPU により分散させたい場面で使われることがあります。

設定例:

1
OLLAMA_SCHED_SPREAD=1 ollama serve

systemd の場合:

1
2
[Service]
Environment="OLLAMA_SCHED_SPREAD=true"

ただし万能ではありません。有効にしても token/s が線形に増えるわけではなく、複数モデルの同時ロード、VRAM 見積もり、コンテキスト長、KV cache の増加によって OOM になることもあります。公式 FAQ の基本方針は変わりません。1 枚の GPU にモデルが完全に入るなら単一 GPU のほうが効率的なことが多く、1 枚に入らないときに複数 GPU 分散が有効になります。

そのため、OLLAMA_SCHED_SPREAD はマルチ GPU 必須設定ではなく、高度なスケジューリング実験項目として扱うのがよいです。まずデフォルト挙動を理解し、ollama ps、ログ、nvidia-smi の結果を見ながら調整します。

複数 GPU が本当に使われているか確認する

よく使う確認コマンド:

1
ollama ps
1
watch -n 0.5 nvidia-smi

Ollama サービスログ:

1
journalctl -u ollama -f

Docker の場合:

1
docker logs -f ollama

確認したい点:

  • Ollama が対応 GPU を検出しているか。
  • モデルが 100% GPU または CPU/GPU 混在で表示されているか。
  • 各 GPU に VRAM 使用量があるか。
  • モデルロード時に複数 GPU の VRAM が増えるか。
  • 生成時の token/s が CPU/RAM 退避より明らかに改善しているか。
  • OOM やモデルのアンロードが頻発していないか。

GPU 使用率だけを見ると誤解しやすいです。LLM 推論では、特にマルチ GPU、低 batch、小さいコンテキスト、遅い CPU、遅い PCIe 環境では、GPU 使用率が常に高いとは限りません。

よくある誤解

誤解 1:12GB GPU 2 枚は 24GB GPU 1 枚と同じ

完全には同じではありません。複数 GPU にモデルを配置できますが、デバイス間アクセスには追加コストがあります。「入らない」問題は解決できますが、単一大容量 VRAM GPU と同じ速度や安定性になるとは限りません。

誤解 2:異なる型番の GPU は混在できない

必ずしもそうではありません。ドライバ、計算能力、ランタイムライブラリが対応していれば、Ollama は複数 GPU を認識できます。ただし混在構成では、遅いカード、小さい VRAM、PCIe トポロジーに制約されやすくなります。最も予測しやすいのは、同じ型番、同じ VRAM、同世代でサポートの良いドライバ構成です。

誤解 3:マルチ GPU は必ず単一 GPU より速い

必ずしも速くありません。モデルが 1 枚の高速 GPU に完全に入る場合、単一 GPU のほうが速いことがあります。マルチ GPU は主に、大きなモデル、長いコンテキスト、単一 GPU の VRAM 不足に向いています。

不要です。普通の PCIe マルチ GPU システムでも Ollama は利用できます。NVLink は前提条件ではありません。

誤解 5:GPU を追加したらサービス再起動は不要

必ずしもそうではありません。Linux systemd サービス、Windows のバックグラウンドアプリ、Docker コンテナは、デバイスや環境変数を再検出するために再起動が必要な場合があります。

GPU 選びの目安

Ollama のローカル推論では、おおよその優先順位は次の通りです。

  1. 単一 GPU の VRAM が大きいほど扱いやすい。
  2. 同一 GPU 複数枚は、混在 GPU よりトラブルシュートしやすい。
  3. PCIe レーンが十分あるほど、大きなモデルのロードが快適。
  4. 古い GPU は CUDA compute capability または ROCm 対応を先に確認する。
  5. マルチ GPU では電源、冷却、筐体エアフローを事前に計算する。

中古予算重視の場合:

  • RTX 3090 2 枚は、今でもよく使われる大容量 VRAM 構成です。
  • P40 / M40 のような古い Tesla は VRAM が大きい一方、消費電力、冷却、ドライバ、性能のトレードオフがあります。
  • RTX 4070 / 4070 Ti などは効率が良いですが、単一 GPU の VRAM 容量が制約になりやすいです。
  • 古い 8GB GPU を複数枚使う構成は実験としては面白いですが、大きなモデルを長期運用する用途にはあまり向きません。

まとめ

Ollama のマルチ GPU は、「性能加速より先に VRAM 拡張」と理解すると分かりやすいです。モデルが 1 枚の GPU に完全に入るなら、デフォルトの単一 GPU 経路のほうが速いことが多いです。1 枚に入らない場合、複数 GPU に分散することで CPU/RAM への大きな退避を避け、大きなモデルを実用的にできます。

実際の設定では、まず ollama ps でモデルのロード先を確認し、nvidia-smi や ROCm ツールで VRAM 使用量を観察します。GPU を制限する場合、NVIDIA は CUDA_VISIBLE_DEVICES、AMD ROCm は ROCR_VISIBLE_DEVICES、Vulkan は GGML_VK_VISIBLE_DEVICES を使います。Docker で動かす場合は、まずコンテナから GPU が見えているか確認します。

マルチ GPU は魔法ではありません。より大きなモデルを載せる助けにはなりますが、線形加速は保証されません。安定して使うなら、大容量 VRAM の単一 GPU、または同一型番のマルチ GPU を優先し、ドライバ、PCIe、電源、冷却、モデル量子化をまとめて考えるのが現実的です。

参考連結

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。