先放最终后训练完成的模型地址:
https://modelscope.cn/models/Merkyor/Qwen3.8-27B-EfficientThink-K3-Opus5-Grok4.6-GPT5.6Sol-SFT-SimPO-DFlash2
这件事一开始看起来挺简单。Qwen 3.8 27B本质不是不会做题,而是后训练过度,HF上闻XH档色变,只要遇到不会的题这货特别容易一直想。
这个判断不是凭感觉而是有铁证的:原版 Qwen3.8-27B 的正式 GPQA 里,答对的 164 题 reasoning 中位数是 3,627 tokens 基本属于会的就超快回答,答错的 34 题中位数直接顶到 32,768——但凡遇到个不会的就给你思考人生了;关键是26 个 32K 截断还里有 22 个答错——纯属思考半天也白搭。
哪怕第三周 SFT 和最终 SimPO 也有同样的形状——答对题中位数都在 4K 左右,答错题中位数仍是 32K。模型有时答案已经写出来,又突然反悔,重新开一轮推理,最后连正式答案都没提交。

图里三组都是同一套 GPQA 198 题、动态 FP8 + DFlash2、双卡 C24、XH 和 32K 输出上限。右图也能看出:原版有 26 个 32K 截断,第三周 SFT 有 27 个,最终 SimPO 降到 21 个;剩下的超长截断几乎都集中在最后没有做对的题上。
所以我的第一目标一直是把这种没收益的思考压下来。能力当然不能掉,但顺序上确实是先让它变得能用,再确认 GPQA、LCB、MMLU 没被我治坏。我不想做一个每道题只会短答的模型,也不想守着一个分数不错、实际用起来却经常想到超时的模型。
万万没想到,这一下居然就整整折腾了三周。前两周我基本把“剂量不够”和“剂量过量”都试了一遍,第三周才真正弄明白:这种已经被后训练得很充分的模型,不能再拿一大桶数据往里灌。它更像一个已经吃了很多药的病人,要精细的针对病灶每一条数据都对症治疗。
第一周:小剂量 SFT,几乎没推动它
第一周我先做了小剂量 SFT测试,想法原本很朴素:模型能力既然还在,那我就轻轻推一下,把过度思考收一下。
训练确实剂量很轻,模型也确实没怎么被破坏,可问题是模型的病灶也同样没怎么变化。一周回顾发现这一周主要是 32–130 条规模的测试各种小型SFT,RL 也只推进到 5/24 个题组,没有形成一套能和 198 题 GPQA 正面对比的完整结果。小
样本里偶尔能看到输出局部变干净,但没有任何节点同时做到能力不掉、思考下降和提交改善,所以当时的结论只能是“没有稳定 Pareto”,而不是硬报一个提升百分比。
现在回头看,不能简单说“小剂量没用”。真正的问题是数据没有把病说清楚。模型只看见了一些更短的答案,却没有同时看见:自己原来哪些推理必须留下,哪些错误搜索才是要改掉的东西。药量小,再加上没打中位置,结果自然就不明显。
第二周:终于有效了,能力却跟着掉了
第二周我把 SFT 剂量加大。效果非常明显,结果也非常尴尬:同一套 XH GPQA 上,官方母模是 166/198,大 SFT 后变成 148/198,少了 18 题;与此同时 reasoning 均值从 10,301 降到 4,123,中位数从 6,330 降到 1,576。
也就是说,思考量确实压掉了约六成,但能力也掉了 9.09 个百分点。方向不是完全错,剂量和数据配比却明显过头了。
之后做 RLVR、SimPO 也是类似的感觉。RLVR 把 GPQA 从 148/198 拉回 158/198,无 final 从 15 降到 11,说明它确实有用;但它仍比母模少 8 题,而且 reasoning P95 反而从 16,626 增到 20,912。
病灶还更严重了,原来的能力分布和坏的长尾一起动。直觉这个 27B 已经经历过很多轮后训练,剂量稍微大一点,或者短链、长链、代码、科学的比例偏一点,就很容易顾此失彼。
第三周:不再凑数量,开始一条一条看数据
第三周我换了思路,既然病灶集中那就先彻底定位一下病得不轻的是什么——先让 27B 自己做题,让它把问题充分暴露出来。它自己答对的轨迹留下来护住基座;科学、hard code 里那些答错、想满、截断、空答、答后重开的轨迹,则单独挑出来交给教师模型重做。
K3、Grok 4.6 XH、Opus 5 负责把这些失败轨迹改成完整、可验证、能正确提交的解法。GPT‑5.6 Sol 再做最后一遍复核:能修的就修,逻辑和答案都站不住、又没法补好的就扔掉。
这里不是让教师把每个答案都缩成几行,而是让它真的把题做对,把原来卡住的地方走通,然后在该停的时候交答案。
最后实际冻结的是 1,905 条,来源配比是:
| 数据角色 | 条数 | 占比 |
|---|---|---|
| 27B 原生正确轨迹 | 894 | 46.9% |
| 同题病灶修复轨迹 | 176 | 9.2% |
| 独立教师优秀轨迹 | 835 | 43.8% |
176 条同题修复里,Grok 负责 86 条、Opus 5 负责 58 条、K3 负责 32 条。835 条独立教师轨迹里,Grok 390 条、GPT‑5.6 Sol 221 条、K3 149 条,其他经过复核的教师轨迹 75 条。GPT‑5.6 Sol 还负责最后的整体复核。
按题型看,代码 921 条(48.3%)、科学 567 条(29.8%)、通识 206 条(10.8%),其余 agentic、preservation 和其他任务 211 条(11.1%)。
长度也没有硬凑成整齐比例,而是按最终合格轨迹自然落桶:
| Reasoning 长度 | 条数 | 样本占比 | Reasoning token 占比 |
|---|---|---|---|
| <2K | 798 | 41.9% | 8.0% |
| 2–8K | 837 | 43.9% | 44.8% |
| 8–16K | 197 | 10.3% | 27.6% |
| 16–28K | 71 | 3.7% | 18.9% |
| 28–32K | 2 | 0.1% | 0.8% |
这张表比单看条数更重要:8K 以上轨迹只占 14.2%,却贡献了 47.2% 的 reasoning tokens。短中轨迹负责把主体节奏拉回来,少量真正复杂的长轨迹仍然承担了接近一半的推理监督,所以模型不会被训练成遇到难题也只写几行。
每一条还要继续看答案对不对、推导闭不闭合、是不是比原来的失败轨迹更有效、有没有为了短而短、最后有没有正常提交。第三周真正起作用的,不是把教师数据堆到一半以上,而是让 894 条原生正确轨迹和 176 条同题修复各自承担清楚的职责。
这一轮看治疗效果终于对了。整体思考负担下来了,能力没有跟着掉。剩下的 32K、空 final、不提交和答后重开已经不是大面积能力问题,而是一小撮很具体的行为长尾,后面再用一次很轻的 SimPO 收尾就够了。
第三周 SFT 里程碑:超时被治住,基座能力保住了
这一轮 SFT 跑完,我第一次觉得方向真的对了。完整 GPQA 是 168/198 = 84.85%,平均 reasoning 10,264 tokens;全程请求超时/错误 0/0,严格 LOOP 也是 0。前几周经常一进长推理就会大面积超时,整套测评拖得几乎没法用,这次终于能顺顺当当地跑完,而且分数没有塌。
当然,它还没完全好。32K 截断 27,空 final/无正式提交各 27,不可解析 23,答后重开 42。也就是说,模型已经更能把题做出来了,但少数难题上还是会“答案都找到了,就是不肯停”,最后一路撞上上下文上限。接下来要修的是这一小块,不是把全模型的推理一起砍短。
第三周 RLVR:训练节点失败,但病灶资产被完整留下
SFT 成功后,我还是先照之前的经验做了一轮 RLVR,想把剩下的毛病一次处理掉。P50、P75、P100 三个节点都跑了,结果完整测下来,能力检查没过,所以一个都没留。
不过这次不能简单说“白干了”。RLVR 训练出来的节点不行,但为它准备的数据很好用:哪些是核心病灶、哪些是能力保护、哪些长推理不能误伤,都已经分得很清楚。后来那 110 对 SimPO 数据,就是从这里一点点挑出来的。
2026-09-02,最终 RLVR 数据经独立审计通过并冻结:
1、40 个训练组:核心病灶 16 组(双曝光),A 组 18,能力保护 B 组 6。
2、640 条唯一轨迹,896 次训练曝光,28 个 optimizer steps;每步 2 题,每题 G16。
3、题型为代码 20、科学 18、通识 2;16 个核心病灶恰好由代码 8 + 科学 8 组成。
4、奖励分布为:正确且规范提交 479 条(1.05),普通错误 60 条(0),超长截断、空答、无提交、答后重开等行为病灶 101 条(-0.15)。惩罚只记一次,不叠加。这个幅度是在复刻 RLVR1 的稳定训练结构与加强残余病灶信号之间取的有界折中;它不把“长”本身当作负例。
5、正确的 8K–28K 中长推理共有 299 条。数据没有把“长”本身视为错误;该保留的复杂推导仍占很大比重。
6、另冻结 100 个诊断 pair,覆盖 63 道题,最多每题两对;其中包含一条人工逐段确认的“答案已确定、仍反复重开”负例。这 100 对是审计与后备偏好资产,不计入上述 PPO 的 896 次曝光。
这一轮最重要的数据经验
做到这里我才真正明白,有效的行为训练不是“多给模型看一点短答案”。至少要同时有三种东西:
- 27B 自己已经做对的轨迹,用来保住原生表达、推理节奏和能力上限;
- 27B 在同一难题上的错误、截断、空答和答后重开轨迹,用来暴露真实病灶;
- 教师模型给出的完整、可验证、正确提交的优秀轨迹,用来展示从病灶状态走到正确闭环的路径。
三样东西少一样都容易出问题。只放短答案,模型可能连该想的也不想了;只放教师答案,它会丢掉自己的输出风格;只有失败没有同题正确解法,它又不知道该往哪走。真正想教会它的是:答案已经可靠就提交,路走不通就换一条有效路径,真有必要时照样可以认真想很久。
第三周终局 SimPO:不再扩大训练,只修最后的行为长尾
RLVR 三个节点都没过线,我就回到已经验证好的 SFT BF16,不再往失败节点上叠东西。接下来只从现成的偏好数据里挑最对症、又不容易伤能力的 pair,做一次很轻的 SimPO。
到这一步,模型已经会推理,也已经能跑完整套测评。剩下的问题很窄:少数难题会在得到答案后又重新打开推理,或者一直搜到 32K,最后空 final、没提交、解析不出来。这种问题最适合拿同一道题的两条轨迹直接做比较:一条把题做完并正常交答案,一条真实地展示它是怎么卡住的。没必要再做一轮大 SFT,更不能把所有长回答都当成坏答案。
110 对数据如何组成
我最后只挑了 110 个 preference pairs,一共覆盖 73 道题:
- 代码 60 对、科学 40 对、通识 10 对;
- 病灶修复 57 对,直接针对 32K 截断、空 final、不可解析、无提交和答后重开;
- 能力保护 53 对,保留复杂问题中确有必要的完整推导,防止模型学成“遇事就短答”;
- 与 14,365 条 HOLDOUT/测试题进行污染审计,命中为 0。
我惩罚的不是“写得长”,而是“没有把任务做完”。chosen 必须逻辑和答案都对,而且真的把答案交出来;rejected 可以非常长,只要它确实是模型自己暴露出来的失败。
数据里甚至保留了 36 条超过 32,768 tokens 的 rejected 轨迹。我要让模型看见自己到底是在哪里没停下来,而不是先把负例剪短,剪到连病因都看不见。
chosen 总计 1,875,144 tokens,rejected 总计 1,930,596 tokens,两侧合计约 3.806M sequence tokens。最长 pair 为 33,243 tokens,控制在训练上限 33,280 内,训练时没有发生截断。五个 step 的 token 负载偏差仅 0.0109%,避免某一步因为异常长样本而获得不成比例的更新。
训练剂量与参数
训练从 SFT 的 final1905-p50-bf16-v1 纯 BF16 合并模型重新起步,而不是从失败 RLVR 检查点继续。采用 LoRA r=16、alpha=32、dropout=0,覆盖 12 个目标模块;SimPO 使用 beta=1、gamma=0.2。优化器为 AdamW(beta1=0.9、beta2=0.95、eps=1e-8、weight_decay=0),梯度裁剪 0.5。
双卡 BF16 训练使用 FSDP FULL_SHARD、FLA 与 reentrant gradient checkpointing。全量 110 对只训练一遍,共 5 个 optimizer steps;每步 22 对,固定为代码 12、科学 8、通识 2。学习率不是恒定猛推,而是短 warm-up 后平滑收尾:
2.5e-7 → 5.0e-7 → 4.2678e-7 → 2.5e-7 → 7.3223e-8
五步训练全部完成,110/110 个 pair 每个只曝光一次;无 OOM、无 NaN、无 non-finite skip,总耗时约 3,851 秒。逐步记录如下:
| Step | Loss | Preference margin | Grad norm | LR |
|---|---|---|---|---|
| 1 | 0.849109 | -0.076252 | 0.035400 | 2.5e-7 |
| 2 | 0.843301 | -0.066172 | 0.041016 | 5.0e-7 |
| 3 | 0.841284 | -0.063309 | 0.034180 | 4.2678e-7 |
| 4 | 0.849238 | -0.074994 | 0.031738 | 2.5e-7 |
| 5 | 0.834563 | -0.057523 | 0.037842 | 7.3223e-8 |
训练前还先用三条长样本完成 smoke:loss 分别约为 0.786/0.886/0.798,margin 为 0.023/-0.154/0.001,grad norm 为 0.075/0.091/0.076,最小显存余量约 35.4 GB。
正式训练的 loss 仍处于有偏好信号、没有饱和的区间;margin 从更负逐步向零靠拢,说明更新确实在把 chosen 与 rejected 的相对偏好往目标方向移动。极低学习率则把模型位移限制在一个很小的范围内。
为什么五步不是“剂量太小”
刚看到五步时,我也担心它是不是太轻了。但这五步每一步都有 22 对长序列,整轮实际看了约 380 万 token;而且 110 对全是筛过的同题对照,不是混在普通语料里的几粒行为样本。SimPO 的每个 token 都在比较 chosen 和 rejected,信号其实很密。
反而是多跑一个 epoch、再抬一点学习率更危险。同一小批病灶被反复强调,很容易把全模型都带成短答,或者让基准能力再掉一次。所以我只让 110 对各出现一次,五步跑完就停。训练曲线不需要好看,模型别被推过头更重要。
训练中途的 GPQA:同题配对证据先转正
测评采用与 SFT 相同的 harness,服务配置为动态 FP8、DFlash2、每卡 C24、双卡总并发 C48,context 65,536、最大输出 32,768、单题超时 1,800 秒。截至 SimPO 跑到 162/198 时,只比较 SFT 与 SimPO 都已完成的同一组 162 道题,得到:
| 指标 | SFT(同 162 题) | SimPO(同 162 题) | 变化 |
|---|---|---|---|
| 正确率 | 142/162,87.65% | 146/162,90.12% | +4 题,+2.47pp |
| 平均 reasoning | 8,351.8 | 7,408 | -943.8 |
| reasoning 中位数 | 3,842.5 | 3,124 | -718.5 |
| reasoning P90 | 32,133 | 26,153 | -5,980 |
| 32K 截断 | 16 | 11 | -5 |
| 空 final | 16 | 11 | -5 |
| 不可解析 | 15 | 9 | -6 |
| 答后重开 | 33 | 28 | -5 |
| 超时/请求错误 | 0/0 | 0/0 | 持平 |
| runner 宽松 LOOP 候选 | 4 | 3 | -1 |
逐题迁移是 5 道错题变对、1 道对题变错,净增 4 道。更关键的是,均值只下降约 944 tokens,而 P90 下降近 6K:变化主要发生在最拖沓的长尾,不是把所有正常推理一起砍短。这正符合本轮目标。
它之所以值得保留,是因为训练还没跑完全套时,已经出现 5 道错题变对、1 道对题变错的明确迁移,说明小剂量偏好信号没有先把能力打坏。
最终 GPQA:能力上升,长尾下降,但没有追求清零
正式 198/198 完成后,最终 SimPO 得到 171/198 = 86.36%,相比 SFT 的 168/198 = 84.85% 增加 3 道正确题。平均 reasoning 从 10,264 降到 9,556 tokens;32K 截断从 27 降到 21,空 final/无正式提交各从 27 降到 21,不可解析从 23 降到 18,reopen 从 42 降到 38。两者超时/请求错误均为 0/0,严格 LOOP 均为 0。
最终 SimPO 的 reasoning 中位数为 4,788.5,P90 为 32,765.3;>8K 为 73 题,>16K 为 44 题。P90 依然贴近 32K,说明极难题的长尾没有被完全消灭;但更重要的是,模型整体思考量下降、主要提交病灶减少,正确率反而上升。它没有把所有回答训成短答案,也没有为了追求一张“异常全零”的表继续冒险加码。
三阶段全量成绩:能力没塌,思考降低完全没有死循环

| 阶段 | GPQA(198题) | MMLU(500题) | LCB(100题) |
|---|---|---|---|
| 原版 Qwen3.8-27B | 164/198,82.83% | 451/500,90.20% | 69/100,69.00% |
| 第三周 SFT | 168/198,84.85% | 445/500,89.00% | 73/100,73.00% |
| 最终 SimPO | 171/198,86.36% | 442/500,88.40% | 74/100,74.00% |
这张表更接近我说的“保住能力”。它不是三项一起涨:最终 SimPO 相比原版,GPQA 多对 7 题,LCB 多过 5 题,MMLU 少对 9 题,也就是 -1.80pp。从 SFT 到 SimPO,又是 GPQA +3、LCB +1、MMLU -3。能力分布有轻微重排,但没有出现第二周那种为了少想、GPQA 一口气掉 18 题的情况。
三列都来自同一套正式全量 harness:动态 FP8 + DFlash2、双卡每卡 C24、总并发 48、XH、最大输出 32,768 tokens,超时与异常都留在分母里。
训练不是把模型统一压短,而是让科学推理和 hard code 更容易走到正确闭环;MMLU 的小幅回落也原样保留,不用宏平均把它抹平。图表原始数据见 CSV。最终模型与完整英文模型卡在 Hugging Face 主仓。
异常指标的口径
- 32K:输出碰到 max_tokens=32,768 而被 length 截断;
- empty final:正式 final 字段为空。harness 可能从 reasoning 中回退抽取答案,因此它不一定等于计分错误,但仍是提交行为异常;
- 不可解析:依次检查 final 和 reasoning 后,解析器仍不能得到 A/B/C/D,记为 pred=None;它不是普通答错的同义词;
- reopen:reasoning 中出现“答案是/最终答案/final answer”等答案标记后,模型又继续生成超过 400 个字符;它表示答后重开搜索,不必然等于最终没有答案;
- P90:90% 样本的 reasoning 长度不超过该值,用来观察最重的 10% 长尾;
- 严格 LOOP 只认持续、实质相同内容的循环。单行偶尔重复两三次、随后正常 stop 并提交答案,不算 LOOP。
这些异常可以重叠。例如同一题可能同时是 32K、empty final、不可解析和 reopen,所以不能把各项简单相加当作异常题总数。
原定采用门槛与最终停手点
训练前设定的理想门槛是:
- GPQA 相对 SFT 最多下降 1 个正确题;
- MMLU 最多下降 5 个正确题;
- LCB 最多下降 1 道题,且总测试用例通过率不低于 99%;
- 超时不得多于 SFT,严格 LOOP 不得增加;
- 32K、空 final、不可解析、无提交和 reopen 各项均不得恶化,病灶并集至少下降 25%。
最终病灶并集下降为 13.11%,没有达到最初设想的 25%。如果只看预设数字,似乎还应该再做一次更小的 SimPO;但三周实验已经反复证明,继续推动同一小批行为对最容易让能力先掉。
此时 GPQA 已净增 3 题,平均思考、32K、空 final、无提交、不可解析和 reopen 全部向好,超时与严格 LOOP 也没有恶化。最终决策因此不是为了追求表格满分继续治疗,而是采用这个 SimPO,并在收益仍为正时停手。
这就是这次“赛博治疗”的完成点:当模型主体能力已经成立,最后的优化不应继续扩充剂量,而应把少量、同题、可核验的行为对放在正确的位置。
目标不是让模型少想,而是让它会做时正确完成,不会做时停止无效搜索,同时守住真正需要长思考的问题。治到主要矛盾已经缓解、能力仍在,就应该停,而不是把模型治疗到只剩一种思考长度。
训练停手以后,量化又是另一场踩坑
训练停手以后,我原本以为量化就是把文件做小一点。很快又踩坑了:如果模型结构认错、把多模态 wrapper 当成文本模型去量,出来的不是正常精度损失,而是一串 !!!!;就算结构没错,平均地压每一层,也可能把前面刚保住的科学推理、hard code 和 XH 长思考重新压坏。
所以量化也得接着前面的思路做:普通 tensor 负责省空间,训练和敏感度分析里确认过的关键层、关键家族负责保能力。FP8 和 GGUF 更不能混成一条路线,它们的格式、运行时和检查方法完全不是一回事。
2026-09-03 对 Qwen3.8-27B 的官方与社区方案重新做了一次架构级核对。结论不是选一个名字通吃所有档位,而是把两类完全不同的量化链分开:
1、服务端静态 FP8 使用 Hugging Face/SGLang 的 fine-grained E4M3 权重,128×128 block,activation dynamic。
实际量化输入先被收敛为与最终 SimPO 一致的 64 层、无 MTP、无视觉 tensor 的纯文本 trunk,并在该 tensor namespace 上重新构建和审计跳过表;不能把官方多模态 wrapper 或包含视觉/MTP 名字的排除表原样套进文本模型。
文本 BF16 源的 20 个文件已逐一通过 SHA 校验,量化结果也完成 load、生成质量和 DFlash2 六档并发验证,没有出现此前错误转换导致的标点坍缩。
2、FP8 的第一次采样失败不是量化结构本身的证据。此前服务强制把 recurrent/GDN SSM state 设为 BF16,而 RTX PRO 6000 上经过完整验证的 Qwen3.8 FP8+DFlash2 路线使用 SSM FP32、卷积状态 BF16、target/draft KV FP8 E4M3、FlashInfer prefill 与 DFlash decode。
运行时数据类型、后端和并发必须先按这条路线做 C1/C4 正确性验证,再逐步增加并发;不能把 C24 当作权重是否正确的第一道 smoke。
3、Unsloth Dynamic v3 是 llama.cpp GGUF 的逐 tensor 动态精度分配与 imatrix 路线,不是 safetensors Block128 FP8 的修补工具。其 Qwen3.8-27B 发布档包括 Q3 UD-Q3_K_XL、Q4 UD-Q4_K_M/XL、Q5 UD-Q5_K_M/XL。
它可以作为 Q5/Q4/Q3 的 tensor 家族骨架,但不能直接套用包含 blk.64 MTP 的 65 层拓扑;本模型终版是无 MTP 的 64 层 trunk。
4、APEX 对 Qwen3.8-27B 做过单独的 dense/hybrid 敏感度实验。结果显示其重分配在约 15.2 GB 以下才产生优势:17.65 GB 档比同体积平坦方案差 14%,15.17 GB 基本打平,13.49 GB 的 KL 优势约 25%,10.79 GB 约 22.1%。
因此 APEX 不应强行主导 Q5/Q4;它真正适合补强 Q3。该实验还给出敏感度顺序:output 最高,其次是 full-attention、边缘 FFN、linear-attention output/qkv,再到 FFN down/up/gate;同形状的 output 比 token_embd 敏感约 15.3×。
最后我把几档拆开来做:
1、FP8:保持官方 Block128 数据格式,但在实际的 64 层纯文本 tensor namespace 上重建并审计排除表;采用 PRO6000 已验证的状态精度与 DFlash2 运行组合,通过 load、greedy、采样、C4 后,才进入双卡正式三项 harness。
2、Q5/Q4:以 Unsloth Qwen3.8 动态 tensor map 为骨架,叠加本模型 T10 REAP 的关键层保护;冲突时取更高精度。APEX 只用于交叉检查敏感 tensor,不照搬其低比特梯度。
3、Q3:融合 Unsloth 动态骨架、APEX 的 Qwen3.8-27B 实测敏感度和 T10 REAP 层位;output/lm_head、full-attention、linear-attention out/qkv、首尾层优先保精度,并使用由本次 SFT/SimPO 多域数据构建的 T10 专属 imatrix。
共用底座:不是三次互不相关的量化
Q5、Q4、Q3 都从同一份最终 SimPO 文本 F16 直接量化。主模型固定为 64 层、约 851 个 tensor、无 MTP、无内嵌视觉权重;禁止从较高比特 GGUF 再量化,避免二次舍入误差。
三档共用同一份 512-chunk interleaved imatrix,内容来自本次 SFT/SimPO 覆盖的代码、科学和通识轨迹。token_embd 与 output/lm_head 一律保留为 Q8_0,规则冲突时永远取更高精度。
T10 自身的 REAP 层位也冻结为三组:
- Critical:
0, 50, 52, 54, 56, 58, 60–63; - High:
21, 42, 44, 46, 48, 49, 53, 57, 59; - Full-Attention:
3, 7, 11, …, 63,即每四层中的 full-attention 层。
REAP 告诉我哪些层不能平均压,Unsloth/APEX 的 tensor 敏感度则告诉我同一层里哪些矩阵更怕掉精度。LynnStyle 做的事情,就是把这两类证据叠在一起,而不是挑一份社区表原样照抄。
Q5:高保真部署档,关键层直接升到 Q8
Q5 以 Q5_K_M 为基础,目标是尽量接近高精度模型,同时明显降低存储和显存占用:
- Critical 与首尾层 L0–3 / L60–63 整层升到 Q8_0;
- High 层整层升到 Q6_K;
- full-attention 的 q/k/v/o 与中段 ssm_out 升到 Q6_K;
- 其余 tensor 保持 Q5 基础精度。
这是一档偏保守的“能力优先”方案。它没有让 APEX 的超低比特梯度主导中高档,只借用了其敏感家族排序。最终规则已对 851-tensor F16 做过完整 dry-run,量化主体约 20.86 GiB、6.66 BPW;正式三测为 GPQA 164/198、MMLU 438/500、LCB 75/100。
Q4:容量与能力的主力平衡档
Q4 以 Q4_K_M 为基础,但不是把所有层平均压到四比特:
- L0–3 / L60–63 保留 Q8_0;
- 其余 Critical 与 L56–59 升到 Q6_K;
- 其余 High 升到 Q5_K;
- full-attention 的 q/k/v/o 与中段 ssm_out 升到 Q6_K;
- 中段 gate/qkv/ssm_* 家族升到 Q5_K;
- 其余 tensor 维持 Q4 基础精度。
它的特点是把预算集中给 full-attention、SSM 输出、首尾层和训练中确认过的高敏层,最后成了本地部署的主力平衡档。
这里还及时踩住了一个 llama.cpp 规则坑:Q5_K_S 是模型级量化类型,但 --tensor-type-file 的逐 tensor 覆盖应写成 q5_k,不能写不存在的 q5_k_s。错误规则在 dry-run 阶段即被拒绝,没有产生可误发的坏模型;修正版正式三测为 GPQA 166/198、MMLU 443/500、LCB 74/100。
Q3:真正融合 REAP、Unsloth 与 APEX 的极限档
Q3 才是 APEX 敏感度分配真正有价值的区间。它以 Q3_K_M 为基础,使用更密集的跨层与跨家族保护:
- L0–3 / L60–63 整层升到 Q6_K;
- 其余 Critical,加上 L4–6 / L56–59,整层升到 Q5_K;
- 其余 High 升到 Q4_K;
- full-attention 的 q/k/v/o 与中段 ssm_out 升到 Q5_K;
- gate/qkv/ssm_* 与 ffn_down 升到 Q4_K_M;
- embedding 与输出头仍单独保持 Q8_0。
因此 Q3 不是“Q5 少两比特”,而是一份重新分配精度预算的独立模型:边缘层、输出头、full-attention、linear-attention/SSM 输出和 FFN down 得到超出基础档的保护,普通 tensor 承担主要压缩。
成品约 17.03 GB、5.06 BPW,完成了 llama.cpp 双卡加载、64K slot、正确生成、视觉与 DFlash2 smoke。PRO6000 clean 复测最终拿到 GPQA 172/198、MMLU 435/500、LCB 78/100;此前 Spark 上带 24 个 ReadTimeout 的 GPQA 164/198 已明确作废。
| 档位 | 基础量化 | 主要整层保护 | 主要 tensor 家族保护 | 定位 |
|---|---|---|---|---|
| Q5 | Q5_K_M | Critical 与首尾 → Q8;High → Q6 | full-attn、ssm_out → Q6 | 高保真 |
| Q4 | Q4_K_M | 首尾 → Q8;Critical/尾部 → Q6;High → Q5 | full-attn、ssm_out → Q6;中段混合族 → Q5 | 主力平衡 |
| Q3 | Q3_K_M | 首尾 → Q6;Critical/边缘 → Q5;High → Q4 | full-attn、ssm_out → Q5;FFN/SSM 关键族 → Q4 | 极限容量 |
发布时的配套文件也要分档
GGUF 主文件始终保持纯文本模型;视觉塔作为独立 mmproj/视觉文件发布,DFlash2 也作为独立草稿模型配套,不能把它们重新塞回已经验证过的 851-tensor 文本 trunk。发布组合冻结为:
| 主模型档位 | DFlash2 | 独立视觉塔 |
|---|---|---|
| Q8、Q6_K | 共享 BF16 DFlash2 | Q8 视觉塔 |
| Q5、Q4、Q3 | 共享 BF16 DFlash2 | Q6_K 视觉塔 |
我这么配,主要是在算显存账。会选 Q8、Q6_K 的人通常更在意保真,视觉塔继续用 Q8 比较合适;
到了 Q5、Q4、Q3,本来就是为了在本地省显存和内存,视觉塔换成 Q6 更搭,不然主模型辛苦省下来的空间又被配套文件吃回去了。
模型卡里也只会放真正加载、生成和并发跑过的命令;文件一起提供,不代表没测过的运行时组合也能随便混用。
这三档的共同特点不是某个新量化名字,而是让量化继续服从训练目标:保住已经恢复的能力与必要长推理,把压缩主要放在不敏感的位置,而不是让部署便利抵消前面 SFT 与 SimPO 的全部工作。
所有量化档都必须回到同一版本的 GPQA、MMLU、LCB harness,统一 XH、32K 输出上限和异常口径。PPL、KL、文件大小以及社区宣传分只能用于选择候选,不能替代本模型的能力与行为验收。
五档 GGUF 全量成绩:Q6 最均衡,Q3 把结尾收得很漂亮

| 档位 | GPQA(198题) | MMLU(500题) | LCB(100题) |
|---|---|---|---|
| Q8_0 | 164/198,82.83% | 447/500,89.40% | 74/100,74.00% |
| Q6_K | 171/198,86.36% | 440/500,88.00% | 78/100,78.00% |
| Q5-LynnStyle | 164/198,82.83% | 438/500,87.60% | 75/100,75.00% |
| Q4-LynnStyle | 166/198,83.84% | 443/500,88.60% | 74/100,74.00% |
| Q3-LynnStyle | 172/198,86.87% | 435/500,87.00% | 78/100,78.00% |
如果只让我推荐一档,我会先选 Q6_K:GPQA 只比 Q3 少一题,LCB 并列第一,MMLU 又比 Q3 多五题,是五档里最均衡的。Q8_0 的 MMLU 最高,但 GPQA 和 LCB 没有体现出体积优势;Q4-LynnStyle 的 MMLU 比 Q5、Q6、Q3 都高,是更小一档里很能打的平衡点。
Q3-LynnStyle 则是这三周最合适的句号。它不代表三比特“神奇地比高精度更聪明”:GPQA 只比 Q6 多一题,198 题里的单题变化本来就可能受量化后的临界 token 排序影响;它的 MMLU 也是五档最低。
真正值得高兴的是,一份约 17 GB 的极限容量档,在 clean 复测里仍有 172/198 的 GPQA 和 78/100 的 LCB,没有把科学与代码能力一起压碎。这说明 REAP 层位、Unsloth tensor map 和 APEX 敏感度的融合,至少在这份模型上把该保护的位置保护住了。
三周结束:这次真的可以撒花了
第一周,药量太小,数据也没打中位置;第二周,终于有效,却把能力一起压了下去;第三周才学会先听模型怎么病,再决定给它什么。894 条它自己做对的轨迹守住底子,176 条同题修复专门教它走出卡死点,835 条教师优秀轨迹补上正确路线。SFT 用 1,905 条把主体拉回来,SimPO 再用 110 对、只走 5 步,收掉一部分 32K、空答和不提交。
最后没有得到一个“永远不长想”的模型,也没有必要。它还会在真难题上用掉很多 token,P90 依旧贴近 32K;但完整 GPQA 不再超时,正确题更多,平均思考更低,32K 和提交异常也少了。再往下压当然还可能继续变短,可三周里已经看过好几次能力先掉下去,所以我选择在这里停手。
这次最值钱的收获不是某个学习率,也不是 K3、Grok、Opus 或 GPT 谁更强,而是终于把数据分成了清楚的角色:哪些负责保住模型,哪些负责暴露病灶,哪些负责给出同题的正确闭环。
对一个已经后训练得很充分的 27B,数据不是越多越好,药也不是越猛越好。每一条都知道自己在治什么,剂量刚好够推动它,然后及时停——这才是最后能让 HF都闻之色变的Qwen 3.8 27B的XH 档继续可用的原因。
作者:Lynn
https://zhuanlan.zhihu.com/p/2079282516771587155