在机器学习的日常工作中,许多环节似乎保持着一致性。从编写代码到等待结果,再到解读数据并反复调整,以及期间穿插的阶段性进展汇报,这些都是常见的流程。然而,这种看似重复的模式并不意味着没有新的洞察和经验可循。恰恰相反,从中总能汲取宝贵的教训。通过回顾近期在机器学习实践中积累的经验,有三项实用教训尤为突出,它们对提升效率和工作健康有着显著的指导意义:
- 为未来的自己编写README文档
- 请求MIG切片而非完整GPU资源
- 全天候穿插适度运动
为未来的自己保留一份README文档
大多数README文档的编写初衷是为他人服务。它们旨在帮助新协作者快速上手,或使开源代码库对陌生用户友好。
然而,也应该为自己编写一份——尤其是为了未来的自己。
当身处项目核心时,所有的路径、命令和微妙的设置都清晰地存在于脑海中。但一旦项目暂停一段时间,这些细节便会迅速模糊。在一次为论文更新内容做准备时,就曾遇到类似情况。在机器学习研究中,审稿过程往往耗时数月。在此期间,研究人员通常会投入新的项目,处理新的数据集、编写新的代码、遵循新的规范。当审稿意见最终到来,需要重新回到旧项目时……却发现
需要花费半天时间来重建哪个脚本生成了哪张图。
如果截止日期临近,这无疑会带来巨大的压力。
为自己的遗忘做好准备是工作的一部分。一份小小的README文档可以省去巨大的麻烦。
应记录哪些内容(为自己)
记录内容应保持实用性。未来的自己不需要散文式的描述;他们需要的是“如何操作”:
- 项目快速启动。环境设置、确切的Python版本、环境文件或
conda/pip命令。 - 数据位置。原始数据和处理后的数据存放位置;如何下载、缓存和进行校验和。记录所有注意事项(例如,“NDVI瓦片在重采样后南北翻转”,这在较早的博文中有所提及)。
- 复现结果。每个产出(图表、表格和检查点)对应一条命令。
- 训练与评估。运行主要实验的确切命令;如何恢复训练;如何设置随机种子。
- 超参数搜索。实际使用的命令,包括参数范围;结果的日志记录位置。
- 常见陷阱。任何已知自己会忘记的事项(所需的S环境变量、GPU标志、文件命名约定)。
- 更新日志。以一行短句形式记录有意义的变更。
一个最小化、通用且可适用于所有项目的模板:
# <项目标题>
## 快速启动
# env
conda create -n proj python=3.10 -y
conda activate proj
pip install -r requirements.txt
## 数据
# download & preprocess
python tools/download_data.py --out data/raw
python tools/preprocess.py --in data/raw --out data/processed
## 训练
python train.py --cfg cfgs/base.yaml --seed 42
## 评估
python eval.py --ckpt runs/exp123/best.ckpt --split test
## 复现图表
python scripts/fig_1.py # outputs to figs/fig_1.png
python scripts/tab_2.py # writes tables/tab_2.csv
## 超参数搜索
python sweep.py --study local.pkl --n-trials 100
## 注意事项 / 常见陷阱
- Requires CUDA 12.1
- Set `WANDB_MODE=offline` if no internet
利用MIG切片实现快速调度
训练当前一代大型语言模型需要数百甚至数千块高端GPU。然而,大多数日常机器学习工作并不需要LLM规模的模型。许多问题可以通过紧凑的CNN或小型MLP解决——而这些模型并不需要完整的A100/H100 GPU。
为小型模型请求一块完整的GPU不仅浪费资源,还会使任务排到队列末尾。本月通过一个艰难的教训再次认识到这一点:当时在训练一个四层MLP模型,却等待了漫长的时间才被调度。在调度请求中,请求了一个完整的高端GPU。显而易见,这些GPU对于那些真正需要它们的任务(例如微调LLM)来说,需求量非常大。
一旦切换到MIG切片,任务便能立即启动,迭代速度也随之大幅提升。
什么是MIG及其优势?
MIG(多实例GPU)允许将一块最新的NVIDIA GPU分割成多个独立的“切片”。一块大型GPU可以变成最多七个较小的虚拟GPU,并且完整的显存会根据切片进行分配。本质上,每个切片都是一个更小的GPU。对于许多工作负载而言,这些小切片绰绰有余。
MIG还带来一个额外的好处:请求切片资源的人较少(因为他们可能不了解这个选项),因此调度器可以更快地安排任务。这使得模型迭代速度更快,从而缩短了获得良好结果所需的时间。
实践应用建议
- 检查可用性。咨询集群管理员或查阅调度器文档,了解MIG分区的名称(例如,
1g.10gb,2g.20gb)。 - 合理规划请求大小。从小处着手。如果显存不足(OOM),则增加一个切片大小。不要默认请求完整的GPU。
- 尽早进行内存分析。运行小批量数据以读取峰值显存占用;选择能留出约10-20%余量的最小切片。
- 任务脚本模板化。为MIG和完整GPU分别准备一份任务脚本;通过标志进行切换。
通过运动对抗久坐
多数从事计算机工作的人都不可避免地长时间面对屏幕。人们普遍观察到,随着工作时间的延长,坐姿会变得越来越不端正,身体前倾,所有工作都在前方完成。
长时间保持这种姿势对身体无益,但在当下却相当普遍。对于机器学习从业者而言,计算机是其主要工具集,需要投入大量时间与其共处。
幸运的是,长时间面对屏幕并不意味着必须以不良姿势工作(这两者并非必然相关)。
本月,通过长时间的阅读、编码和会议,观察到肩膀前倾、上背部僵硬的现象。在连续几天大量阅读论文后,身体发出信号,提醒需要做出改变。
事实证明,解决方案非常简单,无需去健身房或进行完整锻炼。它只需要交替姿势和短暂的运动小歇。
以下是一些可在日常工作中穿插进行的运动小贴士(如果不熟悉,可在YouTube上查找相关教程,这是一种有助于更高效、更长久、更健康工作的元知识):
-
仅音频会议:站起来四处走动。如果必须留在桌边,则切换到分腿站姿(一只脚在前),以打开髋部。
-
两分钟重置(例如,咖啡休息后或从打印机返回后等):
- 弹力带拉伸或面部拉伸(10-15次)
- 靠墙胸肌拉伸(每侧30-45秒)
- 髋屈肌拉伸/沙发拉伸(每侧30-45秒)
-
站立阅读时段:打印论文或使用平板电脑站着阅读;交替进行站立和坐姿阅读时段。
此外,实践表明,简短的晨间活动有助于改善肩部感觉,并提升全天注意力,这对于需要高度集中精神的机器学习工作而言,是一个可喜的额外收获:
- 5分钟轻松有氧运动(散步或爬楼梯)
- 5分钟活动度练习(胸椎旋转、肩部绕环、深蹲保持)
- 5分钟轻度力量训练(弓步、靠桌俯卧撑、弹力带划船)
