自制给R9700用的paiton/vLLM专用去审查的极速27B-W3A4权重,MMLU-Pro从 56.7 拉到 57.86
-
把去审查的 27B 塞进官方 3-bit 栈:MMLU-Pro 从 56.7 拉到 57.86,同题追平官方权重

一、背景与结论
经过最近的高强度折腾,手上这台R9700跑的Paiton 的 官方27B(W3A4)速度飞起也很稳,还能八路并发,但它有个毛病:你不让它说的它不说。但是这个框架又只认官方特殊的定制3-bit——想两条都要,只能自己做一套 3-bit的权重了,在这里分享给卡友,可以直接拿去用。
结论先放这:
- 格式逆向成功,打包器做到字节级往返(解包→重量化→重打包,6/6 张量完全一致);
- 先做 abliteration 再量化,顺序反了会白干(下面解释);
- 同样的 2,800 道 MMLU-Pro 随机题:官方 57.82%,自建 RTN 56.68%,自建 GPTQ 57.86%;
- BetterBench 单流加权 155.0 vs 官方 174.3(89%),8 并发 436.8 vs 458.9(95%)——差的不是权重,是我这台虚拟机。
二、为什么不能直接改 3-bit 权重
abliteration 是 rank-1 编辑:从
o_proj/down_proj里把拒绝方向减掉。听着很简单,但 3-bit 是分组量化,步长 0.0067,权重 σ 只有 0.0106——一个步长就是 0.62 个 σ。实测 λ=1 的编辑,每个元素只挪 0.03–0.05 个步长,重新四舍五入之后一个码都不变。也就是说:量化后的模型和原模型是同一个模型,你改了个寂寞。
所以顺序只能是:bf16 阶段去审查 → 再量化。这也是为什么社区的去审查模型都发 Q4/Q5,没人发 Q3。
三、格式:
paiton-w3rot-v1官方没文档,从分片头反推:
- 旋转站点右乘 block-diagonal Hadamard-128(
W·H128),激活侧要同步旋转,不然 Hessian 算错; - 3-bit 对称、group=128、
q∈[-4,3]存成u=q+4,scale 是有符号 bf16(一半是负数); - dense LSB-first 位流打进 int32;
in_proj_a/b是 bf16 的weight_rot_h128;manifest 里side.source_sha256_by_layer校验的是源 bf16 的字节,不是分片哈希——这个坑我踩过一次,加载器直接拒载。
四、32G 显存下的 GPTQ
27B bf16 是 54 GB,一张 32G 卡装不下,更别说还要留显存给 Hessian。做法:
- 用 bitsandbytes NF4 4-bit 加载 abliterated 权重跑校准(4-bit 的激活误差对 Hessian 估计可以忽略);
- attention 必须用 eager:这套 ROCm 上 sdpa 跑 16×2048 会直接
invalid argument,不是 OOM,报错很误导; - 8×2048 × 4 批 = 65,536 token(WikiText-103 + 中文维基);
- Hessian 按 128 列分组存块对角(136 个 128×128),量化时组内做 GPTQ 列级误差补偿,组 scale 还是原来的 14 候选搜索。
五、折腾经过
- 第一版想用全 Hessian,8 个 down_proj 的 H 就要 10 GB,加上模型直接 OOM;
- 16 序列一批也 OOM(30.5 GB 已分配),降到 8 序列才稳;
- 把 Hessian 放 CPU 上算——device 不匹配,白跑一次 3 分钟加载;
- sdpa 的
invalid argument查了半天,最后发现换 eager 就好; - 块对角 H 是妥协:全 H 能再抠一点,但显存不够,先这样。
六、结果
同题同口径(2,800 题,14 类 × 200,seed 42,0-shot,温度 0):
权重 MMLU-Pro 官方 W3A4 57.82% 自建 RTN 56.68% 自建 GPTQ 57.86% 其余:GSM8K 93.10%(1,319 题)、HumanEval 90.24%(164 题)、Needle@61,440 160/160。
速度(BetterBench 20 passes,单流中位数):

单流加权 155.0 vs 174.3,8 并发 436.8 vs 458.9。差距是宿主:这台是 KVM 虚拟机 + 2019 年的 Xeon Gold 6252,每步 host 侧的调度/采样开销比裸金属高;同机换官方权重测出来速度一模一样,所以不是权重或格式的问题。
七、一个被证伪的结论
官方 README 写 MMLU-Pro 59.71,我第一版 RTN 只有 54.6,看着差了 5 分,一度以为是自己量化太糙。后来把官方权重复现到同一套题干上——官方自己也只有 57.82。
那 5 分里,真正属于量化的只有 1.18 分,剩下全是口径(BetterBench full vs 0-shot 同题)。教训:跨口径比分数,比不出东西。
八、复现
python3 scripts/build_gptq2.py --src /path/to/abliterated-bf16 --out ./out \ --calib calib.txt --batches 4 --nseq 8 python3 scripts/gen_manifest.py ./out /path/to/official/w3rot-manifest.json /path/to/abliterated-bf16模型在盘上的话,构建大约 10 分钟。
- Fork 仓库(脚本 + 结果):https://github.com/halonc/paiton-vllm-plugin-27b-w3a4-abliterated
- 权重:https://huggingface.co/halonc/Qwen3.8-27B-W3Rot-INT3-Paiton-RDNA4-abliterated
- 图文版:https://blog-eudc.infocused.cc/qwen38-27b-w3a4-abliterated/
说明
块对角 Hessian 不是全 Hessian;没做 scale 蒸馏;abliteration 拆的是拒绝回路,不是政治立场;只在一张卡上验证过。权重 Apache-2.0,派生自 huihui 的 abliterated 检查和 unsloth 的 NVFP4 基座,仅供研究与自用。
个人的 repo,欢迎指教。
-