-
如果是运行时动态随机生成 dataset splitting(training / val / test),而不是事先生成静态 splitting,就保存一下 splitting indices,后面可能 case study 的时候会用到。数据集足够大的时候,用事先生成的 splitting 也挺好。 还是预先划分好一点,即类似 COCO 官方给的 train/val/test 划分一样,自己模型和所有 baseline 都用相同的划分,这样才能做 case study,主要是要用相同的 test set 做。就算要 k-fold,也可以预处理好几份划分 indices。
- training 要写 resuming,因为不知道几时、缘何会中断,可以每个 epoch(epoch-based)、每 n 个 iterations(iteration-based)、每 y 分钟存一次。PyTorch 可以同时保存 optimizer 的 state_dict,以便断点续炼,参考《PyTorch: What’s the purpose of saving the optimizer state?》。
- (参考 detectron2)python 函数返回多个结果时,可以用 dict 而不是 tuple / list,避免搞错顺序、typo 等。
- 同样,保存数据、结果时可以优先用 .mat / .h5 / .pth(PyTorch) 而不是 .npy,前三者每个数据都有名,这样就算一篇文被拒几次、很久之后还要面对旧代码时友好很多。
- 保存结果时,可以顺便记些元信息,如保存时间,可以帮助分辨这是旧代码、还是新代码的结果,这些都可以在存 .mat / .pth 时放进 dict 里(.h5 未试过但估计也可以?)。
- 用 .mat / .h5 还有个好处是:python、matlab 都可读、写,如果同时用到两者(如 baselines 有 python 又有 matlab 的)会比较方便。
- (参考 mmdetection)用
timeit.default_timer()
记录训练时间,比如每 z 个 iterations、每个 epoch,并估计剩余训练时间。可参考《python手写简易进度条》的计时进度条。(Q:不知道 mmdetection 在多卡训练的时候是怎么计时的,是不是只要在 rank = 0 的进程计时就行?)
- (参考 mmdetection)记录结果的 log 用 json / csv 等结构化的文件格式,而不是自己写 .txt,就不用自己解析 log 的格式。
- 记结果记得舍入,如 numpy.ndarray 用
round
,或者 pandas.DataFrame.to_excel 写入 excel 时指定 float_format
,参考:pandas写excel简例。
- (参考 mmdetection)命令行参数、配置文件可以备份一份到 log 目录。
- 参考《CogVideo: Large-scale Pretraining for Text-to-Video Generation via Transformers》,用 Anonymous GitHub 发布匿名代码仓,可能是用于审稿时交代码验证。
- paper with code 查 state-of-the-art(SOTA):Browse State-of-the-Art。
-
Hugging Face 找预训练模型参数,尤其一些没有对应文章、但可能已经很多人用的改进模型,如 runwayml/stable-diffusion-v1-5。
- python 显示进度除了用 tqdm、手写进度条,如果只是想打点东西,确保程序不是在卡住,也可以简单利用
\r
实现,如:for i, data in enumerate(dataloader):
print(i, end='\r') # 就不会一直换行刷爆终端
# do something ...
- (续 2)续断不仅限于 training,其它如数据处理、下载也可以加:
- 如输出是文件夹,可以用临时文件夹(如加后缀
.tmp
),处理完再改名。这样程序意外停掉要重新运行时,就可以略过已经存在的文件夹;
- 输出是文件也类似。
- 处理数据、论文画图的时候保留必要的中间结果,比如 bbox、seg mask 这种处理大批量模型的时候很耗时,数据清洗的逻辑可能会改几次;论文画图可能也要调几次样式,留了必要的中间结果就不用每次都重跑。
- 及时手动释放显存,即
del
+ torch.cuda.empty_cache() 有用。试过跑生成模型时,为算 loss 生成的中间结果(image)可能挺大的,显存占用续渐变大,而且可能未及时自动释放,累积到下个 epoch 导致 OOM,用上手动释放显存之后解决了。
- 如果不知道什么样的 loss 曲线、收敛范围是正常的(如在自己数据集上跑 GAN 的时候),也许可以用原文代码、在原文数据集上跑一次,用它的 loss 信息做参照。
- 别人的经验:pengsida/learning_research,尤其是《如何找到实验不work的原因》。
- 开完组会之后,把后续实验思路重新捋一次,重新组织语言写成文档,预期输出、实验目的也写上,再发出来跟导师 / 合作者对一次,防止无效实验。中途有改变的,也及时提出,把差异直接体现在文档中方便别人(和过两天之后忘记细节的自己)看懂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)