# 模型训练性能分析使用流程
#### 场景描述
在分布式训练场景中，训练平台提供了性能监控和动态性能分析（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支持。
**性能约束：**
- 性能监控的性能劣化不超过0.1%。
- 轻量级性能分析（profiling）的性能劣化不超过5%。
- 细粒度性能分析对性能影响较大。例如，使用llama3.2-3B模型在A3单机16卡上，设置采集级别为Level2、算子内存和Python调用栈时，性能劣化可达38%。
**存储约束：**
- 性能分析数据采集会占用本地磁盘/cache空间和SFS Turbo挂载存储空间。开启此功能前，需确保/cache可用容量大于100G和SFS Turbo可用容量大于100T。如果采集过程中存储资源耗尽，将直接导致训练作业失败。
 
#### 使用条件
1. 将版本依赖的安装包制作成镜像。
2. 创建作业时选择做好的镜像，并启用性能监控与诊断功能，随后等待作业执行完成。
 
#### 功能与原理介绍
1. **监控模块**
   性能监控支持实时step耗时监控和性能波动监控。
   其中Step耗时检测周期为60s，等待作业处于运行状态后，数据刷新存在1分钟延时。
   图1监控
   ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002511714030.png "点击放大")
   性能波动监控：
   系统会在训练开始后，先建立一个**基线**（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阈值修改   
   ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002506476880.png "点击放大")
   支持作业运行中动态修改阈值，阈值调整后系统会"从连续次数角度重新开始计数"，避免旧计数影响新阈值的判定。当连续阈值超限达到设置次数之后，会自动触发profiling。
   
2. **智能运维模块**
   ModelArts平台对训练作业进行全面实时监测，确保其正常运行。平台在训练作业详情中提供了智能运维功能，帮助用户轻松进行作业监测和维护。通过智能运维的性能监测模块，用户可以快速获取性能报告和异常情况，便于及时处理。
   图3性能监测   
   ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002506001760.png "点击放大")
   - 性能监测： 当监控模块step波动系数曲线连续超过阈值达到设定次数之后，平台会自动触发profiling采集，采集结束后，性能监测的状态会由监测中切换到中风险，并支持查看报告。
     
   
   - 性能分析： 等待监控到迭代耗时后，用户可单击"立即诊断"手动下发profiling采集任务，支持设置采集级别Level2、算子内存、Python调用栈等参数。详情可参见[5]。
     
    
 
#### 分析使用流程
1. 准备工作。 
   CANN包最低版本为CANN 8.1.RC1，在这之后都支持profiling采集功能，
   单击[跳转](https://www.hiascend.com/developer/download/commercial/result?module=cann)下载，下载链接选择对应的安装包。
   下载FrameworkPTAdapter 7.3.0 及以上版本，单击[跳转](https://gitcode.com/Ascend/pytorch/releases)进入下载页，根据Python版本下载对应的pytorch包。
   下载msmonitor 8.3.0 及以上版本，单击https://gitcode.com/Ascend/msmonitor/下载msmonitor安装包。
   
   
2. 制作自定义镜像。 
   由于采集依赖上述工具包，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
   ```
   
   
3. 创建训练作业。 
   作业配置选择自定义算法+专属NPU资源池+性能监控与诊断，详细如下：
   "创建方式"：选择"自定义算法"。
   "启动方式"：选择"自定义"。
   "资源池类型"：选择专属资源池。
   "资源池"：选择NPU类型专属资源池。
   勾选开启"性能监控与诊断"，指定SFS Turbo存储目录，建议使用子目录，如果用户不和其他作业对比，建议使用空目录。
   其他参数参照[创建训练作业](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0022.html)完成作业创建。
   图4资源池配置示例   
   ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002539592003.png "点击放大")
   图5性能监控与诊断   
   ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002537067305.png "点击放大")
   
   
4. 作业运行后， 
   1. 查看性能监控。 可查看训练Step耗时与Step耗时波动系数两个指标。
      图6监控   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002511555650.png "点击放大")
      检测算法：
      波动系数监控：当连续触发阈值4次后，平台会自动开启profiling，在智能运维模块可观测。自动profiling开启存在冷却期（每两小时）和最大次数（3次），如果连续触发阈值间隔在两小时内或者总次数超过3次，不会自动触发新的profiling。
      
   
   2. 查看性能监测报告。
      在智能运维页签中，单击"查看报告"。
      图7智能运维   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002506255572.png "点击放大")
      在打开的网页中加载MindStudio Insight插件页面，选择/home/ma-user/summary/nfs-0/目录下对应JobID的文件夹，然后等待加载。
      图8示例图片   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002505187516.png "点击放大")
      加载一段时间后（加载时间取决于数据量大小，实测500MB的数据量大约需要半分钟），您可以查看timeline等信息。
      图9查看信息   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002537187241.png "点击放大") 
   
   
   
   
5. 下发性能分析任务。
   
   1. 单击"立即诊断"，进入创建性能分析页面。
      图10立即诊断   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002506092564.png "点击放大") 
   
   2. 按需选择采集参数，确认。
      ![](https://support.huaweicloud.com/develop-modelarts/public_sys-resources/warning_3.0-zh-cn.png)
      开启以下配置后会引入额外的性能膨胀，对性能的影响请参见[约束限制]，请谨慎配置。
      表2创建性能分析参数说明 
      | 参数              | 参数解释                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 是否必填 | 默认取值 |
      |:---|:---|:---|:---|
      | 采集步数           | 采集总迭代数，必须传入正整数，取值范围\[1-3\]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 是    | 无     |
      | 采集profiler     | 控制profiler的采集等级，不采集时默认为Level_none，采集时可选Level0, Level1, Level2： Level_none：不采集所有Level层级控制的数据，即关闭profiler_level。 Level0：采集上层应用数据、底层NPU数据以及NPU上执行的算子信息。配置该参数时，仅采集部分数据，其中部分算子信息不采集，详细情况请参见[op_summary（算子详细信息）](https://www.hiascend.com/document/detail/zh/mindstudio/700/T&ITools/Profiling/atlasprofiling_16_0067.html#ZH-CN_TOPIC_0000002129868978)中有关task_time为l0时的说明。 Level1：在Level0的基础上多采集CANN层AscendCL数据和NPU上执行的AI Core性能指标信息。 Level2：在Level1的基础上多采集CANN层Runtime数据以及AI CPU（data_preprocess.csv文件）数据。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 否    | 不采集  |
      | 采集内存           | 采集算子的内存占用情况。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 否       | 不采集     |
      | 采集Python调用栈   | 采集算子调用栈，包括框架层及CPU算子层的调用信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 否   | 不采集  |
      | 采集MSTX        | 打点控制开关，通过开关开启自定义打点功能。参数使用请参见[采集并解析msprof_tx数据（可选）](https://www.hiascend.com/document/detail/zh/mindstudio/700/T&ITools/Profiling/atlasprofiling_16_0033.html#ZH-CN_TOPIC_0000002165108749__zh-cn_topic_0000002128096462_section5940122172516)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | 否     | 不采集  |
      | 采集AI Core的性能指标 | AI Core的性能指标采集项。可取值如下： 以下采集项的结果数据将在Kernel View呈现。 以下采集项的结果数据含义可参见[op_summary（算子详细信息）](https://www.hiascend.com/document/detail/zh/mindstudio/700/T&ITools/Profiling/atlasprofiling_16_0067.html#ZH-CN_TOPIC_0000002129868978)，但具体采集结果请以实际情况为准。 - AiCoreNone：关闭AI Core的性能指标采集，默认值。    - PipeUtilization：计算单元和搬运单元耗时占比。  - ArithmeticUtilization：各种计算类指标占比统计。  - Memory：外部内存读写类指令占比。  - MemoryL0：内部L0内存读写类指令占比。  - ResourceConflictRatio：流水线队列类指令占比。  - MemoryUB：内部UB内存读写类指令占比。  - L2Cache：读写cache命中次数和缺失后重新分配次数。   | 否   | 不采集  |
         
      图11创建性能分析   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002506058994.png) 
   
   3. 等待此次性能分析结束。
   
   4. 单击"查看报告"，选择该jobID下的manual_profiling_dump_{时间戳}的文件夹，确认加载后查看timeline报告。
      图12manual_profiling_dump   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002538133931.png "点击放大")
      图13报告示例   
      ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002548859673.png "点击放大") 
   
   
   
   
 
#### 常见问题
1. **为什么我看到性能波动曲线score越线了但没有触发profiling？**
   profiling是重动作，训练本身有天然噪声（IO、checkpoint、通信同步等）。单点触发会把噪声当异常，导致频繁触发、影响训练且难解释。当前策略是"连续超阈 + 冷却 + 上限"，确保行为稳定可预期。
   
2. **我感觉已经变慢了但没触发？**
   常见原因：
   - 基线还没建立完成。
   
   - 变慢是缓慢漂移，没有形成"连续明显超阈"的阶段。
   
   - K/连续次数门槛过高（建议先降低K或降低MinSpikeConsec进行验证）。
    
3. **为什么训练作业正常运行，一直看不到性能监控指标上报？**
   常见原因：
   - 指标采集周期默认为1分钟，默认迭代正常运行后延时1-2分钟后才会有指标上报。
   
   - 依赖pytorch版本不配套，由于pytorch部分版本已进入维护状态，底层暂不支持监控采集这套方案，确认方式如下：进入容器查看torch_npu的版本号，post版本号小于1230发布的post版本，代表版本不配套。 ![](https://support.huaweicloud.com/develop-modelarts/figure/zh-cn_image_0000002506173874.png "点击放大")
     1230发布的torch_npu版本号：
     2.1.0.post19.dev2025xx
     2.6.0.post5.dev2025xx
     2.7.1.post2.dev2025xx
     2.8.0.post2.dev2025xx
     2.9.0.dev2025xx
     
    
 
