华为云 ModelArts 训练任务断点续训与超参搜索实战:把一次跑了两天的训练作业救回来
上周有个图像分类的任务在 ModelArts 上跑了两个多小时,最后十分钟因为一个我完全没预料到的原因挂掉,前面的 checkpoint 也因为没配自动保存策略而丢了。那天加班到很晚,但真正让我难受的不是这次失败,而是意识到:我对训练任务的「可恢复性」几乎一无所知,只能靠人肉守着看。
这篇文章算是我交过的学费总结,围绕三个问题展开:训练任务怎么配才能在意外中断后自动接上、超参搜索怎么跑才不至于把配额烧光、以及怎么在控制台里快速判断「这个作业还有没有救」。
一、先把 checkpoint 策略配对
很多人刚开始用 ModelArts 的时候会忽略训练输出目录里的自动保存配置,默认的保存间隔对短任务够用,但对动辄几小时的训练就明显不够。我现在的做法是直接把三个参数绑定起来考虑:保存间隔、训练总轮次、单次保存的文件体积。
具体一点,比如我做的那次训练总共 60 个 epoch,如果保存间隔设成 10,那就意味着最坏情况下要重跑 10 个 epoch 的时间;而每次保存的权重文件大概几百 MB,密集保存并不会让文件无限膨胀(会覆盖同名的最新文件),但如果开了多次保存策略,目录里会堆出一堆时间戳文件,反倒拖慢下载和续训时的加载速度。
我的经验值是:保存间隔取总轮次的十分之一左右,同时显式打开「保存全部中间结果」的开关。这样单次任务最坏损失 10% 的时间,但换来了断点续训的可行性,这个交换在实测中非常值。
二、断点续训不是自动的,但配置很直接
这里有个我一开始误解的地方:ModelArts 的断点续训不是「任务挂了自动复活」,而是你在创建新任务时,指定从某个 checkpoint 继续训练。所以真正需要提前准备的是:产出目录的结构、checkpoint 文件的命名规律、以及你的训练脚本能不能识别这个路径继续跑。
我现在的做法是在训练脚本里统一从环境变量读取 checkpoint 路径,续训时把该变量指向上一次产出的最新权重,脚本内部用 PyTorch 的 load_state_dict 把模型权重、optimizer 状态、epoch 计数一起恢复,而不是只恢复模型权重。只恢复权重看起来省事,但学习率调度器会从头开始走,相当于把已经衰减过的学习率又拉高,反而更容易在最收敛的阶段震荡发散。这一点我踩过坑。
三、超参搜索:把配额花在刀刃上
超参搜索是另一个让我烧配额的场景。第一次跑的时候我老老实实列了 20 组参数组合,结果跑了三个多小时才出第 4 组结果,而且并没有比单次精心调参好多少。后来改了三件事,效率明显提升。
第一,缩小搜索空间。我先用手动跑的几组结果圈定出学习率和 batch size 的合理区间,只在这个区间里做网格搜索,而不是全域搜索。
第二,用早停代替训到底。设置 patience 让明显发散的组合提前退出,把配额留给有希望的组合。早停真正省下来的不是那一点点时间,而是「在明显没希望的组合上浪费的整段时间」。
第三,先小数据后全数据。我会先用 10% 的训练集跑一遍全组合筛选,把表现最好的两三组拿到全量数据上跑完整训练。这一步看起来朴素,但它把「结构性问题」和「数据量问题」分开了,很多组参数在小子集上就已经能看出不稳定。
四、怎么判断一个跑挂的作业还有没有救
这是我最想分享的一点,因为它完全不需要额外配置,只需要知道看哪里。
控制台的训练作业列表里,除了状态列,还有几个容易忽略的列:一是运行时长,二是异常信息入口,三是资源占用。我现在的排查顺序是:先看异常信息,判断是 OOM、被平台中断、还是脚本本身报错;再看资源占用,如果内存曲线在某个时间点突然冲到上限,基本可以确定是 OOM。
OOM 和其他错误的处理完全不同:OOM 说明你的 batch size 或者模型本身边界不够,通常需要改配置而不是等;被平台中断(超时会中断)则要考虑是不是任务时长超过了套餐限制,这种情况下换成异步提交或者申请更长的配额比优化脚本更有效;而脚本自身的报错(形状不匹配、标签越界这类)说明任务已经跑完了所有能跑的部分,重启是没有意义的,得先改代码。
把这三类分开之后,我判断「是否值得重跑」的耗时从原来的十几分钟降到了两三分钟。
五、把经验固化成配置,而不是记住
最后想说一个心态上的变化。我以前觉得这类经验是「用一次记住一次」的东西,后来发现真正管用的做法是把它固化成配置模板和检查清单。
我现在的做法是:常用训练任务用固定的 YAML 配置模板生成,每次改的地方只有数据路径和几个超参;把「保存间隔、最小保存轮次、早停 patience、显存预估」这几个字段做成必填项,填错就直接在提交前报错。这样新人接手的时候不需要知道这些经验,配置本身就带着经验跑。
这套做法在云上训练里显得尤其重要,因为云环境最大的特点就是「你不盯着它,它就自己跑完了或者跑挂了」。把可靠性做进配置里,比在日志里事后追责有用得多。
如果你也在 ModelArts 上跑训练任务,我最想建议的一句是:先把 checkpoint 策略配好,再去调超参。顺序反过来的话,你会失去所有中途失败的经验积累。
- 点赞
- 收藏
- 关注作者
评论(0)