libtorch推理

以AscendPytorch仓库下pytorch/examples/libtorch_resnet模型为例,介绍libtorch推理的快速使用。

已完成NPU适配的模型代码与编译文件请参见libtorch_resnet.cppCMakeLists.txt。另外resnet_trace.py用于导出torchscript文件可用于libtorch推理,编译与推理脚本可参见libtorch_resnet.sh

  1. 需提前安装torch、torch_npu、torchvision、expecttest。
    • torch与torch_npu、torchvision安装请参见安装PyTorch
    • expecttest安装可使用以下命令。
      pip3 install expecttest
  2. 编译文件添加NPU编译配置。
    在CMakeLists.txt编译文件中,添加了以下内容用于引用libtorch_npu插件,以便进行后续基于NPU的编译工作。
    set(torch_npu_path path_to_libtorch_npu)         # 设置libtorch_npu的路径
    include_directories(${torch_npu_path}/include)   # 设置引用libtorch_npu的头文件路径
    link_directories(${torch_npu_path}/lib)          # 设置引用libtorch_npu的库文件路径
    
    target_link_libraries(libtorch_resnet torch_npu) # 链接torch_npu库
  3. 为了使模型在NPU设备上初始化和运行,用户需在C++代码中已将GPU接口修改为适配NPU接口,当前脚本中已完成对应修改,用户可参见以下内容对实际开发的脚本进行修改。
    代码示例如下,引入torch_npu头文件并设置初始化device,在NPU使用结束时需要调用torch_npu::finalize_npu()释放资源,否则可能会有报错提示。
    // 使用libtorch_npu相关接口,需引用libtorch_npu的头文件
    #include<torch_npu/torch_npu.h>
    
    // 使用NPU设备前需进行初始化
    torch_npu::init_npu("npu:0");
    
    // 通过传NPU字符串构造npu设备
    at::Device("npu:0")
    
    // 使用NPU设备结束需进行反初始化
    torch_npu::finalize_npu()
    表1 C++接口说明

    接口

    说明

    torch_npu::init_npu()

    使用NPU设备前需进行初始化,输入值格式为npu:id,其中id为NPU卡号。

    at::Device()

    通过传NPU字符串构造npu设备,输入值格式为npu:id,其中id为NPU卡号

    torch_npu::finalize_npu()

    使用NPU设备结束需进行反初始化,输入值格式为npu:id,其中id为NPU卡号。

  4. 执行编译并推理,运行脚本位于pytorch/ci/libtorch_resnet.sh,当前提供的脚本已集成了导出torchscript文件、编译与推理部分。
    bash libtorch_resnet.sh

    显示以下内容,表示编译成功。

    图1 命令回显