@nb4ld: 我的首个@huggingface上传 Qwen3.8-27B-DFlash2 for Blackwell - 最终解码速度相同 - 输出质量相同 - 2.6x 显存减少…

X AI KOLs Timeline 模型

摘要

发布针对NVIDIA Blackwell GPU优化的Qwen3.8-27B-DFlash2模型的量化版本,实现类似的解码速度和输出质量,显存使用减少2.6倍,并扩展上下文长度。

我的首个@huggingface上传 🥳 Qwen3.8-27B-DFlash2 for Blackwell - 最终解码速度相同 - 输出质量相同 - 显存减少2.6倍 https://t.co/0uxKJR04zl
查看原文
查看缓存全文

缓存时间: 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 GB90K215 tok/s3.71
NVFP4,校准 (本仓库)1.37 GB130K228 tok/s3.60
NVFP4,四舍五入取最近值,未校准1.37 GB130K210 tok/s3.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 校准
8K166 → 200 tok/s202 → 1833.12 → 3.03
32K168 → 196217 → 2353.18 → 3.32
64K174 → 180203 → 2293.44 → 3.19
85K157 → 166178 → 2183.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}_projmlp.{gate,up,down}_proj。融合分片(q/k/vgate/up)共享其 weight_scale_2input_scale,如 ModelOpt 所要求。
  • BF16 (未改动)fc(目标特征投影),attention_conv.* / mlp_conv.*(动态深度卷积),candidate_selector.*(码本 + 隐藏层投影),以及所有 RMSNorm 权重。这些是 SGLang DFlash2DraftModel 中的普通 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_projgate_updown —— 在 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 1024MAX_JOBS=2 可确保在 64 GB 内存的主机上,图捕获 / JIT 期间主机 RAM 使用率保持合理。
  • 在此 SGLang 构建版本(混合 GDN 模型)中,使用 FP4 KV 缓存(--kv-cache-dtype nvfp4)与推测解码不兼容。

文件

  • model.safetensors — 1,550,153,248 字节 (sha256 2228b9b2...),186 个张量(35 个 uint8 打包 FP4 权重,35 个 FP8 块缩放,70 个 FP32 缩放,46 个 BF16)。
  • hf_quant_config.jsonconfig.jsonquantization_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-30config.jsonquantization_config.producer 现在使用 ModelOpt 的字典格式(之前是纯字符串,导致 vLLM 的草稿模型 ModelConfig 构造出错 AttributeError: 'str' object has no attribute 'get';SGLang 忽略了该键)。权重未更改(相同的 model.safetensors,sha256 2228b9b2...)。感谢 @joelafrite 的报告和 vLLM 数据。
  • 2026-08-29 — 初始版本。

许可证

Apache-2.0,与基础 DFlash 2 草稿模型和 Qwen3.8-27B 相同。

相似文章

z-lab/Qwen3.8-27B-DFlash2

Hugging Face Models Trending

介绍了 DFlash 2,一种用于与 Qwen3.8-27B 模型进行投机解码的块扩散草稿器,在基准测试中展示了改进的接受长度和吞吐量。

nvidia/Qwen3.6-27B-NVFP4

Hugging Face Models Trending

NVIDIA发布了Qwen3.6-27B-NVFP4,这是阿里巴巴Qwen3.6-27B模型的量化版本,针对在NVIDIA GPU上的部署进行了优化,支持文本、图像和视频输入。