news 2026/9/20 3:35:51

CANN ops-nn 算子 SigmoidCrossEntropyWithLogitsGradV2 深度解析:ACLNN 两段式接口、梯度公式与 NPU 实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN ops-nn 算子 SigmoidCrossEntropyWithLogitsGradV2 深度解析:ACLNN 两段式接口、梯度公式与 NPU 实现原理

CANN ops-nn 算子 SigmoidCrossEntropyWithLogitsGradV2 深度解析:ACLNN 两段式接口、梯度公式与 NPU 实现原理

【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn

导读

本文围绕 CANN ops-nn 仓库中experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2算子目录展开,系统讲解带 logits 的二元交叉熵损失(Binary Cross Entropy with Logits)反向传播梯度的完整计算链路:从数学公式、算子参数与约束,到 aclnnBinaryCrossEntropyWithLogitsBackward 两段式调用接口、AscendC 内核实现与 Tiling 策略。读完本文,你将能够:正确理解该算子每个输入/属性/输出的语义与合法性约束;独立完成基于 ACLNN 两段式接口的算子调用样例编写与运行;并可以从源码层面掌握该算子在 NPU 上的数据搬运、计算拆分与性能调优思路。

一、算子概述与产品支持情况

SigmoidCrossEntropyWithLogitsGradV2是 CANN ops-nn 项目中用于计算二分类交叉熵(带 logits)损失对输入 logits 的梯度的算子,它对应 PyTorch 中binary_cross_entropy_with_logits的反向传播。该算子位于仓库的 experimental 实验目录下,其完整工程结构如下:

experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/ ├── README.md # 算子功能、参数与约束说明(本文主体依据) ├── docs/aclnnBinaryCrossEntropyWithLogitsBackward.md # ACLNN 两段式接口文档 ├── examples/test_aclnn_sigmoid_cross_entropy_with_logits_grad_v2.cpp # 可运行调用样例 ├── op_host/ │ ├── op_api/ # ACLNN 接口层实现与头文件 │ ├── sigmoid_cross_entropy_with_logits_grad_v2_def.cpp # 算子定义(IR 注册) │ ├── sigmoid_cross_entropy_with_logits_grad_v2_infershape.cpp # 输出 shape 推导 │ └── sigmoid_cross_entropy_with_logits_grad_v2_tiling.cpp # Tiling 策略 ├── op_kernel/ │ ├── sigmoid_cross_entropy_with_logits_grad_v2.cpp # AscendC 内核 │ ├── sigmoid_cross_entropy_with_logits_grad_v2.h # 内核类模板声明 │ ├── sigmoid_cross_entropy_with_logits_grad_v2_tiling_data.h # Tiling 数据结构 │ └── sigmoid_cross_entropy_with_logits_grad_v2_tiling_key.h # Tiling Key └── tests/ut/ # op_api / op_host / op_kernel 三级单测

根据 README.md 的“产品支持情况”,该算子支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品

二、数学原理:梯度公式推导

2.1 基础定义

设输入为predict(即 logits,用 $x$ 表示)、target(标签,用 $y$ 表示)、dout(上游梯度),先计算 sigmoid:

$$ p = \text{sigmoid}(predict) = \frac{1}{1 + e^{-predict}} $$

2.2 无 pos_weight 的分支

pos_weight不存在时:

$$ grad_base = p - target $$

2.3 有 pos_weight 的分支

pos_weight存在时,引入正样本权重因子:

$$ log_weight = pos_weight \cdot target $$

$$ grad_base = (log_weight + 1 - target) \cdot p - log_weight $$

可以验证:当pos_weight = 1时,log_weight = target,该式退化为(target + 1 - target) · p - target = p - target,与无pos_weight分支完全一致,说明该公式是前者的广义化形式。

2.4 梯度合成与权重缩放

梯度输出先乘以上游梯度:

$$ gradient = grad_base \cdot dout $$

weight非空(样本级权重),再逐元素相乘:

$$ gradient = gradient \cdot weight $$

reduction = mean时,再按元素总数 $N$ 做均值缩放:

$$ gradient = gradient \cdot \frac{1}{N} $$

三、参数说明

3.1 算子级参数(IR 定义)

根据 README.md 参数表整理如下:

参数名输入/输出/属性描述数据类型数据格式
predict输入模型输出 logitsBFLOAT16、FLOAT16、FLOATND
target输入标签张量BFLOAT16、FLOAT16、FLOATND
dout输入上游梯度输入BFLOAT16、FLOAT16、FLOATND
weight可选输入样本权重BFLOAT16、FLOAT16、FLOATND
pos_weight可选输入正样本权重BFLOAT16、FLOAT16、FLOATND
reduction可选属性支持 none、mean、sumSTRING / INT64(接口映射)-
gradient输出梯度输出BFLOAT16、FLOAT16、FLOATND

其中reduction在算子 IR 层的默认值为"mean",见 sigmoid_cross_entropy_with_logits_grad_v2_def.cpp 中的this->Attr("reduction").AttrType(OPTIONAL).String("mean");IR 注册中同时声明了predicttargetdout为 REQUIRED 输入,weightpos_weight为 OPTIONAL 输入,支持的数据类型为ge::DT_FLOAT16 / ge::DT_FLOAT / ge::DT_BF16,格式统一为ge::FORMAT_ND,目标硬件为ascend910b

3.2 约束说明

来自 README.md 的约束项:

  • 输入维度范围为 1-8 维;
  • predicttargetdout的 shape 需一致;
  • weightpos_weight为可选输入,若存在需与predictshape 一致;
  • 输入与输出数据类型需保持一致。

值得注意的是,ACLNN 接口层对 shape 的校验比算子 README 的表述更宽松:从 aclnn_binary_cross_entropy_with_logits_backward.cpp 的CheckShape实现可以看到,gradOutputweightOptionalposWeightOptional按广播语义(broadcast)校验的——它们需要能够广播到self的 shape,最终广播结果必须与self完全一致;而targetout则要求与selfshape 严格相等。因此在实践中,三个必选输入与输出通常使用相同 shape,可选输入可以使用可广播至该 shape 的形态。

3.3 输出 shape 推导

infershape 实现 中,gradient的 shape 直接拷贝predict的 shape,即输出与输入 logits 同 shape,这符合逐元素梯度算子的直觉——反向传播的梯度形状与正向 logits 张量一一对应。

四、ACLNN 两段式接口:aclnnBinaryCrossEntropyWithLogitsBackward

4.1 接口与参数映射

ACLNN 层将该算子包装为aclnnBinaryCrossEntropyWithLogitsBackward,采用 CANN 标准的两段式接口调用模式(详见 docs/zh/context/two_phase_api.md):第一段GetWorkspaceSize完成入参校验与计算流程编排、返回 workspace 大小和执行器;第二段执行真正的计算。

参数映射关系(来自 aclnnBinaryCrossEntropyWithLogitsBackward.md):

  • self↔ 算子输入predict(logits)
  • gradOutput↔ 算子输入dout(上游梯度)
  • out↔ 算子输出gradient
  • weightOptional↔ 算子输入weight
  • posWeightOptional↔ 算子输入pos_weight
  • reductionint64_t传入:0 表示 none,1 表示 mean,2 表示 sum

函数原型(见 aclnn_binary_cross_entropy_with_logits_backward.h):

aclnnStatus aclnnBinaryCrossEntropyWithLogitsBackwardGetWorkspaceSize( const aclTensor* gradOutput, const aclTensor* self, const aclTensor* target, const aclTensor* weightOptional, const aclTensor* posWeightOptional, int64_t reduction, aclTensor* out, uint64_t* workspaceSize, aclOpExecutor** executor); aclnnStatus aclnnBinaryCrossEntropyWithLogitsBackward( void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, const aclrtStream stream);

4.2 第一段接口的参数校验逻辑

从 aclnn_binary_cross_entropy_with_logits_backward.cpp 的CheckParams可以看到,第一段接口依序执行六类检查:

  1. 空指针检查gradOutputselftargetout任一为空指针时报ACLNN_ERR_PARAM_NULLPTR(错误码 161001);
  2. 维度检查:所有张量维度不得超过 8 维(CheckDimension使用OP_CHECK_MAX_DIM,宏MAX_SUPPORT_DIMS_NUMS);
  3. 数据类型检查self/target/gradOutput/out及非空的weight/pos_weight均须落在支持列表内,且out类型须与target一致(CheckDtypeValid);
  4. 数据格式检查selftargetselfout的存储格式必须相同(CheckFormat);
  5. shape 检查targetoutself严格同 shape;gradOutputweightpos_weight广播后须与self一致;空 tensor 直接放行(CheckShape);
  6. reduction 检查:取值必须落在 0~2(CheckReduction,枚举enum Reductions { None, Mean, Sum, END })。

上述任一检查失败均返回ACLNN_ERR_PARAM_INVALID(错误码 161002)。完整的返回码含义可参见 docs/zh/context/aclnn_return_code.md。

4.3 数据类型推导与内部计算流程

ACLNN 接口层还实现了一套类型提升(promote)与格式适配流程(BinaryCrossEntropyWithLogitsBackwardStub):

  • CheckPromoteType依次对self+target+gradOutput+weightOptional+posWeightOptionalop::PromoteType类型推导,要求最终推导结果可安全 cast 到输出类型;
  • 输入 tensor 若为非连续(non-contiguous)则先经l0op::Contiguous转为连续,接口文档明确标注各张量均支持“非连续 Tensor”(√);
  • weightpos_weight为空时,分别用l0op::OnesLike(self)生成全 1 张量参与计算——这解释了算子内核为什么始终能看到“逻辑上存在的”两个权重;
  • 全部输入 cast 到 promoteType 后,调用 L0 级算子l0op::SigmoidCrossEntropyWithLogitsGradV2,将reduction枚举映射为字符串{"none", "mean", "sum"}
  • 计算结果再 cast 回out的数据类型,经ReFormat/ViewCopy适配输出 format 与视图(非连续输出场景)。

支持的数据类型列表是平台相关的GetDtypeSupportList()在 DAV_2201 架构或 Regbase 模式下返回{DT_FLOAT16, DT_FLOAT, DT_BF16},其他平台仅返回{DT_FLOAT16, DT_FLOAT},详见 aclnn_binary_cross_entropy_with_logits_backward.cpp。这提醒开发者:BFLOAT16 支持是有平台前提的,跨平台使用时需确认目标平台的 dtype 支持范围。

4.4 确定性计算保证

根据 aclnnBinaryCrossEntropyWithLogitsBackward.md 的说明,该接口默认采用确定性实现,即相同输入在同一软硬件环境下多次运行结果可复现,这对训练梯度校验、数值调优与问题定位具有实用价值。确定性计算的通用机制可参考 docs/zh/context/determinism_compute.md。

五、完整调用示例:从 Host 到 Device

5.1 完整样例代码

examples/test_aclnn_sigmoid_cross_entropy_with_logits_grad_v2.cpp 给出了一个可运行、可验证的完整样例(演示数据均为同 shape,不使用广播)。其核心步骤包括:ACL 环境初始化 → 构造输入/输出 aclTensor → 两段式接口调用 → 同步取回结果 → 资源释放。关键调用片段如下:

#include "aclnnop/aclnn_binary_cross_entropy_with_logits_backward.h" // 1. 环境初始化(固定写法):aclInit / aclrtSetDevice / aclrtCreateStream int32_t deviceId = 0; aclrtStream stream; Init(deviceId, &stream); // 2. 构造张量:predict(32,32)、target(32,32)、dout(32,32), // 可选输入 weight(32,32)、pos_weight(32,32) 同 shape; // 通过 aclrtMalloc + aclrtMemcpy 放入 Device,再 aclCreateTensor 封装 // (CreateAclTensor 内部同时计算连续张量 strides,format 为 ACL_FORMAT_ND) // 3. 两段式接口调用 uint64_t workspaceSize = 0; aclOpExecutor* executor; int64_t reduction = 1; // 0:none, 1:mean, 2:sum ret = aclnnBinaryCrossEntropyWithLogitsBackwardGetWorkspaceSize( doutTensor, // gradOutput(注意参数顺序:gradOutput 在前) predictTensor, // self(logits) targetTensor, weightTensor, // 可传 nullptr 表示不使用 posWeightTensor, // 可传 nullptr 表示不使用 reduction, outputTensor, &workspaceSize, &executor); void* workspaceAddr = nullptr; if (workspaceSize > 0) { aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); } ret = aclnnBinaryCrossEntropyWithLogitsBackward(workspaceAddr, workspaceSize, executor, stream); aclrtSynchronizeStream(stream); // 4. aclrtMemcpy(DEVICE_TO_HOST) 回拷输出并打印前 8 个元素验证 // 5. aclDestroyTensor / aclrtFree / aclrtDestroyStream / aclrtResetDevice / aclFinalize 释放资源

易错点提示:第一段接口的参数顺序是gradOutput, self, target, weightOptional, posWeightOptional, reduction, out,即dout位于predict之前,与直觉上的“先 logits 后梯度”相反,样例代码中已用注释特别标注。

5.2 编译与运行指引

样例的编译执行过程遵循 CANN 算子开发标准流程,具体可参考 docs/zh/context/compile_and_run_sample.md。整体要点为:

  • 头文件路径:aclnn_binary_cross_entropy_with_logits_backward.h(op_host/op_api 目录中声明的ACLNN_API接口)及acl/acl.h
  • 链接 CANN 运行时库(acl、aclnn 相关动态库),并设置好ASCEND_HOME_PATH等环境变量;
  • 在装有 Atlas A2 系列产品的环境上执行,输出 tensor 需预先分配与self同 shape 的 Device 内存。

5.3 数值验证小实验(样例数据推算)

以样例中的简化数据为例可直观验证公式:若predict = 1.0target = 0.5dout = 1.0weight = 1.0pos_weight = 2.0,则有:

  • $p = \frac{1}{1+e^{-1}} \approx 0.7310586$
  • $log_weight = 2.0 \times 0.5 = 1.0$
  • $grad_base = (1.0 + 1 - 0.5) \times 0.7310586 - 1.0 = 1.5 \times 0.7310586 - 1.0 \approx 0.0965879$
  • doutweight后仍约为 0.0965879(本组数据下两权重均为 1 或已计入)

reduction=mean 时再除以元素总数。由于样例输入为全 1 / 全 0.5 常量,所有元素梯度一致,打印结果应为同一常量,可用以快速确认算子被正确执行、输出被写回。

六、NPU 内核实现原理:AscendC 视角

6.1 模板化内核与权重组合

kernel 实现 以类模板KernelSigmoidCrossEntropyWithLogitsGradV2<T, HAS_WEIGHT, HAS_POS_WEIGHT>组织,T为输入数据类型(由DTYPE_PREDICT推导),两个布尔模板参数在编译期按weight/pos_weight是否存在的 4 种组合展开(见DISPATCH_SIGMOID_GRAD宏),从而:

  • 内核入口签名固定为(predict, target, dout, weight, pos_weight, gradient, workspace, tiling)
  • 不存在的可选输入不会申请队列、不会做搬运,避免运行时分支开销;
  • Init阶段按blockIdx与 tiling 数据切分 Global Memory 缓冲区,并根据tileDataNum初始化 UB 上多级队列(predict/target/dout、条件性的 weight/pos_weight、输出 grad,以及 FP32 计算缓冲区)。

6.2 计算流水与公式落位

内核采用经典的CopyIn → Compute → CopyOut 三段式流水Process循环,QUEUE_DEPTH=1的双缓冲由 Tiling 侧决定)。Compute阶段与数学公式一一对应:

无 pos_weight 分支(对应 2.2 节):

// sigmoid(x) = 1 / (1 + exp(-x)) Muls(tmp1, x_fp32, -1.0f); Exp(tmp1, tmp1); Adds(tmp3, tmp1, 1.0f); Duplicate(tmp2, 1.0f); Div(x_fp32, tmp2, tmp3); Sub(x_fp32, x_fp32, y_fp32); // grad_base = p - y

有 pos_weight 分支(对应 2.3 节):

Mul(tmp1, pos_w_vec_fp32, y_fp32); // log_weight = pos_weight * target Adds(tmp3, tmp1, 1.0f); Sub(tmp3, tmp3, y_fp32); // log_weight + 1 - target Muls(tmp2, x_fp32, -1.0f); Exp(tmp2, tmp2); Adds(y_fp32, tmp2, 1.0f); Duplicate(tmp2, 1.0f); Div(x_fp32, tmp2, y_fp32); // sigmoid(x) Mul(tmp3, tmp3, x_fp32); Sub(x_fp32, tmp3, tmp1); // grad_base

随后统一执行:gradient = grad_base * dout(可选再乘weight),最后若tiling.globalScale != 1.0f则整体缩放(reduction=mean 时的 $1/N$ 因子)。内核注释明确指出该公式序列与 TBE 路径保持一致,同时指令顺序对齐 builtin trace。

数值精度设计:非 FP32 输入(FP16/BF16)在计算前Cast到 FP32 中间缓冲区(calc_fp32),全部中间运算在 FP32 下完成,输出时再按类型回写——FP16 使用CAST_RINT、BF16 使用CAST_RINT、FP32 直接拷贝,最大程度避免中间累积误差;calcBuf数量为FP32_BUF_NUM(FP32 输入在 lite 模式下可缩减为 3 个缓冲,见 6.4 节)。非整块数据通过DataCopyPad补齐搬运,FP32 尾块在tileDataNum < 1024时回退为标量路径以避免 pad 开销(源码注释:For tiny fp32 tiles, pad copy overhead can exceed scalar fallback benefits)。

6.3 内核的 Tiling 数据结构

内核依赖的 Tiling 参数定义在 sigmoid_cross_entropy_with_logits_grad_v2_tiling_data.h:

struct SigmoidCrossEntropyWithLogitsGradV2TilingData { uint64_t smallCoreDataNum; // 小核(非尾核)处理的数据量 uint64_t bigCoreDataNum; // 大核(尾核)处理的数据量 uint64_t finalBigTileNum; // 大核的 tile 循环次数 uint64_t finalSmallTileNum; // 小核的 tile 循环次数 uint64_t tileDataNum; // 单个 tile 的元素数 uint64_t smallTailDataNum; // 小核尾 tile 元素数 uint64_t bigTailDataNum; // 大核尾 tile 元素数 uint64_t tailBlockNum; // 承担"大核"角色的 block 数 float globalScale; // reduction=mean 时的 1/N 缩放因子 uint32_t has_weight; // 是否携带 weight uint32_t has_pos_weight; // 是否携带 pos_weight uint32_t fp32_lite_mode; // FP32 精简缓冲模式标记 };

内核Init中通过GetBlockIdx()tailBlockNum判断当前核是"大核"还是"小核",并据此确定各自的数据量与 tile 循环次数;数据量不同的核之间通过globalBufferIndex的偏移修正保证每个元素恰好被处理一次。

七、Tiling 策略与性能调优细节

7.1 整体流程

tiling 实现 完成:读取输入 shape/dtype → 判定has_weight/has_pos_weight→ 解析reduction→ 计算 UB 可用容量与 tileBlockNum → 分配核数 → 通过CalculateCoreBlockNums计算大小核数据分布 → 写入 Tiling 数据并SetBlockDim

7.2 reduction 的“双编码”兼容

GetReductionType展示了算子 IR 与 ACLNN 接口层 reduction 编码差异的处理:Tiling 侧优先读字符串属性("none"/"sum"/"mean",兼容单字母缩写n/s/m),若拿到整数属性则做了一次编码映射——ACLNN 接口的枚举是 0:none、1:mean、2:sum,而内部 Tiling 枚举是 0:none、1:sum、2:mean(源码注释明确说明该兼容性设计),读取后统一换算为内部ReductionTypeglobalScale仅在 mean(内部编码 2)且totalLength > 0时置为1.0f / totalLength,其余情况为 1.0。

7.3 核数与 UB 自适应

  • 核数选择:默认按(totalLength + 1023) / 1024估算最优核数并与 AIV 核数、总 block 数取较小值;随后依据 dtype 与 workload 范围套用多种细分策略,例如:
    • FP32 且同时带 weight/pos_weight 的“重计算”场景(enableFp32PerfTune)按数据量分档限制核数(≤8K 用 8 核、≤64K 用 16 核、≤256K/512K 用 24 核、≤1M 用 32 核等),避免中小 shape 被过度切分引入 sync/scalar 开销;
    • FP32 3D/4D + sum + 中大规模(25 万~95 万元素)场景使用FP32_HEAVY_PREFERRED_CORE_NUM = 40的偏好核数;
    • BF16 3D + mean + 2 万~3 万元素场景限制到BF16_3D_MEAN_PREFERRED_CORE_NUM = 25,并同步做 tile 上限收敛;
    • FP16 5D + none + 90 万~120 万元素场景(enableFp16FiveDimSyncOpt)通过缩小 UB 预留提升单片容量;
    • BF16 sum + 15 万~18 万元素场景强制每核 2 tile(enableBf16Split2Tiles)以恢复流水重叠。
  • UB 容量reservedUbSize默认为 64KB,FP32 lite 模式 16KB、FP32 重计算 8KB、FP32 heavy 场景仅 4KB,进而影响tileBlockNum与单片数据量;FP32 路径还要求tileDataNum保持 16 对齐以避免短向量回退。
  • workspace:Tiling 阶段通过GetLibApiWorkSpaceSize()设置 workspace 大小,供内核框架使用。

这些策略均以 workload 区间(dtype + 维度 + reduction + 元素量)为触发条件,属于仓库内已有的调优经验沉淀,开发者可参照 tiling 实现 结合自身业务 shape 复现与验证。

八、测试体系与验证方式

算子目录下配套了三级单元测试(tests/ut):

  • op_kernel 层test_sigmoid_cross_entropy_with_logits_grad_v2.cpp使用 gtest +ICPU_RUN_KF在 CPU 模拟环境下运行内核,手工构造TilingDataType并校验梯度输出。例如test_case_fp32_smoke用 128 个 FP32 元素、单核单 tile、globalScale=1.0的配置运行内核(TILING_KEY_FLOAT+AIV_MODE),用于内核正确性冒烟;
  • op_host 层test_sigmoid_cross_entropy_with_logits_grad_v2_tiling.cpp验证 Tiling 计算逻辑(核数、tile 数、尾块分配等);
  • op_api 层test_aclnn_binary_cross_entropy_with_logits_backward.cpp从 ACLNN 接口层做端到端校验,覆盖参数校验、广播、两段式调用等路径。

如需对算子做二次开发或行为确认,可参考上述测试的构造方式:先准备 host 数据与 shape,再按 tiling 结构填充关键字段,最后在 CPU 模拟器或 NPU 环境断言输出与理论公式结果一致。

九、总结与使用建议

SigmoidCrossEntropyWithLogitsGradV2是 CANN ops-nn 中面向 Atlas A2 系列产品的二分类交叉熵反向算子,其完整技术栈可归纳为四层:

  1. 数学层grad_base = (pos_weight·target + 1 - target)·sigmoid(predict) - pos_weight·target(无 pos_weight 时退化为sigmoid(predict) - target),再依次乘doutweight,mean 模式下按 $1/N$ 缩放;
  2. 接口层aclnnBinaryCrossEntropyWithLogitsBackward两段式 ACLNN 接口,自带空指针/维度/dtype/format/shape/reduction 六重校验、类型提升、非连续张量 contiguity 适配与确定性计算保证;
  3. 内核层:AscendC 模板内核,FP32 中间精度计算 + 可选输入编译期展开 + 大小核数据切分 + DataCopyPad 尾块处理;
  4. 调度层:按 dtype/维度/reduction/元素量分档的核数与 UB 自适应 Tiling 策略。

实用建议

  • 调用前确认目标平台为 Atlas A2 系列,且非 DAV_2201/Regbase 平台不支持 BF16 输入;
  • 三个必选输入与输出保持同 shape 与同 dtype,可选权重优先使用同 shape 或可广播 shape;
  • reduction在 ACLNN 接口层用整数 0/1/2,注意与算子 IR 层字符串"none"/"mean"/"sum"的编码差异已由框架内部自动映射;
  • 若需要快速验证算子行为,可直接运行 examples/test_aclnn_sigmoid_cross_entropy_with_logits_grad_v2.cpp 并对照本文 5.3 节的手算结果。

参考文档与源码索引

  • 算子说明:experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/README.md
  • ACLNN 接口文档:experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/docs/aclnnBinaryCrossEntropyWithLogitsBackward.md
  • 调用样例:experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/examples/test_aclnn_sigmoid_cross_entropy_with_logits_grad_v2.cpp
  • ACLNN 接口实现:experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/op_host/op_api/aclnn_binary_cross_entropy_with_logits_backward.cpp
  • 算子 IR 定义:experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/op_host/sigmoid_cross_entropy_with_logits_grad_v2_def.cpp
  • Tiling 实现:experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/op_host/sigmoid_cross_entropy_with_logits_grad_v2_tiling.cpp
  • AscendC 内核:experimental/loss/sigmoid_cross_entropy_with_logits_grad_v2/op_kernel/sigmoid_cross_entropy_with_logits_grad_v2.cpp
  • 通用机制:两段式接口 docs/zh/context/two_phase_api.md、ACLNN 返回码 docs/zh/context/aclnn_return_code.md、编译运行样例 docs/zh/context/compile_and_run_sample.md

【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 3:34:32

Claude安装路径全解析:Windows、macOS、Linux下如何快速定位

1. 为什么“找到 Claude 装在哪”比想象中更值得聊很多人第一次意识到需要查 Claude 的安装路径&#xff0c;往往不是出于好奇&#xff0c;而是被现实逼的。比如你在终端敲下claude回车&#xff0c;系统回你一句无法将"claude"项识别为 cmdlet、函数、脚本文件或可运…

作者头像 李华
网站建设 2026/9/20 3:34:30

放大器设计100问:运放选型、噪声分析与PCB布局实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 3:32:42

Jackett 快速上手指南:550 多个种子站点一次聚合搜索

Jackett 快速上手指南:550 多个种子站点一次聚合搜索 【免费下载链接】Jackett API Support for your favorite torrent trackers 项目地址: https://gitcode.com/GitHub_Trending/ja/Jackett 十几个站点逐个搜,谁都会搜烦。Jackett 是一个跑在本地的种子搜索聚合服务:S…

作者头像 李华
网站建设 2026/9/20 3:32:36

Codex AI Agent实战指南:从模型原理到多模态任务配置

2026年聊 AI Agent&#xff0c;Codex 是绕不开的一个名字。作为 OpenAI 出品的全能型 AI Agent&#xff0c;它把写代码、改文件、跑命令、生成图片这些能力整合进了同一个交互会话里&#xff0c;默认底层跑在 GPT-5.5 上&#xff0c;视觉理解与图像生成则交给 Image-2 模型负责…

作者头像 李华
网站建设 2026/9/20 3:29:31

Spring AI Alibaba实战:用Java快速构建通义千问AI应用

做后端这么多年&#xff0c;我有个特别明显的感受&#xff1a;Java圈子上手大模型应用的速度&#xff0c;始终比Python圈子慢半拍。不是Java不行&#xff0c;是那时候合适的落地框架太少。直到Spring AI正式进入Spring家族&#xff0c;阿里又在它上面开源了Spring AI Alibaba&a…

作者头像 李华
网站建设 2026/9/20 3:27:04

Android Studio中文界面设置指南:官方语言包安装与避坑全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华