Ollama使用時に発生する「CUDA error: out of memory」問題の完全解決ガイド
はじめに:どんな問題が発生するか
OllamaでLLMを実行際に、最も発生する可能性が高いエラーが「CUDA error: out of memory」です。OllamaのGitHub Issuesを確認すると、VRAMが十分にあるにもかかわらずメモリ不足エラーが発生するケースが複数報告されています。
代表的な症状は以下の通りです:
- モデルが正常にロードされるが、プロンプト送信直後にエラー発生
- 複数モデル使用時にメモリが解放されず、最終的にOOM発生
- マルチGPU環境で1つのGPUのみを使用し、メモリ不足で失敗
- 大きなコンテキストサイズ(num_ctx)を設定すると発生する
結論:的主要原因と解決策
GPUメモリ不足の主な原因は以下の5点です:VRAM消費の他のプロセスの存在、環境変数によるメモリ管理不到位コンテキストウィンドウサイズの設定過ぎ大、モデルの並列読み込み設定不当、Docker利用時のVRAM認識問題。環境変数(OLLAMA_MAX_VRAM、OLLAMA_KEEP_ALIVEなど)の適切な設定で大部分の問題を解決可能です。
具体的な解決手順
手順1:VRAM使用状況を確認する
まず、現在のGPUメモリ使用状況を確認します:
# NVIDIA GPUの場合
nvidia-smi
# AMD GPUの場合
amd-smi
他のプロセスがVRAMを使用していないか確認します。必要に応じて、他のアプリケーションを終了させてVRAMを確保します。
手順2:環境変数でVRAM上限を設定する
Ollamaサーバーを起動する際に、VRAM使用量を制限する環境変数を設定します:
# Dockerを使用しない場合
export OLLAMA_MAX_VRAM=20000 # MB単位、使用GPUのVRAMより少し小さく設定
export OLLAMA_KEEP_ALIVE=-1 # モデルを継続的にメモリに保持(デバッグ用)
export OLLAMA_MAX_LOADED_MODELS=1 # 同時にロードするモデル数
export OLLAMA_NUM_PARALLEL=1 # 並列処理数
# Ollama起動
ollama serve
VRAM消費を控えめにすることで、他のプロセスとの競合を回避できます。
手順3:Docker環境で実行する場合の設定
Dockerを使用する場合は、環境変数をコンテナに渡します:
docker run -d
--gpus=all
-v /usr/share/ollama/.ollama/:/root/.ollama/
-p 11434:11434
-e OLLAMA_KEEP_ALIVE=-1
-e OLLAMA_MAX_VRAM=20000
-e OLLAMA_MAX_LOADED_MODELS=1
-e OLLAMA_NUM_PARALLEL=1
-e OLLAMA_CONTEXT_LENGTH=32768
--name ollama ollama/ollama:latest
プロキシ環境がある場合は、HTTPS_PROXYなどのプロキシ設定も追加で必要です。
手順4:Modelfileでコンテキストサイズを最適化する
コンテキストサイズ(num_ctx)を小さくすることで、VRAM使用量を大幅に削減できます。Modelfileを作成してパラメータを調整します:
# Modelfileを作成
FROM <model-name>:<tag>
PARAMETER num_ctx 4096 # デフォルトより小さく設定
PARAMETER num_gpu 128 # GPU使用率の調整
PARAMETER num_predict 512 # 生成トークン数の上限
# Modelfileを使ってモデルを作成
ollama create my-model -f ./Modelfile
num_ctxを16384や32768に設定しているユーザーは、VRAM不足に陥りやすいので要注意です。
手順5:マルチGPU環境でVRAMを明示的に指定する
複数GPUがある場合でもOllamaが片方のGPUのみを使用する問題があります。その場合は、環境変数で各GPUのVRAMを明示的に設定します:
# 2つのGPUがある場合(各12GB VRAM)
export OLLAMA_MAX_VRAM=12000
# またはGPU IDを明示的に指定
export CUDA_VISIBLE_DEVICES=0,1
ollama serve
補足・注意点
- バージョン依存:Ollama 0.6.4では一部の問題が修正されていますが、古いバージョンでは発生しやすいです。最新バージョンにアップデートすることを推奨します。
- モデルサイズの考慮:VRAM以上のサイズのモデルは読み込めません。例えば24GB VRAMの場合、量子化なしの70Bモデルは動作しません。Q2_KやQ4_0などの量子化モデルを使用してください。
- プロキシ環境:プロキシ環境下ではSSL/TLS関連のエラーが発生する場合があり、環境変数でのプロキシ設定が必要です。
- Windows Subsystem for Linux (WSL):WSL2を使用している場合は、GPUパススルーの設定が必要な場合があります。
- ログの確認:OLLAMA_DEBUG=1を設定すると詳細なログが出力され、問題の原因特定に役立ちます。
参考元
- Ollama not freeing and eventually running out of memory
- CUDA error: out of memory
- Out of memory on AMD multi GPU instance
- cuda error out of memory
- MultiGPU: not splitting model to multiple GPUs