Page 484 - 《软件学报》2025年第8期
P. 484

王昊天 等: MTTorch: 面向  MT-3000  芯片和  Transformer 模型的  PyTorch  算子库实现与优化            3907


                                                           
                                                  K ∑                       K ∑
                                                    (     )
                                                             log
                                                            
                                              
                                       dx i = y i × dy i −  dy j ×y j  ,dx  = dy i −exp(y i )×  dy j  (5)
                                                            
                                                              i
                                                           
                                                   j=1                       j=1
                    计算得到. 对于前向传播需要进行规约操作求出数组的最大值和总和, 再按照公式进行向量化计算. 对于反向
                 传播则只需要规约求和直接计算即可, 因为              y i 为  softmax  之后的计算结果, 取值范围为   [0–1], 不会造成溢出.

                 3.6.2.2    Layer_norm
                    PyTorch  中的  Layer_Normalization (层归一化) 是一种用于深度神经网络的归一化技术, 其在每个样本的特征
                 维度上进行归一化. Layer_norm     适用于处理变长序列数据, 如文本数据, 可以提高模型的稳定性和收敛速度, 是大
                 型语言模型中必不可少的一环. 计算过程涉及将输入张量沿指定维度计算均值和标准差, 并使用它们进行归一化.
                 其计算公式为:

                                                        x− E (x)
                                                    y = √       ×γ +β                                 (6)
                                                        Var(x)−ϵ
                 其中, E(x) 代表数据的均值, Var(x) 代表数据的标准差, ϵ 是一个用于保持数值稳定的常数, γ 和                 β  是该层的可学习
                 参数.
                    在传统的计算均值和标准差的方法中, 通常需要将所有数据相加, 然后除以数据个数来得到均值, 再遍历每一
                 个样本数据求得标准差. 然而, 当数据量非常大时, 将所有数据相加可能导致精度溢出的问题, 同时进行两次遍历
                 也会造成较大的时间开销. 为了解决这个问题, 并且实现并行化计算, 本文在                        DSP  上实现了适用于多核并行的
                 Welford  迭代计算算法. 程序只需要对数据进行一次遍历, 并利用迭代公式:

                                                            x k − Mean(x k−1 )
                                         Mean(x k ) = Mean(x k−1 )+
                                        
                                        
                                        
                                                                 k
                                        
                                        
                                        
                                        
                                          S (x k ) = S (x k−1 )+(x k − Mean(x k−1 ))×(x k − Mean(x k ))  (7)
                                        
                                        
                                        
                                        
                                        
                                                S (x k )
                                        
                                         Var(x k ) =
                                        
                                        
                                                   k
                    即可计算    k 个数据的均值和标准差, 避免了精度溢出的问题. 其中, S(x) 是迭代计算标准差的中间结果. 此外,
                 Welford  算法的合并公式:

                                         
                                          delta = Mean(x 2 )− Mean(x 1 )
                                         
                                         
                                         
                                         
                                         
                                                                           n 2
                                                                   2
                                         
                                           Var(x) = Var(x 1 )+Var(x 2 )+delta ×n 1 ×                  (8)
                                         
                                                                         n 1 +n 2
                                         
                                         
                                         
                                                                  n 2
                                         
                                          Mean(x) = Mean(x 1 )+delta×
                                         
                                                                  n 1 +n 2
                    也使得可以将数据进行分段处理, 不同的数据段间互不干涉, 从而可以通过一次规约来求得结果, 其中                                n 1 和
                 n 2 代表要合并的两段子数据的长度.
                    具体来说, 在核内分段计算阶段利用迭代公式将每个核内的数据在不同向量间进行迭代, 最终得到长为                                32  的迭
                 代结果. 接着, 在   VPU  内规约和  DSP  簇核间规约时采用合并公式, 将不同数据段迭代得到的结果最终规约为一个值.

                 3.6.3    访存优化
                    在  MT-3000 DSP  上, 每个核都有若干个直接存储器存取          (DMA). 使用  DMA  在各级存储之间搬移数据无需占
                 用计算核心, 可以使得计算和访存最大化的重叠, 提高性能.
                    乒乓算法是一种经典的访存优化技术, 用于实现异步情况下计算和数据传输之间的重叠. 本文在访存时采用
                 乒乓算法, 通过手动编程实现通信和计算最大限度的互相隐藏, 从而取得良好的加速效果, 乒乓算法具体流程如算
                 法  4  所示. DSP 上实现乒乓操作的核心是在 VPU 的 AM 存储器上申请数据所需大小 2 倍的空间, 以存放 2 份相
                 同大小但不同时序的数据互为对方的缓冲. 具体来说: 除去第                  1  轮次的数据读取和最后一轮次的数据写回, DSP 核
                 心在进行本轮的数据计算同时将下一轮数据通过异步                   DMA  加载到   AM  中, dma_p2p & dma_wait; VPU  计算完成
                 后, 再通过异步    DMA  方式将本线程负责的数据块从           AM  拷贝回  DDR. 异步 DMA 方式将计算与主存访问相重叠.
   479   480   481   482   483   484   485   486   487   488   489