Page 108 - 《软件学报》2025年第7期
P. 108

沈庆超 等: 深度学习编译器缺陷实证研究: 现状与演化分析                                                   3029


                 码逻辑造成的缺陷, 45     个由错误的非优化代码逻辑造成的缺陷. 随着深度学习的迅猛发展, DL                      编译器中的优化算
                 法也随之频繁更新, 以便与深度学习算法和目标硬件平台的快速发展相适应. 例如, 在过去                           3  年中, TVM  的源码平
                 均每行发生了     0.61  次修改  (TVM  版本区间: e31564e1e–d85ea256f). 因此, 复杂且频繁迭代的代码逻辑会导致在
                 DL  编译器的实现中引入更多的逻辑缺陷. 此外, 由于优化算法的复杂性和需要处理不同类型硬件的优化需求, 优
                 化代码往往比非优化代码更复杂. 因此, 优化相关的逻辑缺陷占比                    61.86%, 高于非优化的逻辑错误.

                               逻辑错误     102                                                118
                            张量形状错误            80                                     87
                               API 误用             59                               79
                               类型错误 116                                           75
                            异常处理错误                 58                            69
                               配置错误                   42                  40
                               赋值错误                     36               35
                               并发问题                         13          30
                                不兼容                   41               25
                            数值计算错误                        23           24
                               注册问题        新数据 (右)             5     14
                               拼写错误        旧数据 (左)          16      9
                                  其他                         12    8
                                      120    90    60     30     0     30     60    90     120
                                              图 2 不同时期缺陷根因分布对比图

                    发现  2. 逻辑错误已成为      DL  编译器缺陷的主要根因, 占比高达         19.25%. DL  编译器的复杂逻辑和高频迭代使
                 得逻辑错误    (特别是优化相关的逻辑错误) 占比显著上升.
                    张量形状问题上升至第         2  类最常见的缺陷根因, 包含        87  个缺陷, 占  DL  编译器缺陷的    14.19%, 包括  53  个
                 TVM  缺陷、9  个  Glow  缺陷和  15  个  AKG  缺陷. 由于张量在  DL  编译器中发挥重要作用, 且张量形状属于张量的
                 一个重要属性, 所以      DL  编译器中除张量类型转换操作外, 也存在大量针对张量形状的操作. 深入分析发现, 当下
                 DL  编译器引入了动态的张量形状推理的新特性, 这使得                DL  编译器关于张量形状问题的缺陷数量与比例有一定
                 量的上升. 具体来说, 87    个张量形状问题的缺陷中有           22  个缺陷和动态张量形状推理相关. 图         3  展示了一个张量形
                 状推理错误导致性能缺陷的例子, 如果一个模型中有多个                   alter_op, 第  1  个  alter_op  操作不会触发类型推断, 所以
                 在执行后续的     alter_op  操作时, 张量形状信息将无法自动获得. 因此, 开发者通过手动添加张量形状动态推理操作
                 来获取数据的对应张量形状.












                                       图 3 一个与张量形状错误相关的缺陷             (TVM#PR-7308)

                    发现  3. 由于张量形状动态推理等新特征的引入使得张量形状问题的缺陷比例有所上升.
                    类型问题从最常见的缺陷根因下降为第               4  常见的缺陷根因, 占比下降       7.01%. 此类根因共引入     75  个缺陷, 包
                 括  TVM  中  54  个、Glow  中  14  个以及  AKG  中  7  个. 进一步分析发现, 这类缺陷包含  3  个子类, 分别是节点类型错
                 误, 张量类型错误和传统数据类型错误. 具体来说, 在              75  个类型缺陷中, 30  个缺陷是由于张量类型错误引起的, 40
                 个缺陷是由于传统数据类型错误引起的, 5             个缺陷是由节点类型错误引起的. 从中我们发现张量类型错误是类型
                 错误中最常见的子类. 这是因为张量在            DL  编译器中频繁出现且发挥着重要作用. DL            编译器中的所有深度学习计
                 算都依赖于一个或多个张量. 因此, 在编译过程中存在大量的类型转换                       (尤其是隐式类型转换) 和类型推断操作.
   103   104   105   106   107   108   109   110   111   112   113