昇腾社区首页
中文
注册
开发者
下载

配合mstx接口实现范围级重放

展示如何使用msProf工具配合mstx接口实现范围级重放,以保留算子执行时上下文的L2Cache信息。

前提条件

准备算子工程,并在算子代码中添加mstx扩展接口确定范围级重放的范围,具体请参见mstx扩展功能《MindStudio mstx API参考》

  • mstxRangeStartA和mstxRangeEnd接口需成对调用,不支持交叉调用。每一对mstx API中包含的算子为一个重放范围,该重放范围内算子的Stream不能改变。

  • 每一个重放范围能采集的算子数量受OpBasicInfo(算子基础信息)中算子Block Dim数量限制,建议不超过50个。
  • 使用该功能时,不支持与--aic-metrics=MemoryDetail、--aic-metrics=TimelineDetail及--aic-metrics=Source同时使能;不建议与--kill=on同时使能,否则可能导致采集的算子数据缺失。
  • 在进行范围级重放时,执行算子SynchronizeStream可能会失败,建议在mstxRangeEnd接口调用结束后再执行。
  • 该功能仅适用于Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件

调用示例

以Python API接口方式(test.py文件)为例,说明msProf工具如何配合mstx接口实现范围级重放。

import mstx
import torch
import torch_npu
 
x = torch.Tensor([1,2,3,4]).npu()
y = torch.Tensor([1,2,3,4]).npu()

a = x + y
range1_id = mstx.range_start("range1", None)
b = a - x
c = a * x
mstx.range_end(range1_id)
range2_id = mstx.range_start("range2", None)
d = x / y
range3_id = mstx.range_start("range3", None)
e = torch.abs(y)
mstx.range_end(range3_id)
f = x + e
mstx.range_end(range2_id)

操作步骤

单range范围级重放
  1. 执行以下命令,使能单一mstx API范围,以下命令将执行“range1”范围级重放。
    msprof op --replay-mode=range --mstx=on --mstx-include="range1" --launch-count=10 python3 test.py
  2. 工具生成Sub、Mul算子的调优数据,且两个算子之间的L2Cache信息会保留。具体性能文件介绍请参考表2
    OPPROF_{timestamp}_XXX
    ├── Mul_XXX  // Mul_XXX为采集算子名称
    │   └── 0
    │       ├── dump
                    ...
    │       └── visualize_data.bin
    └── Sub_XXX
        └── 0
            ├── dump
                   ...
            └── visualize_data.bin
  • 多range范围级重放
    1. 执行以下命令,使能所有mstx API范围。
      msprof op --replay-mode=range --mstx=on --launch-count=10 python3 test.py
    2. 工具将会先后执行“range1”和“range2”范围级重放,生成Sub、Mul、Div、Abs、Add算子的调优数据,每次重放算子之间的L2Cache信息会保留,但两次重放的L2Cache信息互相独立。但因为“range2”和“range3”存在范围交叉,则仅第一个范围生效,“range3”将无效。具体性能文件介绍请参考表2
      OPPROF_{timestamp}_XXX
      ├── Abs_XXX  // Abs_XXX为采集算子名称
      │   └── 0
      │       ├── dump
                      ...
      │       └── visualize_data.bin
      ├── Add_XXX
      │   └── 0
      │       ├── dump
                      ...
      │       └── visualize_data.bin
      ├── Mul_XXX
      │   └── 0
      │       ├── dump
                      ...
      │       └── visualize_data.bin
      ├── RealDiv_XXX
      │   └── 0
      │       ├── dump
                      ...
      │       └── visualize_data.bin
      └── Sub_XXX
          └── 0
              ├── dump
                     ...
              └── visualize_data.bin