| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 17 天前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 17 天前 | ||
| 17 天前 | ||
| 17 天前 | ||
| 1 个月前 | ||
| 16 小时前 |
Relu6Grad
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | × |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | × |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | × |
功能说明
-
算子功能:激活函数Relu6的反向,计算对应Relu6操作的反向传播梯度。对前向输入落在开区间
(0, 6)的位置透传上游梯度,其余位置(含端点features = 0与features = 6)输出0。 -
计算公式:
backpropsi={gradientsi,0<featuresi<60,otherwisebackprops_{i} = \begin{cases} gradients_{i}, & 0 < features_{i} < 6 \\ 0, & otherwise \end{cases}
其中:
- gradients:对应Relu6操作的反向传播梯度。
- features:作为输入传递给对应Relu6操作的特征,或其输出,使用任一者产生相同结果。
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| gradients | 输入 | 传递给对应Relu6操作的反向传播梯度,公式中的gradients。 | FLOAT16、FLOAT、BFLOAT16 | ND |
| features | 输入 | 作为输入传递给对应Relu6操作的特征,或其输出,使用任一者产生相同结果,公式中的features。其shape须与gradients一致,或为标量[1]。 | FLOAT16、FLOAT、BFLOAT16 | ND |
| backprops | 输出 | 公式中的输出张量,shape与gradients一致。 | FLOAT16、FLOAT、BFLOAT16 | ND |
约束说明
- gradients、features、backprops的数据类型须保持一致,不支持混合数据类型。
- 不支持广播:features的shape须与gradients完全一致,或为标量[1]。
- 支持动态shape与动态rank。
实现方案
| 层 | 文件 | 说明 |
|---|---|---|
| 计算图原型 | op_graph/relu6_grad_proto.h |
REG_OP(Relu6Grad),二输入一输出 |
| 算子定义 | op_host/relu6_grad_def.cpp |
OpDef::AddConfig("ascend950", ...) |
| InferShape | op_host/relu6_grad_infershape.cpp |
复用Ops::Base::InferShape4Broadcast |
| Tiling | op_host/arch35/relu6_grad_tiling_arch35.{h,cpp} |
按dtype分支调用Ops::Base::BroadcastBaseTiling<OpDag> |
| DAG | op_kernel/arch35/relu6_grad_dag.h |
fp32通路原生计算;fp16/bf16通路提升fp32中间精度 |
| Struct | op_kernel/arch35/relu6_grad_struct.h |
BRC_TEMP_SCH_MODE_KEY_DECL/SEL |
| Kernel入口 | op_kernel/relu6_grad_apt.cpp |
KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY) + BroadcastSch<schMode, OpDag> |
fp32通路
In0(dy) ─CopyInBrc─+
+──────────────────────────────+
|
In1(x) ─CopyInBrc─+ |
+─Compare(GT, x, 0) ─ mask_gt0 |
+─Compare(LT, x, 6) ─ mask_lt6 |
mask = And(mask_gt0, mask_lt6)
|
Const(0,fp32) ─Duplicate─ Zero ─────────────── ┴ Select(mask, dy, Zero) ─ CopyOut ─ Out0
`Vec::Compare<u8, fp32, GT/LT>`输出位掩码,`Vec::And<u8>`合成`(0 < x < 6)`
区间mask;`Vec::Select<u8, fp32, TENSOR_TENSOR>`按`mask ? dy : 0`逐元素
选择,避免分支,硬件原生vsel实现。
### fp16 / bf16通路
In0/In1 ─CopyInBrc─ Cast(->fp32) ─+
+─ Compare ── And ─ Select ── Cast(->T,RINT) ─ CopyOut ─ Out0
Const(0,fp32) ── Zero ─+
Const(6,fp32) ── Six ──+
把fp16/bf16整体提升到fp32做cmp/and/sel,末端用CAST_MODE_RINT
(round-to-nearest-even)回退到原dtype。原因:
- 与DSL
relu6_grad.py在fp16vcmpsel不可用时fallback到fp32的行为一致; - 上下界0.0和6.0在fp16/bf16中均能精确表达,但cmp走fp32路径更稳健, 且dy是NaN/Inf时fp32中间不会被半精度范围截断。
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| 图模式 | test_geir_relu6_grad.cpp | 通过算子IR构图方式调用Relu6Grad算子。 |