昇腾社区首页
中文
注册

算子调优

  1. Dump算子信息。

    算子调优前,需要先获取模型中算子信息统计文件(*.json),包括算子的shape、dtype、format等信息。目前支持两种方式Dump算子json文件,请根据实际情况选择合适的方式。

    • 使用PyTorch的Python接口编程时,可通过Ascend PyTorch Profiler接口dump算子json文件,具体请参考性能调优工具指南中“其他采集方式介绍 > 使用PyTorch框架接口采集 > Ascend PyTorch Profiler接口采集”章节。
      1. 使用Ascend PyTorch Profiler接口开启PyTorch训练时的性能数据采集。

        在训练前,开启扩展参数experimental_config中“算子信息统计功能”,即参数record_op_args置为True。

      2. 查看采集到的PyTorch训练性能数据结果文件。

        训练结束后,Dump的算子信息统计文件默认在{worker_name}_{时间戳}_ascend_pt_op_args/{pid}目录下。

    • 使用AscendCL的C++接口编程时,可通过aclopStartDumpArgsaclopStopDumpArgs接口将算子信息统计文件Dump到指定目录下。
  2. 编译静态Kernel包

    在任意目录下,以运行用户(如HwHiAiUser)身份执行如下命令,进行算子编译:

    • (默认)静态编译命令样例:
      1
      2
      op_compiler --op_params_dir=<dump_dir>  --soc_version=<soc_version> --log=info --job=128 --output=<output_dir>
      op_compiler -p <dump_dir>  -v <soc_version> -l info -j 128 -o <output_dir>
      
    • 调优编译命令样例:
      1
      2
      op_compiler --op_params_dir=<dump_dir>  --soc_version=<soc_version> --log=info --job=128 --compile_mode=tune --output=<output_dir>
      op_compiler -p <dump_dir>  -v <soc_version> -l info -j 128 -m tune -o <output_dir>
      

    关键参数释义如下,全量的参数说明可参考算子编译工具使用指南中“参数说明”章节,请根据实际情况设置。

    • --op_params_dir:必选参数,简写-p,Dump工具导出的统计数据所在的文件夹路径,支持绝对和相对路径。
    • --soc_version:执行算子编译功能时为必选参数,简写-v,指定算子编译时昇腾AI处理器的版本。

      如果无法确定当前设备的soc_version,查询方法如下:

      • 在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,获取Chip Name信息。实际配置值为AscendChip Name,例如Chip Name取值为xxxyy,实际配置值为Ascendxxxyy
    • --log:可选参数,简写-l,设置算子编译过程中日志的级别。默认为null,即不输出日志。如需输出日志,可设置debug、info、warning、error级别。
      • debug:输出debug、info、warning、error、event级别的运行信息。
      • info:输出info、warning、error、event级别的运行信息。
      • warning:输出warning、error、event级别的运行信息。
      • error:输出error、event级别的运行信息。
    • --job:可选参数,简写-j,设置编译时工作进程数。默认为2*cpu最大物理核数-1,最小取值1。
    • --complie_mode:可选参数,简写-m,指定编译的模式。默认为compile纯编译模式,如需调优编译,参数取值tune。
    • --output:可选参数,简写-o,编译输出的目录+安装包名称,如xxx/xxx/*.run,支持相对路径和绝对路径。

      不输入路径的情况下,默认在当前编译命令执行路径下生成;不输入安装包名称的情况下,安装包默认命名为static_kernel_${datatime}.run。

    算子编译工具提供了--count参数和-p参数配合使用,用于统计-p参数指定的目录下算子信息统计json文件的数目。

    样例如下:

    1
    op_compiler -p <dump_dir> --count
    

    只有动态shape才能dump出算子统计信息,安装静态kernel包后,静态kernel包对应算子的统计信息就不会dump出来。所以在安装静态kernel包后,如果网络有调整,可以通过调整前后dump的json文件的数量来判断静态kernel包和当前网络是否匹配。

    通过调整网络前后,各执行一次dump操作,并通过--count命令来统计dump生成的json文件的数目,如果调整后的数目比调整前大,则说明静态kernel包中有部分算子不再匹配当前网络,此时开发者可以:

    • 卸载静态kernel包,重新走dump流程,编译安装新的静态kernel包。
    • 仍使用当前静态kernel包,此时需要注意不匹配的算子会走动态流程,得不到性能收益。
  3. 安装静态Kernel包。
    进入static_kernel_${datatime}.run包所在目录,以运行用户(如HwHiAiUser)身份运行run包:
    1
    ./static_kernel_${datatime}.run
    

    当出现如下回显信息代表安装成功。

    1
    2
    Verifying archive integrity...  100%   SHA256 checksums are OK. All good.
    Uncompressing STATIC KERNEL RUN PACKAGE  100%
    

    目前暂不支持指定目录安装,run包默认安装到${install_path}/opp/static_kernel路径下,其中${install_path}为CANN软件安装后文件存储路径,请根据实际情况替换该路径。

    run包安装后的目录结构样例如下,

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    |-- ${install_path}/opp/static_kernel
        |-- ai_core
            |-- config                                
               |-- ascendxxxx
                   |-- binary_info_config.json            # 全量静态Kernel包的总索引
            |-- config.ini                               # 记录安装顺序的配置文件。
            |-- static_kernel_230808110316            # 时间戳为“230808110316”的静态Kernel文件
               |-- ascendxxxx
               |   |-- Add                                 # 算子二进制目录
               |      |-- Add_float16_NCL_xxxx_d0.json
               |      |-- Add_float16_NCL_xxxx_d1.json 
               |      |-- Add_float16_NCL_xxxx_d0.o
               |      |-- Add_float16_NCL_xxxx_d1.o
               |   |-- xxxx
               |      |-- xxx.json
               |      |-- xxx.o
               |   |-- ......
               |-- config                                # 单个静态Kernel包索引
               |   |-- ascendxxxx
               |       |-- binary_info_config.json     
               |-- scripts                               # 工具涉及的通用脚本                          
               |   |-- ......                         
               |-- uninstall.sh                        # 单包卸载脚本  
            |-- static_kernel_xxxx                    # 不同时间戳的静态Kernel文件
            |-- uninstall.sh                           # 全量卸载脚本
            |-- version.info                             # 版本信息
    

    支持多个Kernel包安装,如果多个包中存在相同的算子Kernel,以后安装的Kernel包为准。

  4. (可选)当不再需要静态Kernel包时,可以单包卸载或全量卸载。
    • 单包卸载

      进入static_kernel_${datatime}.run包的安装目录,以运行用户(如HwHiAiUser)身份运行uninstall.sh。

      1
      2
      cd ${install_path}/opp/static_kernel/ai_core/static_kernel_${datatime}
      ./uninstall.sh
      

      此时,ai_core目录下static_kernel_${datatime}文件夹被删除。

    • 全量卸载
      进入${install_path}/opp/static_kernel/ai_core目录下,以运行用户(如HwHiAiUser)身份运行uninstall.sh。
      1
      2
      cd ${install_path}/opp/static_kernel/ai_core/
      ./uninstall.sh
      

      此时,ai_core目录下所有内容被删除,所有已安装的kernel包均被卸载。