Atlas 900 A2 Mindspeed-MM数据预处理缓慢
发表于: 2026/06/03
背景概述
在基于 Atlas 900 A2 PoD 平台进行大模型微调开发时,数据预处理阶段的性能表现直接影响整体训练流程的效率与稳定性。尤其在处理大规模多模态数据集(如 COCO 15 万样本)时,预处理耗时过长可能导致同步超时、进程退出等异常问题。本文记录一次在使用 Mindspeed-MM 框架对 Qwen2.5vl-72B 模型进行微调过程中,遇到数据预处理速度异常缓慢的问题,并通过深入排查与调优,最终定位到绑核配置不当为根本原因,提出有效解决方案。
问题现象
在使用 Mindspeed-MM 框架对 Qwen2.5vl-72B 模型进行微调时,数据预处理阶段处理速度仅为 5–30 samples/s,处理 8 万样本预计耗时约 3 小时。而相同环境下,Qwen2.5vl-7B 和 32B 模型的预处理速度正常,仅需数分钟即可完成 15 万样本处理。
该问题导致训练流程在数据加载阶段频繁超时,进程被强制终止,严重影响开发效率与任务稳定性。
排查过程与分析
1. 确认问题存在性
与框架开发团队确认,标准测试环境下使用 15 万 COCO 数据集,预处理耗时不超过半小时。结合客户实测数据,确认当前场景存在明显性能异常。
2. 尝试调大 num_workers
为提升并行处理能力,尝试将 num_workers 从默认值 16 调整至 32。然而处理速度未见明显改善,排除了线程数不足导致的瓶颈。
注:num_workers 过大可能引发 OOM,需根据内存资源合理配置。
3. 检查脚本与配置文件
对比 7B 与 72B 模型的配置文件(model_xx.json、data_xx.json、finetune_xx.sh),未发现参数配置差异。7B 模型在相同脚本下运行正常,进一步排除配置错误的可能性。
4. 排查存储性能瓶颈
检查数据集是否部署于共享存储,确认已切换至本地 SSD 硬盘。
使用 dd 命令测试写入带宽:
dd if=/dev/zero of=/path/to/test_file.img bs=1M count=1024 oflag=direct实测写入速度达 3 GB/s,无 I/O 瓶颈。
预处理输出缓存目录(cache)写入速率正常,排除存储层问题。
5. 排查进程资源抢占
观察日志发现,数据处理速率波动剧烈:快时可达 30+ samples/s,慢时仅 5+ samples/s。使用 top 命令查看 CPU 占用,发现存在非业务进程突发占用高 CPU 资源的情况。
尽管非独占机器,但 7B 和 32B 模型未出现类似问题,说明问题具有模型规模相关性,需进一步分析运行时调度行为。
6. 定位关键配置差异
深入对比 32B 与 72B 模型的启动脚本,发现关键差异:
72B 脚本中设置:CPU_AFFINITY_CONF=2
32B 脚本中设置:CPU_AFFINITY_CONF=1
CPU_AFFINITY_CONF 为 Ascend PyTorch 扩展提供的 CPU 亲和性控制变量:
1:粗粒度绑核,允许系统自动调度线程至空闲核心。
2:细粒度绑核,强制线程绑定至指定核心。
将 CPU_AFFINITY_CONF 修改为 1 后,预处理速度立即恢复至正常水平,处理效率显著提升。
问题根因
在非独占运行环境下,细粒度绑核(CPU_AFFINITY_CONF=2)导致数据预处理进程被强制绑定至特定 CPU 核心。当该核心被其他非业务进程抢占时,预处理线程无法及时获取 CPU 资源,造成处理速率剧烈波动,严重拖慢整体流程。
而使用粗粒度绑核(CPU_AFFINITY_CONF=1)后,系统可动态将进程调度至空闲核心,有效规避资源争抢,从而恢复稳定高效处理。
关键结论:
在非独占环境中,建议优先使用 CPU_AFFINITY_CONF=1 以避免核心抢占。
在独占机器上,细粒度绑核可带来更优性能,但需确保无其他干扰进程。
解决方案与建议
临时修复方案(快速上线)
修改启动脚本,强制设置粗粒度绑核:
export CPU_AFFINITY_CONF=1该配置适用于单机单卡场景,可快速缓解预处理瓶颈。
推荐最佳实践(长期优化)
为避免资源争抢并提升稳定性,建议在微调任务中采用以下配置:
1. 强制单机单卡运行预处理
避免多卡并行导致的同步等待与资源竞争。
在 model_xx.json 中设置:
"num_layers": 1防止因模型层数过多导致 OOM。
2. 调整并行配置为单机单卡
确保训练流程不被多节点/多卡配置干扰:
"NPUS_PER_NODE": 1,
"NNODES": 1,
"TP": 1,
"PP": 1适用于数据预处理阶段,确保资源独占。
总结
本次问题源于 绑核策略不当 导致的 CPU 资源争抢。通过对比不同模型配置,定位到 CPU_AFFINITY_CONF 的设置差异,最终通过切换为粗粒度绑核(=1)成功解决性能瓶颈。
核心建议:
在非独占环境中,优先使用 CPU_AFFINITY_CONF=1 以提升容错性与稳定性。
大模型微调任务应尽量运行在独占资源环境,避免外部进程干扰。
预处理阶段可考虑单机单卡执行,简化调度逻辑,提升可靠性。
参考文档:CPU_AFFINITY_CONF



