计算和搬运类指令的性能建模

需完成使用前准备后可在任意目录下实现算子的DSL语言方案( Domain-Specific Language ,基于特性域语言),实现中包括如下注意事项:

具体操作

  1. 根据用户自己的算子逻辑方案实现算子功能函数,tiling策略的模拟体现在算子功能函数的for循环中,例如单核需要处理4096个数据,预期分8块数据分批处理,就需要for循环8次并每次创建一个大小为512个数据的GM的Tensor。
  2. main.py实现完成后,使用python执行该脚本即可,并在当前目录获取以下建模数据。
    • 支持搬运通路建模(Atlas A2训练系列产品/Atlas 800I A2推理产品
      Atlas A2训练系列产品/Atlas 800I A2推理产品中,新增了L1到fixpipe buffer及L1到Bias table。前者是存在L0C_TO_OUT随路转换时存储量化转换的scale参数,后者是存一维的bias数据。在本工具中,只需按GM-L1-Bias table/FP的顺序通路搬运即可。
      in_x = Tensor("GM", "FP16", [64], format="ND")
      l1_x = Tensor("L1")
      fp_x = Tensor("FB")
      bt_x = Tensor("BT")
      l1_x.load(in_x)
      l1_x_to_fp = l1_x[0:32]
      l1_x_to_bt = l1_x[32:64]
      fp_x.load(l1_x_to_fp)
      bt_x.load(l1_x_to_bt)
    • 支持随路转换建模

      昇腾AI处理器的CUBE单元中,进行计算的数据格式需要是特殊的私有NZ格式。而通常在GM上的数据都是ND格式,因此在进行Cube运算时,需要将数据格式进行转换。在Atlas A2训练系列产品/Atlas 800I A2推理产品中,GM到CUBE相关的存储单元的搬运通路已具备ND转NZ的随路转换能力。

      在mskpp工具中,若GM-L1且用户定义GM的tensor是ND,L1的tensor是NZ,或L0C-GM且用户定义L0C上的tensor是NZ,GM的tensor是ND,则开启随路转换,调取相关实测数据。

      in_x = Tensor("GM", "FP16", [128, 256], format="ND")
      l1_x1 = Tensor("L1", format="NZ")
      l1_x2 = Tensor("L1", format="NZ")
      l1_x1.load(in_x[128, 0:128])
      l1_x2.load(in_x[128, 128:])
    • 支持cache命中率建模

      L2Cache是指部分GM空间与vectorcore和cubecore存在高带宽的搬运通路,当L2Cache命中率接近100%与L2Cache命中率接近0%时,带宽能有两倍以上的差距。mskpp工具目前支持用户手动调整L2Cache命中率。

      with Chip("Ascendxxxyy") as chip:
          config = {"cache_hit_ratio": 0.6}
          chip.set_cache_hit_ratio(config)
    • 支持tensor拆分使用
      mskpp工具中,Tensor拆分是指将一个大的Tensor用切片的手段生成新的小Tensor,例如:
      in_x = Tensor("GM", "FP16", [128, 256], format="ND")
      in_x_1 = in_x[128, 0:128]    # 大小1*128
      in_x_2 = in_x[128, 64:]    # 大小1*64
    • 支持debug模式
      该模式可使能用户初步定位DSL语言编码过程中哪个指令的出队入队存在问题,提升与工具开发共同定位的效率,使能方式如下:
      with Chip("Ascendxxxyy", debug_mode=True) as chip:
    • 支持pipe信息的理论值与msprof实测值比对
      Ascend C算子为例,通过--application方式调用msprof,在OPPROF_{timestamp}_XXX目录中输出PipeUtilization.csv文件,并在脚本中使能:
      with Chip("Ascendxxxyy") as chip:
          chip.enable_metrics() 
          chip.set_prof_summary_path("${INSTALL_DIR}/OPPROF_{timestamp}_XXX/PipeUtilization.csv")
      生成的Pipe_statistic.csv文件包含“ProfDuration(us)_0”“ProfRatio_0”两列,其中ProfDuration(us)_0列的取值和PipeUtilization.csv文件中对应的值一致,ProfRatio_0为实测值跟理论值的比值。 ProfRatio是实测值相对理论值的倍数,倍数越大,优化空间越大。
      图1 Pipe_statistic.csv文件