24GB GPUでのGemma 4 OOM(メモリ不足)エラーの修正
結論:RTX 3090/4090でGemma 4 27Bまたは31Bを読み込む際にCUDAメモリ不足エラーが発生する場合、問題がモデルの重み自体にあることはまれです。ほとんどの場合、制限のないKVキャッシュ、またはOllamaやvLLMでの野心的なコンテキスト長の設定が原因です。
コンテキスト: このガイドは、推論パラメータを調整することで24GBのVRAMにGemma 4 31Bをうまく収めた、X(Twitter)やRedditの開発者からの実際の修正方法を集約しています。
このページの内容
症状
24GB GPUを使用している多くのユーザーが、次のクラッシュシーケンスを報告しています。
- モデルがVRAMに正常に読み込まれる(Q4_K_Mで約18〜20GBを消費)。
- 最初の短いプロンプトは正常に機能する。
- 長いドキュメントを貼り付けたり、チャット履歴が増えたりする。
- 推論エンジンが
CUDA error: out of memoryでクラッシュするか、Ollamaが突然応答を停止する。
根本原因の分析:KVキャッシュの隠れたコスト
量子化された31Bモデルの重みは約19GBのVRAMに収まりますが、アテンションメカニズムはコンテキスト(KVキャッシュ)を保存するためのメモリを必要とします。Gemma 4では、長いコンテキストはメモリ使用量を線形にスケーリングします。コンテキストウィンドウをデフォルトの8kのままにするか、メモリ制限なしで32kに押し上げようとすると、KVキャッシュが24GB VRAMの残りの4〜5GBを即座に消費し、ハードクラッシュを引き起こします。
修正 1:Ollamaでのコンテキストの制限
Ollamaを使用している場合は、モデルの実行時またはAPI呼び出し内でコンテキストサイズ(num_ctx)を明示的に制限する必要があります。
# コンテキストを制限してCLI経由で実行
ollama run gemma4:31b --num_ctx 4096
カスタム Modelfile を使用している場合は、このパラメータを追加します。
FROM gemma4:31b
PARAMETER num_ctx 4096
修正 2:vLLMでのGPUメモリ使用率の管理
より高いスループットのためにvLLM経由で展開している場合、vLLMのデフォルトの動作は、GPUメモリの90%を事前に予約することです。24GBカード上のGemma 4 31Bの場合、この積極的な予約はOSのオーバーヘッドと競合することがよくあります。
gpu-memory-utilization フラグを明示的に下げる必要があります。
python -m vllm.entrypoints.openai.api_server \
--model google/gemma-4-27b-it \
--quantization awq \
--gpu-memory-utilization 0.85 \
--max-model-len 4096