DeepNorm
【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
产品支持情况
功能说明
在深层神经网络训练过程中,执行层LayerNorm归一化时,可以使用DeepNorm进行替代,通过扩大残差连接来提高Transformer的稳定性。
本接口实现了对shape大小为[B,S,H]的输入数据的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 LocalTensor<T>& dstLocal, const LocalTensor<T>& meanLocal, const LocalTensor<T>& rstdLocal, const LocalTensor<T>& srcLocal, const LocalTensor<T>& gxLocal, const LocalTensor<T>& betaLocal, const LocalTensor<T>& gammaLocal, const LocalTensor<uint8_t>& sharedTmpBuffer, const T alpha, const T epsilon, DeepNormTiling& tiling)接口框架申请临时空间
template <typename T, bool isReuseSrc = false, bool isBasicBlock = false> __aicore__ inline void DeepNorm(const LocalTensor<T>& dstLocal, const LocalTensor<T>& meanLocal, const LocalTensor<T>& rstdLocal, const LocalTensor<T>& srcLocal, const LocalTensor<T>& gxLocal, const LocalTensor<T>& betaLocal, const LocalTensor<T>& gammaLocal, const T alpha, const T epsilon, DeepNormTiling& tiling)
参数说明
表 1模板参数说明
表 2接口参数说明
返回值说明
无
约束说明
操作数地址对齐要求请参见通用地址对齐约束。
isReuseSrc模板参数为false时,srcLocal和dstLocal的Tensor空间不支持复用。
仅支持输入shape为ND格式。
输入数据不满足对齐要求时,开发者需要进行补齐,补齐的数据应设置为0,防止出现异常值从而影响网络计算。
调用示例
// dstLocal: 存放 DeepNorm 计算结果的 Tensor // meanLocal: 输出均值Tensor // rstdLocal: 输出方差Tensor // srcLocal: 输入的主数据 X,shape 为 [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::DeepNorm<T, 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),仅供参考