Page 115 - 《软件学报》2025年第7期
P. 115
3036 软件学报 2025 年第 36 卷第 7 期
陷的根因以辅助其执行缺陷调试. 发现 9 和发现 10 指出逻辑错误和性能相关的缺陷发生在 Low-level IR 转换阶
段的概率远大于其他两个阶段, 这对开发者定位缺陷的具体位置有很大的引导作用, 同时也能促进自动缺陷定位
方法的设计. 具体来说, 在进行缺陷排查时, 开发者可以优先关注 Low-level IR 转换阶段的代码, 集中精力检查该
阶段潜在的问题, 从而提高缺陷定位的效率. 这不仅减少了排查的工作量, 还可以提升项目的整体开发效率.
最后, 本文的研究发现对缺陷的自动修复技术有一定的指导作用. 比如, 发现 12 指出 78.30% 缺陷修复的补丁
涉及少于或等于 3 个函数. 这表明大部分的 DL 编译器缺陷可以使用自动化修复技术进行修复. 同时, 本文发现多
个不同函数中存在相似的补丁修改情况. 因此, 使用克隆检测技术识别具有相似上下文的函数, 并从中提取部分代
码片段辅助设计自动化修复技术或许是一种可行的方案.
5.2 验证性应用
为了验证本文的研究发现是否切实可用, 我们基于本文研究中的两点发现设计了一种简单的 DL 编译器测试
工具——CfgFuzz. 一方面, DL 编译器中与优化相关的缺陷占比多且增长显著 (发现 2). 另一方面, 张量形状错误
的因为动态张量形状推理特性的而引入而有所增加 (发现 3). 为此, 我们设计一种基于优化组合配置指导的模糊
测试方法 CfgFuzz, 并通过虚拟机编译方式实现对 DL 编译器中张量动态推理特性的功能覆盖检测. 需要注意的
是, 由于 CfgFuzz 工具仅用于验证本文研究发现是否切实可行性和潜在价值, 因此 CfgFuzz 仅采用了朴素的设计
方案. 具体来说, 考虑到 DL 编译器中优化操作设计到 High-level IR 转换阶段图层面的优化和 Low-level IR 转换
中硬件相关的优化, 我们设计了一种细粒度的优化组合配置方法, 以充分地探索优化逻辑代码. DL 编译器的优化
配置选项包括 High-level IR 转换阶段粗粒度的优化等级, 细粒度的优化 Pass 组合和 Low-level IR 转换阶段优化
目标设备与自动调优算法相应的一系列配置选项 (包括自动算法选择、优化器、执行次数等) 等. 为此, CfgFuzz
首先构造了一个 DL 编译器优化选项配置的搜索空间. 具体来说, 优化等级包含 0–4 共 5 个级别, 优化 Pass 组合包
含 25 个细粒度的优化算子 (如 FuseOPs), 优化目标设备包含 LLVM 和 CUDA 两种目标语言, 自动调优算法的执
行次数范围在本文中设置为 0–20 次. 需要注意, 优化等级为 0 表示仅支持最基本的优化操作; 自动调优次数为 0
表示编译过程中关闭自动调优的功能. 为了更全面地探索不同类别优化组合的关联关系, CfgFuzz 采用组合测试
的方法, 在每次测试中从优化配置空间中随机选择一个具体的优化选项, 以深入探索 DL 编译器的不同优化操作
与优化组合.
为了验证 CfgFuzz 的有效性, 我们选择最流行的 DL 编译器 TVM 作为待测软件执行测试任务, 并使用
LEMON [44] 工具作为测试用例的种子生成工具. 由于发现 5 指出崩溃和结果错误是 DL 编译器中最常见的两类缺
陷症状, 我们采用编译是否成功和差分测试作为测试预言. 具体来说, 对于同一模型输入, 如果编译前的 DL 模型
与 DL 编译器编译后的 DL 模型在相同的输入输出的预测结果存在显著不同 (即预测结果之间的切比雪夫距离大
于 1E–3) [37] , 或者 DL 编译器在编译过程中发生程序崩溃, 则认为 CfgFuzz 检测到了一个缺陷. 在编译过程中, 我们
使用 TVM 的虚拟机编译方式 (即 relay.vm.compile) 实现模型的编译任务实现对 TVM 动态张量形状推理功能的
覆盖. 在 24 h 的测试过程中, CfgFuzz 共检测到 8 个缺陷, 其中 7 个缺陷已被开发者确认. 检测到的缺陷详细信息
见表 8.
表 8 CfgFuzz 检测到的缺陷
序号 症状 根因 阶段 缺陷状态
1 结果错误 优化相关逻辑错误 Low-level IR转换 已修复
2 崩溃 张量形状错误 High-level IR转换 已确认
3 结果错误 张量形状错误 Low-level IR转换 已确认
4 崩溃 - - 等待确认
5 结果错误 优化相关逻辑错误 High-level IR转换 已确认
6 崩溃 异常处理错误 High-level IR转换 已确认
7 崩溃 张量形状错误 High-level IR转换 已修复
8 崩溃 张量形状错误 模型加载阶段 已修复

