Mindformers模型启动时因为host侧OOM导致任务被kill
【问题描述】
基于Mindformers进行Telechat2 35B模型SFT训练,模型拉起训练任务时进行权重自动转换阶段失败,提示
[ERROR] TBE Subprocess(task distribute] raise error[], main process disappeared!
【版本信息】
mindformers: 1.3.0
minespore: 2.5.0
CANN: 8.0.0
【错误信息】
[ERROR] TBE Subprocess(task distribute] raise error[], main process disappeared!
【根因】
权重加载时,需要将权重文件从服务器硬盘上读到host的内存中,然后再从host内存下发到NPU的显存,在权重文件从硬盘往host内存中加载时,服务器侧内存不足导致操作系统将进程kill。
【处理过程】
参考错误提示,并没有CANN或者mindformers侧相关的报错,提示信息表示进程是强行结束的。
报错是发生在权重转换阶段,客户提供的权重文件是使用64卡训练出来的分布式权重文件,并进行了合并,合并后的ckpt权重大小约到130G。
当前需要使用8卡来跑训练,预期每个卡的权重大小是23G左右,客户开启了权重自动转换,mindformers拉起模型时的yaml里面配置为:
_#_打开权重自动转换开关
auto_trans_ckpt: True
自动转换时,每个卡都会单独加载ckpt权重文件,相当于host侧需要把8个ckpt文件都加载host侧的内存里面,合计需要约1T的内存空间。
重新拉起一次任务,并通过top命令监控内存的使用信息,发现内存的free值逐渐减少,最后可用内存不足,然后进程被kill掉,问题复现。
针对这种打大权重文件需要进行转换的场景,建议使用离线转换方式:
https://gitee.com/mindspore/mindformers/blob/r1.3.0/docs/feature_cards/Transform_Ckpt.md
然后mindformers使用的yaml文件直接使用转换后的权重,并将自动转换关闭
_#__打开权重自动转换开关_
auto_trans_ckpt: False
重新拉起模型,本次host侧没有因为内存耗尽导致触发kill进程,任务顺利拉起。
【解决方案】
需要对大的权重文件进行转换时,需要评估host的可用内存是否足够,可用free -g来检查可用内存大小。如果内存不够,建议采用离线转换方式:
https://gitee.com/mindspore/mindformers/blob/r1.3.0/docs/feature_cards/Transform_Ckpt.md
然后mindformers使用的yaml文件直接使用转换后的权重,并将自动转换关闭
