这是 Qwen/Qwen3.5-35B-A3B 的20% 专家剪枝版本,采用论文《REAP the Experts: Why Pruning Prevails for One-Shot MoE Compression》(ICLR 2026)中提出的 REAP(基于路由权重的专家激活剪枝) 方法生成。
该模型保留了256 个专家中的 205 个(约为原始专家数量的 80%),同时在标准基准测试中保持竞争力。
REAP 通过结合以下因素对每个专家的重要性进行评分,从而剪枝 MoE 专家:
剪枝后,路由 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 上进行张量并行)、贪婪解码、零样本设置。
| 基准测试 | 原始模型 | 剪枝模型(20%) | 差异 |
|---|---|---|---|
| HumanEval(pass@1) | 76.2% | 73.2% | -3.0% |
| HumanEval+(pass@1) | 72.0% | 70.1% | -1.9% |
| 基准测试 | 原始模型 | 剪枝模型(20%) | 差异 |
|---|---|---|---|
| MMLU | 84.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-Challenge | 60.00% | 60.40% | +0.40% |
| ARC-Easy | 84.00% | 83.20% | -0.80% |
| BoolQ | 88.00% | 89.20% | +1.20% |
| HellaSwag(标准化) | 76.40% | 75.60% | -0.80% |
| OpenBookQA(标准化) | 45.20% | 47.20% | +2.00% |
| RTE | 81.20% | 82.00% | +0.80% |
| WinoGrande | 77.20% | 76.80% | -0.40% |
| 模型 | 困惑度(PPL) |
|---|---|
| 原始模型(256个专家) | 6.83 |
| 剪枝20%模型(205个专家) | 9.51 |
| 批处理大小 | 原始模型(tokens/秒) | 剪枝模型(tokens/秒) | 加速比 |
|---|---|---|---|
| 1 | 12.3 | 12.5 | 1.02倍 |
| 4 | 37.0 | 36.0 | 0.97倍 |
| 8 | 74.4 | 70.3 | 0.95倍 |
| 16 | 89.3 | 86.0 | 0.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 32768git 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}
}