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

cube/vector

程序性能由计算核心(Kernel)的执行时间主导,可以通过以下几处查看是否bound。

  1. npu-smi info查看利用率,如果利用率很高则很有可能就是bound,也有可能前期跑单个推理利用率比较低,多个推理并行时,利用率超过80%(一般认为这个值就已经很高了);这种方式查看到的值是cube核上的cycle与时钟频率换算出来的cycle的比值,不包含vector core的占比,所以这个值是个初步查看,具体的需要从profiling里面的cycle自行计算;

    通过profiling计算利用率,以下图为例:

  2. 按照算子type筛选,比如这里筛选AI_CORE,就是计算CUBE的利用率。
  3. 按照start time排序,计算第一个和最后一个时间戳的差值,就是这一整段的所有耗时。
  4. CUBE的总cycle数就是aic_total_cycles数求和。
  5. 利用率为③/(②/1000000*20*1650*1000000)。其中②的单位是us,所以除以1000000转换成s;20是具体芯片的ai_core数量;1650是当前芯片的频率,单位为MHz/s,所以需要乘以1000000。

    这里计算出来的利用率是cube整体利用率的78.9%。

  6. 计算过程中各流程的占比直接用时间可以算出来。比如mte2耗时占比为ai_core总耗时的70.18%,可以推断出ai_core上的耗时内存搬入占大头。
cube/vector bound场景下的优化手段:
  • 图优化,比如torch.compile或者TensorFlow的xla。
  • 算子融合,可以减少算子启动开销和算子中间读写。
  • 数据类型,如本来是float32降低到HF32,相同数据,计算量将减少(可能影响精度,要做好精度测试)。其中,HF32数据类型仅针对Conv类算子与Matmul类算子生效。