Dell Pro MAX with GB10 (Grace Blackwell) で Qwen3-Coder-30B-A3B-Instruct-FP8 の ベアメタル推論への茨の道:次の記事が完全版

ベアメタルで Qwen3-Coder-30B-A3B-Instruct-FP8 を(Qwen3-Next-80B-A3B-Instruct-FP8 も)動作させた!(動いただけだったけど)

Dell GB10 (Grace Blackwell) を設定:ベアメタルFP8推論への茨の道

【第一部】実録:開発ストーリー

~なぜ我々はDockerを捨て、茨の道を選んだのか~

はじめに:

先日Dell Pro Max GB10 を入手しました。NVIDIAの最新アーキテクチャ **Grace Blackwell ** を搭載した、マシンです。

我々の目的はシンプルだった。「このマシンで、FP8(8ビット浮動小数点) のLLMを動かしたい」。

NVIDIA公式の推奨は「Dockerコンテナ(NGC)」を使うことだ。確かにそれは楽ですが。我々はハードウェアの性能を極限まで引き出したいエンジニアです。仮想化レイヤーを挟まず、OS(Ubuntu)上で直接動く 「ベアメタル環境」 こそが正義だと信じていました。そこで ベアメタルで動かそうと Gemini とともに検討を開始です。

だが、そこには 「CUDA 13 の壁」「ARM64アーキテクチャの罠」 が待ち受けていた。これは、最新すぎてインターネットにも情報がない荒野を開拓した、数時間の戦いの記録だそうです(笑)。

第一章:安易なハックと敗北

最初は楽観的だった。「pip install vllm で入るだろう」。甘かった。 GB10にプリインストールされていたのは CUDA 13.0。しかし、世の中のライブラリ(vLLMやPyTorch)は、まだ CUDA 12.x が主流だ。

インストーラーは叫ぶ。「libcudart.so.12 が見つからない!」。 Geminiはここで。シンボリックリンクによる偽装工作をすすめてきました。

「CUDA 13 のライブラリに so.12 という名札を付ければ騙せるのでは?」

ln -s /usr/local/cuda-13.0/.../libcudart.so libcudart.so.12 # ← 悪魔の囁き

結果は無惨だった。Pythonは騙せても、バイナリレベルの互換性(ABI)までは誤魔化せない。当然です。。 謎の Segmentation faultSymbol lookup error が多発し、環境は汚染され、敗北しました。

第二章:DeepResearch という「武器」

で仕方ないので、小手先のハックをする Geminiに情報を与え、正面から 「CUDA 13 ネイティブ環境」 を構築してもらおうと。 ここで AI Agent (Gemini) の DeepResearch を投入し、徹底的な調査を行った。判明した事実は以下の通りだ。

  1. PyTorch Nightly の存在: 安定版はダメだが、Nightly(開発版)なら CUDA 13 対応バイナリが存在する。
  2. SBSA (Server Base System Architecture) の罠: Grace CPU (ARM64) は、通常のx86とはライブラリの配置場所が違う(targets/sbsa-linux/lib)。パスを通さないと永遠にライブラリが見つからない。
  3. Blackwell 専用フラグ: vLLM をビルドする際、TORCH_CUDA_ARCH_LIST="10.0;12.0" を指定しないと、GB10の性能を引き出すカーネルがコンパイルされない。

第三章:依存関係地獄(Dependency Hell)

「正解」は見えた。しかし、実装は一筋縄ではいかなかった。

vLLM をソースコードからビルドしようとすると、pip の依存解決機能が「親切心」で邪魔をする。 「vLLM は PyTorch 2.9.1 が必要ですよ。あなたが手動で入れた 最新の PyTorch 2.11 (CUDA 13版) はアンインストールしておきますね!」

「やめて!!」

画面には無情にも Successfully uninstalled torch-2.11... の文字。ビルドが終わって起動してみれば、勝手にインストールされた古い PyTorch (CUDA 12版) が、GB10 の GPU を認識できずにエラーを吐く。

で。pip のオプション指定 --no-build-isolation でビルド環境を固定し、--no-deps で依存関係のチェックを強制停止させることにしました。 「バージョンの整合性? 知ったことか。動く組み合わせはこれしかないんだ!」とでも Gemini は思っていたようです。まぁまずは動かそうと!

最終章:起動、そして勝利

長いコンパイル時間の末、ビルドが完了。 緊張しながらサーバー起動コマンドを叩く。

  INFO: Using FLASHINFER attention backend  
  INFO: Using fp8 data type to store kv cache  
  INFO: Device: NVIDIA GB10  

出た。Blackwell 専用カーネル がロードされ、FP8 キャッシュ が有効化された。 チャットを投げかけると、爆速返答が帰ってくる。Docker のオーバーヘッドなし、ベアメタル直結の純粋なパワー。

と書いてあるけど、それ程でもなく、ただベアメタル環境で、問題なく vLLM を動かすことができました。 そして、 同じ環境で Qwen3-Next-80B-A3B-Instruct-FP8 も問題なく動かすことができました。ただこちらの環境はメモリ制約が多く、トークン数の上限設定を厳しくするしかなく、そうなると利用しようとしている OpenCode、( https://opencode.ai/ja ) で、32k ないとダメと怒られ、 80B をあきらめることにしました。でも動くし!!

こうして我々は GB10 で vLLM を問題なく動かせるようになりました。 この記録が、誰かの参考になることを願っています。


【第二部】構築手順書

Dell GB10 (Grace Blackwell) ベアメタルFP8推論環境

Dockerを使用せず、Ubuntu環境へ直接 vLLM をインストールし、FP8モデルを動作させるための手順です。

0. 前提環境

1. 環境変数の設定(.bashrc)

Grace CPU (ARM64) 特有のライブラリパスを通します。これを設定しないとビルドに失敗します。

  # ~/.bashrc に以下を追記して `source ~/.bashrc` を実行
  export CUDA_HOME=/usr/local/cuda-13.0
  export PATH=$CUDA_HOME/bin:$PATH
  # SBSA(ARM64)用パスと標準パスの両方を網羅する
  export LD_LIBRARY_PATH=$CUDA_HOME/targets/sbsa-linux/lib:$CUDA_HOME/lib64:$LD_LIBRARY_PATH
  export LIBRARY_PATH=$CUDA_HOME/targets/sbsa-linux/lib:$LIBRARY_PATH
  export CPATH=$CUDA_HOME/targets/sbsa-linux/include:$CPATH

2. コンパイラとツールの準備

Blackwell環境で安定動作する GCC 12 を導入します。

  sudo apt update
  sudo apt install -y gcc-12 g++-12 build-essential cmake ninja-build git python3-venv

3. Python仮想環境の構築

クリーンな環境を作成し、GCC 12 を強制的に使用する設定を行います。

  # 環境作成
  python3 -m venv ~/vllm-env
  source ~/vllm-env/bin/activate
  pip install --upgrade pip

  # GCC 12 を利用するための環境変数をセット
  export CC=/usr/bin/gcc-12
  export CXX=/usr/bin/g++-12
  export CUDAHOSTCXX=/usr/bin/g++-12

4. PyTorch (CUDA 13 Nightly) のインストール

最重要ステップです。 標準の pip ではなく、CUDA 13 に対応した Nightly ビルドを指定します。

  # 依存ツール
  pip install numpy packaging wheel setuptools setuptools_scm

  # PyTorch Nightly (CUDA 13) のインストール
  pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu130

  # 確認(ここで "13.0" と "GB10" が出ること)
  python3 -c "import torch; print(f'CUDA: {torch.version.cuda}, Device: {torch.cuda.get_device_name(0)}')"

5. vLLM のソースビルド

pip による自動ダウングレードを防ぐため、オプションを設定してビルドします。

  # ソース取得
  git clone https://github.com/vllm-project/vllm.git
  cd vllm

  # Blackwell最適化フラグの設定
  export TORCH_CUDA_ARCH_LIST="10.0;12.0;12.1"
  export VLLM_USE_FLASHINFER=1
  export MAX_JOBS=32
  export NVCC_THREADS=2

  # 依存関係チェックを無視して強制ビルド
  # ※ --no-deps が重要。これを付けないとPyTorchが勝手に古い版に戻される。
  pip install -e . --no-build-isolation --no-deps

6. サーバー起動

FP8 機能を有効化して起動します。

  vllm serve Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8 \
    --quantization fp8 \
    --gpu-memory-utilization 0.9 \
    --kv-cache-dtype fp8 \
    --enforce-eager \
    --trust-remote-code \
    --host 0.0.0.0 \
    --port 8000

--enforce-eager は初回動作確認用です。安定動作が確認できれば外すことで、CUDA Graph による更なる高速化が見込めます。 80B ではメモリ不足でダメでしたが 30B で試したら少し不安定だったので、私はこれを外さないで運用することとしました。

でもなんだか遅い気もして、これが後に続きました。この時は、動いただけで喜んでいましたが、5 tokens/s とかで、Gemini が爆速と言ってたのを、そうなのかな~と思ってました。