「1枚では24GBしかVRAMがなく70BモデルをGPUで動かせない。2枚合算できないのか」
そんな悩みを抱えるインフラエンジニアは多いはずです。OllamaはNVIDIAカードを自動検出してモデルのレイヤーを複数GPUに分散配置します。この記事では、OllamaのマルチGPU動作の仕組み・環境確認コマンド・CUDA_VISIBLE_DEVICESとOLLAMA_GPU_OVERHEADによる制御・nvidia-smiでのリアルタイム監視・「1枚しか使われない」問題の対処法を実機コマンドとともに解説します。
この記事のポイント
・OllamaはCUDAドライバが認識する全GPUを自動検出しVRAMを合算してレイヤー分散する
・ollama psとnvidia-smiの組み合わせで複数GPU使用を確認できる
・CUDA_VISIBLE_DEVICESで使用するGPUを明示的に制限・指定できる
・OLLAMA_GPU_OVERHEADで予約VRAMを設定しOOM(メモリ不足)クラッシュを防げる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
OllamaのマルチGPU動作の仕組み
Ollamaは推論エンジンとしてllama.cppを内部で使っています。llama.cppはモデルを「レイヤー」という単位で分割してGPUに割り当てます。複数のNVIDIAカードがある場合、各GPUの空きVRAMを調べ合計VRAMに収まるようレイヤーを振り分けます。たとえばGPU0(16GB)とGPU1(16GB)の2枚構成であれば理論上32GBのモデルを全レイヤーGPUに乗せられます。1枚では動かせなかった70B・q4_K_M(約40GB)もこの構成なら運用できます。複数GPUをまたぐ推論ではGPU間PCIe転送が発生するため、NVLinkや同じPCIeスイッチで接続されたカード同士の方が有利です。
Ubuntu ServerへのOllama構築手順でシングルGPUの初期設定は済んでいる前提で、ここではマルチGPU固有の設定と確認に絞ります。
前提確認:nvidia-smiですべてのGPUを認識しているか調べる
まずホストOSがすべてのカードを認識できているかを確認します。1. GPUの一覧を確認する
# list all gpus detected by the cuda driver $ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 4090 (UUID: GPU-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) GPU 1: NVIDIA GeForce RTX 3090 (UUID: GPU-yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy)
2. 各GPUのVRAM空き容量を確認する
$ nvidia-smi --query-gpu=index,name,memory.total,memory.free --format=csv,noheader 0, NVIDIA GeForce RTX 4090, 24576 MiB, 23800 MiB 1, NVIDIA GeForce RTX 3090, 24576 MiB, 24100 MiB
モデル比較と量子化選定の記事でモデル別のVRAM消費目安を確認しておくと良いでしょう。
3. CUDAバージョンの確認
$ nvidia-smi | head -5 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 550.90.07 Driver Version: 550.90.07 CUDA Version: 12.4 | |-------------------------------+----------------------+----------------------+
Ollamaが複数GPUを使っているか確認する
モデルをpullして実行するだけで自動的にマルチGPUが使われます。確認方法は2つあります。1. ollama psで現在のGPU割り当てを確認する
$ ollama run llama3.3:70b-instruct-q4_K_M "こんにちは" & $ ollama ps NAME ID SIZE PROCESSOR UNTIL llama3.3:70b-instruct-q4_K_M abc123 41 GB 100% GPU 4 minutes from now
2. nvidia-smiでGPU別のメモリ使用量を確認する
$ nvidia-smi --query-gpu=index,name,memory.used --format=csv,noheader 0, NVIDIA GeForce RTX 4090, 22100 MiB 1, NVIDIA GeForce RTX 3090, 19200 MiB
CUDA_VISIBLE_DEVICESで使用するGPUを制御する
`CUDA_VISIBLE_DEVICES` 環境変数でOllamaが使うGPUを限定・除外できます。systemdのoverride.confに設定します。1. 使用するGPUを明示指定する
$ sudo mkdir -p /etc/systemd/system/ollama.service.d/ $ sudo tee /etc/systemd/system/ollama.service.d/override.conf << 'EOF' [Service] Environment="CUDA_VISIBLE_DEVICES=0,1" EOF $ sudo systemctl daemon-reload $ sudo systemctl restart ollama
設定変更後は必ず `ss -tlnp | grep 11434` と `ollama ps` で正常起動を確認してください。
2. UUIDで指定する(スロット番号が変わる環境向け)
再起動やカードの抜き差しでインデックス番号が変わる環境ではUUID指定が確実です。`nvidia-smi -L` で表示されるUUIDをoverride.confに書きます。# UUID指定の例(override.conf内) Environment="CUDA_VISIBLE_DEVICES=GPU-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,GPU-yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
OLLAMA_GPU_OVERHEADでVRAM予約量を設定する
Ollamaはモデルロード時に各GPUの空きVRAMをフルに使おうとし、OSやドライバ側のVRAM消費と競合するとOOMクラッシュが起きます。これを防ぐのが `OLLAMA_GPU_OVERHEAD` です。$ sudo tee /etc/systemd/system/ollama.service.d/override.conf << 'EOF' [Service] Environment="CUDA_VISIBLE_DEVICES=0,1" Environment="OLLAMA_GPU_OVERHEAD=1073741824" EOF # 1073741824 bytes = 1 GiB / GPU(各GPUごとに1GiB確保) $ sudo systemctl daemon-reload $ sudo systemctl restart ollama
【注意】ゼロにするとOSのVRAM確保領域と衝突しOOMクラッシュが起きやすくなります。最低512MBは予約しておくのが安全です。OOMクラッシュ時はまずこの値を増やしてください。
複数GPUの負荷をnvidia-smiでリアルタイム監視する
# 1秒間隔でGPU一覧を更新表示 $ watch -n1 nvidia-smi # dmon でGPU使用率・メモリを連続出力(sm=GPUコア使用率・fb=VRAMメモリ使用量) $ nvidia-smi dmon -d 1 -s um 0 22100 1024 87 76 0 0 1 19200 512 82 71 0 0 # ログからレイヤー分散状況を確認(分散配置なら両GPU行に layers 値が出る) $ sudo journalctl -u ollama -n 100 | grep -i "gpu\|layer" time=2026-09-30T09:14:22Z level=INFO msg="offload" gpu=0 layers=50 time=2026-09-30T09:14:22Z level=INFO msg="offload" gpu=1 layers=30
よくある問題とトラブルシュート
**問題1: 2枚あるのに1枚しかメモリを使っていない**原因の大半は「1枚のVRAMにモデルが収まっている」ことです。GPU0が24GBでモデルが20GBなら1枚で足りるためGPU1は使われません。2枚に分散させるには1枚のVRAMを超えるモデルを選ぶ必要があります。
**問題2: モデルはロードされるが推論速度が遅い**
マルチGPU推論はGPU間PCIe通信が発生するため枚数×速度にはなりません。シングルGPUで収まるモデルを並列リクエストで処理する用途では `OLLAMA_SCHED_SPREAD=1` で複数GPUにリクエストを分散できます。
**問題3: CUDAエラーでOllamaがクラッシュする**
`CUDA error: out of memory` がjournalctlに出る場合はOLLAMA_GPU_OVERHEADを増やします。`CUDA error: device-side assert triggered` はドライバとCUDAのバージョン不一致を疑います。
社内でのローカルLLM導入の前に、既存の複数GPU構成が正常に機能しているかをこの手順で確認しておくと良いでしょう。
まとめ
マルチGPU構成のポイントを整理します。現場インフラエンジニアの多くが「VRAMが足りなくなったらもう1枚積む」という選択をする理由は、より大きなモデルを全レイヤーGPUに乗せられるようになるためです。ただし「増やせば速くなる」ではなく「収まるようになる」が正確な表現です。| やりたいこと | コマンド・設定 |
|---|---|
| 全GPUの一覧とUUIDを確認 | nvidia-smi -L |
| GPU別の空きVRAMを確認 | nvidia-smi --query-gpu=index,name,memory.total,memory.free --format=csv,noheader |
| モデルのGPU配置を確認 | ollama ps |
| GPU別メモリ使用量を確認 | nvidia-smi --query-gpu=index,name,memory.used --format=csv,noheader |
| 使用GPUをインデックスで指定 | override.confに Environment="CUDA_VISIBLE_DEVICES=0,1" |
| GPU予約VRAMを設定 | override.confに Environment="OLLAMA_GPU_OVERHEAD=1073741824" |
| リアルタイムGPU使用率を確認 | nvidia-smi dmon -d 1 -s um |
| Ollamaのレイヤー分散状況を確認 | sudo journalctl -u ollama -n 100 | grep -i "gpu\|layer" |
マルチGPU環境でのOllama実機ハンズオンを2日間で体験する
本記事で解説した複数GPU構成・nvidia-smiによる監視・VRAM最適化の手順を、実機GPUサーバーで手を動かしながら確認したい方向けに、「ローカルAIマスターセミナー」を開催しています。
少人数(最大8名)ZOOMハンズオン形式で実施しています。
・Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
・社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
・ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:OllamaをインターネットなしのLinuxサーバーで運用する方法|エアギャップ環境でのモデル配布・オフライン構築手順
- この記事の属するカテゴリ:ローカルLLMへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます