エラーメッセージ
ついに強力な新しいモデルをダウンロードしましたが、実行しようとした瞬間にOllamaがクラッシュしてしまいます。チャットのプロンプトが表示される代わりに、ターミナルに次のようなテキストの壁が表示され、最後はこう締めくくられています:
CUDA out of memory. Tried to allocate [X] MiB (GPU 0; [Y] GiB total capacity; [Z] MiB already allocated; [W] MiB free; ...)
なぜGPUが悲鳴を上げているのか
Ollamaは、高速でほぼ瞬時のレスポンスを提供するために、大規模言語モデル(LLM)全体をGPUのビデオRAM(VRAM)に詰め込もうとします。モデルファイルと、会話に必要な「思考スペース」(コンテキストウィンドウ)の合計が利用可能なVRAMを超えると、CUDAドライバは処理を断念します。これは、8GBのカードで70Bモデルを実行しようとしたり、ブラウザがすでにGPUリソースを占有していたりする場合によく発生するボトルネックです。
ステップ1:VRAMリソースを占有しているものを特定する
Ollamaの設定を微調整し始める前に、他に何がメモリを消費しているかを確認しましょう。ターミナルを開いて次を実行します:
nvidia-smi
下部にある「Processes」テーブルを確認してください。ChromeやEdgeのような最新のブラウザは、タブをレンダリングするだけで500MBから1.5GBのVRAMを使用することがよくあります。同様に、DiscordやSlackのようなアプリもデフォルトでハードウェアアクセラレーションを使用しています。これらのメモリを大量に消費するアプリケーションを閉じ、モデルを再度実行して、ボトルネックが解消されるか確認してください。
ステップ2:より軽量な量子化に切り替える
モデルには「重み」や圧縮レベルの違いがあり、これを量子化(Quantization)と呼びます。8Bモデルの標準的な8ビット(Q8_0)版は9GBのVRAMを必要とする場合がありますが、4ビット(Q4_K_M)版は約5.5GBしか必要としません。Ollamaはデフォルトで4ビットモデルをプルしますが、容量がどうしても足りない場合はさらに低い設定にすることも可能です。
モデルの高度に圧縮されたバージョンをプルしてみてください:
# 最大限のメモリ節約のために2ビット量子化を試す
ollama run llama3:8b-instruct-q2_K
Q2やQ3のモデルはVRAMの使用量が大幅に少なくなりますが、圧縮率が高いため、AIがエラーを起こしやすくなったり、「ハルシネーション(もっともらしい嘘)」が発生しやすくなったりする可能性があることに注意してください。
ステップ3:コンテキストウィンドウを縮小する
コンテキストウィンドウとは、会話中にモデルが「記憶」できるテキスト量のことです。デフォルトでは、Ollamaは2048または4096トークン分のVRAMを割り当てることがよくあります。Llama 3などの一部のモデルでは、これを8192トークンに増やすと、さらに1〜2GBのVRAMを消費する可能性があります。この制限を減らすことは、モデル自体を変更せずにOOM(メモリ不足)エラーを停止させる最も速い方法です。
メモリ使用量を制限するためにカスタムの Modelfile を作成します:
config.Modelfileという名前のファイルを作成します:
FROM llama3
PARAMETER num_ctx 1024
- 最適化したモデルバリエーションをビルドします:
ollama create llama3-low-vram -f config.Modelfile
- 新しいバージョンを実行します:
ollama run llama3-low-vram
ステップ4:Ollamaにメモリの解放を強制する
Ollamaは、最後のプロンプトから5分間、モデルをVRAMにロードしたまま保持します。これにより、その後のチャットを即座に開始できますが、他のアプリがGPUを使用するのを妨げてしまいます。頻繁にモデルを切り替える場合は、GPUをすぐに解放するようにOllamaに指示するか、一度に保持するモデルの数を制限する必要があります。
Linuxの場合:
systemdサービス設定を変更します:
sudo systemctl edit ollama.service
[Service] ブロックの下に、以下の環境変数を挿入します:
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_KEEP_ALIVE=0"
変更を適用し、サービスを再起動します:
sudo systemctl daemon-reload
sudo systemctl restart ollama
Windowsの場合:
- スタートメニューで「システム環境変数の編集」を検索します。
- 「環境変数」をクリックし、「ユーザー変数」を確認します。
- 新規変数
OLLAMA_MAX_LOADED_MODELSを値1で追加します。 - システムトレイのOllamaアイコンを右クリックして「Quit」を選択し、再起動します。
ステップ5:レイヤーを手動でオフロードする
モデルがGPUに対して数メガバイトだけ大きすぎる場合、通常、OllamaはGPUとCPUの間でワークロードを分割しようとします。この自動プロセスが失敗した場合は、GPUに送るモデルレイヤーの数を手動で制御できます。これにより、処理の大部分をグラフィックスカードに任せつつ、余剰分をシステムRAMにオフロードできます。
Modelfile を num_gpu パラメータで更新します:
FROM llama3
# モデル全体ではなく、20レイヤーのみをGPUに送るように試行
PARAMETER num_gpu 20
低い数値から始めて、徐々に上げていってください。これはバランス調整です。GPUレイヤーが多いほど速度は上がりますが、レイヤーを少なくすることでOOMクラッシュを防ぐことができます。
修正を確認する方法
動作しているかどうかを推測するだけでなく、以下の手順でメモリ使用量をリアルタイムで確認してください:
ollama stop [モデル名]を実行してメモリをフラッシュします。- 新しいターミナルウィンドウを開き、
watch -n 1 nvidia-smiを実行します。 - 元のターミナルで、モデルを開始します:
ollama run llama3。 - Memory-Usage 列を監視します。GPUの総容量(例:8192MB中7200MB使用)よりも十分に低い状態が維持されていれば、最適化は成功です。
VRAM管理を改善するためのプロのヒント
- ドライバの更新: NVIDIAドライバのバージョンが535以上であることを確認してください。新しいドライバはメモリページングをより適切に処理します。
- 限界を知る: VRAMが8GBの場合は、7Bまたは8Bモデルを使用しましょう。14Bモデルの場合、快適に動作させるには12GB以上のVRAM(RTX 3060 12GBなど)が本当に必要です。
- ゴーストプロセスの終了: Ollamaが正常に終了しないことがあります。Linuxでは
pkill ollamaを使用するか、Windowsのタスクマネージャーでollama.exeプロセスを終了して、完全に空のGPUで開始してください。

