
DeepNorm【免费下载链接】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 推理产品xAtlas 推理系列产品 AI Core√Atlas 推理系列产品 Vector CorexAtlas 训练系列产品x功能说明在深层神经网络训练过程中执行层LayerNorm归一化时可以使用DeepNorm进行替代通过扩大残差连接来提高Transformer的稳定性。本接口实现了对shape大小为[BSH]的输入数据的DeepNorm归一化其计算公式如下DeepNorm(x) LayerNorm(α * X SubLayer(X))SubLayer(X)通常是指在DeepNorm模型中的一个子层sub-layer用于实现自注意力机制self-attention mechanism。本接口中会整体作为一个输入Tensor传入。其中LayerNorm的计算公式请参考LayerNorm。函数原型通过sharedTmpBuffer入参传入临时空间template typename T, bool isReuseSrc false, bool isBasicBlock false __aicore__ inline void DeepNorm(const LocalTensorT dstLocal, const LocalTensorT meanLocal, const LocalTensorT rstdLocal, const LocalTensorT srcLocal, const LocalTensorT gxLocal, const LocalTensorT betaLocal, const LocalTensorT gammaLocal, const LocalTensoruint8_t sharedTmpBuffer, const T alpha, const T epsilon, DeepNormTiling tiling)接口框架申请临时空间template typename T, bool isReuseSrc false, bool isBasicBlock false __aicore__ inline void DeepNorm(const LocalTensorT dstLocal, const LocalTensorT meanLocal, const LocalTensorT rstdLocal, const LocalTensorT srcLocal, const LocalTensorT gxLocal, const LocalTensorT betaLocal, const LocalTensorT gammaLocal, const T alpha, const T epsilon, DeepNormTiling tiling)参数说明表 1模板参数说明参数名描述T操作数的数据类型。支持的数据类型为half、float。isReuseSrc是否允许修改源操作数默认值为false。如果开发者允许源操作数被改写可以使能该参数使能后能够节省部分内存空间。设置为true则本接口内部计算时复用srcLocal的内存空间节省内存空间设置为false则本接口内部计算时不复用srcLocal的内存空间。对于float数据类型输入支持开启该参数half数据类型输入不支持开启该参数。isReuseSrc的使用样例请参考更多样例。isBasicBlocksrcTensor的shape信息满足基本块要求的情况下可以使能该参数用于提升性能默认不使能。基本块要求srcTensor的shape需要满足如下条件尾轴即H的长度为64的倍数但不超过2040非尾轴长度B*S为8的倍数。表 2接口参数说明参数名输入/输出描述dstLocal输出目的操作数。shape为[BSH]。H长度不可超过2040。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。meanLocal输出均值目的操作数。shape为[BS]。meanLocal的数据类型需要与dstLocal保持一致。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。rstdLocal输出方差目的操作数。shape为[BS]。rstdLocal的数据类型需要与dstLocal保持一致。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。srcLocal输入源操作数shape为[BSH]。srcLocal的数据类型需要与目的操作数保持一致尾轴长度需要32B对齐。H长度不可超过2040。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。gxLocal输入源操作数shape为[BSH]。gxLocal的数据类型需要与目的操作数保持一致尾轴长度需要32B对齐。H长度不可超过2040。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。该参数对应计算公式中的SubLayer(X)的计算结果。betaLocal输入源操作数shape为[H]。betaLocal的数据类型需要与目的操作数保持一致长度需要32B对齐。H长度不可超过2040。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。gammaLocal输入源操作数shape为[H]。gammaLocal的数据类型需要与目的操作数保持一致长度需要32B对齐。H长度不可超过2040。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。sharedTmpBuffer输入接口内部复杂计算时用于存储中间变量由开发者提供。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。临时空间大小BufferSize的获取方式请参考DeepNorm Tiling。alpha输入权重系数。数据类型需要与目的操作数一致。epsilon输入权重系数 用来防止除零错误。数据类型需要与目的操作数一致。tiling输入DeepNorm计算所需Tiling信息Tiling信息的获取请参考DeepNorm Tiling。返回值说明无约束说明操作数地址对齐要求请参见通用地址对齐约束。isReuseSrc模板参数为false时srcLocal和dstLocal的Tensor空间不支持复用。仅支持输入shape为ND格式。输入数据不满足对齐要求时开发者需要进行补齐补齐的数据应设置为0防止出现异常值从而影响网络计算。调用示例// dstLocal: 存放 DeepNorm 计算结果的 Tensor // meanLocal: 输出均值Tensor // rstdLocal: 输出方差Tensor // srcLocal: 输入的主数据 Xshape 为 [B, S, H] // gxLocal: SubLayer(X) 的输出 // betaLocal: LayerNorm 的偏置系数βshape 为 [H] // gammaLocal: LayerNorm 的缩放系数γshape 为 [H] // alpha: 残差连接的缩放系数α // epsilon: 防除零系数ε // tiling: Tiling 信息包含维度、分块等参数 // 使用 DeepNorm 接口实现 DeepNorm(x) LayerNorm(α * X SubLayer(X)) // 若尾轴的长度H不超过2040且为64的倍数同时非尾轴长度B*S为8的倍数可设置isBasicBlock true提升性能 // 若数据类型T为float且允许修改srcLocal可设置isReuseSrc true复用srcLocal内存空间以节省内存 AscendC::DeepNormT, isReuseSrc, isBasicBlock( dstLocal, // 输出归一化后的结果 meanLocal, // 输出均值 mean rstdLocal, // 输出倒数标准差 rstd srcLocal, // 输入原始输入 X gxLocal, // 输入子层输出 SubLayer(X) betaLocal, // 输入LayerNorm 偏置系数β gammaLocal, // 输入LayerNorm 缩放系数γ alpha, // 输入残差路径缩放系数 α epsilon, // 输入防除零系数 ε tiling // 输入Tiling 信息 );示例结果如下输入数据(srcLocal, shape:[4, 2, 8]): [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ] 输入数据(gxLocal, shape:[4, 2, 8]): [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ] 输入数据(gammaLocal, shape:[4]): [ 0 1 2 3 4 5 6 7 ] 输入数据(betaLocal, shape:[4]): [ 0 1 2 3 4 5 6 7 ] 输出数据(dstLocal): [ 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 0. 1.0439204 2.0527046 3.0263522 3.9648638 4.868239 5.7364774 6.56958 ] 输出数据(meanLocal): [ -15.75 -51.75 -87.75 -123.75 -159.75 -195.75 -231.75 -267.75 ] 输出数据(rstdLocal): [ 106.3125 106.3125 106.3125 106.3125 106.3125 106.3125 106.3125 106.3125 ]【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考