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 编译器中的所有深度学习计
算都依赖于一个或多个张量. 因此, 在编译过程中存在大量的类型转换 (尤其是隐式类型转换) 和类型推断操作.

