当 RA 的我学到了什么:如何优化实验流程
Table of Contents
#
背景
成为 NUS 的 Research Assistant, 我跑了 1,072 3,172 个实验。
几周前,面对小老板的需求,我手足无措:
“把 XX 数据集在 A B C 三个算法上跑一下”
“把 learning rate 改成 0.001 跑一下”
“把 activation层 去掉,跑一下”
“昨天跑的实验结果怎么样了?” (一看 log 发现零零散散几个任务出错了需要重新跑)
特别是,同时在不同服务器上运行很多任务,并且个别任务跑的时候 显卡/内存
报错,log 里记录的信息并不足以区分这是哪个任务的时候….
更糟糕的是,不同服务器上的代码版本也可能不同,这让问题变得更复杂(使用git可能是一个解决方法)。
当我写下这篇文章的时候,意识到我可以把总结出的技能迁移到其他项目中。
为了防止遗忘,我把这次的经验写下来,跟大家分享一下心得(我是如何建立属于我的文件管理体系和实验进度追踪方法)
#
文件管理体系
数据集文件夹使用统一的文件结构,用于存放各种数据集。(与项目无关)
/home/junyi/data/mnist/
/home/junyi/data/cifar10/
/home/junyi/data/covtype/
项目文件夹针对每一个项目单独设立(例如VertiBench和VertiLearn)
/home/junyi/project/VertiBench/
/home/junyi/project/VertiLearn/
./experiment/ # 实验文件夹
./experiment/{exp-name}-{timestamp}/*.log
./data/ # 软链接到数据集
./code/ # 项目的仓库 / 相关代码
./rebuttal/ # 回复 Reviewer 的
./rebuttal/{reviewer-id}/experiment/
./rebuttal/{reviewer-id}/plot/
./rebuttal/{reviewer-id}/comment/
#
如何做实验
⭐️ 自动化: 跑太多的实验真的很麻烦,特别是出问题需要重跑特定的实验时会让人头大。我坚决反对手工操作,即使做手工实验,也务必记录每一个实验命令。
使用脚本: 我靠脚本实现自动化,用一个脚本来管理所有的实验,每个实验都会被分配一个唯一id。这样在某个实验出错时,例如
显存不足
,我可以直接根据 id 重新运行该实验(特别是在使用 slurm 的时候,有这样的脚本可以省去不少写 sbatch 的工作)。同时,我还有另一个脚本用来追踪每个实验的进度(打印进度条)。日志要 print 完整: 每次实验都确保打印所有的参数,每一行的开头都要有时间(精确到秒),打印的内容包括模型的超参数和结构,并且把 parse 的 args 都打印出来。当实验变得复杂并且时间有限时,这种详细的记录非常有助于我回顾。(如果实验名足够详细,其实在日志里也没必要打印这么多内容)
为实验命名: 为了方便查找,每次实验我都会给它一个描述性的名字,如 “test SplitNN with lr 0.3”。
使用 git: 为了尽快得到结果,我不得不在多台机器上进行实验,这让我非常非常头痛。建议使用 git 来完成多个机器的代码同步。(不建议用 git 来同步数据集🤣)
#
总结
这次 RA 感觉还蛮苦的,不过好在我 “闭门造车”,造出来一套属于我的文管理体系和进度追踪系统,提高了工作效率,也减少了很多心智负担。
(后来有老师说,做 benchmark 确实是一个很苦的工作)
希望我的经验能为大家提供一些参考。
同时也想告诫自己,不要想偷懒!!! 不要想着 “这个实验手动跑一下算了”,因为你永远不知道哪个实验会出问题,哪个实验会成为你的重要成果。
也顺便感谢小老板一直对我很有耐心!在合作过程中小老板给到我很多中肯的建议,让我学到了很多,具体跟小老板发生了什么事,我准备另外写篇文章来记录。 (见 这篇文章)
#
后续更新
##
2023 年 9 月 22 日更新
论文投 NeurIPS 2023 被拒了,转投 ICLR 2024,需要补一些实验,还好有自动化脚本和有序的文件结构,让我不用花太多时间就能完成这些实验。
##
2023 年 10 月 2 日更新
补了实验,重新画了图(我只需要把 log 放到对应的文件夹里,然后运行一下 Jupyter Notebook 就可以了)
##
2023 年 11 月 16 日更新
ICLR 2024 的 Rebuttal 期间,又补了 840 个实验….