CANN/asc-devkit SoftmaxGradFront接口文档

📅 2026/7/17 8:30:43
CANN/asc-devkit SoftmaxGradFront接口文档
SoftmaxGradFront【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品支持Atlas 推理系列产品AI Core支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持功能说明将输入tensor[m0, m1, ...mt, n]t大于等于0的非尾轴长度相乘的结果看作m则输入tensor的shape看作[m, n]。对输入tensor[m,n]按行做gradfront反向计算计算公式如下当输入shape为ND格式时内部的reduce过程按last轴进行当输入shape为NZ格式时内部的reduce过程按照last轴和first轴进行reduce过程可以参考SoftMax中的图示说明。为方便理解通过Python脚本实现的方式表达其计算公式如下其中dx、y是源操作数输入d为目的操作数输出。def softmax_grad_front(dx, y, is_fp16False): dx dx.astype(np.float32) y y.astype(np.float32) d (dx * y).sum(axis-1, keepdimsTrue) ###[1024,1] if is_fp16: d d.astype(np.float16) return d实现原理以float类型ND格式shape为[m, k]的输入Tensor为例描述SoftmaxGradFront高阶API内部算法框图如下图所示。图1SoftmaxGradFront算法框图![](https://raw.gitcode.com/cann/asc-devkit/raw/1680a8274bf627fb844cc7e09f9e1a9e99e24425/docs/zh/api/figures/SoftmaxGradFront算法框图.png SoftmaxGradFront算法框图?utm_sourcegitcode_repo_files)计算过程分为如下几步均在Vector上进行mul步骤对输入x和y所有数据相乘计算结果会保存到一个临时空间temp中reducesum步骤对temp中的数据([m, k])每一行数据求和得到[m, 1]计算结果保存到临时空间中broadcast步骤对[m, 1]做一个按datablock为单位的填充比如float类型下把[m, 1]扩展成[m, 8]并输出结果z。函数原型接口框架申请临时空间template typename T, bool isBasicBlock false, bool isDataFormatNZ false __aicore__ inline void SoftmaxGradFront(const LocalTensorT dstTensor, const LocalTensorT gradTensor, const LocalTensorT srcTensor, const SoftMaxTiling tiling, const SoftMaxShapeInfo softmaxShapeInfo {})通过sharedTmpBuffer入参传入临时空间template typename T, bool isBasicBlock false, bool isDataFormatNZ false __aicore__ inline void SoftmaxGradFront(const LocalTensorT dstTensor, const LocalTensorT gradTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const SoftMaxTiling tiling, const SoftMaxShapeInfo softmaxShapeInfo {})由于该接口的内部实现中涉及复杂的计算需要额外的临时空间来存储计算过程中的中间变量。临时空间支持接口框架申请和开发者通过sharedTmpBuffer入参传入两种方式。接口框架申请临时空间开发者无需申请但是需要预留临时空间的大小。通过sharedTmpBuffer入参传入使用该tensor作为临时空间进行处理接口框架不再申请。该方式开发者可以自行管理sharedTmpBuffer内存空间并在接口调用完成后复用该部分内存内存不会反复申请释放灵活性较高内存利用率也较高。接口框架申请的方式开发者需要预留临时空间通过sharedTmpBuffer传入的情况开发者需要为tensor申请空间。临时空间大小BufferSize的获取方式如下通过SoftmaxGrad Tiling接口中提供的GetSoftMaxGradMaxTmpSize/GetSoftMaxGradMinTmpSize接口获取所需最小和最大临时空间大小最小空间可以保证功能正确最大空间用于提升性能。参数说明表1模板参数说明参数名描述T操作数的数据类型。支持的数据类型为half、float。isBasicBlocksrcTensor和gradTensor的shape信息和Tiling切分策略满足基本块要求的情况下可以设置为true开启该参数用于提升性能默认为false表示不开启。是否满足基本块的要求可以采用如下两种方式之一判断srcTensor和dstTensor的shape信息[m,n]需要满足如下条件尾轴长度n小于2048并且大于等于256/sizeof(T)即half场景下n最小为128float场景下n最小为64同时n是64的倍数非尾轴长度的乘积m为8的倍数。在Tiling实现中通过调用IsBasicBlockInSoftMax判断Tiling切分策略是否满足基本块的切分要求。针对Atlas 200I/500 A2 推理产品该参数为预留参数暂未启用为后续的功能扩展做保留保持默认值即可。isDataFormatNZ当前输入输出的数据格式是否为NZ格式默认数据格式为ND即默认取值为false。针对Atlas 200I/500 A2 推理产品不支持配置为NZ格式。表2接口参数说明参数名输入/输出描述dstTensor输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。last轴长度固定32Byte即一个datablock长度并且该datablock中的所有数据为同一个值。比如half数据类型下该datablock里的16个数均为相同的值非last轴长度需要和srcTensor保持一致。gradTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。last轴长度需要32Byte对齐gradTensor的shape与srcTensor的shape一致。srcTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。last轴长度需要32Byte对齐srcTensor的shape与gradTensor的shape一致。sharedTmpBuffer输入临时空间。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。该操作数的数据类型固定uint8_t。用于接口内部复杂计算时存储中间变量由开发者提供。临时空间大小BufferSize的获取方式请参考SoftmaxGrad Tiling接口。tiling输入softmaxgradfront计算所需tiling信息Tiling信息的获取请参考SoftmaxGrad Tiling接口。softmaxShapeInfo输入srcTensor的shape信息。SoftMaxShapeInfo类型具体定义如下方代码所示其中参数的含义为srcM非尾轴长度的乘积。srcK尾轴长度必须32Byte对齐。oriSrcM原始非尾轴长度的乘积。oriSrcK原始尾轴长度。需要注意当输入输出的数据格式为NZ格式时尾轴长度为reduce轴长度即图2中的W0*W1非尾轴为H0*H1。struct SoftMaxShapeInfo { uint32_t srcM; uint32_t srcK; uint32_t oriSrcM; uint32_t oriSrcK; };返回值说明无约束说明操作数地址对齐要求请参见通用地址对齐约束。不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。当参数softmaxShapeInfo中srcM ! oriSrcM或者srcK ! oriSrcK时开发者需要对GM上的原始输入(oriSrcM, oriSrcK)在M或K方向补齐数据到(srcM, srcK)补齐的数据会参与部分运算在输入输出复用的场景下API的计算结果会覆盖srcTensor中补齐的原始数据在输入输出不复用的场景下API的计算结果会覆盖dstTensor中对应srcTensor补齐位置的数据。调用示例// dstLocal: 存放SoftmaxGradFront计算结果的Tensor // gradLocal存放SoftmaxGradFront计算的输入Tensor // srcLocal存放SoftmaxGradFront计算的输入Tensor // sharedTmpBuffer: 存放SoftmaxGradFront计算过程中临时缓存的Tensor // softmaxTiling存放SoftmaxGradFront计算所需Tiling信息可通过SoftMaxGradTilingFunc接口获取 AscendC::SoftMaxShapeInfo softmaxInfo( /* 非尾轴长度的乘积 */ srcM, /* 尾轴长度必须32Bytes对齐 */ srcK, /* 原始非尾轴长度的乘积 */ oriSrcM, /* 原始尾轴长度 */ oriSrcK); // 通过sharedTmpBuffer入参传入临时空间 AscendC::SoftmaxGradFrontT(dstLocal, gradLocal, srcLocal, sharedTmpBuffer, softmaxTiling, softmaxInfo); // 接口框架申请临时空间 AscendC::SoftmaxGradFrontT(dstLocal, gradLocal, srcLocal, softmaxTiling, softmaxInfo);结果示例如下输入数据(gradLocal) [[-100. -80. -60. -50. -30. -20. -15. -10. ] [ -9. -8. -7. -6. -5. -4. -3. -2. ] [ -1.5 -1. -0.8 -0.6 -0.5 -0.45 -0.4 -0.35 ] [ -0.3 -0.25 -0.2 -0.15 -0.1 -0.05 -0.01 -0.001] [ 0. 0.001 0.01 0.05 0.1 0.15 0.2 0.25 ] [ 0.3 0.35 0.4 0.45 0.5 0.6 0.8 1. ] [ 1.5 2. 3. 4. 5. 6. 7. 8. ] [ 9. 10. 15. 20. 30. 50. 60. 80. ]] 输入数据(srcLocal) [[2. 2. 2. 2. 2. 2. 2. 2.] ... [2. 2. 2. 2. 2. 2. 2. 2.]] 输出数据(dstLocal) [[-730. ] [ -88. ] [ -11.2 ] [ -2.122] [ 1.522] [ 8.8 ] [ 73. ] [ 548. ]]【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考