NVIDIA DGX Spark (GB10) 向け vLLM + DFlash/DDTree 手順書
最終更新日: 2026年4月25日
対象ハードウェア: NVIDIA DGX Spark (GB10, Blackwell SM121, 128 GB 統合メモリ, 273 GB/s LPDDR5X)
対象ソフトウェア: vLLM ≥ v0.19.0, DFlash v1.x, DDTree (開発中/POC段階)
1. 概要:DFlash と DDTree って何?
1.1 DFlash(Block Diffusion Speculative Decoding)
論文: arXiv:2602.06036 (Z Lab, ICLR 2026)
DFlash は、小さなドラフトモデルを使ってブロック単位で拡散処理を実行し、複数のトークンを並列にドラフトする speculative decoding 手法です。
- ドラフト: 軽量 drafter(例: Qwen3.6-35B-A3B → z-lab/Qwen3.6-35B-A3B-DFlash, 0.5B params)が、ターゲットモデルの中間層([1, 16, 31, 46, 61])からの hidden states を消費し、次ブロックのトークン分布を 1回の forward pass で生成
- 検証: ターゲット大規模モデルが全ドラフトトークンを 1回の forward pass で並列検証(bidirectional attention)
- vLLM 実装: PR #36847 (2026年3月Merge済み, v0.19.0~) に同梱
性能目安 (DGX Spark GB10 / Qwen3.5-27B):
| プロンプト種別 | スループット | 倍率 |
|—|—|—|
| Code(アルゴリズム)| ~64 tok/s | ~2.1× |
| Reasoning(数学) | ~54 tok/s | ~2.0× |
| Dialogue | ~38 tok/s | ~1.5× |
| Prose | ~29.5 tok/s | ~1.3× |
1.2 DDTree(Diffusion Draft Tree)
論文: arXiv:2604.12989
リポジトリ: github.com/liranringel/ddtree
DDTree は DFlash の上に構築された改良手法。ドラフトモデルの出力を「単一パス」ではなく「ドラフトツリー」に変換し、ターゲットモデルで 1回の forward pass + tree attention でツリー全体を検証する。
- コアアイデア: ドラフト分布から best-first heap algo で最も確率の高い分岐を優先的に拡張 → ツリー構築
- 検証: tree attention (ancestor-only mask) で全ブランチを並列検証
- vLLM 実装状況: Feature Request #40809 (2026年4月24日、未実装・POC段階)
- GB10 での実績: Mitko Vasilev が vLLM fork で POC 実装し、Qwen3.5-27B AWQ + GB10 で 80+ tok/s を報告
2. DGX Spark 環境要件
| 項目 | 要件 |
|---|---|
| GPU | NVIDIA Blackwell (SM120 / SM121) — GB10, B200/GB200 |
| メモリ | ≥ 64 GB free(DGX Spark = 128 GB unified) |
| ディスク | ≥ 50 GB: 画像 18 GB + モデル 20 GB + drafter ~4 GB + cache |
| NVIDIA driver | ≥ 580.x(GB10 サポート) |
| Docker | ≥ 25.x + nvidia-container-toolkit |
| Python | ≥ 3.12 |
| CUDA | 13.0 toolkit (nvcc --version で確認) |
動作しない hardware: H100/H200 (Hopper), A100 (Ampere), L40/L4, RTX 40-series。NVFP4 tensor cores は Blackwell 専用。
3. DFlash + vLLM のセットアップ手順
ステップ 1: モデルのダウンロード(約20 GB)
pip install "huggingface_hub[cli]"
huggingface-cli download \
AEON-7/DFlash-Qwen3.5-27B-Uncensored-NVFP4 \
--local-dir /models/DFlash-Qwen3.5-27B-Uncensored-NVFP4
または Qwen3.6-35B-A3B 系:
huggingface-cli download Qwen/Qwen3.6-35B-A3B \
--local-dir /models/Qwen3.6-35B-A3B
# Drafter は初回起動時に自動ダウンロード (~4 GB)
# huggingface-cli download z-lab/Qwen3.6-35B-A3B-DFlash
ステップ 2: vLLM コンテナのビルド / ビルド済みイメージ取得
方法 A(推奨): ビルド済みイメージを使用
docker pull ghcr.io/aeon-7/vllm-dflash:latest
# または NVIDIA NGC:
# docker pull nvcr.io/nvidia/vllm:<latest_version> # ex: 26.02-py3
方法 B: vLLM をソースからビルド(aarch64 / Blackwell 向け)
# CUDA 13.0 の設定
export CUDA_HOME=/usr/local/cuda-13.0
export PATH="$CUDA_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$CUDA_HOME/lib64:$LD_LIBRARY_PATH"
# PyTorch cu130 インストール (aarch64 wheels 存在)
uv venv .venv --python 3.12
source .venv/bin/activate
uv pip install torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu130
# vLLM nightly (DFlash 含む)
uv pip install -U vllm --extra-index-url https://wheels.vllm.ai/nightly/cu130
# FlashInfer / build deps
uv pip install wheel ninja cmake
# Blackwell 向け
export TORCH_CUDA_ARCH_LIST="12.1a"
export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas
ステップ 3: DFlash を有効化して vLLM サーバーを起動
Docker + DFlash (AEON-7 ビルド済みイメージ):
export VLLM_API_KEY=$(openssl rand -hex 32)
echo "VLLM_API_KEY=$VLLM_API_KEY" >> ~/.bashrc
docker run -d --name vllm-dflash \
--gpus all --network host --ipc host \
--ulimit memlock=-1:-1 \
-v /models/DFlash-Qwen3.5-27B-Uncensored-NVFP4:/models/target:ro \
-e MODEL_PATH=/models/target \
-e SERVED_MODEL_NAME=qwen35-dflash \
-e DFLASH_DRAFTER=z-lab/Qwen3.5-27B-DFlash \
-e DFLASH_NUM_SPEC_TOKENS=15 \
-e MAX_MODEL_LEN=65536 \
-e MAX_NUM_SEQS=16 \
-e MAX_NUM_BATCHED_TOKENS=32768 \
-e GPU_MEMORY_UTILIZATION=0.85 \
-e ATTENTION_BACKEND=flash_attn \
-e VLLM_API_KEY=$VLLM_API_KEY \
ghcr.io/aeon-7/vllm-dflash:latest
CLI / Docker 非依存 (vLLM ≥ v0.19.0 で公式 DFlash 対応):
vllm serve Qwen/Qwen3.6-35B-A3B \
--speculative-config '{"method": "dflash", "model": "z-lab/Qwen3.6-35B-A3B-DFlash", "num_speculative_tokens": 15}' \
--attention-backend flash_attn \
--max-num-batched-tokens 32768 \
--gpu-memory-utilization 0.85 \
--max-model-len 65536 \
--quantization fp8 \
--tensor-parallel-size 1
# Blackwell + NVFP4 モデル用:
vllm serve Qwen/Qwen3.6-35B-A3B \
--speculative-config '{"method": "dflash", "model": "z-lab/Qwen3.6-35B-A3B-DFlash", "num_speculative_tokens": 15}' \
--attention-backend flash_attn \
--max-num-batched-tokens 32768 \
--gpu-memory-utilization 0.45 \
--max-model-len 262144 \
--kv-cache-dtype auto \
--quantization fp8 \
--tensor-parallel-size 1
CLI (vLLM < v0.19.0 の旧フォーマット):
vllm serve Qwen/Qwen3-8B \
--speculative-config '{"num_speculative_tokens": 15, "method":"dflash", "model":"z-lab/Qwen3-8B-DFlash-b16"}' \
--attention-backend flash_attn \
--max-num-batched-tokens 32768
ステップ 4: サーバーのウェットアップとテスト
ヘルスチェック待機:
until curl -sf http://localhost:8000/health; do sleep 10; done
echo "server up"
ウォーミング (初回リクエストは ~30 秒かかる):
for i in 1 2 3; do
curl -sf -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $VLLM_API_KEY" \
-d '{"model":"qwen35-dflash","messages":[{"role":"user","content":"hi"}],"max_tokens":16,"temperature":0}' \
> /dev/null && echo "warmup $i ok"
done
実際の推論:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $VLLM_API_KEY" \
-d '{
"model": "qwen35-dflash",
"messages": [{"role":"user","content":"Write a binary search in Python with type hints."}],
"max_tokens": 256,
"temperature": 0
}'
4. DDTree の組み込み(POC / 開発中)
注意: DDTree の vLLM 公式サポートはまだ PR #40809 (2026年4月24日) の feature request 段階です。以下は Mitko Vasilev による POC fork や Community リポジトリに基づく手動手順です。
4.1 DDTree の概念的理解
DDTree は DFlash にさらに一歩進めた手法です:
| DFlash | DDTree | |
|---|---|---|
| ドラフト構造 | 単一行 (Linear) | ツリー (Tree) |
| 検証方法 | 1回の forward pass で単一パス | tree attention + 1回の forward pass |
| 採用率 | ~60~78% (context 依存) | さらに高くなる (期待値) |
| メモリ追加 | なし | ドラフトツリー分の少量 VRAM |
[root/bonus]
/ | \
[A] [B] [C] ← 確率の高い分岐
/ \ |
[D] [E] [F] ← best-first で拡張
全ノードを tree attention + 1回の forward pass で検証
4.2 DDTree + DFlash の vLLM コマンド(テンプレ)
v0.19+ で公式 merge された際に以下のようになる(現在まだ POC 段階):
# DDTree は method フラグで切り替える予定
vllm serve Qwen/Qwen3.6-35B-A3B \
--speculative-config '{"method": "ddtree", "model": "z-lab/Qwen3.6-35B-A3B-DDTree", "num_speculative_tokens": 15}' \
--attention-backend flash_attn \
--max-num-batched-tokens 32768 \
--gpu-memory-utilization 0.45 \
--max-model-len 262144 \
--kv-cache-dtype auto \
--quantization fp8
# DFlash と同じ vLLM コマンド(DDTree はドラフトモデル名のサフィックスで判別される可能性あり)
vllm serve Qwen/Qwen3.6-35B-A3B \
--speculative-config '{"method": "dflash", "model": "z-lab/Qwen3.6-35B-A3B-DDTree", "num_speculative_tokens": 15}' \
--attention-backend flash_attn \
--max-num-batched-tokens 32768
4.3 vLLM DDTree POC コードのビルド方法(参考: ddtree.py)
ソースから DFlash + DDTree 機能を有効にした vLLM をビルドする手順:
# vLLM リポジトリを clone(DFlash サポートブランチまたは main)
git clone https://github.com/vllm-project/vllm.git
cd vllm
# ddTree サポートが必要な場合は Mitko Vasilev の fork から
# git clone https://github.com/mitkox/vllm-turboquant.git
# DFlash 実装本体
# vllm/v1/spec_decode/dflash.py
# vllm/models/qwen3_dflash.py
# Blackwell + DFlash 向けにビルド
export CUDA_HOME=/usr/local/cuda-13.0
export TORCH_CUDA_ARCH_LIST="12.1a"
export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas
export MAX_JOBS=16
# FlashInfer 等の依存を先にインストール
uv pip install -e ".[flashinfer]"
# vLLM を editable モードでビルド
uv pip install wheel ninja cmake
uv pip install -e . --no-build-isolation
5. DGX Spark 用パラメータ最適リファレンス
5.1 Qwen3.6-35B-A3B (GB10 向け推奨値)
| パラメータ | 推奨値 | 説明 |
|---|---|---|
--gpu-memory-utilization |
0.45 |
GPU メモリ使用量(FP8 MoE, ~43 GiB) |
--max-model-len |
262144 |
最大シーケンス長 (262K context) |
--tensor-parallel-size |
1 |
シングル GPU |
--kv-cache-dtype |
auto |
DFlash 用 (BF16 必須, non-causal attention のため) |
--quantization |
fp8 |
FP8 MoE quantization |
--attention-backend |
flash_attn |
Flash Attention(DFlash 非因果 attention が必要) |
| DFLASH_DRAFTER | z-lab/Qwen3.6-35B-A3B-DFlash |
ドラフトモデル |
| DFLASH_NUM_SPEC_TOKENS | 15 |
speculative トークン数 |
5.2 Qwen3.5-27B (AEON-7 NVFP4 向け)
| パラメータ | 推奨値 | 説明 |
|---|---|---|
GPU_MEMORY_UTILIZATION |
0.85 |
GPU メモリ使用量 |
MAX_MODEL_LEN |
65536 |
最大シーケンス長 |
MAX_NUM_SEQS |
16 |
並列シーケンス数 (c=8+ に最適) |
MAX_NUM_BATCHED_TOKENS |
32768 |
scheduler トークン予算 |
5.3 DDTree + DFlash 複合ケース(理論値)
- expected throughput: 80+ tok/s (GB10 / Qwen3.5-27B AWQ, 報告値)
- 追加 VRAM: ドラフトツリー分の少量
--kv-cache-dtypeはauto(BF16)。DFlash は non-causal attention を使用するため。
6. よくあるトラブルシューティング
| エラー | 原因 | 対処法 |
|---|---|---|
| CUDA OOM | MAX_MODEL_LEN が大きすぎる |
0.45 や 32768 に下げる、または TurboQuant 有効化 |
| First request ~30s | DGraph specialization (初回のみ) | ウォーミングを1~3回実行してからベンチマーク |
| Server hang on start | ブラックウェル非対応 GPU | SM120/SM121 を確認。Ampere/Hopper では不可 |
Model not found (404) |
model name の不一致 | SERVED_MODEL_NAME を curl /v1/models で確認 |
sm_121a architecture not recognized |
LLVM パッチ未適用 | Blackwell 向け LLVM サポートを適用 |
| DFlash acceptance rate が低い | コンテンツ依存性 (prose) | コード/数学プロンプトでより効果的 |
Cannot copy between CPU and CUDA tensors |
未パッチ TurboQuant | mitkox/vllm-turboquant fork を使用 |
7. DDTree の内部動作概要(参考)
┌──────────────────────────────────────────────────────────┐
│ DDTree Round (1回) │
├──────────────────────────────────────────────────────────┤
│ 01. Draft Model: diffusion forward for next block │
│ → per-position distributions (トークン確率分布) │
│ │
│ 02. Build Tree: best-first heap でノイズ抽出 │
│ → node_budget B 以下で最も log-prob 高い順に拡張 │
│ → ドラフトツリー完成 │
│ │
│ 03. Target Model: tree attention + 1 forward pass │
│ → ancestor-only mask で全ブランチ並列検証 │
│ → longest matching prefix を採用 │
│ │
│ 04. Unmatched token → next bonus token │
│ → KV cache compaction │
└──────────────────────────────────────────────────────────┘
DDTree vs DFlash の違い:
– DFlash: per-position distribution → 単一行ドラフト → 1 pass 検証
– DDTree: per-position distribution → ツリードラフト → tree attention + 1 pass 検証
8. GPU メモリ管理(TB / DDTree + FlashInfer)
8.1 TB / KV Cache 設計
DDTree は DFlash の上に構築されているため、KV cache メモリの使い方は DFlash と同様:
– --kv-cache-dtype auto: DFlash は non-causal attention を使用するため BF16 が必須
– DDTree 追加分: ドラフトツリーノード分の少量追加 VRAM(GB10 の 128 GB unified メモリで十分)
8.2 FlashInfer の KV Cache 最適化
# FlashInfer を通した KV Cache 最適化 (FlashInfer MOE FP8)
export VLLM_USE_FLASHINFER_MOE_FP8=1
export VLLM_ATTENTION_BACKEND=FLASHINFER
9. パフォーマンス比較(DGX Spark GB10)
| 構成 | スループット | 倍率 |
|---|---|---|
| baseline (speculation なし) | ~20~30 tok/s | 1.0× |
| DFlash (Qwen3.5-27B, code) | ~64 tok/s | ~2.1× |
| DFlash (Qwen3.5-27B, prose) | ~29.5 tok/s | ~1.3× |
| DDTree+DFlash (POC, Qwen3.5-27B) | 80+ tok/s | ~2.7~4.0× (期待値) |
10. 主要リソースと参照
- DFlash Paper: arXiv:2602.06036
- DFlash GitHub (z-lab): github.com/z-lab/dflash
- DDTree Paper: arXiv:2604.12989
- DDTree GitHub: github.com/liranringel/ddtree
- vLLM DFlash PR: #36847 (2026年3月Merge, v0.19.0~)
- vLLM DDTree Feature: #40809 (未実装)
- AEON-7 DFlash Docker: github.com/AEON-7/vllm-dflash
- Qwen3.6-35B-A3B-DDTree: github.com/ZengboJamesWang/dgx-spark-vllm-qwen3.6-35b-a3b-dflash
- vLLM Spark Playbook: github.com/NVIDIA/dgx-spark-playbooks
- DFlash on GB10 Forum: forums.developer.nvidia.com/366643
11. まとめコマンド(クイックスタート)
DFlash + Qwen3.6-35B-A3B (簡易版):
# 1. モデル取得
huggingface-cli download Qwen/Qwen3.6-35B-A3B --local-dir /models/qwen36
# 2. vLLM 起動 (v0.19+ で公式 DFlash サポート)
vllm serve /models/qwen36 \
--speculative-config '{"method": "dflash", "model": "z-lab/Qwen3.6-35B-A3B-DFlash", "num_speculative_tokens": 15}' \
--attention-backend flash_attn \
--max-num-batched-tokens 32768 \
--gpu-memory-utilization 0.45 \
--max-model-len 262144 \
--kv-cache-dtype auto \
--quantization fp8
# 3. テスト (Qwen3.5-27B NVFP4 系の場合)
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"qwen35-dflash","messages":[{"role":"user","content":"Test"}],"max_tokens":256,"temperature":0}'

コメント