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

3900                                                       软件学报  2025  年第  36  卷第  8  期


                 用户对计算任务的需求. Hthreads 通过引入 DMA 技术实现高效的数据传输. 在优化案例中, Hthreads 性能显著优
                 于  MOCL3  [20] . 总体而言, Hthreads 的设计更贴近  MT-3000  芯片的底层架构, 在允许用户对 DSP 进行精细控制、
                 降低内核启动开销的同时, 也兼顾了可编程性和灵活性.
                    图  2 展示了  MT-3000 的各层级编程模型, 越接近底层编程模型效率越高, 但是其开发和维护难度也就越大.
                 综合考虑性能、可编程性、可读性等因素, 本文选择可以嵌入到 C 语言中的高级编程模型 Hthreads 作为开发
                 模型.


                                                          OpenCL
                                                                            编
                                                     异构多线程库 (Hthreads)      程
                                           可                                模
                                           编                    高性能数学库      型
                                           程                                性
                                           性                    原语操作集       能
                                               加速管理接口 (Iibmt)  C+Intrinsic/汇编
                                                                汇编指令集
                                                图 2 MT-3000  用户层编程模型


                 3   MTTorch  的实现与优化

                 3.1   MTTorch  设计背景
                    原生  PyTorch  框架中囊括了近千个算子, 为框架中所有算子都进行精心优化是一个庞大的工程. 考虑到大模型训
                 练对于计算需求的迫切性, 本文工作聚焦于在新一代天河超算上实现和优化                       Transformer 类大语言模型训练任务.
                    首先, 我们在 MT-3000 的 CPU 上训练 PyTorch Examples (https://github.com/pytorch/examples) 官方项目中的
                 Transformer 模型至  loss 下降趋于稳定, 并使用   PyTorch 中的 profile 工具详细统计分析了模型训练过程中的各算
                 子的平均耗时     (如表  2 所示). 前  15  个算子的总耗时占比就高达       82% (如图  3  所示). 这为后续的算子优化提供了明
                 确的方向和依据. 本文将这        15  个算子定义为   Transformer 类模型的核心算子, 优化好这       15  个算子就可以极大地提
                 升模型的计算性能.

                                            表 2 Transformer 类模型中耗时大的算子

                            函数名称                     算子功能              时间占比 (%)        平均执行时间 (ms)
                              mm                     矩阵乘法                46.20              19.454
                        softmax/log_softmax        归一化指数函数               12.47             141.763
                          add/sub/mul/div           加, 减, 乘, 除           11.24               3.87
                     softmax_back/log_softmax_back  softmax的反向传播          3.95              44.959
                              bmm                   批矩阵乘法                 2.41              3.309
                         native layer_norm          层内归一化                 2.00              2.147
                              sum                   Tensor求和              1.94              2.511
                             copy_                   数据拷贝                 1.88              2.452
                       ReLU_back/GELU_back        激活函数反向传播                0.95              28.01
                              _cat                  Tensor拼接              0.82               3.23
                           ReLU/GELU                 激活函数                 0.57              15.91
                    表  2  中算子可分为   3  类. 第  1  类是如 cat、copy 等访存密集型操作, 并不涉及计算, 可以直接使用 DMA 进行
                 实现. 第  2  类为 pointwise 类型算子, 即 Tensor 中对应位置进行计算操作, 主要为计算耗时, 访存消耗较小. 第               3  类
                 为需要进行规约操作的算子, 如 layer_norm. 这一类算子在计算和访存方面都存在瓶颈问题, 且在规约过程中可能
                 遇到数值溢出. 综上所述, 本文面向         MT-3000  的体系结构特性, 对耗时占比高的         15  个核心算子进行了精心优化.
   472   473   474   475   476   477   478   479   480   481   482