Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
KLDivV2算子实现Kullback-Leibler散度的计算,对应PyTorch中的torch.nn.functional.kl_div接口。该算子用于度量两个概率分布之间的差异,是训练知识蒸馏、变分自编码器(VAE)、强化学习中策略优化等场景的核心损失函数。
torch.nn.functional.kl_div
当前CANN内置的KLDiv实现仅支持ascend950平台,本需求为Atlas A2/A3训练系列产品提供高性能的AscendC实现。
F.kl_div
aclnnKlDiv
计算公式:
output = target * (log(target) - input)
output = exp(target) * (target - input)
归约方式(reduction属性):
none
mean
sum
batchmean
x和target的数据类型必须一致,输出类型与输入一致。
InferShape:
Tiling策略:
platform_ascendc::PlatformAscendC
整体流水:CopyIn → ComputePointwise → CopyOut(三级流水,双缓冲)
精度保障:
CAST_NONE
CAST_RINT
target≤0掩码实现(非log_target模式):
Maxs(target, TINY)
Log
max(target,0) / (max(target,0)+TINY)
归约实现:
💡 备注
/assign
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
一、背景信息
KLDivV2算子实现Kullback-Leibler散度的计算,对应PyTorch中的
torch.nn.functional.kl_div接口。该算子用于度量两个概率分布之间的差异,是训练知识蒸馏、变分自编码器(VAE)、强化学习中策略优化等场景的核心损失函数。当前CANN内置的KLDiv实现仅支持ascend950平台,本需求为Atlas A2/A3训练系列产品提供高性能的AscendC实现。
二、价值/作用
F.kl_div在训练流程中被大量使用,缺少该算子会导致模型无法在昇腾平台上训练或需要走CPU回退路径三、设计方案
3.1 使能方式
aclnnKlDiv两段式接口调用3.2 总体设计
计算公式:
output = target * (log(target) - input),其中target≤0的位置输出置零output = exp(target) * (target - input)归约方式(reduction属性):
none(0):逐元素输出,output shape与input相同mean(1):输出所有元素的均值,output为标量sum(2):输出所有元素的求和,output为标量batchmean(3):输出求和后除以batch维度(第0维),output为标量3.2.1 算子支持的数据类型
x和target的数据类型必须一致,输出类型与输入一致。
3.2.2 host侧设计
InferShape:
Tiling策略:
platform_ascendc::PlatformAscendC动态获取核数和UB大小3.2.3 kernel侧设计
整体流水:CopyIn → ComputePointwise → CopyOut(三级流水,双缓冲)
精度保障:
CAST_NONE(round-to-nearest-even,与PyTorch一致)CAST_RINT(AscendC对bf16的正确舍入模式)target≤0掩码实现(非log_target模式):
Maxs(target, TINY)+Log避免log(0)max(target,0) / (max(target,0)+TINY)构造软掩码(target>0→~1, target≤0→~0)归约实现:
3.3 支持硬件
3.4 算子约束限制
💡 备注