可复现首先意味着能解释差异
这篇方法回顾按主题归档,月份不代表一次实际训练的时间。视觉实验的可复现性,不只是再次运行得到相似数字,还包括知道两次运行究竟用了什么数据、哪些配置发生变化,以及差异来自哪里。
一个随机种子无法描述全部条件。数据清单、预处理、代码状态、依赖环境和模型选择规则都可能改变结果。因此应把一次实验视为一条证据链:输入可定位,过程可追踪,输出可复查。
为数据与配置建立不可含糊的身份
运行目录应保存最终生效配置,而不只是启动命令。默认参数、环境变量和配置覆盖顺序都可能让命令表面相同,实际行为不同。数据划分也应保存为具体清单,包含稳定样本键、分组键和标签版本。
对需要比对的文件,可以计算内容摘要。下面使用 Python 标准库逐块读取,适合核对清单、配置或模型文件;摘要只说明内容是否相同,不证明标注正确或数据来源合规。
import hashlib
def sha256_file(path):
digest = hashlib.sha256()
with open(path, "rb") as stream:
for chunk in iter(lambda: stream.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
大型数据不必每次训练都重新计算全量摘要,可以维护经过核验的版本清单。但仅有文件路径不足以标识内容,同名文件覆盖后尤其如此。代码记录则要包含提交标识和未提交差异;只存一个提交号可能遗漏实际运行的修改。
随机性需要沿执行链控制
需要区分模型初始化、样本打乱、数据增强、采样器以及第三方库各自的随机状态。多进程数据加载还涉及工作进程的初始化,使用独立随机生成器的库也需要单独处理。
PyTorch 官方说明,可通过种子和确定性算法选项减少随机来源,但跨版本、跨平台或不同设备间不能保证完全一致;确定性设置也可能影响性能。PyTorch 可复现性说明
因此记录应包含框架与依赖版本、实际运行设备信息、确定性设置和数据加载配置。设备信息必须来自真实运行环境,不能从预期配置推测。比较方案时,也应记录是否采用多次独立运行以及如何汇总差异。
检查点不只保存网络权重
继续训练需要优化器、学习率调度器、训练步数以及相关随机状态。使用混合精度时,还需保存对应缩放状态。若希望从批次中途精确恢复,采样器位置、预取数据和增强状态也可能影响后续轨迹。
更容易管理的做法是在明确的轮次边界保存完整状态,并写清恢复粒度。只有权重的文件适合推理或重新开始优化,不能默认等价于原训练过程的无缝续接。
模型选择同样属于实验定义。按哪个验证指标、在什么时间点选择检查点,应在运行前确定,避免事后从多个规则里挑最好看的结果。
用一次独立复跑检查记录是否够用
可以在新的运行目录中,从清单和配置重新生成少量固定样本的预处理结果,再执行推理与评估。首先比较数据身份、形状、空间位置和中间数值;基础条件一致后,再讨论训练差异。
输出至少包括逐例指标、汇总结果、模型摘要和失败样本索引。出现偏差时,按「数据—预处理—模型状态—推理—评估」逐层比较。若只剩一个总分,任何环节都可能成为无法验证的解释。
本文提供的是记录与复查方法,没有宣称某套环境已经实现逐位一致。良好的实验记录应能让下一次复跑暴露差异,而不是要求后来的人依靠记忆补齐条件。
参考
- PyTorch Reproducibility:随机性控制、确定性算法及其边界。
- Python
hashlib:文件内容摘要示例所用标准库。