编译优化-torch_npu

编译优化方法

  1. 依赖安装。

    torch_npu构建依赖PyTorch,目前需要参考编译优化-Pytorch用毕昇编译器构建PyTorch之后,在环境里重新安装PyTorch,然后再编译torch_npu。

    torch_npu推荐在容器里进行编译,参考https://gitee.com/ascend/pytorch下的“README”文件中"使用源代码进行安装" 一栏拉取镜像。以下描述均以torch_npu v2.1.0版为例。

    参考安装毕昇编译器配置毕昇编译器环境。

  2. 获取源码。
    Git下载:
    git clone -b v2.1.0 https://gitee.com/ascend/pytorch.git torch_npu
  3. 根据需要的优化类型进行相应编译参数设置并进行编译,LTO和PGO优化可以单独使用,也可以叠加一起使用,当前torch_npu已支持基于毕昇编译器的编译优化选项。

    使用毕昇编译torch_npu之前需要先参照编译优化-PyTorch,用毕昇重新编译PyTorch并安装,然后再编译torch_npu。

    • LTO优化
      1. 配置编译参数,设置环境变量。
        export CC=clang
        export CXX=clang++
      2. 执行编译命令。
        cd torch_npu
        git clean -dfx
        bash ci/build.sh --python=3.8 --enable_lto
      3. 执行ls dist命令,查看编译成功的whl包。

      4. 安装whl包。
        pip install torch_npu-*.whl --force-reinstall --no-deps
    • LTO+PGO优化
      • 一次编译(插桩编译)
        • 配置编译参数,设置环境变量。
          export CC=clang
          export CXX=clang++
        • 执行编译命令。
          cd torch_npu
          git clean -dfx
          bash ci/build.sh --python=3.8 --enable_lto --enable_pgo=1
      • 安装一次编译后的torch_npu的whl包,执行如下命令:
        pip3 install /path/to/*.whl --force-reinstall --no-deps
        • 配置环境变量LLVM_PROFILE_FILE指定profraw数据生成文件。

          参考命令:

          export LLVM_PROFILE_FILE=/tmp/profile/default_%m.profraw

          参考命令中%m允许在线合并profile数据,改为%p将按pid记录数据。

        • 根据实际情况操作,正常跑模型即可,基于插桩的二进制在运行时会比正常二进制性能差,无需关注 。
      • 运行需要优化的模型,采集Profile信息。
      • 模型跑完之后,程序停止执行,在上述文件路径有已生成的profraw格式文件。
      • Profile数据格式转换。

        执行如下命令:

        llvm-profdata merge /path/to/profile -o default.profdata

        该命令可以合并/path/to/profile目录下所有的profraw文件,profile数据文件不受机器环境影响,可以迁移到其他机器上使用。

      • 二次编译(使用Profile数据)

        配置profdata文件:将前一步骤中生成的default.profdata文件拷贝到torch_npu目录下。请将profdata文件命名为default.profdata。

        执行编译命令:
        cd torch_npu
        git clean -dfx
        bash ci/build.sh --python=3.8 --enable_lto --enable_pgo=2

        二次编译后的torch_npu的whl包为正式使用的高性能包。

常见问题

  1. Error while loading shared libraries: libomp.so: cannot open shared object file: No such file or directory.

    torch_npu构建时默认使用了openmp。torch_npu运行环境需要安装毕昇编译器包,并设置LD_LIBRARY_PATH环境变量,以便可以正确找到动态库libomp.so。

  2. PyTorch和torch_npu中profile生成路径是否可以相同?

    可以相同,并且可以合并使用同一个profdata,编译器会识别内部信息,互不干扰。

  3. 运行时报错未定义符号,其中包含如basic_string等字样。

    可能是编译时c++11 abi不一致导致,建议查看PyTorch和torch_npu的build目录下的compile_commands.json文件,检查宏DGLIBCXX_USE_CXX11_ABI的值是否一致。若不一致,设置环境变量export _GLIBCXX_USE_CXX11_ABI=0,再重新编译PyTorch。