第一步 — 环境要求
| 组件 | 要求 |
|---|---|
| GPU | NVIDIA GB10(DGX Spark 专属),sm_120/sm_121a Blackwell |
| 统一内存 | 128 GB |
| 磁盘空间 | ≥ 80 GB 可用(镜像 ~50GB + 模型 ~23GB) |
| NVIDIA Driver | ≥ 580.x |
| Docker | ≥ 25.x,带 nvidia-container-toolkit |
| OS | Ubuntu 24.04 LTS |
⚠️ 硬件限定:此镜像仅适用于 GB10(sm_121)。H100/A100/RTX 4090 等均不可用。
第二步 — 构建 Docker 镜像
# 克隆仓库
git clone https://github.com/AEON-7/Qwen3.6-NVFP4-DFlash.git
cd Qwen3.6-NVFP4-DFlash
# 构建镜像(约 15-25 分钟)
docker build -t vllm-spark-omni-q36:v1.2 \
--build-arg TORCH_CUDA_ARCH_LIST="12.0a+PTX" \
-f docker/Dockerfile .
⚠️ 关键:
验证构建:
TORCH_CUDA_ARCH_LIST="12.0a+PTX" 是 GB10(SM121)的必要参数,用错架构构建出来的镜像无法运行。
docker images vllm-spark-omni-q36:v1.2
# 预期:虚拟大小 ~50.1 GB
第三步 — 下载模型文件
# 安装 hf CLI
pip install --user "huggingface_hub[hf_transfer]"
export HF_HUB_ENABLE_HF_TRANSFER=1
# 创建工作目录
mkdir -p ~/qwen36-heretic
# 下载 NVFP4 主模型(22 GB,约 5-10 分钟)
huggingface-cli download AEON-7/Qwen3.6-35B-A3B-heretic-NVFP4 \
--local-dir ~/qwen36-heretic/qwen36-nvfp4
# 下载 DFlash drafter(905 MB,gated repo)
huggingface-cli download z-lab/Qwen3.6-35B-A3B-DFlash \
--local-dir ~/qwen36-heretic/qwen36-dflash
⚠️ DFlash 是 gated repo:需要先去 https://huggingface.co/z-lab/Qwen3.6-35B-A3B-DFlash 点击 "Request access"(通常几小时内批准),然后设置
验证下载:
HF_TOKEN 环境变量。
ls -lh ~/qwen36-heretic/qwen36-nvfp4/model.safetensors # ~22 GB
ls -lh ~/qwen36-heretic/qwen36-dflash/model.safetensors # ~905 MB
第四步 — 编写 docker-compose.yml
mkdir -p ~/qwen36-heretic
cat > ~/qwen36-heretic/docker-compose.yml << 'EOF'
services:
vllm:
image: vllm-spark-omni-q36:v1.2
container_name: vllm2
restart: unless-stopped
network_mode: host
environment:
- VLLM_ALLOW_LONG_MAX_MODEL_LEN=1
- TORCH_MATMUL_PRECISION=high
- PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
- NVIDIA_FORWARD_COMPAT=1
- VLLM_TEST_FORCE_FP8_MARLIN=1
volumes:
- /home/nvidia/qwen36-heretic/qwen36-nvfp4:/models/qwen36
- /home/nvidia/qwen36-heretic/qwen36-dflash:/models/qwen36-dflash
command:
- bash
- -c
- |
exec vllm serve /models/qwen36 \
--served-model-name qwen36-35b-heretic qwen36-fast qwen36-deep \
--host 0.0.0.0 --port 30002 \
--tensor-parallel-size 1 \
--dtype auto \
--quantization compressed-tensors \
--max-model-len 131072 \
--max-num-seqs 128 \
--max-num-batched-tokens 65536 \
--gpu-memory-utilization 0.40 \
--enable-chunked-prefill \
--enable-prefix-caching \
--load-format safetensors \
--trust-remote-code \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--reasoning-parser qwen3 \
--speculative-config '{"method":"dflash","model":"/models/qwen36-dflash","num_speculative_tokens":15}' \
--attention-backend flash_attn
ipc: host
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
EOF
第五步 — 启动服务
cd ~/qwen36-heretic
docker compose up -d
# 查看启动进度(约 5-8 分钟)
docker compose logs -f
启动时间线
| 阶段 | 耗时 |
|---|---|
| 模型加载 | ~14 秒 |
| torch.compile | ~95 秒 |
| Encoder cache profiling | ~250 秒 |
| CUDA graph capture | ~9 秒 |
| 总计 | ~6 分钟 |
💡 提示:后续重启因编译缓存命中,启动时间会缩短至 ~3 分钟。
第六步 — 验证与测试
# 健康检查
curl -s http://localhost:30002/health
# 查看注册模型
curl -s http://localhost:30002/v1/models
# 聊天测试
curl -s http://localhost:30002/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "qwen36-fast",
"messages": [{"role":"user","content":"1+1=?"}],
"max_tokens": 64,
"temperature": 0
}'
关键参数说明
| 参数 | 值 | 原因 |
|---|---|---|
VLLM_TEST_FORCE_FP8_MARLIN | 1 | SM121 CUTLASS GEMM 有 Bug,不用此环境变量会导致 cudaErrorIllegalAddress 崩溃 |
--gpu-memory-utilization | 0.40 | 约占用 23 GiB 显存,为其他服务预留空间 |
--max-model-len | 131072 | 0.4 利用率下 262K 上下文会 OOM,131K 刚好 |
--speculative-config | DFlash k=15 | 投机解码,Draft 接受率 20-30% 为正常 |
--quantization | compressed-tensors | NVFP4 格式专用量化方式 |
--attention-backend | flash_attn | DFlash 必须使用 FlashAttention 后端 |
性能数据
测试环境:DGX Spark GB10,显存利用率 0.40,131K 上下文,temperature=0
单并发(500 token)
| 次数 | Tokens | 耗时 | 速度 |
|---|---|---|---|
| 1 | 500 | 6.5s | 77.5 tok/s |
| 2 | 500 | 6.6s | 75.5 tok/s |
| 3 | 500 | 6.9s | 72.8 tok/s |
并发压力测试
| 并发 | 批处理耗时 | 总吞吐 |
|---|---|---|
| 1 | ~6.8s | 72 tok/s |
| 4 | ~13.3s | 150 tok/s |
| 8 | ~17.9s | 224 tok/s |
常见问题
1. KV Cache 内存不足 OOM
ValueError: ... KV cache is needed, which is larger than the available ...
降低 --max-model-len(如 131072)或提高 --gpu-memory-utilization(如 0.55)。
2. DFlash drafter 下载 401
DFlash 是 gated repo。先去 HF 页面申请访问权限,设置 HF_TOKEN 环境变量后重试。
3. 运行时 cudaErrorIllegalAddress
确认环境变量 VLLM_TEST_FORCE_FP8_MARLIN=1 已设置。这是 SM121 平台的必须配置。
4. 镜像构建失败
确认 TORCH_CUDA_ARCH_LIST="12.0a+PTX",且磁盘空间 ≥ 35 GB。
5. 端口冲突
如果目标端口已被占用,先停止旧容器再启动新的:
docker stop old_container && docker rm old_container
管理命令
# 查看日志
docker logs -f vllm2
# 重启
cd ~/qwen36-heretic && docker compose restart
# 停止
docker compose down
# 查看资源占用
docker stats vllm2 --no-stream
← 返回 DGX Spark 教程列表