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

1. 問題の概要

SGLangサーバーを起動する際、特に大規模言語モデルやマルチモーダルモデルをロードしようとすると、以下の2つの主要な問題に遭遇することがあります。

  • CUDA Out of Memory (OOM) エラー: GPUメモリが不足し、モデルのロードや推論中にtorch.OutOfMemoryError: CUDA out of memory.が発生します。エラーメッセージには、PyTorchによって割り当てられたメモリ量と、断片化により予約されているが未割り当てのメモリ量が表示されることがあります。
  • torch.cuda.is_available() が False を返す: CUDAが利用可能なGPU環境にもかかわらず、PyTorchがCUDAを認識せず、結果的にSGLangがGPUを使用できなくなります。

これらの問題は、モデルサイズが大きい、GPUメモリが不足している、CUDA/PyTorchのバージョン不一致、またはメモリ管理設定が不適切な場合に発生します。

2. 結論(解決策の要約)

OOMエラーを解決するには、--mem-fraction-static--tp(テンソルパラレル)などの起動オプションでGPUメモリ使用量を制限・分散し、環境変数PYTORCH_CUDA_ALLOC_CONFでメモリ断片化を抑制します。torch.cuda.is_available()がFalseになる問題は、CUDA ToolkitとPyTorchのバージョン互換性を確認し、必要に応じて再インストールすることで解決できます。

3. 具体的な手順

3.1 CUDA OOMエラーの解決手順

まず、SGLangサーバー起動コマンドにメモリ制限オプションを追加します。以下は、Qwen3-VLのような超大規模モデルを実行する例です。

# 環境変数でメモリ断片化を防止(検索結果#6082より)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

# サーバー起動コマンド例(検索結果#11382, #6526より)
python -m sglang.launch_server 
  --model-path /path/to/your/model 
  --tensor-parallel-size 8            # 複数GPUがある場合、モデルを分割してロード
  --port 30000 
  --host 0.0.0.0 
  --trust-remote-code 
  --context-length 64000 
  --mem-fraction-static 0.7           # 静的メモリ割り当ての割合を下げ��(検索結果#7918より)
  --cpu-offload-gb 1                   # CPUに一部オフロード(検索結果#6526より)
  --max-total-tokens 1024

主要オプションの説明:

  • --mem-fraction-static 0.7: GPUメモリの70%のみをSGLangが使用するように制限します。デフォルトは高い値(例: 0.9)のため、OOMが起きる場合は0.7や0.8に下げます。
  • --tensor-parallel-size: 利用可能なGPUの数に合わせて設定します。単一GPUの場合は1、マルチGPUなら2以上にします。
  • --cpu-offload-gb 1: 1GBのモデルパラメータをCPUメモリにオフロードし、GPUメモリの圧迫を軽減します。
  • PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True: PyTorchのメモリアロケータに「拡張可能セグメント」を使用させ、メモリ断片化を減らします。

3.2 torch.cuda.is_available()がFalseになる問題の解決手順

この問題は、CUDA ToolkitとPyTorchのバージョン互換性が失われていることが主な原因です。

  1. 現在の環境を確認:
    python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
    nvcc --version  # CUDA Toolkitのバージョン確認
  2. 互換性のあるバージョンに再インストール(検索結果#6197, Stack Overflowより):

    PyTorch公式サイトのGet Startedページで、お使いのCUDAバージョンに対応するインストールコマンドを確認します。例えば、CUDA 12.1を使用している場合:

    # 古いPyTorchをアンインストール(必要に応じて)
    pip uninstall torch torchvision torchaudio
    
    # 互換性のあるバージョンをインストール(例: CUDA 12.1用)
    pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121
    
    # または、検索結果#6197のように特定バージョンを指定
    pip install torch==2.7.0 torchvision==0.22.0

    重要: PyTorchのバージョンとCUDA Toolkitのバージョンは厳密に一致させる必要があります。CUDA 12.8などの最新Toolkitに対して、PyTorchが対応ビルドを提供していない場合があります。

  3. SGLangと依存ライブラリの再インストール:
    # PyTorchインストール後、SGLangと必要なカーネルを再インストール
    pip install "sglang[runtime_common]" sgl-kernel==0.0.9.post2 flashinfer_python==0.2.5

4. よくある関連エラーと対処法

エラー/現象 原因 対処法
--enable-torch-compile使用時にOOM Torch CompileとCUDA Graphが競合し、メモリ使用量が増加(検索結果#7918) 1. --mem-fraction-static 0.7を設定
2. --cuda-graph-max-bsを小さくする(例: 16)
3. --enable-torch-compileオプションを外す
4. --disable-cuda-graphでCUDA Graphを無効化
小さいモデルは動くが大きいモデルでOOM GPUメモリ容量不足、またはメモリ断片化 1. --tensor-parallel-sizeを増やしてマルチGPU化
2. PYTORCH_CUDA_ALLOC_CONF=expandable_segments:Trueを設定
3. モデルを量子化(AWQ, GPTQ)したバージョンを使用
cpu-offload-gb設定時でもOOM オフロード処理自体にオーバーヘッド(検索結果#6526) 1. --cpu-offload-gbの値を増やしてみる(例: 2)
2. オフロードを使用せず、--mem-fraction-staticで制御する
長時間実行後、突然OOM メモリリーク、またはリクエストの蓄積によるメモリ不足 1. --max-total-tokensで同時処理トークン数を制限
2. サーバー再起動スクリプトを用意

5. AIを快適に動かすためのおすすめ環境

ローカルLLMや画像生成AIでエラーを減らし、高速に処理するには、VRAM容量が最も重要です。

6. まとめ

SGLangのCUDA OOMエラーは、--mem-fraction-static--tensor-parallel-sizePYTORCH_CUDA_ALLOC_CONF環境変数を適切に設定することで多くの場合解決できます。torch.cuda.is_available()がFalseになる問題は、PyTorchとCUDA Toolkitのバージョン互換性を第一に疑い、公式サイトから対応する組み合わせで再インストールしましょう。大規模モデルを扱う際は、物理的なVRAM容量が根本的な制約となるため、モデルの量子化やクラウドGPUの利用も検討することをお勧めします。

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

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

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