
CANN ops-nn Softplus 算子技术指南数学原理、NPU 源码实现与图模式调用实战【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn导读本文围绕 CANN ops-nn 算子库中的 Softplus 算子文档 展开系统讲解 softplus 激活函数在昇腾 NPU 上的算子定义、公式原理、参数约束、产品适配情况并结合仓库内 op_graph / op_host / op_kernel 各层源码与图模式调用样例帮助你理解从算子 IR 注册、shape 推导、tiling 切分到内核 DAG 计算的完整链路最终能够独立完成 Softplus 算子的构图调用与结果验证。Softplus 算子功能与数学原理Softplus 是一种常用的激活函数核心作用是把任意实数输入映射到正数区间函数曲线平滑、处处可导常被用作 ReLU 的平滑近似。算子功能激活函数用于将任意实数映射到正数区间。计算公式$$ y \log(1 e^x) $$从公式可以看出当 x 为较大的正数时y 近似等于 x当 x 为绝对值较大的负数时y 趋近于 0从而天然具备正区间近似线性、负区间平滑饱和的激活特性。数值稳定性源码中的稳定实现直接按 $y\log(1e^x)$ 计算时x 取值过大容易导致 $e^x$ 溢出为无穷大。仓库内核侧 softplus_dag.h 给出了一个数值稳定的计算图DAG将输入拆分为正、负两部分分别处理正分支xPosRes max(x, 0) log(1 exp(-max(x, 0)))负分支xNegRes log(1 exp(min(x, 0)))合并y xPosRes xNegRes - ln(2)其中constNegLn2 -0.69314718055994530941723212145818即 $-ln2$。该实现避免了直接计算exp(x)在大正数下溢出的问题同时针对 FP16/BF16 输入内部中间计算统一使用float见SoftplusDaghalf, float与SoftplusDagbfloat16_t, float的模板参数最终再Cast回原类型输出从而在低精度数据类型下保持足够的中间计算精度。产品支持情况Softplus 算子在当前仓库中的产品适配矩阵如下来自 README.md产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品√Atlas 训练系列产品√源码层面同样印证了该适配范围算子定义文件 softplus_def.cpp 中为 AICore 配置了ascend950与ascend350两个平台对应 ascend950/softplus_binary.json 与 ascend350/softplus_binary.json 两份二进制算子配置。参数说明参数名输入/输出描述数据类型数据格式x输入表示 softplus 激活函数的输入公式中的 xFLOAT、FLOAT16、BFLOAT16NDy输出表示 softplus 激活函数的输出公式中的 yFLOAT、FLOAT16、BFLOAT16ND上述参数说明在仓库多层定义中均有对应体现算子 IR 层图协议文件 softplus_proto.h 通过REG_OP(Softplus)注册算子声明.INPUT(x, TensorType({FloatingDataType, DT_BF16}))与.OUTPUT(y, TensorType({FloatingDataType, DT_BF16}))输入最高支持 8D算子定义层op_host 中的 softplus_def.cpp 将 x、y 均声明为REQUIRED必选数据类型限定为DT_BF16 / DT_FLOAT16 / DT_FLOAT数据格式为FORMAT_ND二进制算子配置层ascend350/softplus_binary.json 中为 bfloat16、float16、float32 三种 dtype 各生成一份 bin 配置shape 为[-2]表示支持动态 rankformat 匹配模式为FormatAgnostic格式无关即无论输入以何种 ND 变体传入均按 ND 处理。约束说明输入 x 和输出 y 的shape 和数据类型需要一致。该约束在 tiling 源码中得到了强制校验见 softplus_tiling_arch35.cppCalcInputDtype()校验 x 的 dtype 必须是DT_FLOAT16 / DT_BF16 / DT_FLOAT否则返回GRAPH_FAILEDCalcOutputDtype()校验 y 的 dtype 与 x 完全一致CheckShape()校验 x 与 y 的 storage shape 完全一致标量输入会被视为 shape{1}处理。此外算子支持动态 shapeDynamicShapeSupportFlag(true)、动态 rankDynamicRankSupportFlag(true)以及动态编译DynamicCompileStaticFlag(true)并开启了PrecisionReduceFlag(true)精度降低标志。图模式调用说明README 提供的调用方式为图模式调用通过算子 IR 构图方式调用 softplus 算子样例代码见 test_geir_softplus.cpp算子 IR 定义见 softplus_proto.h。调用方式样例代码说明图模式调用test_geir_softplus.cpp通过算子IR构图方式调用 softplus 算子。样例代码核心流程拆解初始化 GEge::GEInitialize携带全局选项{ge.exec.deviceId, 0}、{ge.graphRunMode, 1}其中ge.graphRunMode1表示图执行运行模式构图CreateOppInGraph中创建单算子op::Softplus(softplus)输入 shape 为{4, 2}dtype 为DT_FLOAT通过Data算子接入输入并调用softplus.set_input_x(...)完成连线输入数据通过GenOnesDataFloat32填充为全 2 的浮点数据建会话并加图new Session(build_options)创建会话session-AddGraph(graph_id, graph, graph_options)将计算图加入会话dump 图aclgrphDumpGraph将构图结果 dump 为 txt便于排查构图问题运行图session-RunGraph(graph_id, input, output)执行计算落盘与打印将输入/输出分别写入tc_ge_irrun_test_0008_npu_input_0.bin与tc_ge_irrun_test_0008_npu_output_0.bin并逐元素打印result[i]可直接与公式计算结果比对验证收尾GEGetErrorMsgV2 / GEGetWarningMsgV2获取错误与告警信息最后GEFinalize()结束会话。底层运行时的关键调用链图模式调用并非黑盒其背后的算子编译与执行路径在仓库中完整可见算子原型注册op::Softplus来源于 softplus_proto.h 的REG_OP(Softplus)注释明确说明与 TensorFlow 的Softplus算子兼容TensorFlow 框架插件softplus_tf_plugin.cpp 通过REGISTER_CUSTOM_OP(Softplus)将 TF 侧同名算子自动映射AutoMappingByOpFn到本算子shape 推导softplus_infershape.cpp 复用Ops::Base::InferShape4Elewise逐元素推导逻辑保证输出 shape 与输入一致tiling 计算softplus_tiling_arch35.cpp 依据输入 dtype 选择TPL_FP16 / TPL_BF16 / TPL_FP32模板参数调用ElewiseBaseTiling.DoTiling完成数据切分设置 tilingKey、blockDimAIV 核数workspace 为 0kernel 启动softplus_apt.cpp 中模板 kernelsoftplusschMode, dType读取 tilingDataEleBaseTilingData16B按 dtype 实例化ElementwiseSch16B调度器并执行SoftplusDag计算 DAG任务类型为KERNEL_TYPE_AIV_ONLY调度模板选择softplus_struct.h 声明了schModeTPL_SCH_MODE_0/1两种调度模式与dTypeFP16/BF16/FP32两组编译期模板参数供编译器在编译阶段展开出全部 kernel 变体。测试与验证仓库为 Softplus 算子配套了完整的单测与系统测试见 tests 目录host 侧单测test_softplus_infershape.cpp 验证 shape 推导行为test_softplus_tiling.cpp 验证 tiling 计算与非法 dtype/shape 的校验分支kernel 侧单测test_softplus_apt.cpp 验证算子 APT算子模板内核系统测试ttk_kernel_softplus_st.csv 提供 arch35 平台上的 ST 用例配置golden.py 用于生成与 CPU 参照结果对比的 golden 数据可在昇腾环境下回归验证数值正确性。延伸阅读若希望进一步学习本文涉及的周边能力可参考仓库内以下资源算子库整体构建与开发指南CONTRIBUTING.md、docs/QUICKSTART.md更多激活类算子的同类实现范式relu、gelu、sigmoid图模式调用样例的通用工程模板examples/add_example【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考