Page 109 - 《软件学报》2025年第7期
P. 109
3030 软件学报 2025 年第 36 卷第 7 期
这个结果表明, 在 DL 编译器中处理类型问题是非常容易出现错误的, 尤其是张量类型问题. 由于其易错性和重要
性, 开发者应该更加关注张量类型方面的操作. 尽管类型错误是一类较为容易引入缺陷的根因, 但是分析发现, 关
于类型的数据结构已经设计较为完备, 例如, 在 3 年的时间里, TVM 源码中与数据类型相关的数据结构定义文件
行代码变更频次不足 0.16, 显著低于总体的代码修改频率 (即 0.61). 本文所研究的 3 款 DL 编译器中均没有很大
的代码变更, 这也导致此类缺陷占比下降较为显著.
发现 4. 类型错误在 DL 编译器缺陷中依然是一类常见的根因, 特别是张量类型错误. 但其占比下降较为显著
(减少 7.01%). 这主要得益于类型相关的数据结构及代码已较为完善.
4.2 RQ2: 症状
4.2.1 症状分类
● 崩溃. 崩溃是指 DL 编译器在编译过程中意外终止, 通常会在终止后抛出一个错误信息.
● 结果错误. 结果错误是指在 DL 编译器没有意外终止的情况下, 以期望之外的方式产生了一个错误的结果
或中间结果, 例如优化后生成了非等价的代码中间表示.
● 性能问题. 性能问题是指 DL 编译器所花费的时间成本或内存开销远远大于开发者或用户的期望值, 期望
值是回归测试中 DL 编译器上一个版本所达到的性能, 或特定硬件的性能要求.
● 挂起. 挂起意味着 DL 编译器持续运行了很长一段时间, 但没有输出期望的结果.
● 构建失败. 构建失败是指 DL 编译器的安装过程意外终止.
● 未报告. 除了上述类别之外, 还有一些 DL 编译器错误, 其症状不属于以上任何一类或不能通过获取到的任
何信息确定, 则将其分类为未报告.
4.2.2 症状分布情况
图 4 中展示了按症状类别的缺陷数量分布. 从图中可知, 崩溃一直是 DL 编译器缺陷最常见的症状, 该类缺陷
占缺陷总数的 55.46%–59.37%. 在本工作的缺陷数据中, 分别有 244 个 TVM 缺陷、53 个 Glow 缺陷和 43 个
AKG 缺陷的症状表现为崩溃. 目前对 DL 编译器的测试工作 [13,38−41] 均使用了模型编译过程是否发生崩溃作为测
试预言, 并检测到较多此类缺陷. 其中, Tzer [37] 检测到了 32 个 TVM 崩溃缺陷, NNSmith [41] 检测到了 13 个 TVM 崩
溃缺陷, HirGen [13] 检测到了 8 个崩溃缺陷, 然而, 这些测试技术均没有应用到 Glow 和 AKG 上. 将已有测试方法迁
移应用到其他 DL 编译器上或许可以揭露出 Glow 和 AKG 中更多的崩溃缺陷. 此外, 设计能够同时检测所有 DL
编译器的通用测试方法变得尤为重要.
崩溃 358 340
结果错误 151 165
构建失败 50 42
性能问题 11 29
未报告 28 25
新数据 (右)
旧数据 (左)
挂起 5 12
400 300 200 100 0 100 200 300 400
图 4 不同时期缺陷症状分布对比图
结果错误是指 DL 编译器产生错误的代码中间表示或非预期结果. 根据图 4 可知, 结果错误同样属于常见症
状, 在不同时期的此类缺陷的占比为 25.04%–26.92%, 其中包括 115 个 TVM 缺陷、21 个 Glow 缺陷和 29 个
AKG 缺陷. 由于此类缺陷会在编译的过程中将缺陷传播到所有受编译的 DL 模型中, 从而引起更广泛的缺陷影响.
为了捕获此类缺陷, NNSmith [41] 使用模型编译前后在相同输入下的预测结果是否一致作为测试预言, 并检测到 3
个此类缺陷. HirGen [13] 使用 DL 编译器在不同优化级别或不同编译模式下对模型的编译结果是否相同作为新的测

