问题描述: 在VL类多模态大模型或CV类中小模型训练时,由于数据处理逻辑相对复杂,常将DataLoader的num_workers≥4。此时偶尔会遇到模型训练随着时间推移耗时抖动严重,或逐渐劣化,现象参考下图。
原因分析:
- I/O瓶颈:受磁盘/云道OBS读取速度影响。
- CPU瓶颈:观测CPU利用率,如飙升或>50%,考虑该因素。
- 锁竞争:考虑是否自定义数据处理方式中存在非进程安全的代码或触发了GIL的操作。
- 内存瓶颈:如CPU内存占用率过高,或逐渐升高,考虑是否算子缓存带来的内存占用高间接引入了性能劣化和不稳定现象。
解决经验:
- 定期垃圾回收:考虑每200个step手动调用python的垃圾回收机制,如gc.collect()
- 限制算子缓存大小:当模型为动态shape场景,当算子缓存设置过大,易引发内存占用过高的现象,可以考虑设置减小缓存数量(默认1024),如export MS_DEV_RUNTIME_CONF=“aclnn_cache_queue_length:128”
- 绑核。
效果:
注:其中周期性耗时长的step为手动GC的时刻。