【SGLang】起動時のCUDA OOMエラー・torch.cuda.is_available() Falseの解決法

問題の説明:SGLangサーバー起動時のCUDAメモリエラー

SGLangは、大規模言語モデル(LLM)の推論を高速化するためのランタイムです。しかし、特に大規模なモデルやマルチモーダルモデルをロードする際に、CUDA Out of Memory(OOM)エラーに遭遇することがあります。また、環境設定によってはtorch.cuda.is_available()Falseを返し、GPUが認識されない問題も発生します。

これらのエラーは、主に以下の原因で発生します。

  • モデルのVRAM要求量がGPUの物理メモリを超えている。
  • PyTorchのメモリ管理設定が最適化されていない(メモリフラグメンテーション)。
  • CUDAドライバ、PyTorch、CUDA Toolkitのバージョン不一致。
  • テンソル並列(–tp)やメモリ割り当て設定(–mem-fraction-static)の不適切な使用。

本記事では、GitHubのIssueで報告されている実際のトラブルを参考に���これらの問題を解決する具体的な手順を解説します。

結論:解決策の要約

SGLangのCUDA OOMエラーとGPU認識問題は、以下の複数のアプローチを組み合わせることで解決できる可能性が高いです。

  1. 環境変数PYTORCH_CUDA_ALLOC_CONFの設定:メモリフラグメンテーションを防ぎます。
  2. 起動オプション--mem-fraction-staticの調整:GPUメモリの静的な確保割合を制御します。
  3. テンソル並列(--tensor-parallel-size)の活用:モデルを複数GPUに分散してロードします。
  4. CUDA環境の再確認:ドライバ、PyTorch、CUDAのバージョン整合性を確認します。

具体的な手順:コマンド例と設定

1. メモリフラグメンテーション対策

PyTorchはデフォルトでメモリをキャッシュし、断片化(フラグメンテーション)が発生することがあります。これにより、実際に空きがあるにもかかわらずOOMが発生します。環境変数PYTORCH_CUDA_ALLOC_CONFを設定して対策します。

# シェルで設定(Linux/macOS)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

# または、Pythonスクリプト内で設定
import os
os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'expandable_segments:True'

# サーバー起動コマンド例
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True python -m sglang.launch_server 
  --model-path Qwen/Qwen2.5-7B-Instruct 
  --port 30000

この設定により、PyTorchがメモリをより柔軟に管理し、大きな連続メモリブロックの確保に失敗する問題を軽減できます。

2. メモリ割り当ての静的管理 (–mem-fraction-static)

SGLangサーバー起動時に、GPUメモリのうちどれだけを静的に確保するかを指定できます。デフォルトは0.9ですが、他のプロセスとGPUを共有する場合や、OOMが頻発する場合はこの値を下げます。

# メモリの70%を静的に確保する例
python -m sglang.launch_server 
  --model-path Qwen/Qwen3-0.6B 
  --port 8000 
  --mem-fraction-static 0.7 
  --cpu-offload-gb 1

--cpu-offload-gbオプションと組み合わせることで、指定したGB分の重みをCPUにオフロードし、GPUメモリの圧迫をさらに緩和できます。

3. テンソル並列によるマルチGPU活用

単一GPUのメモリ容量では収まらない大規模モデル(例:Qwen3-VL-235B)を実行する場合は、テンソル並列が必須です。--tensor-parallel-size(または--tp)オプションで、使用するGPU数を指定します。

# 8GPUを使用して235BパラメータのVLモデルを実行する例
export SGLANG_VLM_CACHE_SIZE_MB=8192
python -m sglang.launch_server 
  --model-path /path/to/Qwen3-VL-235B-A22B-Instruct 
  --tensor-parallel-size 8 
  --port 30000 
  --host 0.0.0.0 
  --trust-remote-code 
  --context-length 64000 
  --enable-multimodal

この例では、8つのGPUにモデルを分散してロードすることで、単体GPUのメモリ制限を超えるモデルを実行可能にしています。

4. CUDA環境とtorch.cuda.is_available()の確認

torch.cuda.is_available()Falseを返す場合、根本的なCUDA環境に問題があります。以下のコマンドで環境を確認してください。

# Pythonインタラクティブシェルで確認
import torch
print(f"PyTorch Version: {torch.__version__}")
print(f"CUDA Available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"CUDA Version: {torch.version.cuda}")
    print(f"GPU Device: {torch.cuda.get_device_name(0)}")
    print(f"GPU Count: {torch.cuda.device_count()}")

# nvidia-smiでドライバとGPU状態を確認
nvidia-smi

出力結果を確認し、以下の点に不一致がないかチェックします。

  • torch.version.cudaのバージョンと、システムにインストールされているCUDA Toolkitのバージョン。
  • PyTorchがCUDAサポート付きでインストールされているか(pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124など)。
  • NVIDIAドライバのバージョンが十分に新しいか。

よくあるトラブルと対処法

ケース1: 「reserved by PyTorch but unallocated」が大きい

エラーメッセージに「Of the allocated memory XX GiB is allocated by PyTorch, and YY MiB is reserved by PyTorch but unallocated」と表示される場合、メモリフラグメンテーションが疑われます。

対処法: 前述のPYTORCH_CUDA_ALLOC_CONF=expandable_segments:Trueを設定してください。これが最も効果的な解決策です。

ケース2: テンソル並列設定後もOOM

--tensor-parallel-sizeを指定しているのにOOMになる場合、各GPUのメモリ容量が依然として不足しているか、モデルの精度(dtype)が高い(例:float32)可能性があります。

対処法:

  • モデルを量子化(AWQ, GPTQ)したバージョンを使用する。
  • 起動オプションに--dtype bfloat16または--dtype float16を明示的に指定する。
  • 使用するGPU数をさらに増やす(可能であれば)。

ケース3: CPUオフロード使用中にOOM

--cpu-offload-gbを指定しているのにOOMエラーが報告される場合(Issue #6526)、オフロードの処理中に一時的にGPUメモリが逼迫している可能性があります。

対処法:

  • --mem-fraction-staticの値をさらに下げて(例:0.5)、GPUメモリの余裕を増やす。
  • --cpu-offload-gbの値を増やして、より多くの重みをCPUに移す。

参考元

本記事の解決策は、以下のSGLang公式GitHub Issueの実際の議論と解決案に基づいています。

🔧 AI開発におすすめのGPU・パーツ

本記事の手順を快適に進めるための推奨スペック:

⚡ GPU環境をすぐに使いたいなら

ハードウェアの購入・セットアップなしで、すぐにGPU環境を使えるクラウドサービスがおすすめです。

  • RunPod — RTX 4090/A100/H100を即座に利用可能
  • Vast.ai — 最安のGPUクラウド、オークション方式で低コスト
  • RTX 5090をAmazonで見る — 自宅GPU環境を構築するなら
この記事は役に立ちましたか?