人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载导读本文围绕 asc-devkit 仓库中 99_acl_based 示例专题展开系统讲解基于 Ascend C 的自定义算子编译工程编译、打包、部署以及 Aclnn / Aclop 两种单算子调用方式的完整实现路径。读完本文你将掌握自定义算子工程的目录组织与 CMake 构建链路、Tiling 模板与 Tiling 下沉编程范式、静态库链接与多厂商并行打包方案以及aclnn两级接口与aclopExecuteV2单算子模型调用的可运行代码骨架能够直接对照仓库示例落地自己的算子开发与部署流程。示例专题总览examples/01_simd_cpp_api/02_features/99_acl_based/README_en.md是整个示例专题的入口文档它将专题划分为两个子目录目录名称功能描述00_acl_compilation自定义算子的编译、打包和部署实现方法01_acl_invocationAclnn 和 Aclop 算子调用的实现方法其中 00_acl_compilation 进一步包含四个独立工程custom_op标准编译打包部署全流程、custom_op_simplified_key自定义简化 key 与 BINARY_JSON 内核二进制选择、custom_op_static_lib自定义算子静态库编译与 aclnn 链接执行、parallel_ops_package多厂商并行编译打包部署01_acl_invocation 包含aclnn_invocation与aclop_invocation两个调用示例。下文依次深入。一、custom_op自定义算子工程编译、打包与部署全流程1.1 适用产品与 CANN 版本产品CANN 版本Ascend 950PR950DT CANN 9.1.0Atlas A3 CANN 9.0.0Atlas A2 CANN 9.0.0Atlas 200I/500 A2 推理 CANN 9.0.0Atlas 推理系列 CANN 9.0.0注意本示例包含多个算子示例实际支持的产品型号请以各算子示例为准。1.2 工程目录结构custom_op 采用标准的 host/kernel 分离布局详见 custom_op 目录custom_op ├── CMakeLists.txt // 顶层构建工程文件 ├── framework // 框架适配插件目录 │ ├── CMakeLists.txt │ ├── onnx_plugin // ONNX 框架适配插件 │ └── tf_plugin // TensorFlow 框架适配插件 ├── op_host // Host 侧算子实现目录 │ ├── CMakeLists.txt │ ├── add_custom // Add 算子 host 实现 │ ├── add_custom_template // Add 模板算子 host 实现 │ ├── add_custom_tiling_sink // Add Tiling 下沉算子 host 实现 │ └── leaky_relu_custom // LeakyRelu 算子 host 实现 ├── op_kernel // Kernel 侧算子实现目录 │ ├── CMakeLists.txt │ ├── add_custom // Add 算子 kernel 实现 │ ├── add_custom_template // Add 模板算子 kernel 实现 │ ├── add_custom_tiling_sink // Add Tiling 下沉算子 kernel 实现 │ └── leaky_relu_custom // LeakyRelu 算子 kernel 实现 └── README.md // 示例文档1.3 顶层 CMake 构建入口顶层 CMakeLists.txt 是整个工程的构建枢纽关键点如下set(ASCEND_SOC_SERIES ascend910b ascend910_93 ascend950) find_package(ASC REQUIRED)ASCEND_SOC_SERIES声明算子工程适配的昇腾 AI 处理器系列find_package(ASC)引入 CANN 提供的 Ascend C 编译基础设施对应 cmake/asc/asc_modules/FindASC.cmake 与 cmake/asc/ascendc.cmakenpu_op_package()定义算子安装包名称此处为customize与安装路径并声明包类型TYPE RUN顶层按需add_subdirectory挂载framework、op_host、op_kernel三个子目录。1.4 Host 侧算子定义与 Tiling 库op_host/CMakeLists.txt 集中体现了 Host 侧四类产物的构建方式npu_op_code_gen根据 host 源码自动生成算子原型op_proto与 aclnn 接口aclnn_*.cppnpu_op_library(... TILING)将 tiling 逻辑编为 Tiling 库cust_optilingnpu_op_device_tiling_library(... SHARED)将 Tiling 下沉函数编为设备侧共享库cust_opmasternpu_op_library(... ACLNN)将自动生成的aclnn_*.cpp编为单算子 API 库cust_opapinpu_op_library(... GRAPH)编为算子原型库cust_op_proto最后通过npu_op_package_add将上述库统一收进customize安装包。以 AddCustom 的 Host 实现 add_custom_host.cpp 为例可以看到算子定义的三段式结构static ge::graphStatus TilingFunc(gert::TilingContext* context) { AddCustomTilingData* tiling context-GetTilingDataAddCustomTilingData(); uint32_t totalLength context-GetInputShape(0)-GetOriginShape().GetShapeSize(); context-SetSimdNumBlocks(NUM_BLOCKS); tiling-totalLength totalLength; tiling-tileNum TILE_NUM; ... } class AddCustom : public OpDef { public: explicit AddCustom(const char* name) : OpDef(name) { this-Input(x).ParamType(REQUIRED).DataType({ge::DT_FLOAT16}).Format({ge::FORMAT_ND}); this-Input(y).ParamType(REQUIRED).DataType({ge::DT_FLOAT16}).Format({ge::FORMAT_ND}); this-Output(z).ParamType(REQUIRED).DataType({ge::DT_FLOAT16}).Format({ge::FORMAT_ND}); this-SetInferShape(ge::InferShape).SetInferDataType(ge::InferDataType); this-AICore().SetTiling(optiling::TilingFunc).AddConfig(ascend910b); } }; OP_ADD(AddCustom);要点OpDef中声明输入/输出的数据类型与 Formatfloat16、NDInferShape/InferDataType完成输出 shape 与 dtype 推导输出直接继承输入 shape 与 dtypeAICore().SetTiling(...)挂接 Tiling 函数并声明适配配置ascend910b最后OP_ADD注册算子。1.5 Kernel 侧算子二进制打包op_kernel/CMakeLists.txt 通过npu_op_kernel_sources为每个算子登记OP_TYPE、KERNEL_DIR与KERNEL_FILEnpu_op_kernel_sources(ascendc_kernels OP_TYPE AddCustom KERNEL_DIR add_custom KERNEL_FILE add_custom_kernel.cpp ) ... npu_op_kernel_library(ascendc_kernels SRC_BASE ${CMAKE_CURRENT_SOURCE_DIR} TILING_LIBRARY cust_optiling )npu_op_kernel_library将 kernel 源码与 Tiling 库cust_optiling绑定最终产出算子 kernel 二进制库ascendc_kernels并加入安装包。1.6 四个算子示例的规格与实现解析AddCustomAdd计算式z x y输入x/y与输出z均为[8, 2048]、float16、NDKernel 函数名add_custom。Kernel 实现 add_custom_kernel.cpp 展示了典型的 vector 流水编程Init()中按GetBlockNum()切分 block、按tileNum * BUFFER_NUM计算循环次数Process()中使用LocalMemAllocatorHardware::UB在统一缓存 UB 上分配三个LocalTensor通过SetFlag/WaitFlag在 MTE2数据搬运、Vector向量计算、MTE3搬出流水间做事件同步循环内完成DataCopy搬入、AscendC::Add计算、DataCopy搬出。入口函数add_custom通过REGISTER_TILING_DEFAULT(AddCustomTilingData)与GET_TILING_DATA获取 TilingData。TilingData 设计AddCustomTilingData本质是并行切分参数共 2 个字段——totalLength待计算数据总量与tileNum每个核的数据块总数。AddCustomTemplate模板算子计算式z x y输入输出支持float16/floatshape[8, 2048]NDKernel 函数名add_custom_template模板参数templatetypename D_T_X, typename D_T_Y, typename D_T_Z, int TILE_NUM, int IS_SPLIT。模板参数含义参数类型说明D_T_Xtypename输入 x 数据类型half/floatD_T_Ytypename输入 y 数据类型half/floatD_T_Ztypename输出 z 数据类型half/floatTILE_NUMint每个核的数据块总数IS_SPLITint是否使能数据块切分0 时 TILE_NUM 不生效实现要点add_custom_template.cpp模板参数组合取代传统 TilingKey编译期即可针对不同 dtype/切分策略生成特化内核if constexpr (IS_SPLIT 0)走单块Process1IS_SPLIT 1走多块流水Process2。Host 侧 Tiling 函数add_custom_template.cpp根据输入 dtype 组合出D_T_X/D_T_Y/D_T_Z当totalLength 2048时置IS_SPLIT0, TILE_NUM1否则IS_SPLIT1, TILE_NUM8并通过ASCENDC_TPL_SEL_PARAM将模板参数作为 TilingKey 下发。TilingData 只保留 1 个字段totalLength全核待计算数据总量。AddCustomTilingSinkTiling 下沉计算式z x y输入输出为[8, 2048]、float、NDKernel 函数名add_custom_tiling_sink。实现要点add_custom_tiling_sink_kernel.cpp 与 add_custom_tiling_sink_tiling.cppkernel 通过KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY)强制以 AIC/AIV 混合场景运行满足 Tiling 下沉算子的条件全部 Tiling 逻辑独立实现于 tiling 源文件并通过DEVICE_IMPL_OP_OPTILING(AddCustomTilingSink).Tiling(...)注册下沉 Tiling 函数使 Tiling 同时可在 host 与 device 执行Tiling 函数中通过platform_ascendc::PlatformAscendC(context-GetPlatformInfo()).GetLibApiWorkSpaceSize()获取系统 workspace 大小编译期InputTensor 的 Data 为空指针时按系统 workspace 用户 workspace 最大值示例为 32 字节设置运行期按系统 workspace 0设置保证运行期高效、编译期内存充足。LeakyReluCustomLeakyRelu计算式y x (x≥0)y a*x (x0)a 为标量输入x为[8, 200, 1024]、float、NDnegative_slope为标量0.0输出y为[8, 200, 1024]、float、NDKernel 函数名leaky_relu_custom。实现要点leaky_relu_custom_kernel.cpp组合基础 API 完成计算——Maxs(tmp1, x, 0)取正半轴部分、Mins(tmp2, x, 0)取负半轴部分、Muls(tmp2, tmp2, negativeSlope)乘负斜率、最后Add(y, tmp1, tmp2)合并。TilingData 共 3 个字段totalLength、tileNum含义与 Add 相同与negativeSlopeLeakyRelu 负半轴斜率系数作为计算参数传入 kernel。框架适配插件frameworkcustom_op 还包含 ONNX 与 TensorFlow 框架适配插件用于将第三方框架模型中的算子映射到自定义算子。以 leaky_relu_custom_plugin.cc 为例REGISTER_CUSTOM_OP(LeakyReluCustom) .FrameworkType(ONNX) .OriginOpType({ge::AscendString(ai.onnx::8::LeakyRelu), ...}) .ParseParamsByOperatorFn(ParseOnnxParamsLeakyReluCustom) .ImplyType(ImplyType::TVM);ParseOnnxParamsLeakyReluCustom从 ONNX 原始算子的attributeJSON 形式中解析alpha属性float 精度损失问题通过 string 形式存储规避写入自定义算子negative_slope属性。1.7 构建、打包与部署步骤在示例根目录执行以下步骤环境变量配置依据 docs/en/quick_start.md 中 CANN 开发套件的安装方式# 1. 配置环境变量默认安装路径 /usr/local/Ascend source ${install_path}/cann/set_env.sh # 2. 构建、打包并部署 mkdir -p build cd build cmake .. make -j binary package ./custom_opp_*.run执行成功输出SUCCESSmake -j binary package中的binary目标产出算子二进制package目标将cust_optiling、cust_opapi、cust_op_proto、cust_opmaster、ascendc_kernels等库打成custom_opp_*.run自解压安装包运行该安装包即完成向 CANN 环境的部署。1.8 ccache 构建加速可选custom_op 工程支持 ccache 加速重复构建分为本地缓存与分布式缓存两种模式。前提安装ccache建议 4.6.1apt install ccache分布式场景需确认当前版本支持 Redis 存储ccache --version输出 Features 包含redis-storage。本地缓存通过 CMake 参数-DENABLE_CCACHEON开启无需修改 CMakeLists.txt顶层 CMakeLists.txt 中已内置该 option并在找不到 ccache 时自动回退普通编译mkdir -p build cd build cmake -DENABLE_CCACHEON .. make -j binary package验证与清理ccache -Cz # 清空缓存内容与统计 rm -rf build mkdir -p build cd build cmake -DENABLE_CCACHEON .. make -j binary package # 第一次构建写缓存 cd .. ccache -z rm -rf build mkdir -p build cd build cmake -DENABLE_CCACHEON .. make -j binary package # 第二次构建命中缓存 ccache --show-stats -v # 观察 Local storage Hits 显著上升 # 清理方式ccache -z仅清统计/ ccache -C仅清内容/ ccache -Cz两者都清分布式缓存ccache Redis适用于多机共享缓存——A 机构建并写入 RedisB 机在源码、构建选项、工具链版本一致时可从 Redis 命中减少重复编译。ccache 以本地缓存为一级缓存、Redis 为二级共享缓存若两机编译器路径不同但内容一致可设置compiler_checkcontent。网络要求A 机首建机、B 机二次构建机、C 机Redis 服务器C_IP:6379处于同一网络A、B 均能访问 Redis。C 机部署 Redisapt install redis-server redis-server --daemonize yes --bind 0.0.0.0 --port 6379 --requirepass PASSWORD redis-cli -h C_IP -p 6379 -a PASSWORD ping注意以上配置仅适用于受控测试环境共享或生产环境需开启访问控制、认证与网络隔离。A/B 机配置 ccacheapt install redis-tools redis-cli -h C_IP -p 6379 -a PASSWORD ping # 配置 Redis 为二级存储并带密码认证格式redis://default:PASSWORDC_IP:6379 ccache --set-configsecondary_storageredis://default:PASSWORDC_IP:6379 # 以内容校验编译器避免路径差异导致缓存 miss ccache --set-configcompiler_checkcontentA/B 机执行构建ccache -Cz rm -rf build mkdir -p build cd build cmake -DENABLE_CCACHEON .. make -j binary packageA 机构建后写入本地缓存与 RedisB 机本地缓存为空、从 Redis 读取共享缓存构建后对比两机ccache --show-stats -vB 机Remote storage Hits应显著上升。建议 A/B 两机保持源码内容、构建命令、编译器版本、源码路径与构建目录路径一致否则可能缓存 miss。更多 ccache 配置与缓存行为细节可参考 ccache 官方文档。二、custom_op_simplified_key自定义简化 Key 与内核二进制选择该示例基于AddCustomTemplate演示 Host 回调生成自定义simplifiedKey以及BINARY_JSON如何针对不同输入数据类型选择不同的 Kernel Binary。它是一个独立的自定义算子工程不改变既有 custom_op 示例的编译行为。目录结构详见 custom_op_simplified_keycustom_op_simplified_key ├── CMakeLists.txt ├── op_host │ ├── CMakeLists.txt │ ├── add_custom_template │ └── config │ └── ascend910b │ └── add_custom_template_binary.json └── op_kernel └── add_custom_templateAddCustomTemplate计算z x y支持float16与float32输入输出。Host 侧 add_custom_template.cpp 中的GenSimplifiedKeyFunc依据第一个输入dtype返回简化 key输入 dtypesimplified keyKernel Binaryfloat16custom_fp16AddCustomTemplate_FP16.ofloat32custom_fp32AddCustomTemplate_FP32.o实现要点OpDef中通过.SetGenSimplifiedKey(optiling::GenSimplifiedKeyFunc)挂接回调回调内部按context-GetInputDesc(0)-GetDataType()分支返回 key并用strcpy_s安全写入 256 字节缓冲与普通 TilingKey 不同简化 key 由开发者自定义直接映射到二进制选择add_custom_template_binary.json 描述两个 Kernel Binary 及其输入/输出的dtype、format、shapekernel 编译选项通过--kernel-json-file传入该文件。构建命令示例根目录source ${install_path}/cann/set_env.sh rm -rf build mkdir build cd build cmake .. make AddCustomTemplate_ascend910b # 仅构建单个算子二进制 # 或构建完整二进制与安装包 make -j binary package构建结果验证build目录下应包含AddCustomTemplate_FP16.o、AddCustomTemplate_FP32.o、含simplifiedKey与simplifiedKeyMode的算子 JSON 文件以及汇总 Kernel Binary 查找信息的binary_info_config.jsonfind . -name AddCustomTemplate_*.o -o -name binary_info_config.json说明示例已预置输入配置目录与 Binary JSON无需手工配置开发自有算子时需自行提供 Binary JSONop_host/config/soc仅为推荐的目录布局CMake 不会自动创建build下的配置文件由构建过程生成。三、custom_op_static_lib自定义算子静态库编译与 aclnn 执行该示例用AddCustom演示自定义算子静态库的编译、打包、链接并通过 aclnn 执行算子详见 custom_op_static_lib。适用产品为 Ascend 950PR950DT CANN 9.1.0、Atlas A3/A2 CANN 9.0.0。目录结构custom_op_static_lib ├── CMakeLists.txt // 顶层构建工程文件 ├── app // 链接静态库并执行算子 └── op // 编译并打包自定义算子静态库实现方式op目录负责编译打包自定义算子静态库生成路径为./build/customize-install/lib/lib${package_name}.aapp目录通过find_package(${package_name})引入静态库编译 main.cpp 生成execute_add_op调用aclnnAddCustom执行并校验结果。AddCustom 算子描述与 custom_op 一致。构建与运行source ${install_path}/cann/set_env.sh # 默认安装路径 /usr/local/Ascend mkdir -p build cd build python3 ../app/scripts/gen_data.py # 生成输入/黄金数据 cmake .. make -j ./execute_add_op执行成功输出test pass四、parallel_ops_package多算子工程并行打包部署该示例演示在顶层 CMake 工程中用ExternalProject_Add并行构建两个独立自定义算子工程add_customAddCustom扁平目录布局host/kernel/tiling 源码同级与leaky_relu_customLeakyReluCustom分层目录布局每个子工程独立完成编译打包并生成独立的custom_opp_*.run安装包详见 parallel_ops_package。Add/LeakyRelu 的算子描述、规格与代码实现均与 custom_op 一致可对照 custom_op/README_en.md 的 Example Description、Example Specification Description 与 Code Implementation 小节。构建与运行示例根目录source ${install_path}/cann/set_env.sh cmake -S . -B build cmake --build build -j ./build/add_custom/custom_opp_*.run # add_custom 安装包 ./build/leaky_relu_custom/custom_opp_*.run # leaky_relu_custom 安装包执行成功输出SUCCESS构建结果顶层工程在build/下生成两个相互独立的子目录build/add_custom/与build/leaky_relu_custom/便于多厂商/多算子场景下并行开发与独立发布。五、Aclnn 单算子 API 调用aclnn_invocation5.1 原理与适用场景单算子 API 执行是纯 C 语言 API 方式无需为离线模型转换提供单算子描述文件可直接调用单算子 API 接口。示例基于自定义算子工程部署后使用两级接口aclnnAddCustomGetWorkspaceSize与aclnnAddCustom执行固定 shape 的算子计算。核心流程创建输入/输出aclTensor对象并准备 device 侧数据调用aclnnAddCustomGetWorkspaceSize获取本次计算所需 workspace 大小并分配对应 device 内存调用aclnnAddCustom执行计算aclrtSynchronizeStream同步流将结果拷回 host 侧校验。5.2 关键代码解析main.cppaclnn_invocation/main.cpp 展示了完整调用骨架#include aclnn/aclnn_base.h #include aclnn/acl_meta.h #include acl/acl_rt.h #include aclnn_add_custom.h // 编译期由 npu_op_code_gen 自动生成 const std::vectorint64_t shape {8, 2048}; // 固定 shape // 1. 初始化与建流 CHECK_ACL(aclnnInit(nullptr)); CHECK_ACL(aclrtSetDevice(deviceId)); CHECK_ACL(aclrtCreateStream(stream)); // 2. 分配 device 内存并构造 aclTensorACL_FLOAT16, ACL_FORMAT_ND void* input0DeviceMem nullptr; CHECK_ACL(aclrtMalloc(input0DeviceMem, bufferSize, ACL_MEM_MALLOC_HUGE_FIRST)); aclTensor* input0 aclCreateTensor(shape.data(), shape.size(), ACL_FLOAT16, nullptr, 0, ACL_FORMAT_ND, shape.data(), shape.size(), input0DeviceMem); // 3. H2D 拷贝输入 CHECK_ACL(aclrtMemcpy(input0DeviceMem, bufferSize, input0HostData.data(), bufferSize, ACL_MEMCPY_HOST_TO_DEVICE)); // 4. 两级接口先取 workspace 大小再执行 uint64_t workspaceSize 0; aclOpExecutor* executor nullptr; CHECK_ACL(aclnnAddCustomGetWorkspaceSize(input0, input1, output0, workspaceSize, executor)); void* workspaceDeviceMem nullptr; if (workspaceSize 0) { CHECK_ACL(aclrtMalloc(workspaceDeviceMem, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST)); } CHECK_ACL(aclnnAddCustom(workspaceDeviceMem, workspaceSize, executor, stream)); // 5. 同步流并 D2H 拷回与 golden 数据按 1e-3 容差比对 CHECK_ACL(aclrtSynchronizeStream(stream)); CHECK_ACL(aclrtMemcpy(output0HostData.data(), bufferSize, output0DeviceMem, bufferSize, ACL_MEMCPY_DEVICE_TO_HOST));要点aclnn_add_custom.h与aclnnAddCustom*接口是在算子工程编译阶段由npu_op_code_gen依据 OpDef 自动生成的两级接口将计算所需 workspace 查询与计算执行分离执行前必须按返回的workspaceSize分配 device 内存workspaceSize 0时workspaceDeviceMem传空指针即可。结果校验将 float16 转 float 后与 golden 比较容差1e-3通过则打印test pass。5.3 构建与运行运行前需先进入 custom_op 完成编译、打包与部署source ${install_path}/cann/set_env.sh # 默认安装路径 /usr/local/Ascend mkdir -p build cd build python3 ../scripts/gen_data.py cmake .. make -j ./execute_add_op执行成功输出test pass六、Aclop 单算子模型调用aclop_invocation6.1 原理与适用场景单算子模型执行aclop 方式需要先用atc --singleop在离线模式生成单算子离线模型并在应用中配置模型目录。示例基于自定义算子工程部署后使用aclopExecuteV2接口执行单算子模型。核心流程通过aclCreateTensorDesc创建输入/输出张量描述用aclCreateDataBuffer准备 device 侧数据缓冲调用aclopSetModelDir指定模型目录然后调用aclopExecuteV2执行算子计算通过aclrtSynchronizeStream同步流将 device 结果拷回 host 侧校验。6.2 单算子描述文件add_custom.json 是 ATC 模型转换的输入描述文件固定描述算子AddCustom的输入输出ND、float16、shape [8, 2048][ { op: AddCustom, input_desc: [ { name: x, param_type: required, format: ND, shape: [8, 2048], type: float16 }, { name: y, param_type: required, format: ND, shape: [8, 2048], type: float16 } ], output_desc: [ { name: z, param_type: required, format: ND, shape: [8, 2048], type: float16 } ] } ]6.3 关键代码解析main.cppaclop_invocation/main.cpp 展示了 aclop 调用骨架#include acl/acl_base.h #include acl/acl_rt.h #include acl/acl_mdl.h #include acl/acl_op.h CHECK_ACL(aclInit(nullptr)); CHECK_ACL(aclrtSetDevice(deviceId)); CHECK_ACL(aclrtCreateStream(stream)); CHECK_ACL(aclopSetModelDir(.)); // 指定单算子离线模型目录 const char* opType AddCustom; // 1. 创建张量描述ACL_FLOAT16, ACL_FORMAT_ND与数据缓冲 auto* input0 aclCreateTensorDesc(dataType, shape.size(), shape.data(), format); auto* input0Buffer aclCreateDataBuffer(input0DeviceMem, bufferSize); // 2. 执行单算子模型 CHECK_ACL(aclopExecuteV2(opType, inputDesc.size(), inputDesc.data(), inputBuffers.data(), outputDesc.size(), outputDesc.data(), outputBuffers.data(), opAttr, stream)); // 3. 同步流并 D2H 校验 CHECK_ACL(aclrtSynchronizeStream(stream)); CHECK_ACL(aclrtMemcpy(output0HostData.data(), bufferSize, output0DeviceMem, bufferSize, ACL_MEMCPY_DEVICE_TO_HOST));要点aclopSetModelDir必须在执行前指定由 ATC 生成的单算子离线模型所在目录aclopExecuteV2通过算子类型名opType与张量描述/数据缓冲数组完成调用无需算子专属头文件。6.4 构建与运行source ${install_path}/cann/set_env.sh # 默认安装路径 /usr/local/Ascend mkdir -p build cd build python3 ../scripts/gen_data.py # 使用 ATC 工具生成单算子离线模型 atc --singleop../add_custom.json --output. --soc_version${soc_version} cmake .. make -j ./execute_add_op${soc_version}AI 处理器型号获取方式对于 Atlas A2、Atlas 200I/500 A2 推理、Atlas 推理系列、Atlas 训练系列在装有昇腾 AI 处理器的服务器上执行npu-smi info查询Name信息实际配置值为 AscendName。例如Name为 xxxyy则实际配置值为 Ascendxxxyy对于 Ascend 950PR950DT、Atlas A3执行npu-smi info -t board -i id -c chip_id查询Chip Name与NPU Name实际配置值为 Chip Name_NPU Name。例如Chip Name为 Ascendxxx、NPU Name为 1234则实际配置值为 Ascendxxx_1234。其中id为设备 ID由npu-smi info -l查询 NPU ID 获得chip_id为芯片 ID由npu-smi info -m查询 Chip ID 获得。同一系列的 AI 处理器型号创建的算子工程共享相同的基础功能基于工程的算子开发、编译与部署。执行成功输出test pass七、Aclnn 与 Aclop 两条调用路径的对比与选型对比维度aclnn 单算子 APIaclnn_invocationaclop 单算子模型aclop_invocation接口形态C 语言 APIaclnnAddCustomGetWorkspaceSizeaclnnAddCustom两级接口C 语言 APIaclopSetModelDiraclopExecuteV2离线模型不需要单算子描述文件无需离线模型转换需先atc --singleop生成单算子离线模型并在应用内配置模型目录张量对象aclCreateTensor构造aclTensoraclCreateTensorDescaclCreateDataBuffer接口来源aclnn_*.h由算子工程npu_op_code_gen自动生成通用acl/acl_op.h等 ACL 头文件前置条件均需先完成 custom_op 的编译、打包与部署同左适用场景固定 shape 算子快速验证接口贴近算子定义、无需模型管理依赖 ATC 单算子模型适合与离线模型链路统一的场景从源码结构看两条路径共享相同的底层设备侧算子二进制与 Tiling 产物差异主要体现在 Host 侧调用封装aclnn 面向自动生成的单算子接口、面向算子开发者直接调用aclop 面向通用算子模型执行框架。开发者可按自身集成方式直连算子 API 或模型化执行二选一。八、整体工作流串联与仓库导航综合上述示例一条完整的自定义算子开发 → 部署 → 调用链路为在op_kernel编写 Ascend C kernelvector 计算 事件同步流水在op_host编写 OpDef 注册、InferShape/InferDataType 与 Tiling 函数普通 Tiling / 模板 TilingKey / Tiling 下沉三种范式由 CMake 的npu_op_package系列接口完成 host 库、aclnn 自动接口、kernel 二进制与安装包的生成运行custom_opp_*.run部署到 CANN编写调用侧程序二选一使用aclnnAddCustomGetWorkspaceSize/aclnnAddCustom或aclopExecuteV2执行并校验结果。建议深入阅读的仓库资源示例入口99_acl_based/README_en.md、00_acl_compilation/README_en.md、01_acl_invocation/README_en.md编译基础设施cmake/asc/ascendc.cmake、cmake/asc/asc_modules/FindASC.cmake、cmake/asc/fwk_modules/device_task.cmake快速上手文档docs/en/quick_start.mdKernel 接口实现impl/basic_api 下的kernel_operator_vec_*_impl.h如AscendC::Add、Maxs/Mins/Muls对应实现说明本文所有构建与运行步骤均需在已安装对应版本 CANN 开发套件的环境source ${install_path}/cann/set_env.sh中执行${install_path}默认为/usr/local/Ascend。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐Ascend C 自定义算子编译工程与 Aclnn/Aclop 算子调用全流程实战指南CANN asc-devkit 样例解析Ascend C 自定义算子编译工程与 Aclnn/Aclop 算子调用全流程实战指南CANN asc devkit 样例解析 本指南基于 CANN asc人工智能深度学习算子库CANNAscendCANN asc-devkit 自定义算子单算子调用实战aclnn 两段式 API 与 aclop 单算子模型调用完整指南CANN asc devkit 自定义算子单算子调用实战aclnn 两段式 API 与 aclop 单算子模型调用完整指南 导读 本指南基于 asc devk人工智能深度学习算子库CANNAscendCANN asc-devkit 算子调用实战基于 aclnn 单算子 API 与 aclop 单算子模型的两种调用方式解析CANN asc devkit 算子调用实战基于 aclnn 单算子 API 与 aclop 单算子模型的两种调用方式解析 导读 本文以 CANN asc d人工智能深度学习算子库CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?