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

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


                 可能是因为    CPU  端内存同时被操作系统使用, 使得缓存需要频繁进行替换, 造成性能的损失. 而片上的每一个
                 DSP  簇都是一个裸机系统, 其内存区域并没有操作系统, 因此更容易缓存命中.

                           35     CPU mean
                                  MTTorch mean
                           30
                           25
                          平均时间 (ms)  20

                           15
                           10

                           5
                           0
                              eq.Tensot_out norm abs_out  max_out  ceil gt.Tensor_out  _cat reciprocal  sqrt bernoulli_ clamp  triu.out embedding_dense_backward  nll_loss_forward
                                                                     index_select
                                       bitwise_and
                                                                                        nll_loss_backward
                                                                              nll_loss2d_backward
                                                                               native_batch_norm_backward
                                                                         arange
                                                                            nll_loss2d_forward

                                          图 9 虚拟算子与      CPU  同构环境算子性能对比

                 4.3   RQ3: MTTorch  中核心算子的性能提升

                 4.3.1    DSP  算子与 CPU  算子性能对比
                    本文使用    PyTorch  中的  profile 工具统计算子的执行时间. Profile 是 PyTorch 框架中用于对模型进行性能分析
                 和调试的工具之一, 它提供了一个简单的方式来收集 PyTorch 操作的计算时间、内存使用、执行次数等信息. 为
                 了能够直观地评估       MTTorch  中基于  Hthreads 实现的核心算子与    MT-3000 CPU  算子性能上的差异, 本文设计了公
                 式     (9) 中的性能评价指标:
                                                     
                                                        T Hthreads
                                                     
                                                      −     , T Hthreads ⩾ T CPU
                                                     
                                                     
                                                     
                                                        T CPU
                                               P source =                                            (9)
                                                     
                                                        T CPU
                                                     
                                                     
                                                            , T Hthreads < T CPU
                                                        T Hthreads
                 其中, T Hthread 代表  MTTorch  中基于  Hthreads 实现的核心算子运行时间, T CP 为   MT-3000 CPU  上算子的运行时
                                                                            U
                           s
                 间. 在相同情况下, P source  > 1  表示  Hthreads 核心算子性能优于  CPU, 且越大代表   Hthreads 核心算子的性能提升的
                 倍数越大; P source  < −1  表示  MT-3000 CPU  的算子较好.
                    本文分别统计了在不同数据规模下             (2 –2 ), MT-3000 CPU  和  Hthreads 核心算子的运行时间, 结果以  10  个不
                                                 18
                                                    28
                 同的  MT-3000  节点运行取平均为准. 图     10  展示了  CPU  算子和  Hthreads 核心算子性能对比.
                    从图  10  中可以看出, 在数据量小的情况下, CPU         算子略微好于      MTTorch, 但并没有倍数的优势. 而随着数据
                 量的逐渐增大, Hthreads 核心算子的性能优势逐渐明显. 大部分算子都取得了                    2–8  倍的加速效果. 这是由于      DSP
                 线程组的启动有      1 ms 左右的固有开销, 当数据量少的时候, 这个固有开销可能会将                 Hthreads 带来的性能提升抵消
                 掉. 因此, 在实现算子时应该根据传入          Tensor 的数据量大小动态地选择使用         DSP  加速还是使用虚拟算子.
                    此外, 我们发现, 使用     Hthreads 进行实现的算子在稳定性方面要远好于             CPU  同构环境下的算子. 在不同节点
                 上, 使用  Hthreads 加速后的标准差通常都维持在         [0, 1] 之间, 而  CPU  同构环境下的算子, 其标准差却会随着数据
                 规模的增大而不断上升. 考虑算子的稳定性对于大规模分布式训练是必要的, 因为在多节点训练的场景下, 由于短
                 板效应, 模型的整体运行时间往往是由集群中性能最差的节点决定的, 更稳定的节点更有助于系统发挥其性能的
                 上限.
   482   483   484   485   486   487   488   489   490   491   492