我因为之前做实验时习惯不好(一边训练一边改代码),没有保留好实验记录惹出了一些麻烦(不知道发布的模型具体是怎么训练出来的),觉得有必要确立几条原则防止以后再出现类似的情况。 为了确保每次实验都是完全可复现的,以下是我的想法:
- 使用 git 管理实验代码版本,在程序内强制要求长时间训练模型前 commit 所有修改,并且在 commit 记录内写清楚每次做出的更改;
- 使用
logging
模块替代print
,以将带时间戳的记录同时输出到控制台和 log 文件; - 在程序运行前输出所有超参数与运行时间;
- 在训练时使用运行时间与 commit id 的前几位创建文件夹,并将此次训练产生的所有文件都组织到这个文件夹内,测试记录可以和模型放在一起。
- 固定并输出 random seed;
- 使用服务器训练时应及时下载训练记录。
实现
原本想自己实现的,这个时候发现了 meta 开源的 Hydra 库,似乎它提供的功能能实现其中几个想法。