昇腾社区首页
中文
注册

算子动态库编译

算子动态库编译是将算子实现代码及相关文件编译为动态库的过程。相比自定义算子包编译,动态库编译能够显著简化集成与部署流程。该过程包括将算子kernel实现、host侧tiling实现、入图适配文件以及自动生成的单算子调用实现代码编译链接成动态库。

同时会自动生成以下头文件:

算子动态库编译支持如下型号:

  • Atlas A2 训练系列产品/Atlas 800I A2 推理产品
  • Atlas 推理系列产品

算子动态库编译的具体步骤如下:

  1. 完成工程编译相关配置。
    除了上文介绍的基础配置,算子动态库编译需要在工程目录下的CMakePresets.json cacheVariables的配置项中配置ASCEND_PACK_SHARED_LIBRARY为True,默认为False(会生成run包)。
    "ASCEND_PACK_SHARED_LIBRARY": {
        "type": "BOOL",
        "value": "True"
     }
  2. 在算子工程目录下执行如下命令,进行算子工程编译。
    ./build.sh

    编译成功后,会在${CMAKE_INSTALL_PREFIX}/op_api目录生成算子原型定义头文件、单算子调用aclnn头文件和lib库libcust_opapi.so。具体目录结构如下:

    ├── op_api
    │   ├── include
    │       ├── aclnn_optype1.h    // 单算子调用aclnn头文件
    │       └── aclnn_optype2.h
    │       └── aclnn_optypexxx.h
    │       └── op_proto.h         // 算子原型定义头文件
    │   ├── lib
    │       ├── libcust_opapi.so   // 算子动态库
  3. 动态库的使用。
    • 单算子调用场景,在应用程序的编译文件中链接libcust_opapi.so,具体使用方法可参考单算子API调用
    • 算子入图场景
      • 配置ASCEND_CUSTOM_OPP_PATH环境变量,将libcust_opapi.so的绝对路径追加到该环境变量。由GE框架在图编译和执行时根据该环境变量搜索算子动态库并使用。环境变量位置越靠前,算子的优先级越高。
        export ASCEND_CUSTOM_OPP_PATH=${CMAKE_INSTALL_PREFIX}/op_api/lib/:${ASCEND_CUSTOM_OPP_PATH}

        动态库编译和算子包编译功能同时使用时,前者生成的动态库优先级更高。

        如下示例中,path1和path3是算子包编译生成的目录,path2和path4是动态库编译产物的存放目录,则编译产物的优先级为2>4>1>3。

        ASCEND_CUSTOM_OPP_PATH=<path1>/vendor_name1:<path2>/op_api/lib/:<path3>/vendor_name3:<path4>/op_api/lib/
      • 如果开发者通过Ascend Graph进行图开发,除了配置环境变量的方式也可以采用直接在应用程序的编译文件中链接libcust_opapi.so的方式。Ascend Graph图开发的相关信息请参考Ascend Graph开发指南。动态库链接方式的so加载优先级高于环境变量配置方式。