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 fault や Symbol lookup error が多発し、環境は汚染され、敗北しました。
第二章:DeepResearch という「武器」
で仕方ないので、小手先のハックをする Geminiに情報を与え、正面から 「CUDA 13 ネイティブ環境」 を構築してもらおうと。 ここで AI Agent (Gemini) の DeepResearch を投入し、徹底的な調査を行った。判明した事実は以下の通りだ。
- PyTorch Nightly の存在: 安定版はダメだが、Nightly(開発版)なら CUDA 13 対応バイナリが存在する。
- SBSA (Server Base System Architecture) の罠:
Grace CPU (ARM64) は、通常のx86とはライブラリの配置場所が違う(
targets/sbsa-linux/lib)。パスを通さないと永遠にライブラリが見つからない。 - 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. 前提環境
- Hardware: Dell Pro Max GB10 (NVIDIA Grace Blackwell)
- OS: Ubuntu 24.04 (ARM64/aarch64)
- Driver/CUDA: NVIDIA Driver & CUDA 13.0 (Pre-installed)
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 が爆速と言ってたのを、そうなのかな~と思ってました。