HuggingFace镜像/Qwen-3.5-28B-A3B-REAP
模型介绍文件和版本分析
下载使用量0

Qwen3.5-35B-A3B — REAP 20% 专家剪枝

这是 Qwen/Qwen3.5-35B-A3B 的20% 专家剪枝版本,采用论文《REAP the Experts: Why Pruning Prevails for One-Shot MoE Compression》(ICLR 2026)中提出的 REAP(基于路由权重的专家激活剪枝) 方法生成。

该模型保留了256 个专家中的 205 个(约为原始专家数量的 80%),同时在标准基准测试中保持竞争力。


我们的工作

方法:REAP 逐层剪枝

REAP 通过结合以下因素对每个专家的重要性进行评分,从而剪枝 MoE 专家:

  1. 路由门控值——路由选择每个专家的频率和强度
  2. 专家激活范数——每个专家输出贡献的大小

剪枝后,路由 logit 权重会重新归一化以确保总和为 1(这对于维持输出规模至关重要)。剪枝以逐层方式进行(逐层模式)。

校准数据

观察数据是在混合校准数据集上收集的,每个类别包含 1000 个样本:

  • theblackcat102/evol-codealpaca-v1(250 个样本)
  • open-r1/Mixture-of-Thoughts[code](250 个样本)
  • open-r1/Mixture-of-Thoughts[math](250 个样本)
  • open-r1/Mixture-of-Thoughts[science](250 个样本)

最大序列长度:4096 个 token。专家相似度采用角距离度量。

剪枝配置

参数值
压缩率20%(移除 51 个专家)
原始专家数量256
剩余专家数量205
剪枝方法REAP
路由权重重归一化✓
随机种子42
校准样本数共 1000 个

基准测试结果

所有评估均使用 vLLM(在 8 张 RTX 3090 上进行张量并行)、贪婪解码、零样本设置。

代码(EvalPlus,贪婪解码,零样本)

基准测试原始模型剪枝模型(20%)差异
HumanEval(pass@1)76.2%73.2%-3.0%
HumanEval+(pass@1)72.0%70.1%-1.9%

多项选择/推理(lm-eval,零样本,250样本/任务)

基准测试原始模型剪枝模型(20%)差异
MMLU84.34%80.89%-3.45%
MMLU - 人文科学82.40%76.35%-6.05%
MMLU - 社会科学90.04%88.38%-1.66%
MMLU - 理工科(STEM)81.46%78.88%-2.58%
MMLU - 其他84.52%81.05%-3.47%
ARC-Challenge60.00%60.40%+0.40%
ARC-Easy84.00%83.20%-0.80%
BoolQ88.00%89.20%+1.20%
HellaSwag(标准化)76.40%75.60%-0.80%
OpenBookQA(标准化)45.20%47.20%+2.00%
RTE81.20%82.00%+0.80%
WinoGrande77.20%76.80%-0.40%

困惑度(WikiText-2,10k tokens,llama.cpp)

模型困惑度(PPL)
原始模型(256个专家)6.83
剪枝20%模型(205个专家)9.51

吞吐量(4×RTX 3090,TP=4,vLLM,enforce_eager)

批处理大小原始模型(tokens/秒)剪枝模型(tokens/秒)加速比
112.312.51.02倍
437.036.00.97倍
874.470.30.95倍
1689.386.00.96倍

注:在当前vLLM路由开销下,此压缩级别下的吞吐量加速效果微乎其微。主要优势在于减少了VRAM占用。


内存占用

模型大小分片
原始模型~71 GB(bf16)14个safetensors文件
剪枝20%模型~53 GB(bf16)2个safetensors文件

使用方法

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "0xSero/Qwen3.5-35B-A3B-REAP-20pct"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype="auto",
    device_map="auto",
)

messages = [{"role": "user", "content": "Write a quicksort in Python."}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=512)
print(tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))

使用 vLLM:

vllm serve 0xSero/Qwen3.5-35B-A3B-REAP-20pct \
    --tensor-parallel-size 4 \
    --gpu-memory-utilization 0.9 \
    --max-model-len 32768

复现

git clone https://github.com/cerebras/reap
cd reap
bash scripts/build.sh

python -m reap.layerwise_prune \
    --model_name Qwen/Qwen3.5-35B-A3B \
    --dataset_name "theblackcat102/evol-codealpaca-v1:250,open-r1/Mixture-of-Thoughts[code]:250,open-r1/Mixture-of-Thoughts[math]:250,open-r1/Mixture-of-Thoughts[science]:250" \
    --compression_ratio 0.20 \
    --prune_method reap \
    --seed 42 \
    --renormalize_router_weights true

引用

@inproceedings{lasby2025reap,
  title={REAP the Experts: Why Pruning Prevails for One-Shot MoE Compression},
  author={Lasby, Mike and others},
  booktitle={ICLR 2026},
  year={2026}
}