1. 课程导入与精度一致性校验问题界定
在数值计算与工程仿真中,“加速”几乎总是伴随着“近似”。无论是把单精度换成半精度、把稠密矩阵换成低秩近似、把逐步迭代换成跳步外推,还是引入算子分裂、混合精度累加、稀疏采样,我们都在用某种“少算一点”的方式换取速度。问题在于:少算的那一点,究竟让结果偏离了多少?这个偏离是否还在业务可接受的范围内?如果没有人能回答这两个问题,加速就只是一场赌博。
本课程讨论的正是这场赌博的“验算规则”——数值加速结果精度一致性校验。它不是简单地比较两个数字是否相等,而是建立一套可复现、可量化、可判定的方法,用来回答:加速后的结果相对于基准结果,误差有多大、误差以什么形式分布、在哪些条件下会越界、以及越界时应当如何处置。
精度风险从哪里来
要界定校验问题,先要看清风险来源。数值加速引入的偏差通常不是单一来源,而是多条路径叠加的结果。第一类是表示精度损失:例如把 FP32 的累加器改为 FP16,单次舍入误差约 2⁻¹¹ 量级,但在上万次累加后,误差会随累加次数累积,甚至因“大数吃小数”而出现灾难性抵消。第二类是算法近似误差:低秩分解截断奇异值、快速多极子展开截断阶数、时间步长放大,都会带来与截断参数直接相关的系统性偏差。第三类是计算顺序与并行归约:浮点加法不满足结合律,改变归约树结构会让同一批数据算出不同末位。第四类是随机性来源:随机采样、随机初始化、非确定性调度,使结果本身带有方差,单次对比失去意义。
这四类风险的性质不同:表示精度损失偏向随机、可统计;算法近似误差偏向系统、随参数单调变化;归约顺序差异通常很小但难以预测;随机性则要求用统计量而非单点值来判定。校验方案必须能区分它们,否则会把系统性偏差误判为噪声,或把正常噪声误判为故障。
一致性校验的目标是什么
需要明确的是,一致性校验不追求“结果相同”,而追求“差异可解释且受控”。具体可拆成四个可操作的目标:其一,可量化——给出明确的误差度量,如最大绝对误差、相对误差、均方根误差、以及面向向量的范数相对误差;其二,可定位——当误差超限时,能指出是哪个分量、哪个时间步、哪个网格区域出了问题,而不是只知道“整体不对”;其三,可判定——预先设定容差与判定规则,让“通过/不通过”不依赖个人经验;其四,可复现——固定输入、固定随机种子、固定对比基准,使任何人重跑都能得到同一结论。
这里有一个容易被忽视的前提:基准本身必须可信。如果拿一个同样粗糙的实现当基准,校验就变成了“两个错误互相印证”。因此课程中会把基准分为高精度参考解(如 FP64 或解析解)与业务基准解(当前生产版本)两类,前者用于评估加速算法的固有误差,后者用于评估版本替换的回归风险,二者用途不同,不可混用。
课程任务地图与交付物
围绕上述目标,本课程组织为一条从“认识误差”到“交付判定”的完整链路。前半程建立度量体系:明确误差的定义与参照系、选择适合向量与标量输出的度量组合、区分系统偏差与随机波动。中段进入方法层:如何设计对比实验、如何构造高精度参考解、如何用收敛阶与误差随参数的变化曲线判断误差来源。后段落到工程实践:容差如何设定、判定规则如何写成可执行脚本、超限后如何定位到具体分量与时间步、以及如何把校验嵌入持续集成流程。
课程最终形成四类可直接使用的交付物。第一是误差度量报告,包含最大绝对误差、范数相对误差、误差分位数与极值出现位置,用于回答“差多少、差在哪”。第二是容差判定表,把每个输出量的阈值、适用条件与判定结论固定下来,避免每次靠人拍板。第三是复现脚本与测试用例,锁定输入数据、随机种子、基准版本与对比口径,保证结论可重跑。第四是超限处置记录,记录越界现象、归因分析与处置动作,形成可追溯的经验库。
为了让这些交付物不停留在概念上,课程会贯穿一个具体的教学示例:对一个热传导求解器做混合精度加速,把 FP64 的迭代核改为 FP32 累加并引入跳步外推,然后用温度场的范数相对误差与最大节点误差作为度量,设定相对误差不超过 1×10⁻³ 的容差,观察误差随外推步长的变化,并定位误差最大的网格区域。需要说明的是,示例中的参数与数值均为教学假设,用于演示判定逻辑,不代表任何实际系统的实测结果。