Ling-3.0-tiny-RKNN / docs /INT4_BOARD_ACCURACY_20260922.md
Sariel00's picture
Publish Ling-3.0-tiny RKNN engine and model
3fd1a35 verified
|
Raw History Blame Contribute Delete
9.54 kB

官方 INT4 与板端 v6 数值误差对照

日期:2026-09-22。桌面 RTX 5090 与 RK3588 / NanoPi M6。本轮不测试 FP8,不重新量化模型,不修改线上模型或默认 attention 路径。

结论:官方 INT4 在本组固定前缀上更接近 BF16;板端当前版与基线的总误差接近,但 NPU 路径有可测得的新增偏移,不能称为无损。 本组结果支持继续定位 NPU 数值差异,同时说明板端与官方 INT4 的主要差距在本轮优化前就已存在。

结果

以下统一以原始 BF16 为参考,按 4,322 个预测位置加权,不按题目平均。短输入当前版强制启用 NPU,8K 当前版按默认门槛启用;详见下方测量口径。

路径 logits MAE ↓ logits RMSE ↓ 最大绝对差 ↓ 平均 TV ↓ 平均 KL ↓ Top1 一致率 ↑
官方 INT4,桌面重建计算 0.281598 0.371417 8.390625 5.7605% 0.026054 92.6886%
板端基线 0.420840 0.548970 11.764828 8.9246% 0.060074 89.2642%
板端当前 NPU 版 0.421164 0.549502 12.022694 8.9992% 0.061127 89.5187%

相对 BF16,当前版 TV 比基线增加约 0.0746 个百分点,KL 增加约 0.001053;Top1 一致率反而增加约 0.2545 个百分点。指标有升有降,不能把所有改变简单归类为改善或退化,也不应把数值接近解释为自由生成结果相同。

直接两两比较如下;每行 KL 的参考方向按第一列指定。

参考 → 候选 logits MAE logits RMSE 最大绝对差 平均 TV 平均 KL Top1 一致率
板端基线 → 当前 0.121644 0.165286 7.663408 2.4451% 0.004768 96.9921%
官方 INT4 → 板端基线 0.462391 0.600889 11.749203 9.7555% 0.073287 88.6627%
官方 INT4 → 板端当前 0.462421 0.600880 11.190662 9.7997% 0.074147 88.6395%

当前与基线有 130 / 4322 个位置的 Top1 不同。以基线第一名比第二名至少高 1 nat 筛选,2,998 个位置中仅 1 个不同,一致率 99.9666%;说明本批选词变化大多发生在接近的候选之间。这不是事实正确性保证。

新增偏移的 TV P95 为 7.5762%,单位置最大 TV 为 44.1294%,最大 KL 为 0.408940。极端位置不能被均值掩盖。较早 32 个合成位置的最大 logits 差仅 2.135,本轮扩大到真实语言续写后观察到 7.663;样本不同,不能把两者当成同一条件下的退化趋势。仍不满足此前严格数值门槛,新路径保留实验开关。

Think / No-think

常规输入的完整续写,共 4,217 个位置:

路径(BF16 为参考) No-think TV / KL / Top1 Think TV / KL / Top1
官方 INT4 5.2640% / 0.023242 / 93.874% 6.0769% / 0.027367 / 91.890%
板端基线 8.1693% / 0.054577 / 89.673% 9.4016% / 0.062229 / 89.093%
板端当前 8.2878% / 0.056439 / 90.082% 9.4601% / 0.062958 / 89.253%

直接比较新旧板端,No-think / Think 的 TV 为 2.1454% / 2.6740%,Top1 一致率 97.725% / 96.524%。中文办公 Think 的一致率最低,为 93.563%。各题 256-token 窗口的 TV 有升有降,未见所有题目都随生成长度单调增大的模式。

8K 输入

以下单独列出两组长输入的 105 个预测位置,不能由总体中占多数的短输入代替:

路径(BF16 为参考) logits RMSE 平均 TV 平均 KL Top1 一致率
官方 INT4 0.44417 6.3228% 0.040650 92.381%
板端基线 0.69348 9.8851% 0.098455 86.667%
板端当前 0.69724 9.6228% 0.094009 86.667%

新旧板端直接对比:TV 1.8828%、KL 0.003537、RMSE 0.18262、Top1 一致率 96.190%(4 个位置改变),最大 logits 差 2.8247。本组没有表现为 NPU 启用后的整体分布明显恶化;但只包含 33 / 72 个续写位置,不能证明数千 token 自由回复的稳定性。

后续应冻结真实 Q/K/V,比较 QK、概率、PV、输出投影、激活量化编码和首次路由分歧。不要仅凭某项总误差略有改善,就跳过新路径的数值定位或宣布可以替换默认实现。

测量口径

所有路径使用同一 token 序列、官方聊天模板和固定参考续写,比较整个 157,184 词表。逐步强制输入相同 token,避免采样分叉干扰比较。这是固定前缀数值保真测试,不是任务正确率,也不是自由生成质量测试。

路径 权重与计算
BF16 参考 原始 BF16 模型,官方 Transformers 实现、CUDA eager attention;保留模型指定的 FP32 参数
官方 INT4 官方 group32 INT4 专家 codes × scales 重建至 BF16,在同一 CUDA 实现中计算;未做二次权重量化,没有 A8 激活量化
板端基线 v6 混合 W4A8/W8A8;BF16 KV;单 token MLA 使用 CPU
板端当前 与基线相同的 v6 权重和同一个 C++ 探针;开启 NPU 单 token MLA、双行残差、原生 KV 副本及 MoE 成本调度

官方 INT4 一行不是原生 INT4 GPU 内核实测,因此不用于说明桌面 INT4 的速度或内存。它与板端采用不同量化方案,差距不能全部归因于 RKNN 或 NPU。当前与基线的直接对照才隔离本轮路径变更;先前单独验证过 MoE 成本调度的逐值一致性。

桌面 PyTorch 2.12.1+cu130、Transformers 4.57.1;禁用 TF32。为避免投影未评分的长输入位置,使用官方 model.model 后,仅对目标位置执行原有 lm_head。中文办公 No-think 的 BF16 全词表结果与历史参考逐值一致。

官方 INT4 revision:65a6d1d71e01f73ba01e572992bbd69ea92c865f。读取 8,832 个量化矩阵、6,945,767,424 个专家权重元素;非量化张量没有发现值差异。解包与 compressed-tensors 官方 helper 交叉核对。

输入与覆盖

组别 输入 token 评分位置 说明
中文办公 No-think / Think 189 / 188 447 / 668 历史回归题,完整固定续写
数学 No-think / Think 98 / 97 581 / 873 同上
Python No-think / Think 124 / 123 686 / 962 同上
8K 资料 No-think / Think 8,226 / 8,225 33 / 72 新增资料与干扰条目,固定目标事实

合计 8 组、4,322 个预测位置,其中短输入 4,217 个、8K 输入 105 个。Think 覆盖推理文本和最终答案。短输入对当前版强制设置 LING3_MLA_DECODE_MIN_HISTORY=1,以覆盖新路径;这不是实际服务的默认短输入行为。8K 组使用默认门槛 8192,历史跨越两个以上 4096-token 块。8K 续写较短,不能外推到长时间自由生成。

板端容量 8,297 token,BF16 KV,预填充块最大 128;当前版 tile=4096、native cache 预算 1536MiB。两条路径均固定 A76 大核、NPU、DMC 最高频率,暂时停止既有应用服务,测试后恢复。所有位置有限、C++ 与 Python tokenizer 一致、无 attention fallback。当前版每个续写步骤均使用六层 NPU MLA,合计 25,884 次;基线解码 NPU 调用为零。首个评分位置来自预填充,故调用数为 6 × (4322 − 8)。

指标解释

MAE、RMSE、最大绝对差针对未归一化 logits,不是百分比。TV 为两下一词概率分布的总变差距离,表中以百分比显示;KL 为 KL(参考 || 候选),单位 nat。Top1 是在相同输入前缀下第一候选 token 的一致率,不是问答正确率。

RMSE 由全部位置、全部词表元素的均方误差开方,未逐位置开方后平均。JSON 另保留去除整体平移的 logits RMSE、TV/KL 的 P50/P95/最大值、每题及每 256 个位置的统计。不同参照下的误差不能直接相加。

复现与原始数据

本地已不保留 .f32,仅运行 score 无法重新计算误差。复测应沿用保留的 suite.json,重新执行 PC 和板端推理以生成 logits,再评分;当前摘要用于查阅已有测量结果。

入口:engine/source/tests/cross_platform_accuracy.py,阶段依次为 prepare、pc、board、score。PC 阶段需要可运行官方模型的 Torch/Transformers/FLA 环境,INT4 解包校验需要 compressed-tensors helper;评分阶段只需要 NumPy。板端编译 ling3-quant-loss-probe,用 run_board_experiment.py 管理并恢复服务与频率。

python engine/source/tests/cross_platform_accuracy.py prepare \
  --source ./work/Ling-3.0-tiny --output ./work/results
python engine/source/tests/cross_platform_accuracy.py pc --output ./work/results \
  --source ./work/BF16 --official ./work/official-int4
# 将 suite.json 复制到板端结果目录,执行以下板端阶段:
python engine/source/tests/cross_platform_accuracy.py board --output ./work/board-results \
  --probe ./work/ling3-quant-loss-probe --model ./models/local-final/v6-board-test/ling3-tiny-w4.l3r
# 将 board_baseline、board_current 两个目录复制回 PC 后:
python engine/source/tests/cross_platform_accuracy.py score --output ./work/results

完整统计:comparison.json。目录中保留固定输入 suite.json、权重审计、板端结果摘要、环境校验和 SHA256 记录;逐词表 logits 与大型运行日志已清理,不作为仓库数据分发。原始 v6 权重 SHA256 为 80f0086247328fe77b2f939df460b4955287b6f75f6aaada85512c56e652f435,与发布包校验记录一致。