文档首页/ AI开发平台ModelArts/ 模型训练/ 模型训练性能分析使用流程
更新时间:2026-02-06 GMT+08:00
分享

模型训练性能分析使用流程

场景描述

在分布式训练场景中,训练平台提供了性能监控和动态性能分析(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。如果采集过程中存储资源耗尽,将直接导致训练作业失败。

使用条件

  1. 将版本依赖的安装包制作成镜像。
  2. 创建作业时选择做好的镜像,并启用性能监控与诊断功能,随后等待作业执行完成。

功能与原理介绍

  1. 监控模块

    性能监控支持实时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。

  2. 智能运维模块
    ModelArts平台对训练作业进行全面实时监测,确保其正常运行。平台在训练作业详情中提供了智能运维功能,帮助用户轻松进行作业监测和维护。通过智能运维的性能监测模块,用户可以快速获取性能报告和异常情况,便于及时处理。
    图3 性能监测
    • 性能监测:

      当监控模块step波动系数曲线连续超过阈值达到设定次数之后,平台会自动触发profiling采集,采集结束后,性能监测的状态会由监测中切换到中风险,并支持查看报告。

    • 性能分析:

      等待监控到迭代耗时后,用户可单击“立即诊断”手动下发profiling采集任务,支持设置采集级别Level2、算子内存、Python调用栈等参数。详情可参见5

分析使用流程

  1. 准备工作。

    理论上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安装包

  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存储目录,建议使用子目录,如果用户不和其他作业对比,建议使用空目录。

    其他参数参照创建生产训练作业完成作业创建。

    图7 资源池配置示例
    图8 性能监控与诊断

  4. 作业运行后,

    1. 查看性能监控。

      可查看训练Step耗时与Step耗时波动系数两个指标。

      图9 监控

      检测算法:

      波动系数监控:当连续触发阈值4次后,平台会自动开启profiling,在智能运维模块可观测。自动profiling开启存在冷却期(每两小时)和最大次数(3次),如果连续触发阈值间隔在两小时内或者总次数超过3次,不会自动触发新的profiling。

    2. 查看性能监测报告。
      在智能运维页签中,单击“查看报告”
      图10 智能运维

      在打开的网页中加载 MindStudio Insight 插件页面,选择/home/ma-user/summary/nfs-0/目录下对应JobID的文件夹,然后等待加载。

      图11 示例图片

      加载一段时间后(加载时间取决于数据量大小,实测500MB的数据量大约需要半分钟),您可以查看timeline等信息。

      图12 查看信息

  5. 下发性能分析任务。

    1. 单击“立即诊断”,进入创建性能分析页面。
      图13 立即诊断
    2. 按需选择采集参数,确认。

      开启以下配置后会引入额外的性能膨胀,对性能的影响请参见约束限制,请谨慎配置。

      表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 创建性能分析
    3. 等待此次性能分析结束。
    4. 单击“查看报告”,选择该jobID下的manual_profiling_dump_{时间戳}的文件夹,确认加载后查看timeline报告。
      图15 manual_profiling_dump
      图16 报告示例

常见问题

  1. 为什么我看到性能波动曲线score越线了但没有触发profiling?

    profiling是重动作,训练本身有天然噪声(IO、checkpoint、通信同步等)。单点触发会把噪声当异常,导致频繁触发、影响训练且难解释。当前策略是“连续超阈 + 冷却 + 上限”,确保行为稳定可预期。

  2. 我感觉已经变慢了但没触发?

    常见原因:

    • 基线还没建立完成。
    • 变慢是缓慢漂移,没有形成“连续明显超阈”的阶段。
    • K/连续次数门槛过高(建议先降低 K 或降低 MinSpikeConsec 进行验证)。
  3. 为什么训练作业正常运行,一直看不到性能监控指标上报?

    常见原因:

    • 指标采集周期默认为1分钟,默认迭代正常运行后延时1-2分钟后才会有指标上报。
    • 依赖pytorch版本不配套,由于pytorch部分版本已进入维护状态,底层暂不支持监控采集这套方案,确认方式如下:进入容器查看torch_npu的版本号,post版本号小于1230发布的post版本,代表版本不配套。

      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

相关文档