本月我从机器学习中学到的教训
本月我从机器学习中学到的教训
原文:
towardsdatascience.com/the-machine-learning-lessons-ive-learned-this-month-2/
编码、等待结果、解释结果、返回编码。此外,还有一些关于个人进度中间展示的内容。但是,事情大多相同并不意味着没有东西可以学习。恰恰相反!两到三年前,我开始养成一个习惯,每天记录我从机器学习工作中学到的教训。回顾这个月的部分教训,我发现有三个实用的教训脱颖而出:
-
使用 README 文档来记录自己的情况
-
请求 MIG 切片而不是完整的 GPU
-
在一天中穿插运动
保持一个 README——为了你未来的自己
大多数 README 都是为其他人编写的。它们是为了让新的合作者入门,或者为了让开源仓库对陌生人可用。
也为自己写一个——特别是为了你的 未来 自己。
当你处于项目进行中时,所有的路径、命令和细微的设置都存储在你的脑海中。暂停一下后,可能就不会那么清晰了。我最近在准备一篇论文的更新时遇到了这种情况。在机器学习研究中,审查通常需要几个月的时间。在这段时间里,你将转向下一个项目,使用新的数据集、新的代码和新的约定。当审查最终到来时,你回到旧项目,然后… 花半天时间重建哪个脚本生成了哪个图表。
如果截止日期即将临近,那将会带来很多压力。
准备应对自己的遗忘是工作的一部分。一个小小的 README 可以节省一大堆头疼。
需要记录的内容(对你而言)
保持实用。你未来的自己不需要散文;他们需要“如何做”:
-
项目快速启动。环境设置、确切的 Python 版本、环境文件或
conda/pip命令。 -
数据位置。原始数据和处理后的数据存放的位置;如何下载、缓存和校验和。注意任何 陷阱(例如,“NDVI 瓦片在重采样后南北翻转”,如我在旧帖子中提到的)。
-
重现结果。每个成果一个命令:图表、表格和检查点。
-
训练与评估。运行主要实验的确切命令;如何恢复;如何设置随机种子。
-
超参数搜索。你实际使用的命令,包括范围;结果记录的位置。
-
常见陷阱。任何你知道你会忘记的事情(必需的环境变量、GPU 标志、文件命名约定)。
-
变更日志。一行简短的、有意义的变更。
一个最小化、通用的模板,你可以为所有项目进行适配:
# <Project Title>
## Quickstart
# env
conda create -n proj python=3.10 -y
conda activate proj
pip install -r requirements.txt
## Data
# download & preprocess
python tools/download_data.py --out data/raw
python tools/preprocess.py --in data/raw --out data/processed
## Train
python train.py --cfg cfgs/base.yaml --seed 42
## Evaluate
python eval.py --ckpt runs/exp123/best.ckpt --split test
## Reproduce Figures
python scripts/fig_1.py # outputs to figs/fig_1.png
python scripts/tab_2.py # writes tables/tab_2.csv
## Hyperparameter Search
python sweep.py --study local.pkl --n-trials 100
## Notes / Pitfalls
- Requires CUDA 12.1
- Set `WANDB_MODE=offline` if no internet
MIG 切片用于快速调度
训练当前一代大型语言模型需要数百(或数千)个高端 GPU。但大多数日常机器学习工作并不需要 LLM 规模模型。许多问题都可以通过紧凑的 CNN 或小型 MLP 来解决——而这些并不需要完整的 A100/H100 GPU。
为一个微小的模型请求整个 GPU 会浪费资源,并让你排在队列的后面。这个月我痛苦地重新学习了这一点:我正在训练一个4 层 MLP,等待了很长时间才被安排。在我的调度请求中,我请求了一个完整的顶级 GPU。当然,这些资源对于真正需要它们的工作(如微调 LLM)来说需求很高。
一旦我切换到 MIG 切片,工作就立即开始,我的迭代速度也提高了。
什么是 MIG 以及为什么使用它?
MIG(多实例 GPU)允许你将最新的 NVIDIA GPU 分割成几个隔离的“切片”。一个大 GPU 可以变成多达七个较小的虚拟 GPU,完整的 VRAM 在这些切片之间分配。本质上,每个切片都是一个较小的 GPU。而且对于许多工作负载来说,这些小切片已经足够了。
此外还有一个额外的好处:请求的人更少(因为他们不了解这个机会),因此调度器可以立即安排你的工作。这让你可以更快地迭代模型,减少获得好结果的时间。
在实践中应用它
-
检查可用性。向你的集群管理员询问或查看调度器文档以获取 MIG 分区名称(例如,
1g.10gb,2g.20gb)。 -
合理请求资源。从小开始。如果 VRAM 溢出,增加一个尺寸。不要默认使用完整的 GPU。
-
尽早分析内存。运行一个小批量来读取峰值 VRAM;选择留下大约 10-20%余地的最小切片。
-
模板化你的工作。保留 MIG 和完整 GPU 的工作脚本;通过标志进行切换。
通过运动对抗长时间坐着
大多数计算机工作都是在电脑前完成的。我们都注意到,我们花的时间越多,我们的姿势就越懒散。我们向前弯曲;所有工作都在我们面前完成*。
这种位置并不适合长时间保持,但如今这相当普遍。对于机器学习人员来说,计算机是我们的工具集,我们(需要)花大量时间与这个工具集打交道。
幸运的是,我们在屏幕前工作时不需要在不良姿势下浪费时间(不,这两个并不是按照定义相联系的)。
我意识到这一点(再次,因为我似乎又回到了旧习惯中)这个月:数小时的阅读、编码和会议让我的肩膀向前倾斜并锁定了上背部。然后,在几天的大量论文阅读之后,我的肩膀提醒我改变一下。
结果证明,这个解决方案很简单,不需要健身房或完整的锻炼。只需要交替姿势和短暂的运动小憩。
我收集了一个小程序,我在一天中使用了其中的部分(如果你不知道这些练习,可以在 YouTube 上查找。这是可能帮助你更好地、更长时间地工作的元知识):
-
仅音频会议:站起来四处走动。如果你必须靠近桌子,切换到分腿站立(一只脚向前)以打开髋关节。
-
两分钟休息(例如,在咖啡休息后或从打印机回来等):**
-
弹力带分离或面部拉伸(10-15 次)
-
墙上胸肌拉伸(每侧 30-45 秒)
-
髋屈肌拉伸/沙发拉伸(每侧 30-45 秒)
-
-
站立阅读块:站立打印纸张或阅读平板电脑;交替站立和坐着。
此外,我发现短暂的早晨训练让我的肩膀感觉更好,并提高了一整天的工作专注力——这是一个受欢迎的额外好处,因为机器学习工作需要集中注意力:
-
5 分钟轻松有氧运动(散步或爬楼梯)
-
5 分钟活动性(胸椎旋转,肩部环绕,深蹲保持)
-
5 分钟轻度强度(弓箭步,桌边俯卧撑,弹力带划船)
- 常被提出的论点:所有的工作不都是在我们面前完成的吗?或者,换一种说法:哪种工作需要我们手背后工作?对,除了可能是体操运动员,几乎所有的职业都是在我们的面前完成的。毕竟,那是我们的眼睛所在的地方!但是:非计算机工作在一天中会有多样化的动作:从架子上拿东西,拖东西等。交替才是关键。

浙公网安备 33010602011771号