DeepSeek-V4-Flash W4A16+FP8 结合 MTP 自推测:在 2 张 RTX PRO 6000 Max-Q 上以 524K 上下文长度实现 85 tok/s

Reddit r/LocalLLaMA 工具

摘要

这篇文章详细介绍了一个经过定制并量化的 DeepSeek-V4-Flash 模型版本,启用了 MTP 自推测功能。通过修改后的 vLLM 设置,在双 RTX PRO 6000 Max-Q GPU 上实现了显著的速度提升。

**TL;DR**:在 2× RTX PRO 6000 Max-Q 上,pasta-paul 的 `DeepSeek-V4-Flash-W4A16-FP8` 量化版本表现优异,在 **524k 上下文窗口下达到 85.52 tok/s**,在 **128k 单流场景下达到 ~111 tok/s**。但是,其 MTP(多令牌预测)头在加载时被静默剥离(HF transformers 将其列入 `_keys_to_ignore_on_load_unexpected`),因此使用 `--speculative-config '{"method":"mtp",...}'` 实际上无效。我重新整合了 MTP 模块,对其路由专家层进行了 GPTQ 量化,以匹配基础模型的 W4A16 INT4 分组格式,并修补了 vLLM。解码速度从 **无 MTP 时的 52.85 tok/s 提升至 85.52 tok/s @ 524k 双流 → ~111 tok/s @ 128k 单流**。总参数量 671B / 活跃参数 32B,可适配 2× 96 GB 显存。模型地址:[https://huggingface.co/LordNeel/DeepSeek-V4-Flash-Acti-MTP-W4A16-FP8](https://huggingface.co/LordNeel/DeepSeek-V4-Flash-Acti-MTP-W4A16-FP8) # 数据表现 硬件配置:2× RTX PRO 6000 Blackwell Max-Q(每卡 96 GB 显存,无 NVLink,sm_120): | 配置 | 解码 TPS | TTFT | 相对于基线变化 | |:-|:-|:-|:-| | 基线(pasta-paul 原版,无 MTP,524k) | 52.85 | 91 ms | 参考值 | | **本模型(524k 双流)** | **85.52** | 155 ms | **+62% (1.62×)** | | **本模型(128k 单流)** | **~111** | ~310 ms | **+110% (2.10×)** | Sanity-check 基准测试(小样本,完整数据见模型卡片): | 基准测试 | 样本数 (n) | 得分 | |:-|:-|:-| | GSM8K (T=0, CoT, 精确匹配) | 100 | **93%** | | MMLU (混合学科) | 100 | 53% (受困难学科拖累,与基线一致) | | HumanEval (语法检查,非 pass@1 执行) | 50 | **90%** | # 量化细节 * **768 个路由专家张量**(256 个专家 × {w1, w2, w3}):W4A16 INT4,组大小 128,对称量化,采用 GPTQ(基于 Frantar 风格的 Cholesky H⁻¹)。校准数据来自运行中的 pasta-paul 模型捕获的 256 个 ultrachat_200k 提示词,最大 token 数为 256 —— 共 17,701 个 MTP 前向传播 dump,473k tokens。 * **5 个注意力投影层**:FP8_BLOCK(保留上游的 FP8 权重,仅将 `scale` 重命名为 `weight_scale` 以匹配 pasta-paul 的 compressed-tensors 约定)。 * **共享专家、e_proj、h_proj、归一化层、门控、attn_sink**:保持 BF16 / FP32。 # Max-Q 特定修复 如果你使用的是 **Max-Q 工作站显卡**:必须传递 `--disable-custom-all-reduce` 参数。vLLM 的 CustomAllreduce 使用 CUDA P2P(独立于 `NCCL_P2P_DISABLE`),在仅支持 PCIe 的 Max-Q 拓扑结构上,这会导致后图 eager 预热阶段死锁。如果不加该标志,引擎将卡在 `gpu_worker.py:619`,并无限打印 `shm_broadcast.py:681 No available shared memory broadcast block` 警告。**Server** 变体拥有 NVLink,不会遇到此问题。 可将 TTFT 从 ~155 ms 降低至 ~91 ms 且零解码 TPS 损失的 NCCL 调优参数(针对 Max-Q): ```bash NCCL_PROTO=LL NCCL_ALGO=Ring NCCL_MIN_NCHANNELS=8 NCCL_NTHREADS=512 ``` # 如何运行 需要使用修补过的 vLLM 分支。原版 vLLM 无法加载 DSV4-Flash 量化模型。 基础工作空间位于 [https://github.com/pasta-paul/dsv4-flash-w4a16-fp8](https://github.com/pasta-paul/dsv4-flash-w4a16-fp8)。在此基础上应用 MTP 补丁。 ```bash vllm serve LordNeel/DeepSeek-V4-Flash-Acti-MTP-W4A16-FP8 \ --tensor-parallel-size 2 \ --kv-cache-dtype fp8 \ --block-size 256 \ --max-model-len 524288 \ --max-num-seqs 2 \ --gpu-memory-utilization 0.93 \ --tokenizer-mode deepseek_v4 \ --tool-call-parser deepseek_v4 \ --enable-auto-tool-choice \ --reasoning-parser deepseek_v4 \ --trust-remote-code \ --disable-custom-all-reduce \ --speculative-config '{"method":"mtp","num_speculative_tokens":1}' \ --host 0.0.0.0 \ --port 8000 ``` 我还编写了一份 [`AGENTS.md`](http://AGENTS.md) 运行手册。你可以让 Claude/Codex/Cursor 指向该文件,并指示它“设置环境”/“验证硬件并运行模型”或类似指令。流程涵盖:预检查 → CUDA 工具包(通过 conda 无需 sudo)→ 修补版 vLLM 构建 → 下载 → 应用补丁 → 启动服务 → 冒烟测试。 # 局限性 * **仅限 TP=2。** TP=1 在单张 RTX 6000 专业卡上会 OOM;TP≥4 会触发上游 W4A16 MoE 的 scale-sharding bug ([vllm-project/vllm#41511](https://github.com/vllm-project/vllm/issues/41511))。 * `num_speculative_tokens` **上限为 1。** DSV4 Flash 仅配备一个 MTP 头(`num_nextn_predict_layers=1`);更高的值不会产生更多的草稿 token。 * **推理解析器注意事项。** 使用 `--reasoning-parser deepseek_v4` 时,输出会拆分为 `content` 和 `reasoning_content`。仅读取 `content` 的客户端在“思考”响应中会看到空字符串。 * **MTP GPTQ 在校准期间跳过了注意力层** —— 详见模型卡片中的“未来工作”部分。 * **测试硬件:仅限 Max-Q。** Server 变体 + DGX Spark + H200 **应该**可以工作,但我**尚未**测试。 # 社区请求 如果你运行此模型,发现 **MTP 草稿接受率** 在你的提示分布下显著不同,请评论告知你的领域及该比率(vLLM 会将其记录为 `spec_decode_acceptance_rate`)。 # 致谢 * 基础模型来自 DeepSeek-AI * pasta-paul 提供了 W4A16+FP8 量化及 jasl/vllm 服务栈 ([仓库](https://github.com/pasta-paul/dsv4-flash-w4a16-fp8)) [](/submit/?source_id=t3_1t9efrb&composer_entry=crosspost_prompt)
查看原文

相似文章

Deepseek V4 Flash 在 RTX 5090 MoE 上运行

Reddit r/LocalLLaMA

用户分享了在 RTX 5090 上使用 llama.cpp 的一个分支运行 DeepSeek-V4-Flash (Q2_K) 的优化基准测试结果,实现了 21.3 token/秒的生成速度和 100 万上下文大小。