尧图精选

CANN ops-nn 中 GaussianNllLossGrad 算子的梯度计算原理与 ACLNN 调用实战

🕒 发布时间:2026/9/20 23:46:23 📁 来源:尧图网络
人工智能算子库深度学习CANNAscend【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-nn点击查看免费下载GaussianNllLossGrad 是 CANN ops-nn 神经网络算子库中 GaussianNLLLoss 损失函数的反向算子用于在 NPUAtlas A2 训练系列产品 / Atlas 800I A2 推理产品上同时计算损失对均值预测input与方差var的梯度。本文以 关联文档 为骨架结合仓库内的算子定义、tiling 与 kernel 源码及测试用例深入讲解其数学公式、广播与规约语义、ACLNN 两段式调用方式、约束条件与本地编译验证方法帮助读者既能在业务中正确调用该算子也能从源码层面理解其实现机制。产品支持情况与定位GaussianNllLossGrad 属于实验目录experimental/loss下的反向算子产品支持情况如下产品是否支持Atlas A2 训练系列产品/Atlas 800I A2 推理产品√从仓库结构看该算子位于 experimental/loss/gaussian_nll_loss_grad 目录与同目录下其他算子一致采用标准的四段式工程结构docs接口文档、examplesACLNN 调用样例、op_host算子定义、shape 推导与 tiling、op_kernelAscendC 核函数实现、testsUT 测试。算子注册使用的 AICore 配置为ascend910b见 gaussian_nll_loss_grad_def.cpp与文档所述 Atlas A2 系列平台对应。功能说明梯度数学原理GaussianNLLLoss 的前向损失为负对数高斯似然其反向算子 GaussianNllLossGrad 计算损失对input均值预测和var方差的梯度不计算对target的梯度。设d input - target、v max(var, eps)则每个逻辑元素的梯度为gradInput gradOutput * d / v gradVar gradOutput * 0.5 * (1 / v - d² / v²)几个关键语义点reductionmean时两项梯度额外乘以1/N其中N为input的逻辑元素数reduction与gradOutput的关系sum与mean接收单元素标量gradOutput上游已聚合的标量梯度none接收与input同 shape 的逐元素梯度var广播时的归约当var以广播形式参与计算时gradVar需要把每个广播维度上的贡献求和归约回原始varshape 输出full仅保持前后向接口一致该属性对应前向中“是否包含完整高斯常数项”的开关但不影响梯度计算结果低精度转 FLOAT 计算FLOAT16 与 BFLOAT16 输入会先转换为 FLOAT 参与运算结果再转换回输入 dtype 输出以保证数值精度。上述公式在 op_kernel/gaussian_nll_loss_grad.h 中可直接验证ComputeGradInput第 193–208 行依次执行Sub(input, target)得到d、Maxs(var, eps)得到v、Div(d, v)再Mul(gradOutput)与gradInput gradOutput * d / v完全对应ComputeGradVar第 210–235 行则先计算d² / v²与1 / v的差再乘gradOutput与0.5与gradVar公式一致。参数说明算子的完整参数定义见 gaussian_nll_loss_grad_def.cpp其中 4 个输入、3 个属性与 2 个输出的数据类型、格式与 shape 规格如下参数名输入/输出/属性描述数据类型数据格式Shape 规格gradOutput输入上游梯度。FLOAT、FLOAT16、BFLOAT16NDnone时与input相同sum/mean时为单元素标量。input输入Gaussian 分布均值预测。与gradOutput相同ND任意维静态 shape。target输入目标值。与gradOutput相同ND与input相同或同 rank 且恰有一个广播维为 1。var输入方差。与gradOutput相同ND与input相同、最后一维为 1、缺少最后一维或单元素标量。full属性是否包含完整高斯常数项不影响梯度。默认false。BOOL--eps属性方差下限。默认1e-6。FLOAT-必须大于 0。reduction属性规约方式默认mean。STRING-none、mean或sum。gradInput输出对input的梯度。与gradOutput相同ND与input相同。gradVar输出对var的梯度广播贡献已归约。与gradOutput相同ND与var相同。在算子定义源码中四个输入与两个输出均声明为REQUIRED数据类型限定为{ge::DT_FLOAT, ge::DT_FLOAT16, ge::DT_BF16}格式限定为FORMAT_ND三个属性full默认false、eps默认1e-6、reduction默认mean均为 OPTIONAL。所有输入输出均标记了AutoContiguous()保证 NPU 侧按连续内存访问。广播语义的源码级分类target与var的广播形式在 tiling 阶段被精确分类并编码进 tiling 数据见 gaussian_nll_loss_grad_tiling.cpptarget分类ClassifyTarget第 73–102 行仅允许两种形式——与input完全同 shapeBROADCAST_NONE或同 rank 且恰有一个维度为 1BROADCAST_TARGET_AXIS记录广播轴大小targetAxisSize与该轴之后的内侧步长targetInnerStridevar分类ClassifyVar第 117–151 行支持四种形式——与input同 shapeVAR_SAME、最后一维为 1VAR_LAST_DIM_ONE、缺少最后一维即前缀匹配VAR_MISSING_LAST_DIM、单元素标量VAR_SCALAR并记录每个var元素对应的归约规模varReduceSize。对应地tiling 数据结构 gaussian_nll_loss_grad_tiling_data.h 中保存了targetBroadcastMode、targetBroadcastAxisSize、targetInnerStride、varBroadcastMode、varReduceSize等字段。该分类逻辑在 UT test_gaussian_nll_loss_grad_tiling.cpp 中通过 4 组典型 case同 shape、target 单维广播、var 缺末维、var 标量逐一断言验证。约束说明结合 README.md 与 aclnnGaussianNllLossGrad.md 的约束章节使用该算子需满足仅支持 Atlas A2 平台、ND 数据格式以及 FLOAT、FLOAT16、BFLOAT16 三种数据类型所有输入与输出的 dtype 必须一致实现不创建 dtype-only tiling key即同一 tiling 逻辑复用于三种 dtype计算前统一转 FLOATtarget仅允许同 shape或在一个维度上从 1 广播到inputvar仅允许同 shape、最后一维为 1、缺少最后一维或单元素标量eps必须大于 0var的值约束为非负clampv max(var, eps)对梯度透明即使var epsgradVar仍按 clamp 后的v参与公式计算full不改变gradInput或gradVar的任何结果空input不产生gradInput元素存在单元素var时广播到空 input 之外gradVar为 0none时gradOutput必须与input同 shapesum/mean时gradOutput必须为单元素标量输出gradInput、gradVar分别严格匹配input与var的 shape动态未知维在 tiling 前必须具体化。这些校验在 tiling 阶段全部落地ValidateDtypestiling 源码检查所有输入输出 dtype 一致且属于受支持集合ClassifyTarget/ClassifyVar校验广播合法性eps 0、reduction非法字符串、gradOutput shape 与 reduction 不匹配等均返回GRAPH_FAILED并记录错误日志第 216–242 行。调用说明当前仓库对该算子提供ACLNN 调用两段式接口暂不提供 GE 与 PyTorch 直接调用方式。调用方式调用样例说明ACLNN 调用接口文档、样例两段式接口。GE-暂不提供。PyTorch-暂不提供。两段式接口与函数原型ACLNN 采用与 CANN 其他算子一致的两段式调用模式详见 两段式接口说明先调用aclnnGaussianNllLossGradGetWorkspaceSize完成算子准备并获取 workspace 大小与执行器再调用aclnnGaussianNllLossGrad真正执行计算。aclnnStatus aclnnGaussianNllLossGradGetWorkspaceSize( const aclTensor* gradOutput, const aclTensor* input, const aclTensor* target, const aclTensor* var, bool full, float eps, const char* reduction, aclTensor* gradInput, aclTensor* gradVar, uint64_t* workspaceSize, aclOpExecutor** executor) aclnnStatus aclnnGaussianNllLossGrad( void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, aclrtStream stream)第一段接口各参数的详细说明来自 aclnnGaussianNllLossGrad.md参数名输入/输出描述使用说明数据类型数据格式维度(shape)gradOutputaclTensor*输入上游梯度。非空dtype 与其他张量一致。FLOAT、FLOAT16、BFLOAT16NDnone 时与 input 相同sum/mean 时单元素。inputaclTensor*输入均值预测。非空指针。FLOAT、FLOAT16、BFLOAT16ND任意维静态 shape。targetaclTensor*输入目标值。非空可按一个 size-1 维广播。FLOAT、FLOAT16、BFLOAT16ND同 input或同 rank 且一个维度为 1。varaclTensor*输入非负方差。非空支持限定广播。FLOAT、FLOAT16、BFLOAT16ND同 input、最后一维为 1、缺少最后一维或单元素。fullbool输入保留的前向一致性属性。不影响梯度默认 false。BOOL--epsfloat输入方差下限。必须大于 0默认 1e-6。FLOAT--reductionchar*输入规约模式。none、sum 或 mean默认 mean。STRING--gradInputaclTensor*输出input 梯度。非空dtype 与 gradOutput 一致。FLOAT、FLOAT16、BFLOAT16ND与 input 相同。gradVaraclTensor*输出var 梯度。非空dtype 与 gradOutput 一致。FLOAT、FLOAT16、BFLOAT16ND与 var 相同。workspaceSizeuint64_t*输出返回 Device workspace 大小。----executoraclOpExecutor**输出返回 op 执行器。----第二段接口参数workspaceDevice workspace 地址输入、workspaceSize由第一段接口获取输入、executor第一段接口返回的执行器输入、stream执行任务的 Stream输入。返回值aclnnStatus状态码具体含义参见 aclnn 返回码说明。输入为空指针、dtype 不一致、shape/广播不合法、eps 0或reduction非法时第一段接口返回错误。需要特别说明的是虽然该算子当前实现不申请用户 workspacetiling 中workspace[0] 0见 gaussian_nll_loss_grad_tiling.cpp但框架仍按两段式接口返回实际 workspace 大小调用方应统一按workspaceSize分配并传入样例代码对workspaceSize 0才执行aclrtMalloc。最小调用示例仓库提供的完整可运行样例见 test_aclnn_gaussian_nll_loss_grad.cpp其核心调用片段如下fulltrue、eps1e-6、reductionnoneuint64_t workspaceSize 0; aclOpExecutor* executor nullptr; aclnnStatus ret aclnnGaussianNllLossGradGetWorkspaceSize( gradOutput, input, target, var, false, 1e-6f, mean, gradInput, gradVar, workspaceSize, executor); if (ret ACL_SUCCESS) { ret aclnnGaussianNllLossGrad(workspace, workspaceSize, executor, stream); }样例的运行流程可以归纳为五步同时也是验证算子正确性的完整闭环环境初始化aclInit→aclrtSetDevice(0)→aclrtCreateStream张量构造通过CreateTensor在 Device 上aclrtMalloc并aclrtMemcpy数据再用aclCreateTensor按 ND 格式创建aclTensor。样例采用inputShape{2,3}、targetShape{2,1}、varShape{2,1}即target、var各在第二维上从 1 广播到 3 的典型场景两段式调用先GetWorkspaceSize获取 workspace 与 executor必要时分配 workspace再执行aclnnGaussianNllLossGrad最后aclrtSynchronizeStream同步结果回拷将gradInput、gradVar通过ACL_MEMCPY_DEVICE_TO_HOST拷回 Host 并打印Golden 对比验证样例在 Host 侧按公式d input - target、v max(var, eps)手工计算goldenInput与goldenVar其中gradVar按行累加广播贡献再与 NPU 输出逐元素比较最大误差阈值1e-5内判定PASS最终按passed ? 0 : 1作为进程退出码。值得注意的是样例中gradOutputHost使用reductionnone时与input同 shape 的 6 个元素且 Golden 计算中goldenVar[row] ...的累加逻辑与 kernel 中ProcessBroadcastGradVar的归约行为一致可作为理解广播归约语义的直观参照。本地编译运行 UT该算子已纳入 CANN 的 build.sh 单算子构建体系可分别构建 hosttiling/infershape与 kernel 两部分。先 source 匹配的 CANN 环境仓库 README 以 cann-9.0.0 为例再执行source /usr/local/Ascend/cann-9.0.0/set_env.sh bash build.sh -u --ophost --opsgaussian_nll_loss_grad --socascend910b --experimental bash build.sh -u --opkernel --opsgaussian_nll_loss_grad --socascend910b --experimental命令要点--opsgaussian_nll_loss_grad指定单算子构建范围避免全量编译--socascend910b与算子定义中AddConfig(ascend910b)一致--experimental表示该算子位于 experimental 实验目录-u表示构建并运行 UT单元测试。仓库内的 UT 覆盖情况Host 侧包含 test_gaussian_nll_loss_grad_infershape.cpp验证输出 shape 继承input/var、dtype 继承gradOutput对应 infershape 实现与 test_gaussian_nll_loss_grad_tiling.cpp覆盖 4 种广播组合、reduction 校验、workspace0、tilingKey0Kernel 侧 test_gaussian_nll_loss_grad.cpp 通过 tikicpulib 的ICPU_RUN_KF在 CPU 上仿真运行核函数并对 FLOAT/Half/BF16 三种 dtype 分别设置容差如 Half 容差2e-2配合 gen_data.py 与 compare_data.py 进行数据生成与结果比对。本地自测 UT 覆盖率若普通 UT 已通过且本机安装了lcov可附加--cov生成代码覆盖率报告bash build.sh -u --ophost --opsgaussian_nll_loss_grad --socascend910b --experimental --cov bash build.sh -u --opkernel --opsgaussian_nll_loss_grad --socascend910b --experimental --cov该参数对 host 与 kernel 两个构建目标分别统计行覆盖率便于在新增用例时评估测试充分度。eager 调用前置条件如需在 eager 模式下运行样例如带 Python 前端或自定义 vendor 的集成场景前置条件为先source匹配的 CANN 环境使用--experimental构建并安装最新 custom package以cust及匹配的vendor_namecustom运行样例。也就是说样例默认基于随 CANN 分发的算子包运行要加载本仓库实验目录下新编译的算子实现必须走 custom package 安装流程并显式指定custvendor否则无法命中本仓库内的算子二进制。参考资源算子 READMEexperimental/loss/gaussian_nll_loss_grad/README.mdACLNN 接口文档experimental/loss/gaussian_nll_loss_grad/docs/aclnnGaussianNllLossGrad.md两段式接口通用说明docs/zh/context/two_phase_api.mdaclnn 返回码docs/zh/context/aclnn_return_code.md编译与运行样例指南docs/zh/context/compile_and_run_sample.md前向损失语义参考PyTorch GaussianNLLLossGaussianNLLLossGrad 为其反向对应实现赞分享人工智能算子库深度学习CANNAscend【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-nn点击查看免费下载相关推荐CANN ops-nn SigmoidGrad 算子深度解析Sigmoid 反向传播的梯度计算原理与 aclnn 调用实战CANN ops nn SigmoidGrad 算子深度解析Sigmoid 反向传播的梯度计算原理与 aclnn 调用实战 本文以 CANN ops nn 仓人工智能算子库深度学习CANNAscendCANN ops-nn 仓库 EluGrad 算子解析ELU 反向传播梯度计算原理与 aclnn 接口调用实战CANN ops nn 仓库 EluGrad 算子解析ELU 反向传播梯度计算原理与 aclnn 接口调用实战 本篇技术指南围绕 CANN 神经网络算子库o人工智能算子库深度学习CANNAscendCANN ops-math 中的 AtanGrad 算子反正切梯度计算的原理、实现与 aclnn 调用实战CANN ops math 中的 AtanGrad 算子反正切梯度计算的原理、实现与 aclnn 调用实战 本文以 CANN ops math 仓库中 exp算子库人工智能CANN上一篇如何利用LikeC4进行架构模拟系统行为预测的可视化分析指南下一篇Chrome DevTools App进阶技巧开启远程调试模式的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →