)
上一篇第 16 篇《为什么要有自己的权重格式》 下一篇第 18 篇《文字怎么变成数字分词与位置》一句话导读大模型推理里的转换就是把别人的格式读出来、还原成普通小数、按自己的精度重新压缩、再按自己的布局摆好写进去。既然多走了一趟还原再压缩就必须能对得上账。关键词推理引擎入门、大模型推理、转换conversion、量化quantization、反量化dequantize、布局重排、对拍第 16 篇讲了为什么要自己定一套权重格式。定完格式第一件绕不开的活就是把现成的公开权重翻译过来。这一篇只讲这一件事——转换到底做了什么、代价在哪里、又怎么证明它没做错。① 一句话概念读出旧格式按自己的布局重写一遍。② 起点一本外文菜谱假设你拿到一本外文菜谱想把它改写成自家厨房的习惯版。第一件事是读懂原文一句一句看明白——“二百克中筋面粉”“中火十分钟”。这一步必须老老实实做看不懂就没法往下走。第二件事是按自己的写法重写你不会把外文原样抄一遍而是换成自己的记法——“面粉 200 克普通”“中火十分钟”。同时你还会顺手把食材按自家橱柜的摆放顺序重新分装原来按字母排的现在按常用程度摆在手边下次做菜一伸手就拿到。关键在于这是一次有损耗的翻译原文说中筋面粉你的写法只有普通面粉这一档那差别就记在备注里原文说差不多二百克你写成整数克也会差上一点点。翻译完你得能回答“我把原文的哪些说法简化了、简化掉多少”——答得上来这本菜谱才敢用。③ 伪代码读出来、重压一遍、按自己的摆法写回把这个翻译过程写成代码对每一个张量都走同一条流水线。函数 转换(源文件, 目标文件) - 无: 对 源文件 的每一个 张量: 值 读出源张量(张量) # 压缩过的先还原成小数 新值 按目标精度 重新压缩(值) # 再按自己的精度压一遍 排好的 按目标布局 重排(新值) # 摆成计算时想要的顺序 目标文件.写入(张量.名字, 排好的) 目标文件.收尾(写入头与目录) # 代价: 每个张量各走一遍转换只做一次之后每次加载都受益逐行要点读出源张量(张量)源文件可能是压缩格式用更少的位数表示每个数读出来时先还原成普通小数如果源本来就是小数这一步就是直接读。按目标精度 重新压缩(值)把已经还原成小数的值按自己的精度再压一遍。注意这一步会引入第二次舍入——先还原再压缩中间那一次偏差是躲不掉的所以必须能测量它。按目标布局 重排(新值)源文件里数据用哪种排法由别人决定这里一次性重排成自己计算时想要的顺序也就是第 16 篇说的预排布局。目标文件.写入(张量.名字, 排好的)每个张量带着名字写进去名字就是目录里的键将来靠它定位。最后注释转换是一次性成本重复的加载才是长期在付的账。整条转换流水线如图 1 所示。图 1两条输入 → 同一条流水线 → 一个产物左边两种公开权重格式safetensors 来源、GGUF 来源各作为一条输入箭头汇入同一条流水线读出张量 → 反量化 → 按目标精度重新量化 → 按目标布局重排 → 写入文件最后产出自家格式VQF图里另有两行旁注——“怎么证明两条路一样让两条路产出同一个文件然后逐字节比和对不上的常见原因块的切法不同、步长的算法不同、累加顺序不同”。④ 纸笔实验必做任务给 4 个用 8 位精度存的小数做8 位 → 小数 → 4 位两步转换写出结果并说明误差从哪来。假设源文件里这 4 个数是 8 位存的还原成小数后约为 0.102、0.297、0.551、0.801。第一步已经做完上面这 4 个小数就是还原结果。第二步目标是 4 位精度把 0~1 均匀分档、档宽1/16 0.0625每个值取0、1/16、…、15/16、1这 17 个档位里最近的一个0.102 → 0.1250.297 → 0.31250.551 → 0.56250.801 → 0.8125预期结果转换后的四个值是0.125、0.3125、0.5625、0.8125与最初的原值相比偏差约 0.023、0.016、0.012、0.012。而 8 位那一档宽度只有约1/256 ≈ 0.0039最大偏差不超过半个档宽。结论转换引入的误差由目标精度主导——4 位的档宽是 8 位的十六倍误差也大一个量级。也正因为如此两条不同的来源只要最终都落到同一个目标精度结果原则上应当一致——但原则上不等于事实上边界附近必须用逐字节对拍证明这才有对拍可言。可选 REPL 版# 8 位 → 小数 → 4 位源8位[26,76,141,205]# 源文件里存的是 0~255 的整数小数[q/256forqin源8位]# 第一步还原成小数目标4位[round(x*16)/16forxin小数]# 第二步按 4 位精度取档print([round(x,4)forxin小数])# [0.1016, 0.2969, 0.5508, 0.8008]print(目标4位)# [0.125, 0.3125, 0.5625, 0.8125]# 追问把第二步换成 8 位误差会大还是小为什么⑤ 进阶锚点进阶锚点本篇概念在《30 天手搓推理引擎》Day 17里被真正实现——17-1 safetensors → VQFvqf_write 一次成型/17-2 GGUF → VQFQ4_0…Q8_K 反量化再量化/17-3 位级一致性实验两条转换路产物逐字节对拍。入门版到这里就够了进阶版会多出两条来源各自的反量化路径、写盘代码的一次成型流程以及把两种来源的产物做逐字节对拍的实验记录与差异归因引自进阶系列源码与文档口径。想动手 → 仓库https://gitee.com/pei-xiaoguang/kestrel-llm从 Day 1 开始。下篇预告权重和文件都齐了可是模型不认识文字。下一篇回到最初的入口文字怎么变成数字——分词与位置。