拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CANN ops-nn FusedBiasLeakyRelu 算子 Aclnn 接口深度指南:融合 Bias Add 与 LeakyReLU 的两段式调用实战

人工智能算子库深度学习CANNAscend【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-nn点击查看免费下载FusedBiasLeakyRelu 是 CANN ops-nn 仓库中面向 NPUAscend 910B提供的一个融合激活算子它将「加偏置Bias Add」与「带负斜率与缩放因子的 LeakyReLU 激活」合并为一次内核计算用于减少访存与算子下发开销。本文以 experimental/activation/fused_bias_leaky_relu/docs/aclnnFusedBiasLeakyRelu.md 为骨架结合 experimental/activation/fused_bias_leaky_relu 目录下的 ACLNN L2 接口实现、Tiling 逻辑、AscendC Kernel 与单元测试完整讲解其数学定义、两段式 ACLNN 调用流程、参数约束与底层实现原理帮助你快速在业务代码中接入该算子并理解其工作机制。算子定位与目录结构在 CANN ops-nn 中FusedBiasLeakyRelu 目前以aclnn 接口形态提供即面向应用侧的 L2 API仓库目录 experimental/activation/fused_bias_leaky_relu 中包含了完整的接口声明、实现、Tiling、Kernel 与测试代码docs/aclnnFusedBiasLeakyRelu.md官方接口说明文档op_api/ACLNN L2 API 声明与实现aclnn_fused_bias_leaky_relu.h/.cpp、fused_bias_leaky_relu.h/.cppop_graph/算子图协议定义fused_bias_leaky_relu_proto.hop_host/算子定义fused_bias_leaky_relu_def.cpp、Shape 推导fused_bias_leaky_relu_infershape.cpp以及 arch35 平台的 Tiling 实现op_kernel/AscendC 内核入口fused_bias_leaky_relu_apt.cpp与内核类实现、TilingData 结构、模板参数定义examples/test_aclnn_fused_bias_leaky_relu.cpp完整的端到端调用示例tests/ut/覆盖 op_api、op_hostTiling/Infershape、op_kernel 的单元测试。该算子的语义是计算「融合的 Bias Add LeakyReLU 激活」对输入张量 x 加上偏置 bias 后再应用带缩放因子 scale 的 LeakyReLU 激活。将原本需要两次算子调用Add 与 LeakyReLU的流程合并为一次是典型的访存优化型融合算子。数学定义与计算公式对输入张量 x 与偏置张量 bias 逐元素相加得到 t再按 t 的符号应用带负斜率的激活与统一缩放t x bias 当 t 0 时y t * scale 当 t 0 时y t * negative_slope * scale其中x输入数据张量bias偏置张量shape 与 x 完全相同不支持广播negative_slopeLeakyReLU 负半轴斜率float 类型属性默认 0.2scale缩放因子float 类型属性默认 1.414213562373即 √2y输出张量shape 和 dtype 与 x 相同。从 Kernel 实现看该公式在 op_kernel/arch35/fused_bias_leaky_relu.h 的 Compute 阶段被逐元素执行而 CPU 侧的黄金参考golden实现在 examples/test_aclnn_fused_bias_leaky_relu.cpp 的ComputeGolden函数中逻辑与上式完全一致可用于精度比对。支持的产品型号产品系列芯片型号支持状态Atlas A2 训练系列Ascend910BYES同时从 op_host/fused_bias_leaky_relu_def.cpp 的算子注册信息可以看到该算子注册的 AICore 配置名为ascend950对应 Ascend 910B 芯片平台支持动态编译、动态 Rank、动态 Shape并开启PrecisionReduceFlag允许精度降低以换取性能内核文件指定为fused_bias_leaky_relu_apt。函数原型两段式 ACLNN 接口ACLNNAscend Computing Language NN API的 L2 接口采用两段式设计第一阶段计算 workspace 大小并创建执行器第二阶段真正下发执行。FusedBiasLeakyRelu 的函数原型如下aclnnStatus aclnnFusedBiasLeakyReluGetWorkspaceSize( const aclTensor *x, const aclTensor *bias, double negativeSlope, double scale, const aclTensor *out, uint64_t *workspaceSize, aclOpExecutor **executor); aclnnStatus aclnnFusedBiasLeakyRelu( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);接口声明位于 op_api/aclnn_fused_bias_leaky_relu.h以extern CACLNN_API导出可直接被 C/C 应用调用。参数说明aclnnFusedBiasLeakyReluGetWorkspaceSize参数名输入/输出类型说明x输入const aclTensor*输入数据张量。数据类型支持 FLOAT16、FLOAT。数据格式支持 ND。最高支持 8 维。bias输入const aclTensor*偏置张量。数据类型和 shape 必须与 x 一致。数据格式支持 ND。negativeSlope输入doubleLeakyReLU 负半轴斜率系数。可选默认值 0.2。scale输入double缩放因子。可选默认值 1.414213562373即 √2。out输入const aclTensor*输出张量需预分配。数据类型和 shape 必须与 x 一致。数据格式支持 ND。workspaceSize输出uint64_t*返回执行算子所需的 workspace 大小字节。executor输出aclOpExecutor**返回算子执行器。注意negativeSlope与scale在接口层是double 类型但在算子属性注册fused_bias_leaky_relu_def.cpp与 TilingData 中均以float存储Tiling 阶段会完成 double → float 的转换见 fused_bias_leaky_relu_tiling.cpp 的GetShapeAttrsInfo读取后转换为 float 写入 TilingData。aclnnFusedBiasLeakyRelu参数名输入/输出类型说明workspace输入void*在 Device 侧申请的 workspace 内存地址。workspaceSize输入uint64_tworkspace 内存大小字节由第一阶段接口 aclnnFusedBiasLeakyReluGetWorkspaceSize 获取。executor输入aclOpExecutor*算子执行器由第一阶段接口 aclnnFusedBiasLeakyReluGetWorkspaceSize 获取。stream输入aclrtStreamACL stream 流。返回值返回值说明ACLNN_SUCCESS (0)成功ACLNN_ERR_PARAM_NULLPTR输入参数中存在空指针ACLNN_ERR_PARAM_INVALID输入参数不合法dtype 不匹配、shape 不一致、不支持的 dtype、不支持的 format、维度超限等ACLNN_ERR_INNER_CREATE_EXECUTOR内部创建执行器失败ACLNN_ERR_INNER_NULLPTR内部操作返回空指针其中参数校验相关的错误码在 op_api/aclnn_fused_bias_leaky_relu.cpp 的CheckParams链路中逐类触发CheckNotNull对应ACLNN_ERR_PARAM_NULLPTRCheckDtypeValid/CheckFormat/CheckShape均返回ACLNN_ERR_PARAM_INVALID。约束说明x、bias、out 三者的数据类型dtype必须一致仅支持FLOAT16和FLOAT。此约束同时体现在接口层aclnn_fused_bias_leaky_relu.cpp 中AICORE_DTYPE_SUPPORT_LIST {DT_FLOAT16, DT_FLOAT}、算子定义层fused_bias_leaky_relu_def.cpp的DataType({ge::DT_FLOAT16, ge::DT_FLOAT})以及 Tiling 层fused_bias_leaky_relu_tiling.cpp的supportedDtype集合。x 和 bias 的 shape 必须完全相同不支持广播。接口层CheckShape会逐维比对 x 与 bias 的 shapeTiling 层也会校验三者的元素总数一致。out 的 shape 必须与 x 相同Shape 推导实现见 fused_bias_leaky_relu_infershape.cpp直接拷贝输入 x 的 shape 作为输出 shape。negativeSlope 和 scale 为 double 类型可选属性带默认值negative_slope0.2scale1.414213562373。支持的数据格式为ND不支持 Private format。接口层CheckFormat会通过IsPrivateFormat校验三个张量的 storage format。张量最高支持8 维接口层通过ACLNN_MAX_SHAPE_RANK 8与OP_CHECK_MAX_DIM校验。当输入张量为空张量包含 0 元素时workspaceSize 返回 0直接返回成功见HasEmptyTensor的短路逻辑。调用示例完整的两段式流程仓库提供了可直接编译运行的完整示例 examples/test_aclnn_fused_bias_leaky_relu.cpp其运行前提是已安装 CANN toolkit设置 ASCEND_HOME_PATH、已安装算子包、存在可用的 NPU 设备。示例通过bash run.sh --eager构建运行对应 scripts 目录下的算子包构建与安装流程。完整调用步骤如下初始化 ACL 环境aclInit(nullptr)、aclrtSetDevice(deviceId)、aclrtCreateStream(stream)准备输入数据并创建 aclTensor通过aclrtMalloc申请 Device 内存aclrtMemcpy将 Host 数据拷入再调用aclCreateTensor以 ND 格式创建张量描述示例使用了 shape{2, 4}x 为混合正负值的浮点数据bias 为常数偏置属性取negativeSlope0.2、scale1.414213562373调用第一阶段接口aclnnFusedBiasLeakyReluGetWorkspaceSize获取 workspace 大小与 executor分配 workspace 内存若workspaceSize 0通过aclrtMalloc在 Device 侧申请调用第二阶段接口aclnnFusedBiasLeakyRelu(workspace, workspaceSize, executor, stream)执行计算同步流并拷贝结果回 HostaclrtSynchronizeStream(stream)后用aclrtMemcpyDEVICE_TO_HOST取回输出清理资源释放 workspace、销毁 tensor、释放 Device 内存、销毁 stream、aclrtResetDevice与aclFinalize。示例还实现了CPU golden 参考比对ComputeGolden逐元素计算期望值CompareResults以atol1e-4、rtol1e-4、失配率小于 0.01% 为通过阈值并对每个元素打印 x、bias、txbias、Golden 与 NPU 输出便于肉眼核对与精度分析。底层实现解析从 L2 接口到 NPU 内核L2 接口内部调用链aclnn_fused_bias_leaky_relu.cpp 的aclnnFusedBiasLeakyReluGetWorkspaceSize完整展示了 L2 接口的组装过程创建 executor失败返回ACLNN_ERR_INNER_CREATE_EXECUTOR执行CheckParams参数校验空指针、dtype、format、shape空张量短路x 或 bias 为空时直接返回 workspaceSize0 与成功对 x、bias 分别调用l0op::Contiguous保证内存连续调用l0op::FusedBiasLeakyRelu(xContiguous, biasContiguous, negativeSlope, scale, ...)构建计算图节点通过l0op::ViewCopy(opResult, out, ...)将计算结果搬运到用户预分配的输出张量通过uniqueExecutor-GetWorkspaceSize()返回所需 workspace 大小。第二阶段aclnnFusedBiasLeakyRelu则通过CommonOpExecutorRun(workspace, workspaceSize, executor, stream)统一完成执行代码中亦通过L2_DFX_PHASE_1/2宏记录 DFX 日志便于问题定位。Tiling多核切分与双缓冲决策arch35 平台的 Tiling 实现位于 op_host/arch35/fused_bias_leaky_relu_tiling.cpp核心步骤平台信息获取通过PlatformAscendC获取 AIV 核数GetCoreNumAiv与 UB 内存大小GetCoreMemSize(UB)多核切分blockFactor CeilAlign(CeilDiv(totalNum, coreNum), ubBlockSize)将总元素数按 32 字节对齐粒度均分到各核usedCoreNum CeilDiv(totalNum, blockFactor)作为实际 block dim双缓冲决策计算单核每轮 UB 循环次数若至少 2 次loopCountIfDouble 2则启用双缓冲useDoubleBuffer1否则单缓冲UB 拆分bufferNum TENSOR_NUM * (useDoubleBuffer ? 2 : 1)即 6 或 3 个 bufferubFactor为每次 UB 循环处理的元素数并按ubBlockSize向下对齐写入 TilingDatatotalNum / blockFactor / ubFactor / negativeSlope / scale五个字段写入 fused_bias_leaky_relu_tiling_data.h 定义的结构体TilingKey 下发通过ASCENDC_TPL_SEL_PARAM(context, dTypeX, useDoubleBuffer)将数据类型与缓冲模式作为模板参数下发到内核实现同一内核的编译期特化。值得一提的是该算子的 workspace 需求为 0WS_SYS_SIZE 0因此接口层的 workspaceSize 主要来自 L0 图执行框架本身的系统开销。AscendC Kernel流水线与模板特化内核入口 fused_bias_leaky_relu_apt.cpp 以template typename D_T_X, int BUFFER_MODE形式实例化通过REGISTER_TILING_DEFAULT与GET_TILING_DATA_WITH_STRUCT读取 TilingData并调用 fused_bias_leaky_relu.h 中NsFusedBiasLeakyRelu::FusedBiasLeakyRelu内核类的Init与ProcessInit根据GetBlockIdx() * blockFactor计算当前核的 GM 偏移与处理长度blockLength_推导 UB 循环次数loopCount_与尾块元素数tailNum_将 double 型属性转换为模板类型 Thalf/float初始化三个 GlobalTensorx、bias、y与三组队列VECIN 双队列 VECOUT 单队列队列深度由BUFFER_NUM BUFFER_MODE ? 2 : 1决定Process采用经典的 CopyIn → Compute → CopyOut 三段流水先循环处理完整块再处理尾块若当前核blockLength_ 0元素数少于核数则直接返回Compute逐元素计算y (t 0) ? t * scale : t * negativeSlope * scale其中t x bias。测试与验证仓库为该算子提供了分层的单元测试tests/ut/目录op_api 层tests/ut/op_api/test_aclnn_fused_bias_leaky_relu.cpp 验证 L2 接口的调用与结果op_host 层tests/ut/op_host/arch35/test_fused_bias_leaky_relu_tiling.cpp 验证 Tiling 参数的切分正确性tests/ut/op_host/test_fused_bias_leaky_relu_infershape.cpp 验证 Shape 推导op_kernel 层tests/ut/op_kernel/test_fused_bias_leaky_relu_apt.cpp 验证内核计算逻辑。结合 examples/test_aclnn_fused_bias_leaky_relu.cpp 中的 golden 比对逻辑可以形成「接口调用 → 内核执行 → 精度校验」的完整验证闭环这也是将该算子集成进自有业务前推荐的最低验证标准。小结FusedBiasLeakyRelu 以融合算子形态Bias Add LeakyReLU Scale减少了中间张量的读写配合 ACLNN 两段式接口在 Ascend 910B 上运行。接入时重点关注三点dtype 仅支持 FLOAT16/FLOAT、x 与 bias 的 shape 必须逐维一致不支持广播、输入格式为 ND 且最高 8 维。通过阅读 接口文档 与本文给出的源码路径你可以快速定位到 L2 接口校验、Tiling 切分、双缓冲决策与内核流水线的每一处实现细节为后续调试、性能分析或参考其模式贡献新的融合算子贡献 AscendC 实现的流程见仓库根目录的 CONTRIBUTING.md打下基础。赞分享人工智能算子库深度学习CANNAscend【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-nn点击查看免费下载相关推荐CANN ops-nn 中 aclnnFusedBiasLeakyRelu 融合算子Bias Add LeakyReLU 的 ACLNN 两段式调用指南CANN ops nn 中 aclnnFusedBiasLeakyRelu 融合算子Bias Add LeakyReLU 的 ACLNN 两段式调用指南人工智能算子库深度学习CANNAscendCANN ops-nn 中 LeakyRelu 算子解析从 aclnn 两段式接口调用到 NPU 内核实现CANN ops nn 中 LeakyRelu 算子解析从 aclnn 两段式接口调用到 NPU 内核实现 本篇技术文章围绕 CANN 开源算子库 ops n人工智能算子库深度学习CANNAscendCANN ops-nn EmbeddingDenseGrad 算子深度解析scatter-add 语义、ACLNN 两段式接口与 310P 部署实战CANN ops nn EmbeddingDenseGrad 算子深度解析scatter add 语义、ACLNN 两段式接口与 310P 部署实战 Embe人工智能算子库深度学习CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门