本月我从机器学习中学到的教训

本月我从机器学习中学到的教训

原文:towardsdatascience.com/the-machine-learning-lessons-ive-learned-this-month-2/

大多数机器学习的日子都是相同的。

编码、等待结果、解释结果、返回编码。此外,还有一些关于个人进度中间展示的内容。但是,事情大多相同并不意味着没有东西可以学习。恰恰相反!两到三年前,我开始养成一个习惯,每天记录我从机器学习工作中学到的教训。回顾这个月的部分教训,我发现有三个实用的教训脱颖而出:

  1. 使用 README 文档来记录自己的情况

  2. 请求 MIG 切片而不是完整的 GPU

  3. 在一天中穿插运动

保持一个 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.10gb2g.20gb)。

  • 合理请求资源。从小开始。如果 VRAM 溢出,增加一个尺寸。不要默认使用完整的 GPU。

  • 尽早分析内存。运行一个小批量来读取峰值 VRAM;选择留下大约 10-20%余地的最小切片。

  • 模板化你的工作。保留 MIG 和完整 GPU 的工作脚本;通过标志进行切换。

通过运动对抗长时间坐着

大多数计算机工作都是在电脑前完成的。我们都注意到,我们花的时间越多,我们的姿势就越懒散。我们向前弯曲;所有工作都在我们面前完成*。

这种位置并不适合长时间保持,但如今这相当普遍。对于机器学习人员来说,计算机是我们的工具集,我们(需要)花大量时间与这个工具集打交道。

幸运的是,我们在屏幕前工作时不需要在不良姿势下浪费时间(不,这两个并不是按照定义相联系的)。

我意识到这一点(再次,因为我似乎又回到了旧习惯中)这个月:数小时的阅读、编码和会议让我的肩膀向前倾斜并锁定了上背部。然后,在几天的大量论文阅读之后,我的肩膀提醒我改变一下。

结果证明,这个解决方案很简单,不需要健身房或完整的锻炼。只需要交替姿势短暂的运动小憩

我收集了一个小程序,我在一天中使用了其中的部分(如果你不知道这些练习,可以在 YouTube 上查找。这是可能帮助你更好地、更长时间地工作的元知识):

  • 仅音频会议:站起来四处走动。如果你必须靠近桌子,切换到分腿站立(一只脚向前)以打开髋关节。

  • 两分钟休息(例如,在咖啡休息后或从打印机回来等):**

    • 弹力带分离或面部拉伸(10-15 次)

    • 墙上胸肌拉伸(每侧 30-45 秒)

    • 髋屈肌拉伸/沙发拉伸(每侧 30-45 秒)

  • 站立阅读块:站立打印纸张或阅读平板电脑;交替站立和坐着。

此外,我发现短暂的早晨训练让我的肩膀感觉更好,并提高了一整天的工作专注力——这是一个受欢迎的额外好处,因为机器学习工作需要集中注意力:

  • 5 分钟轻松有氧运动(散步或爬楼梯)

  • 5 分钟活动性(胸椎旋转,肩部环绕,深蹲保持)

  • 5 分钟轻度强度(弓箭步,桌边俯卧撑,弹力带划船)


  • 常被提出的论点:所有的工作不都是在我们面前完成的吗?或者,换一种说法:哪种工作需要我们手背后工作?对,除了可能是体操运动员,几乎所有的职业都是在我们的面前完成的。毕竟,那是我们的眼睛所在的地方!但是:非计算机工作在一天中会有多样化的动作:从架子上拿东西,拖东西等。交替才是关键。
posted @ 2026-03-27 10:08  布客飞龙II  阅读(2)  评论(0)    收藏  举报