模型训练性能分析使用流程
场景描述
在分布式训练场景中,训练平台提供了性能监控和动态性能分析(profiling)功能,以帮助用户更好地管理和优化模型性能。平台能够实时监测训练迭代的耗时及性能下降趋势。当性能下降超过预设阈值时,系统将自动启动轻量级性能分析,用户可以在线查看性能可视化的报告。此外,平台还支持详细的性能诊断,通过下发任务来收集算子内存使用情况和Python调用栈等信息,帮助用户更有效地进行模型性能优化。
约束限制
版本依赖:
- CANN 8.1.RC1 及以上版本
- msmonitor 8.3.0 及以上版本
- FrameworkPTAdapter 7.3.0 及以上版本
- 支持的 PyTorch 框架版本包括 v2.6.0、v2.7.1、v2.8.0、v2.9.0。其他版本如 v2.5.1、v2.3.1、v2.1.0 不再维护,不支持此性能分析与诊断功能。
场景限制:
- 仅支持自定义镜像和专属 NPU 资源池。
框架限制:
- 基于训练场景的 PyTorch 支持。
性能约束:
- 轻量级性能分析(profiling)的性能劣化不超过 5%。
- 细粒度性能分析对性能影响较大。例如,使用 llama3.2-3B 模型在 A3 单机 16 卡上,设置采集级别为 Level2、算子内存和 Python 调用栈时,性能劣化可达 38%。
存储约束:
- 性能分析数据采集会占用本地磁盘/cache 空间和 SFS Turbo 挂载存储空间。开启此功能前,需确保 /cache 可用容量大于 100G 和 SFS Turbo 可用容量大于 100T。如果采集过程中存储资源耗尽,将直接导致训练作业失败。
使用条件
- 将版本依赖的安装包制作成镜像。
- 创建作业时选择做好的镜像,并启用性能监控与诊断功能,随后等待作业执行完成。
功能与原理介绍
- 监控模块
性能监控支持实时step耗时监控和性能波动监控。
其中Step耗时检测周期为60s,等待作业处于运行状态后,数据刷新存在1分钟延时。
图1 监控
性能波动监控:
系统会在训练开始后,先建立一个基线(baseline):
- 跳过阶段:刚开始若干个样本不计入(避免启动抖动影响)。
- 基线阶段:用一段样本估计“正常Step耗时”的均值/波动。
- 检测阶段:之后每个新Step耗时都会和基线对比,计算 波动系数,并用“连续次数”过滤噪声,只有“持续变慢”才判异常。
基线的参数设置由环境变量控制,不设置则为默认值处理:跳过前20个Step后,用后20个Step的耗时计算出基线的均值和标准差,波动系数阈值K为5,阈值超限连续次数为4。因此性能波动监控在基线建立之后才会观测到上报。
表1 环境变量参数说明 环境变量名称
检测说明
特点
默认取值
PERF_BASELINE_SKIP_STEPS
启动后先跳过多少个样本,不用来建基线。
跳过启动抖动,减少误报。
默认20。
PERF_BASELINE_STEPS
用多少个样本建立“正常耗时基线”。
越大越稳,但进入检测更慢。
默认20。
PERF_KSIGMA(阈值)
“明显变慢”的门槛:波动系数 ≥ K 才算一次spike。
K 越小越敏感,越大越保守。
默认5,按误报/漏报调整。
PERF_MIN_SPIKE_CONSEC
连续多少次spike才判定异常。
越大越不容易误触,但也更慢触发。
默认4。
图2 阈值修改
支持作业运行中动态修改阈值,阈值调整后系统会“从连续次数角度重新开始计数”,避免旧计数影响新阈值的判定。当连续阈值超限达到设置次数之后,会自动触发profiling。
- 智能运维模块
ModelArts平台对训练作业进行全面实时监测,确保其正常运行。平台在训练作业详情中提供了智能运维功能,帮助用户轻松进行作业监测和维护。通过智能运维的性能监测模块,用户可以快速获取性能报告和异常情况,便于及时处理。图3 性能监测
- 性能监测:
当监控模块step波动系数曲线连续超过阈值达到设定次数之后,平台会自动触发profiling采集,采集结束后,性能监测的状态会由监测中切换到中风险,并支持查看报告。
- 性能分析:
等待监控到迭代耗时后,用户可单击“立即诊断”手动下发profiling采集任务,支持设置采集级别Level2、算子内存、Python调用栈等参数。详情可参见5。
- 性能监测:
分析使用流程
- 准备工作。
理论上CANN最低版本为CANN 8.1.RC1,在这之后都支持profiling采集功能,下面按CANN 8.2.RC1 Snt9B Arm为例:
以Snt9B Arm为例,下载链接选择对应的安装包:单击跳转下载。
图4 CANN版本
对于企业下载:


对于运营商下载:


PTA 1230版本
单击跳转进入下载页,根据Python版本下载对应的pytorch包。
图5 pytorch包
msmonitor 1230版本
单击链接下载msmonitor安装包。
图6 msmonitor安装包
- 制作自定义镜像。
由于采集依赖上述工具包,CANN和PTA安装包文件较大,可以制作成镜像,在训练容器启动前下拉安装。如下:在用户镜像基础上安装依赖的whl包和二进制文件。
Dockerfile文件:
FROM swr.cn-north-7.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc3-py_3.9-hce_2.0.2409-aarch64-snt9b-20241213131522-aafe527 # 复制OBS下载的文件到镜像中 COPY ./Ascend-cann-toolkit_8.2.RC1_linux-aarch64.run /home/ma-user/tmp/ COPY ./Ascend-cann-kernels-910b_8.2.RC1_linux-aarch64.run /home/ma-user/tmp/ COPY ./torch_npu-2.1.0.post13.xxxxxx-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl /home/ma-user/tmp/ COPY ./msmonitor_plugin-0.1-cp39-cp39-linux_aarch64.whl ./dynolog-0.3.2-1.el8.aarch64.rpm /home/ma-user/tmp/ # 安装监控插件 RUN chmod 777 /home/ma-user/tmp/msmonitor_plugin-0.1-cp39-cp39-linux_aarch64.whl RUN pip install /home/ma-user/tmp/msmonitor_plugin-0.1-cp39-cp39-linux_aarch64.whl RUN rpm -ivh --nodeps /home/ma-user/tmp/dynolog-0.3.2-1.el8.aarch64.rpm # 安装CANN工具包 RUN chmod +x /home/ma-user/tmp/Ascend-cann-toolkit_8.2.RC1_linux-aarch64.run && \ /home/ma-user/tmp/Ascend-cann-toolkit_8.2.RC1_linux-aarch64.run --install --install-for-all --quiet && \ chmod +x /home/ma-user/tmp/Ascend-cann-kernels-910b_8.2.RC1_linux-aarch64.run && \ /home/ma-user/tmp/Ascend-cann-kernels-910b_8.2.RC1_linux-aarch64.run --install --install-for-all --quiet # 安装 PyTorch NPU RUN pip install /home/ma-user/tmp/torch_npu-2.1.0.post13.xxxxx-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - 创建训练作业。
作业配置选择自定义算法+专属NPU资源池+性能监控与诊断,详细如下:
“创建方式”:选择“自定义算法”。
“启动方式”:选择“自定义”。
“资源池类型”:选择专属资源池。
“资源池”:选择NPU类型专属资源池。
勾选开启“性能监控与诊断”,指定SFS Turbo存储目录,建议使用子目录,如果用户不和其他作业对比,建议使用空目录。
其他参数参照创建生产训练作业完成作业创建。
图7 资源池配置示例
图8 性能监控与诊断
- 作业运行后,
- 查看性能监控。
图9 监控
检测算法:
波动系数监控:当连续触发阈值4次后,平台会自动开启profiling,在智能运维模块可观测。自动profiling开启存在冷却期(每两小时)和最大次数(3次),如果连续触发阈值间隔在两小时内或者总次数超过3次,不会自动触发新的profiling。
- 查看性能监测报告。
在打开的网页中加载 MindStudio Insight 插件页面,选择/home/ma-user/summary/nfs-0/目录下对应JobID的文件夹,然后等待加载。
图11 示例图片
加载一段时间后(加载时间取决于数据量大小,实测500MB的数据量大约需要半分钟),您可以查看timeline等信息。
图12 查看信息
- 查看性能监控。
- 下发性能分析任务。
- 单击“立即诊断”,进入创建性能分析页面。
图13 立即诊断
- 按需选择采集参数,确认。
开启以下配置后会引入额外的性能膨胀,对性能的影响请参见约束限制,请谨慎配置。
表2 创建性能分析参数说明 参数
参数解释
是否必填
默认取值
采集步数
采集总迭代数,必须传入正整数,取值范围[1-3]。
是
无
采集profiler
控制profiler的采集等级,不采集时默认为Level_none,采集时可选Level0, Level1, Level2:
Level_none:不采集所有Level层级控制的数据,即关闭profiler_level。
Level0:采集上层应用数据、底层NPU数据以及NPU上执行的算子信息。配置该参数时,仅采集部分数据,其中部分算子信息不采集,详细情况请参见op_summary(算子详细信息)中有关task_time为l0时的说明。
Level1:在Level0的基础上多采集CANN层AscendCL数据和NPU上执行的AI Core性能指标信息。
Level2:在Level1的基础上多采集CANN层Runtime数据以及AI CPU(data_preprocess.csv文件)数据。
否
不采集
采集内存
采集算子的内存占用情况。
否
不采集
采集Python调用栈
采集算子调用栈,包括框架层及CPU算子层的调用信息。
否
不采集
采集MSTX
打点控制开关,通过开关开启自定义打点功能。参数使用请参见采集并解析msprof_tx数据(可选)。
否
不采集
采集AI Core的性能指标
AI Core的性能指标采集项。可取值如下:
以下采集项的结果数据将在Kernel View呈现。
以下采集项的结果数据含义可参见op_summary(算子详细信息),但具体采集结果请以实际情况为准。- AiCoreNone:关闭AI Core的性能指标采集,默认值。
- PipeUtilization:计算单元和搬运单元耗时占比。
- ArithmeticUtilization:各种计算类指标占比统计。
- Memory:外部内存读写类指令占比。
- MemoryL0:内部L0内存读写类指令占比。
- ResourceConflictRatio:流水线队列类指令占比。
- MemoryUB:内部UB内存读写类指令占比。
- L2Cache:读写cache命中次数和缺失后重新分配次数。
否
不采集
图14 创建性能分析
- 等待此次性能分析结束。
- 单击“查看报告”,选择该jobID下的manual_profiling_dump_{时间戳}的文件夹,确认加载后查看timeline报告。
图15 manual_profiling_dump
图16 报告示例
- 单击“立即诊断”,进入创建性能分析页面。
常见问题
- 为什么我看到性能波动曲线score越线了但没有触发profiling?
profiling是重动作,训练本身有天然噪声(IO、checkpoint、通信同步等)。单点触发会把噪声当异常,导致频繁触发、影响训练且难解释。当前策略是“连续超阈 + 冷却 + 上限”,确保行为稳定可预期。
- 我感觉已经变慢了但没触发?
常见原因:
- 基线还没建立完成。
- 变慢是缓慢漂移,没有形成“连续明显超阈”的阶段。
- K/连续次数门槛过高(建议先降低 K 或降低 MinSpikeConsec 进行验证)。
- 为什么训练作业正常运行,一直看不到性能监控指标上报?
常见原因:

