NVIDIA DGX Spark (GB10) 向け vLLM + DFlash/DDTree 手順書

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-dtypeauto (BF16)。DFlash は non-causal attention を使用するため。

6. よくあるトラブルシューティング

エラー 原因 対処法
CUDA OOM MAX_MODEL_LEN が大きすぎる 0.4532768 に下げる、または 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_NAMEcurl /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. 主要リソースと参照


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}'

コメント

タイトルとURLをコピーしました