@nb4ld: 我的首个@huggingface上传 Qwen3.8-27B-DFlash2 for Blackwell - 最终解码速度相同 - 输出质量相同 - 2.6x 显存减少…
摘要
发布针对NVIDIA Blackwell GPU优化的Qwen3.8-27B-DFlash2模型的量化版本,实现类似的解码速度和输出质量,显存使用减少2.6倍,并扩展上下文长度。
查看缓存全文
缓存时间: 2026/08/30 22:23
我的首次 @huggingface 上传 🥳 面向 Blackwell 架构的 Qwen3.8-27B-DFlash2 - 最终解码速度相同 - 输出质量不变 - 显存占用减少 2.6 倍
https://t.co/0uxKJR04zl
maurienne-ai/Qwen3.8-27B-DFlash2-NVFP4-RTNcal · Hugging Face
来源:https://huggingface.co/maurienne-ai/Qwen3.8-27B-DFlash2-NVFP4-RTNcal
Qwen3.8-27B-DFlash2-NVFP4-RTNcal
针对 Qwen3.8-27B 的 DFlash 2 (https://huggingface.co/incoai/Qwen3.8-27B-DFlash2) 块扩散草稿模型进行的 校准 NVFP4 (W4A4) 量化,采用 NVIDIA ModelOpt 布局,SGLang 可原生加载。
专为在 RTX 5090 (32 GB) 上使用 SGLang 以 NVFP4 格式服务 Qwen3.8-27B 而构建:草稿模型显存占用从 3.53 GB (BF16) 降至 1.37 GB,从而在相同解码速度和相同接受率下,为 BF16 草稿模型带来 +44% KV 缓存上下文 (90K → 130K tokens)。
根据构造,输出质量未发生变化:目标模型会验证每一个草稿 token。
| 草稿格式 | 显存占用 | KV 上下文 | 解码速度 (端到端) | 接受率 / 8 tokens |
|---|---|---|---|---|
| BF16 (上游版本) | 3.53 GB | 90K | 215 tok/s | 3.71 |
| NVFP4,校准 (本仓库) | 1.37 GB | 130K | 228 tok/s | 3.60 |
| NVFP4,四舍五入取最近值,未校准 | 1.37 GB | 130K | 210 tok/s | 3.26 |
- 目标模型:
gittensor-model-hub/Qwen3.8-27B-NVFP4-RTX5090,FP8 KV 缓存,--mem-fraction-static 0.90,开启 HiCache。 - 基准测试:5 个混合提示词(代码、数学、法语文本、JSON、论文)× 600 个生成 token,每项运行 3 次,温度 0.7。
- 接受长度的运行间噪声约为 ±0.2,因此 BF16 与此检查点性能持平。
长上下文代理任务基准测试
在 SGLang 源码树上进行编码代理会话(系统提示 + 6 个工具 schema,工具结果 = 真实源文件),开启思考,流式输出;每个上下文大小进行 3 轮(冷分析、基于缓存前缀的后续操作、使用 tools 的工具调用),2 次通过。首 token 时间 (TTFT) 相同(预填充由目标模型处理,约 4K tok/s;缓存前缀在两种情况下均为 0.04–0.2 秒),因此仅展示解码数据。
| 上下文大小 | 解码速度 BF16 → NVFP4 校准 (第 1 轮,思考中) | 解码速度 BF16 → NVFP4 校准 (第 2 轮) | 接受率/8 BF16 → NVFP4 校准 |
|---|---|---|---|
| 8K | 166 → 200 tok/s | 202 → 183 | 3.12 → 3.03 |
| 32K | 168 → 196 | 217 → 235 | 3.18 → 3.32 |
| 64K | 174 → 180 | 203 → 229 | 3.44 → 3.19 |
| 85K | 157 → 166 | 178 → 218 | 3.18 → 3.21 |
| 110K* | 超出 BF16 上下文 → 207 | — → 226 | — → 3.63 |
使用此草稿模型,10 次工具调用轮次均正确发出工具调用(使用 BF16 时为 6/8,差异源于 T=0.7 时的采样噪声)。
量化内容
- NVFP4 (E2M1,组大小 16,FP8-E4M3 块缩放,FP32 全局张量缩放) — 5 层草稿模型中所有 35 个线性投影层:
self_attn.{q,k,v,o}_proj,mlp.{gate,up,down}_proj。融合分片(q/k/v,gate/up)共享其weight_scale_2和input_scale,如 ModelOpt 所要求。 - BF16 (未改动) —
fc(目标特征投影),attention_conv.*/mlp_conv.*(动态深度卷积),candidate_selector.*(码本 + 隐藏层投影),以及所有 RMSNorm 权重。这些是 SGLangDFlash2DraftModel中的普通nn.Linear/ 参数,无法在此量化。 - 激活值在运行时由 SGLang 量化为 NVFP4,使用此处存储的静态张量输入缩放 (
input_scale) (W4A4)。
校准 — 关键部分
未校准的四舍五入取最近值 NVFP4 会损失约 13% 的接受率(3.26 vs 3.71)。通过在草稿模型的真实输入上校准激活缩放,可以完全弥补这一差距:
- 在线策略数据:由目标模型自身通过 SGLang 生成的 460 段对话(其中一半启用了思考),涵盖 6 个领域——英文多轮聊天(ultrachat)、法语(基于维基百科的任务 + 自由提示词)、代码(glaive-code-assistant + bash/SQL/TS/Rust/Go/CUDA 提示词)、工具调用(带工具 schema 的 glaive-function-calling-v2)、数学(GSM8K,MATH-500)、结构化输出(JSON/YAML/Markdown)。共生成 281,649 个 token。
- 捕获:在 BF16 草稿模型服务这些对话(预填充和解码,急切模式)时,对其 20 个可量化线性层应用 forward pre-hook,每层捕获约 621K 行输入。张量输入缩放
input_scale = amax / (6 · 448)。 - 权重:在 NVFP4 网格上四舍五入取最近值;全局缩放
amax / (6 · 448),逐组 FP8 缩放。
在此草稿模型上尝试过但未产生可测量差异的所有方法(均在 ±0.2 噪声范围内):GPTQ(使用完整海森矩阵)、保持 q/k/v 为 BF16、SmoothQuant 折叠(仅限 o_proj,gate_up,down —— 在 SGLang 中 qkv 折叠不保持函数等价,因为上下文 K/V 是从 hidden_norm(fc(features)) 实例化,没有逐层 input_layernorm)。
与 SGLang 一起使用
需要从 main 分支构建的 SGLang(提交 ecbadf0b 或更新版本,添加了 DFlash2DraftModel),CUDA 13,以及用于 NVFP4 GEMM 的 Blackwell GPU (sm120),并需要指定草稿量化标志:
sglang serve \
--trust-remote-code \
--model-path gittensor-model-hub/Qwen3.8-27B-NVFP4-RTX5090 \
--served-model-name qwen3.8-27b \
--kv-cache-dtype fp8_e4m3 \
--mem-fraction-static 0.90 \
--attention-backend flashinfer \
--max-running-requests 1 --cuda-graph-max-bs 1 \
--reasoning-parser qwen3 --tool-call-parser qwen3_coder \
--mamba-full-memory-ratio 5.61 \
--mamba-radix-cache-strategy extra_buffer_lazy \
--mamba-ssm-dtype bfloat16 \
--speculative-algorithm DFLASH \
--speculative-draft-model-path \
--speculative-draft-model-quantization modelopt_fp4 \
--speculative-num-draft-tokens 8 \
--chunked-prefill-size 1024 \
--cuda-graph-bs-prefill 64 128 256 512 1024 \
--enable-memory-saver \
--enable-hierarchical-cache --hicache-ratio 2 \
--hicache-write-policy write_through \
--host 0.0.0.0 --port 30000
注意事项:
- 必须使用
--speculative-draft-model-quantization modelopt_fp4;SGLang 不会动态重新量化自定义草稿模型。 --speculative-num-draft-tokens 8是 DFlash 2 的块大小,无法提高。config.json中的ignore列表(扁平 ModelOpt 格式)是 SGLang 用于将fc等保持为 BF16 的依据;编辑配置时请保留它。--cuda-graph-bs-prefill 64 128 256 512 1024和MAX_JOBS=2可确保在 64 GB 内存的主机上,图捕获 / JIT 期间主机 RAM 使用率保持合理。- 在此 SGLang 构建版本(混合 GDN 模型)中,使用 FP4 KV 缓存(
--kv-cache-dtype nvfp4)与推测解码不兼容。
文件
model.safetensors— 1,550,153,248 字节 (sha2562228b9b2...),186 个张量(35 个 uint8 打包 FP4 权重,35 个 FP8 块缩放,70 个 FP32 缩放,46 个 BF16)。hf_quant_config.json、config.json(quantization_config包含ignore)、无 tokenizer(使用目标模型的 tokenizer)、README.incoai-original.md(上游卡片)。
复现
脚本(SGLang 端):dflash_calib_hook.py(激活捕获,临时补丁 sglang/srt/models/dflash.py)、calib/build_prompts.py + calib/run_calib.py(在线策略校准运行)、quantize-dflash2-gptq-nvfp4.py --rtn(导出)。
基础权重:incoai/Qwen3.8-27B-DFlash2 (BF16)。
量化日期:2026-08-29。
更新日志
- 2026-08-30 —
config.json:quantization_config.producer现在使用 ModelOpt 的字典格式(之前是纯字符串,导致 vLLM 的草稿模型ModelConfig构造出错AttributeError: 'str' object has no attribute 'get';SGLang 忽略了该键)。权重未更改(相同的model.safetensors,sha2562228b9b2...)。感谢 @joelafrite 的报告和 vLLM 数据。 - 2026-08-29 — 初始版本。
许可证
Apache-2.0,与基础 DFlash 2 草稿模型和 Qwen3.8-27B 相同。
相似文章
在16GB显存的RTX 4080上运行Qwen3.8-27B的提速指南
本指南说明如何配置llama.cpp的DFlash2推测解码,以在配备16GB显存的RTX 4080 GPU上实现Qwen3.8-27B模型最高1.72倍的推理速度提升。
z-lab/Qwen3.8-27B-DFlash2
介绍了 DFlash 2,一种用于与 Qwen3.8-27B 模型进行投机解码的块扩散草稿器,在基准测试中展示了改进的接受长度和吞吐量。
nvidia/Qwen3.6-27B-NVFP4
NVIDIA发布了Qwen3.6-27B-NVFP4,这是阿里巴巴Qwen3.6-27B模型的量化版本,针对在NVIDIA GPU上的部署进行了优化,支持文本、图像和视频输入。
大家忽略了 Qwen 3.8 27B Q2 + Q2 DFlash + Q5 KV 的实力
一位用户分享了使用 QAT Q2 和 Q5 KV 运行量化版 Qwen 3.8 27B 模型的经验,在 12GB 显卡上实现了高达 200K token 上下文的高性能,性能超越了 Sonnet 4.6 等模型。
@SpaceTimeViking: Qwen3.6 27B 在新的 AEON ULTIMATE VLLM 镜像上备受青睐 @NVIDIAAI DGX SPARK OPTIMIZED!https://github.com/AEO…
AEON-7 发布了 Qwen3.6-27B 的完全无审查、能力增强的 ablitation 版本,针对 NVIDIA DGX Spark 进行了优化,采用 NVFP4 量化和 DFlash 推测解码以提升性能。