MiaAI-Lab/Qwen3.8-Flash-Next-Single-DGX-Spark · 上手攻略
- 仓库:MiaAI-Lab/Qwen3.8-Flash-Next-Single-DGX-Spark
- 链接:https://github.com/MiaAI-Lab/Qwen3.8-Flash-Next-Single-DGX-Spark
- 分类:LLM 推理 · vLLM 部署 · DGX Spark
- 作者:Tom
- 更新:2026-09-09
这是什么
一个开箱即用的部署配方(recipe),用于在单台 NVIDIA DGX Spark(GB10,121 GiB 统一内存)上通过 vLLM 服务 Qwen3.8-Flash-Next-NVFP4 大模型。
核心工程挑战:Qwen3.8-Flash-Next 原版 FP8 权重约 135 GB,单台 Spark 只有 128 GB 统一内存,直接跑会 OOM。这个配方通过 NVFP4 量化(NVIDIA 官方出品)+ PLE 表(专家路由表)offload 到 NVMe + mmap,把显存占用压到 ~76 GB 活跃权重 + KV cache,完整塞进一台 Spark。Vision-Language Model,支持文本、图片、视频输入。
解决什么问题
- 想在一台 DGX Spark(不额外借助多机 TP)上跑 Qwen3.8-Flash-Next 而不想自己折腾量化 + 内存分配
- 需要在 Spark 上跑 Code Agent 场景(coding harness),要求 512k 超长上下文
- 想用 vLLM 的 OpenAI-compatible API 快速接入现有 Agent 框架
快速安装
前提:DGX Spark 机器,~130 GiB 可用磁盘空间(99 GiB checkpoint + ~27 GiB PLE 表首次构建)
# 1. 复制环境配置
cp .env.sample .env
# 编辑 IMAGE / HF_TOKEN(如需)
# 2. 下载模型(约 99 GiB,可续传)
./download.sh
# 3. 启动服务(首次约 10-12 分钟到 /health)
./start.sh
# 4. 服务在 :8888 就绪
# 停止
./stop.sh
关键 env 参数(.env.sample 默认值):
HOST_RESERVE_GIB=26
KV_TARGET_GIB=20 # 实际会被 host 侧 cap 到 ~16.67 GiB(见坑与注意)
KV_CACHE_DTYPE=fp8 # 默认 fp8,约 2x KV pool;改为 auto 用 BF16
MAX_NUM_SEQS=4
MAX_NUM_BATCHED_TOKENS=2048
vLLM 服务启动后健康检查端点为 http://localhost:8888/health。
dry-run(只看命令不跑):
./start.sh --no-launch
核心用法
API 调用(OpenAI-compatible)
curl http://localhost:8888/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3.8-Flash-Next",
"messages": [{"role": "user", "content": "用 Python 写一个快速排序"}],
"max_tokens": 1024
}'
多模态输入(图片/视频)
Qwen3.8-Flash-Next 是 Vision-Language Model,支持图片和视频理解:
curl http://localhost:8888/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3.8-Flash-Next",
"messages": [
{"role": "user", "content": [
{"type": "text", "text": "描述这张图片"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
]}
]
}'
切换上下文长度(YaRN)
# 启用 512k YaRN 上下文扩展(默认 262k)
export YARN=1
./start.sh
性能数据(官方实测,2026-09-04 ~ 09-06)
⚠️ 以下数字来自单台 DGX Spark 实测,不同配置(KV_TARGET_GIB / FP8 vs BF16 / YaRN 开闭)结果差异显著,详见 README 原始表格。
Decode 吞吐(512k YaRN,MTP=3,FP8):
| 并发数 | 单流速度 | 8 流聚合 |
|---|---|---|
| 1 stream | 48.7 tok/s | 48.7 tok/s |
| 2 streams | 74.6 tok/s | 37.3 tok/s per stream |
| 4 streams | 113.7 tok/s | 28.4 tok/s per stream |
| 8 streams | 162.9 tok/s | 20.4 tok/s per stream |
Prefill 速度(512k YaRN,BF16): - TTFT(400k prompt):260.3 s → 1,537 tok/s
Needle-in-Haystack 检索(512k YaRN): - 512k YaRN + KV_TARGET_GIB=22 + FP8:15/20 通过(FP8 精度问题,见坑) - 512k YaRN + KV_TARGET_GIB=22 + BF16:12/14 通过
冷启动时间: 约 10 分 51 秒(从 NVMe 读取 checkpoint)
长时间稳定性(2.5 小时 coding harness 压测):
- 38 个请求,19 个 50-100k token,3 并发
- 内存余量在 14.2 ~ 14.9 GiB 间,GPU driver 使用 96.6 → 97.5 GiB
- 全程零 NV_ERR_NO_MEMORY 报错
典型适用场景
- 单 DGX Spark Coding Agent:不想搭多机集群,在一台 Spark 上跑 Qwen3.8-Flash-Next 做代码生成/推理
- 超长上下文 RAG:512k YaRN 上下文 + prefix caching,适合代码库级别检索
- Vision Agent:图片/视频理解 + Code 生成一体化 pipeline
- vLLM 生态集成:直接用 OpenAI-compatible API 接入 LangChain/LlamaIndex/Ollama 等现有框架
坑与注意
⚠️ KV_TARGET_GIB=20 实际被 host cap 到 ~16.67 GiB。README 明确记载:KV_TARGET_GIB shipped as 22, then 20,都导致过服务器崩溃(2026-09-04 三台)。当前 host 侧有 cgroup/HOST_RESERVE_GIB 限制,KV_TARGET_GIB=20 实际可用 KV 只有 16.67 GiB(约 992k tokens)。如果需要更大 KV pool,需要同时调 GPU_MEMORY_UTILIZATION 并留意 watchdog 内存地板(~6 GiB)。
⚠️ FP8 KV cache 精度问题:在 Needle 检索测试中,FP8 配置(15/20)低于 BF16(12/14 实际更好,但样本不同)。涉及高精度检索时请用 BF16 或注意 fp8_e4m3 精度损失。
⚠️ Prefill + Decode 并发时 chunk 延迟翻倍:Decode 期间有 64k prompt prefill 到达时,两个流之间的输出间隔从安静服务器的 78ms 扩大到 1,057ms(p50)。这是 shipped chunk width 导致的已知 trade-off。
⚠️ CUDA graph 兼容性:v2 model runner 默认启用 CUDA graph,但在某些 sweep 场景(FULL decode graph at 8 streams)下与 BF16 recurrent state 配合有特殊效果。如果遇到 decode 性能异常,检查 GRAPHS 设置。
⚠️ stop.sh 后 /dev/shm 残留:容器以 --ipc host 运行,vLLM 的 POSIX shared memory 段在 SIGTERM 后可能残留,除非重启机器。用 ./stop.sh --force 也无法清理。重启前确认 df -h /dev/shm。
⚠️ YaRN vs 原生 rope:.env.sample 默认关闭 YaRN(262k context),启用 YaRN 后才是 512k。两者内存布局不同,性能数据不可直接对比。
与同类对比
| 方案 | 硬件 | 量化 | 上下文 | TTFT (32k) | Decode |
|---|---|---|---|---|---|
| 本配方(FP8,512k YaRN) | 1× Spark | NVFP4+fp8 | 512k | ~1,769 tok/s | 162.9 tok/s @8s |
| 官方 Qwen3.8 DGX Solo(FP8) | 1× Spark | FP8 | 262k | — | ~21.6 tok/s |
| 本配方(NVFP4 纯 GPU) | 1× Spark | NVFP4 | 262k | ~1,042 tok/s | ~19.1 tok/s |
| 两台 Spark TP=2 | 2× Spark | FP8 | 32k | — | — |
NVFP4 + PLE offload 方案的核心价值在于单卡 99 GB 以内完整运行 180B MoE 模型,无需双机 Tensor Parallelism。
一句话推荐结论
想在单台 DGX Spark 上完整跑起 Qwen3.8-Flash-Next 且获得 ~160 tok/s 8 并发吞吐?这个配方是目前最省事的开源解法——一个脚本下载,一个脚本启动,OpenAI API 就绪。⚠️ 注意 KV_TARGET_GIB 和 FP8 精度坑,长上下文场景建议开 YaRN + BF16。
来源:GitHub README + NVIDIA Developer Forums + ai-muninn.com 基准测试 ⚠️ 性能数字均来自特定硬件实测,配置不同会有显著差异,引用前请核对 README 最新版本