同一个“通过”可能在说不同的事
本章以前五章的固定模型与输入为共同对象。缓存是在实数数学上应等价的执行重排,量化是主动改变函数的近似,调度模拟是在约定服务模型内改变事件顺序。三者不应共用一个模糊的“正确率”。缓存主要检查相同条件下 logits 近似相等;量化检查扰动大小、决策变化和独立任务质量;模拟检查守恒与时间约束。最终报告必须将这些命题拆开,不把某一测试通过写成其他机制也已证明。
验收首先写对象:模型参数哈希、输入编号、dtype、位置协议、窗口、模式、输出切片和容差。没有共同输入的两条采样序列,即使看起来都通顺,也不是缓存等价证据。没有独立目标的量化输出,即使与参考大部分词元相同,也不是任务质量证据。本项目用随机夹具闭合执行验证,不尝试以它替代语言模型评估;如果接入训练检查点,则应额外冻结词表和文档评分协议,不能只换权重文件继续沿用旧结论。
逐项定义数值比较
令参考 logits 为 z,候选为 ,最大绝对误差为各位置和词表分量差值绝对值的最大值。混合容差逐元素要求 。绝对项照顾接近零的分量,相对项照顾较大尺度;二者是测试协议参数而非自然常数。只有先确定允许误差和预期故障间隔,结果才可证伪。先看输出再挑恰好能过的阈值,会把判据变成成绩的函数。
有限精度比较还应拒绝非有限值。若任一侧含 NaN,一些手写比较会悄悄返回假而未汇总,或者均值直接传播成 NaN 后被忽略;若含无穷,两侧同为无穷也不代表正常模型输出。应先检查所有有效 logits 与损失有限,再计算误差。形状必须相同,不能依赖广播让不同批量或位置切片“比较成功”。项目使用严格切片与 torch.testing 的检查,课程独立示例另给出明确的有限数与维度断言。
完整算例一:极小误差也能改变决策
参考两类 logits 为一和一点零零零零零一,第二类胜出,间隔为十的负六次方。候选只给第一类增加二乘十的负六次方,最大绝对误差仍很小,但第一类胜出。一般地,若参考第一名与第二名的间隔为 m,且每类绝对扰动不超过 e,那么第一名最坏减少 e、第二名最坏增加 e;只有 才能从这个界保证第一名不变。等号处还涉及并列处理,所以要用严格大于。
相反,argmax 完全相同也可能掩盖明显概率变化。两类 logits 从零、一变为零、十,获胜类不变,但其概率从约零点七三变成接近一。若任务关注概率校准、困惑度或抽样行为,这不是相同输出。本项目量化报告同时记录最大 logit 差、argmax 一致率、正向 KL 和目标 NLL,不挑最漂亮的那一项作为所有质量结论。小模型浮点重排引起的误差与四位近似的误差量级不同,门槛应服务各自目标。
import math
z=[1.,1.000001];changed=[1.000002,1.000001]
def best(xs):return max(range(len(xs)),key=lambda i:xs[i])
assert best(z)!=best(changed)
e=max(abs(a-b) for a,b in zip(z,changed))
assert z[1]-z[0]<2*e
for xs in [z,changed]:assert all(math.isfinite(x) for x in xs)
def softmax(xs):
ex=[math.exp(x-max(xs)) for x in xs];return [v/sum(ex) for v in ex]
assert best([0.,1.])==best([0.,10.])
print(e,softmax([0.,1.]),softmax([0.,10.]))概率差异和任务损失的定义
给参考分布 、候选分布 ,正向 KL 为 ,按有效位置均值汇总。它有方向,交换 p、q 通常不同;项目使用参考到候选方向。计算应使用 log_softmax,避免先取极小概率再取对数。理论上 KL 非负,极小负值可能来自浮点抵消,应保留原值和容差说明,不能把明显负数一律裁成零来掩盖实现错误。
NLL 衡量目标在候选分布中的概率,不要求候选模仿参考;KL 衡量候选与参考分布的差异,不知道参考是否正确。若参考本身错误,模仿得更像不一定任务更好;若候选在一小段偶然目标上 NLL 下降,也不一定泛化更好。将这两个标准并列,是为了清楚区分保真与任务表现。随机夹具可验证计算公式和参数扰动,真实任务必须使用独立文档与足够覆盖,才能给出能力结论。
完整算例二:短文档平均会扭曲质量
假设独立文档甲有效位置二个,总负对数损失四,文档乙有效位置八个,总损失八。甲平均二、乙平均一,简单文档均值为一点五;按全部有效位置评分则总损失十二除以十,为一点二。两者回答不同问题。本课若接入 Transformer 实战的字符数据,约定每个真实字符和每个文档末尾 EOS 恰评分一次,文档开头 BOS 仅作条件,右侧 padding 的目标忽略。有效 token 加权均值是该评分契约的整体 NLL。
长文档按固定窗口分块时,还要说明边界上下文。原项目的评估窗口在边界重置上下文,因此每个字符加 EOS 仍只计一次,却不等于整篇文档无限历史条件下的似然。量化与参考必须采用同一窗口、同一重置规则,否则分数差可能来自上下文变化。训练、校准、选择阈值的验证和最终测试文档要按固定文档身份隔离;先切碎再随机分片会把相邻文本泄漏到不同集合。当前随机推理项目没有这些真实文档,报告应明确未测。
检验能否被故障推翻
一个只比较最终形状的“缓存测试”,即使关闭缓存也能通过;一个只检查权重哈希未变的量化测试,即使量化函数什么也没做也能通过。因此必须有正控制:合法缓存与参考相近;也必须有负控制:错误前缀产生可检测差异,四位恢复副本确实改变参数。保存原始模型的哈希、候选哈希和失败类型,比一个总绿色标记更可追溯。负对照不是为了故意让正式功能失败,而是检验验收仪器确实能看见目标错误。
项目十项测试还覆盖窗口溢出拒绝、全零量化、离群值清零、静态连续工作守恒与无收益边界。它们属于数学性质、独立事件账本和真实张量对照三种路径,避免所有检查都复制同一个函数实现。测试通过只覆盖所列输入与性质;它不证明任意设备、任意请求调度或网络异常下正确。若加入新机制,例如缓存行重排或真实整数核,应先增加能分离相应故障的参考,再在同一源码版本上重跑全部联合验收。
测试失败应保留最小反例与状态,不用删除样本维护通过率。若缓存误差超阈值,先定位是位置、mask、切片、dtype、模式还是输入身份;若量化误差大,先检查尺度轴和范围,再讨论位宽是否不够。把结构错误包装成“量化本来就有误差”会混淆近似设计与实现缺陷。每个实验输出都应同时带对象、判据和结果,才能在模型更新后判断是否仍适用。
质量验收还要先冻结接受标准。例如预先规定某真实验证集的平均损失增加不得超过给定阈值、关键任务成功率不得下降超过给定范围,然后只在验证集选择位宽与粒度,最终测试集只用于一次报告。若每看一次测试分数就调整尺度或样本选择,测试集已参与设计,便不再是独立验证。当前项目没有声称完成这样的质量选择,所有随机夹具数字都完整保存,避免给一串偶然目标附会泛化意义。
练习与项目增量
TRY IT YOURSELF
基础:决策稳定性
参考第一名领先0.03,每个logit误差不超过0.01。能保证第一名不变吗?若误差为0.02呢?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
进阶:有效位置聚合
两个批次分别有效3和9个目标,总损失6和9。整体NLL与简单批均值分别是什么?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
挑战:设计负对照
为“缓存确实读取正确历史”和“量化确实改变副本而保留原模型”各设计一个能失败的检查。
提示 1
提示 2
对照参考解答
本章增量是最终验收矩阵的正确性与近似列,而非另造一项综合“准确率”。后继计时只有在缓存正负控制通过后才解释为同一任务的速度差;伪量化仅报告误差,不参与整数性能比较。第八章将把所有文件哈希、测试状态、原始测量和未实现项收进一次冻结报告,避免从不同版本拼接各自最好成绩。