跳至内容

Junyi's Lab

当 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 个实验….

## 2024 年 3 月 4 日更新

ICLR 2024 中稿了!欢迎大家参观我们的论文网站GitHub