引擎叫 llama98-zh,可执行文件是 llama98,目标机器是奔腾 II / III 级的 Windows 9x 和 DOS。构建由同一个 Makefile 驱动 gcc 与 Open Watcom,产物有四类:
- Win32 的 CLI
- Win32 的 GUI,产物名是
kunkun98-gui - 一个 DLL(动态链接库)
- 一个 32 位 DOS 扩展器版本
引擎和桌面端在 llama98-zh 仓库里。它跑的模型在另一个仓库,叫 Kunkun98。
模型是 134,529,456 个参数,量化后 103.5 MiB。架构叫 KunMoE:8 层里 6 层是 KDA 线性注意力、2 层是完整注意力,16 个专家走 top-2 路由,另加 1 个共享专家。权重部分取自 Qwen/Qwen3.5-0.8B,许可跟着上游走 Apache-2.0。把 MODEL/ 目录交给引擎就能对话:
1 | llama98 MODEL --chat --prompt "你好" |
同一份源码要在两套工具链上编译,在参考实现、SSE2(流式 SIMD 扩展 2)与 AVX2(高级矢量扩展 2)三层内核上运行。如果三层内核给出的结果不同,输出出错时就无法判断问题出在模型还是内核。引擎的目标因此定成逐字节一致。
三层内核互为对照
AVX2 与 SSE2 在 kmr20/zh 上跑 603 个 token,逐字节相同。
浮点语义也统一了。默认改成向零舍入加冲刷到零,ARM 的软浮点与 x86 因此逐字节一致;就近舍入只作为诊断选项保留。
0.1.6 修掉了一处浮点舍入不一致。Watcom 那条路径只截断了 387 的控制字,没有写 MXCSR。SSE2 内核按 MXCSR 舍入,C 路径在提供的快速浮点模式下截断,只有 SSE2 那一层用就近舍入。结果是 78,905,344 字节里有 59,349,441 与 gcc 构建不一致。两份构建的输出从第一个 token 起就不同。
构建过程中的校验
make check 构建三个 Watcom 产物,链接通过即证明 DLL 的导出面与引擎一致,不需要另写对照检查。
桌面端自带一套自检:kunkun98-gui --selftest 跑 421 项检查,0 失败,1 跳过。
-D__MMX__=1 写进构建。手写汇编不会静默消失,少了它链接就过不去。
源码列表只在一处定义。引擎、服务端、界面与公共部分这四份清单写在 Makefile 顶部,给引擎加一个源文件只需改一个地方。
DOS 扩展器:一个字节的补丁
DOS 那个产物要用 DOS/32A 扩展器,启动时会打印版权横幅。
许可条件 3 允许把声明放在软件自身。补丁因此只清掉 _ID32 配置字节的第 3 位(”show copyright”),启动时不打印横幅,声明移到 --help 输出里。
出厂产物的底本是官方 9.12 版,与 Open Watcom 2.x 在 binw/ 里带的那份逐字节相同。改动只有一处配置位:偏移 0x75 由 0x09 改成 0x01。
不做源码重建,是因为 TASM 5.0 的 OMF(目标模块格式)目标记录过不了 Open Watcom 的 wlink,入口段会丢。出厂产物因此是打补丁的官方二进制,源码补丁与它并列留在仓库里,供人核对。
速度、答得对、可复现是三件事
134M 的模型在奔腾 III 上大约 2.5 token/秒。这个速度不快,但足以证明引擎能在目标机器上运行,不只是在别处能跑。
答得对不对是另一件事。模型的 README 自己就写着:中文流畅,内容经常是错的。这不是谦虚。仓库里的样例未经编辑,问「1+1等于几」,它答「1 + 2 = 3」;问「你是谁」,它答「我。你是谁?」;问「中国的首都是哪里」,它能写出一段通顺的、带具体年份的、编造的首都史。
规模不决定这一类表现。同一个问题问它和别人的模型,这一点看得很清楚。
问「原神的尼可,解锁2命有啥」,Kunkun98 把「尼可」当成古埃及的符号,写了一整篇关于「尼」字的考据。它夹进去的年份是「阿基米德(约公元前 216—-379—580)」。
同一个问题问小红书的 dots3-note preview,那是 280B 的模型。它把「尼可」当成了另一个角色「妮露」,又在思考段里写下「『解锁2命』中的『命』字被误写为『命』」这样绕回自己的判断。正文最后退化成把问题重复了两遍。
两边都没答对。134M 那份的错法读起来像模像样,280B 那份的错法不像 280B。一次提问说明不了太多,但「答得对不对」和「多少参数」之间,没有一条能直接画的线。
逐字节一致管的是可复现,不是答得对。老机器上给出的答案与其他任何机器完全相同,结果可以复现,也可以对照。至于那个答案对不对,是另外一回事。
引擎在 https://github.com/lunzima/llama98-zh,模型权重在 https://github.com/lunzima/kunkun98-models。
评论
点击下面的按钮加载评论框。评论提交后需经确认,不会立即显示。
已提交,确认后会显示。