站点图标 高效码农

速度飙至1600+ tokens/s!WeDLM实战:把扩散模型塞进vLLM,推理性能反超3倍

WeDLM:把扩散模型塞进因果注意力,推理速度反超 vLLM 的实战笔记

核心问题:扩散语言模型(DLLM)一向“理论并行、实际拉胯”,WeDLM 如何用“纯因果注意力 + 拓扑重排”把 KV-Cache 吃满,让 8B 模型在 GSM8K 上比 vLLM 再快 3 倍,还不掉点?


本文欲回答的核心问题

  1. WeDLM 到底改了什么,让“并行预测”第一次真正转化为“墙钟时间”?
  2. 作为普通开发者,我该怎么把它跑起来、调起来、甚至微调出自己的领域版本?
  3. 速度飙到 1600+ tokens/s 的同时,质量会不会偷偷塌方?有哪些踩坑信号可以提前预判?

1. 背景:为什么扩散模型一直“叫好不叫座”

痛点 典型症状 根因
KV-Cache 失效 每步都要重算整个上下文 双向注意力把前缀 token 的未来依赖锁死
块提交同步 一整块 mask 没全猜完就不能写盘 块内 token 互相依赖,pcache 极低
工业生态断档 FlashAttention、PagedAttention 用不上 内核假设“因果掩码”,DLLM 却非因果

一句话总结:并行度≠可缓存度,而墙钟时间只认后者。


2. WeDLM 的解法:把“双向”改成“因果”,再把“顺序”玩成“拓扑”

2.1 拓扑重排:物理搬家,逻辑留门牌

  • 输入句子:[x1 x2 x3 x4 x5],随机 mask 掉 x3、x5
  • 重排后物理顺序:[x1 x2 x4 M M]
  • 逻辑位置 id 不变:[1 2 4 3 5](靠 RoPE 保留)
  • 因果掩码依旧下三角,但所有“已观测 token”被搬到前缀,mask token 自然看到全局历史,却仍在因果壳子里

作者反思:第一次读论文时我以为“重排”只是 trick,后来写代码才发现,RoPE 的 position_id 与物理 index 解耦才是灵魂;否则 CUDA kernel 里早把位置写死,根本塞不进现有推理框架。

2.2 双流掩码:训练期给“干净历史”单独开一条 VIP 通道

  • Memory Stream:全程无 mask,供下游 block 查表
  • Prediction Stream:按 block 掩码 + 重排,只看 Memory 里“更早”的块
  • 效果:推理时扔 Memory Stream,只剩单流因果,与 vLLM 同一套内存布局,零内核改造。

3. 推理算法:Streaming Parallel Decoding 的 5 步循环

# 伪代码,对应论文 Algorithm 1
while window 非空:
    1. 重排:已填 token 放左,mask 放右
    2. 前向:FlashAttention 直接复用 KV-Cache
    3. 提交:最左连续非 M 前缀写盘并更新 KV-Cache
    4. 预测:按“熵 + 距离惩罚”选最靠谱的 mask 填值
    5. 补位:右侧追加新 mask,保持窗口大小 W
参数 作用 推荐值 踩坑提示
τ(熵阈值) 决定多激进 0.3-0.5 >0.6 后质量雪崩
λ(距离惩罚) 越大越“从左往右” 0.05 设 0 会出现“跳着猜”,pcache 骤降
W(窗口) 并行度 6-12 H20 显存 40 G 可开到 16,再高性价比递减

4. 跑起来:从 pip install 到 689 tokens/s 的完整命令链

4.1 安装

# 推荐用 Python 3.10 + CUDA 11.8
pip install git+https://github.com/tencent/WeDLM.git

4.2 单机单卡推理

python example.py \
  --model tencent/WeDLM-8B-Instruct \
  --prompt "A store sells apples for $2 each..." \
  --max_tokens 512 \
  --temperature 0

输出示例

Generated tokens: 218
Time elapsed: 0.32 s
Speed: 689.18 tokens/s ⚡

4.3 起一座兼容 OpenAI API 的 Demo 服务

python web_demo.py --model tencent/WeDLM-8B-Instruct --port 8000

浏览器打开 http://localhost:8000 即可实时对比左侧 WeDLM、右侧 Qwen3-vLLM 的生成速度差。


5. 质量实测:把“加速”做成“加分”

Benchmark Qwen3-8B-Instruct WeDLM-8B-Instruct 差值
GSM8K 89.9 92.3 +2.4
MATH 69.6 64.8 -4.8*
HumanEval 71.9 80.5 +8.5
MMLU 71.5 75.1 +3.6

作者见解:MATH 略降是因为采样温度 0.1 时,模型倾向“保守填 mask”,部分长链推理符号被截断;把 τ 降到 0.2 可拉回 68+,但速度会掉到 2× 区间。实际部署建议“任务-阈值”联动:代码生成用 τ=0.3,开放写作用 τ=0.6。


6. 速度剖面:低熵场景 1673 tokens/s 的真相

任务类型 熵区间 实测速度 加速比
顺序报数 1~200 0.05 bit 1673 t/s 10×+
数学解方程 0.8 bit 745 t/s 3.6×
开放问答“量子物理” 2.3 bit 198 t/s 1.5×

结论:WeDLM 的加速是“熵敏感”的;把高不确定任务丢给它,会退回到 AR 的体感。最佳实践是混合路由:确定性模板用 WeDLM,创意发散用传统 AR,或把 τ 动态调到 0.8 以上。


7. 微调自己的 WeDLM:只改 3 行代码

WeDLM 支持 HuggingFace Trainer,唯一区别是 DataCollator 要换成 WeDLMDataCollator,自动在 batch 内做随机掩码 + 拓扑重排。

from transformers import Trainer
from wedlm import WeDLMDataCollator, WeDLMForCausalLM

model = WeDLMForCausalLM.from_pretrained("tencent/WeDLM-8B")
collator = WeDLMDataCollator(tokenizer, masking_ratio=0.3, block_size=32)

trainer = Trainer(
    model=model,
    train_dataset=dataset,
    data_collator=collator,
    # 其余参数与常规 causal LM 相同
)
trainer.train()

经验值:领域语料 2-5 B tokens、学习率 3e-6、cosine 到 3e-7,即可在保持通用能力的同时把领域 loss 降 30%+。


8. 工业部署:与 vLLM 并排跑,零摩擦

WeDLM 的推理内核就是 vLLM,因此以下功能开箱即用:

  • PagedAttention:长上下文不爆显存
  • CUDA Graph:小 batch 也能占满 SM
  • Tensor/Pipeline Parallel:80 G 多卡并行扩到 128 k 上下文

唯一新增超参是 --entropy-threshold--distance-penalty,在 sampling_params 里加两行即可:

from wedlm import SamplingParams
params = SamplingParams(
    temperature=0.3,
    max_tokens=1024,
    entropy_threshold=0.4,
    distance_penalty=0.05
)

9. 常见踩坑与信号

症状 可能原因 快速诊断
速度<1.2× AR τ 过低或窗口 W 太小 看日志“tokens/fwd”<3 即确认
后期突然乱码 λ=0 造成右部 mask 先解 把 λ 调到 0.05 以上
显存暴涨 窗口 W 太大 + 长 prompt 用 vLLM 的 --max-model-len 截断 prompt
微调后通用能力下降 掩码比例过高 把 ratio 从 0.5 降到 0.3,并加 10% AR 辅助 loss

10. 结论与行动清单

WeDLM 用“因果注意力 + 拓扑重排”把扩散模型从学术玩具变成工业级引擎:

  • 8B 模型在 GSM8K 上比 vLLM 快 3×,HumanEval 还涨 8.5 分;
  • 训练、微调、部署全链路沿用 HuggingFace & vLLM 生态,零额外内核;
  • 加速收益与输出熵强相关,低熵模板场景可直接上,高熵创意场景需动态 τ 或回退 AR。

一页速览(One-page Summary)

  1. 安装:pip install git+https://github.com/tencent/WeDLM.git
  2. 推理:python example.py --model tencent/WeDLM-8B-Instruct
  3. 调参:τ∈[0.3,0.5]、λ=0.05、W=6-12
  4. 微调:换 WeDLMDataCollator,其余同因果 LM
  5. 部署:直接塞进现有 vLLM 配置,加两行采样参数即可

FAQ

  1. Q:WeDLM 与 SDAR、LLaDA 最大区别?
    A:后两者用双向注意力,KV-Cache 需整块提交;WeDLM 全程因果,token 级即时缓存,pcache 高 2-3 倍。

  2. Q:窗口 W 越大越快吗?
    A:显存随 W 线性涨,>16 后提速边际递减,建议先 6-12。

  3. Q:τ 设太低会不会无限拖慢?
    A:τ<0.2 时“谨慎过头”,tokens/fwd 常降到 1-2,速度接近 AR;除非质量刚需,否则 0.3 起步。

  4. Q:能用 INT4 量化吗?
    A:官方已集成 GPTQ-INT4,显存砍半,速度再提 15-20%,MMLU 掉 <1 点。

  5. Q:自己的中文垂直领域怎么微调?
    A:按第 7 节脚本,掩码比例 0.3、block_size 32、数据 2-5 B tokens,学习率 3e-6,cosine 到 3e-7,通用能力基本不降。

  6. Q:推理出现“断层式乱码”怎么办?
    A:检查 λ 是否为 0,右部 mask 被先解导致顺序崩;把 λ 提到 0.05 并重启解码即可恢复。


High-speed server room
图片来源:Unsplash

退出移动版