CRADLE:跨后端验证可检测和本地化深度学习库中的错误

2020-6-19 11:26 2597 50

在本文中,做出了以下贡献:

  • 通过交叉检查同一模型的多个实现以检测不一致和错误的新方法来测试 DL 软件。
  • 使用异常传播跟踪和分析来定位跨模型不一致的故障功能的第一种方法; 和
  • 对 30 种 DL 模型,11 个数据集(包括 ImageNet,MNIST,Udacity Challenge 2 和 KGS Go 游戏)和 15 种 Keras 版本(包括最新版本)的测试和本地化技术进行了评估。

我们的结果表明,CRADLE 在 DL 软件中检测到 12 个错误(其中 9 个已由开发人员修复),这些错误导致 30 个模型中的 28 个存在不一致,其中 3 个以前未知的错误,其中 2 个已被开发人员确认。 CRADLE 突出显示了与所有 104 个唯一不一致,不一致原因相关的功能。 CRADLE 的端到端平均运行时间少于 5 分钟,这表明 CRADLE 是实用的。

摘要

深度学习(DL)系统广泛用于飞机防撞系统,阿尔茨海默氏病诊断和自动驾驶汽车等领域。尽管需要高可靠性,但 DL 系统很难进行测试。

现有的 DL 测试工作重点在于测试 DL 模型,而不是模型的实现(例如 DL 软件库)。测试 DL 库的一个关键挑战是在给定输入实例的情况下很难知道 DL 库的预期输出。幸运的是,在不同的 DL 库中有相同 DL 算法的多种实现。

因此,我们提出了 CRADLE,这是一种新方法,专注于发现和本地化 DL 软件库中的错误。 CRADLE(1)执行交叉实现不一致检查以检测 DL 库中的错误,而(2)利用异常传播跟踪和分析来定位导致错误的 DL 库中的错误功能。我们在三个库(TensorFlow,CNTK 和 Theano),11 个数据集(包括 Ima-geNet,MNIST 和 KGS Go 游戏)和 30 个预先训练的模型上评估 CRADLE。 CRADLE 检测到 12 个错误和 104 个唯一不一致,并针对所有 104 个唯一不一致突出显示与不一致原因相关的功能。

关键字:深度学习软件测试;交叉实施测试;错误检测;软件测试;

引言

深度学习(DL)已广泛用于许多领域,包括飞机防撞系统,阿尔茨海默氏病诊断,自动驾驶汽车。此类系统中的错误可能会造成灾难性的后果,例如,Uber 的自动驾驶汽车 DL 系统中的软件错误导致行人死亡。不幸的是,DL 算法难以理解。 普通用户并不了解 DL 算法的所有细节。 高级 DL 应用程序开发了成熟的编程接口(API),使用户可以在不了解神经网络内部工作的情况下构建 DL 系统。 这些高等 API 依赖于 DL 算法的低级库。

CRADLE:跨后端验证可检测和本地化深度学习库中的错误

图 1 展示了典型的 DL 库的结构。开发人员使用高级库 API(例如,Keras API)编写代码。 这些 API 调用实现特定 DL 算法的低级库。 TensorFlow(Google),Theano 和 CNTK(Microsoft)等低级库实现了相同的算法,例如卷积神经网络(CNN)和递归神经网络(RNN)。 低级库使用不同的输入格式并提供不同的 API,而高级库允许用户在不同的低级库之间无缝切换。 调用低层库的组件称为高层库和低层库之间的接口。 每个接口和低级库(称为后端)均提供 DL 算法的实现。后端训练和测试 DL 模型。 DL 模型包含 DL 网络和参数(也称为权重)。

Keras 是最受欢迎的深度学习高级库。 Keras 已用于在关键领域实施神经网络,包括飞机避撞系统,炎症性肠病诊断,化学反应预测,医学影像,空气质量控制和计算机网络安全性。

后端和高级库会包含错误,这些错误难以查找和修复。一个关键的挑战是,开发人员很难知道给定输入实例的预期输出。 DL 后端实现使用复杂网络和数学公式的 DL 模型。 因此,如果有可能的话,对于给定任意输入实例的情况,人类很难产生 DL 后端的预期输出。 例如,给定一个数字为'1'的输入图像(地面真实情况为'1')和一个数字分类模型,该模型在该图像上的预期输出不一定是'1',因为模型通常会 由于其局限性而导致分类错误(很少达到 100%的分类准确度)。 现有的 DL 测试工作专注于生成使基础事实与模型输出不一致的输入实例,以便 DL 用户和构建者可以改进模型。

模型必须由后端库实现。 如果后端库无法如实实现模型(例如,由于后端中的错误),则即使模型正确,后端的输出也可能是错误的,反之亦然。 错误实现的 DL 后端可能导致上述数字分类模型针对相同的图像“ 1”输出“ 9”,即使 DL 模型的预期输出为“ 7”。 另外,DL 后端可能会输出意外匹配地面实况的“ 1”。 错误的输出可能会误导 DL 用户和构建者的调试和修复过程。 输出掩盖了实现错误,这使其很难被检测到。

很少有人关注测试模型实现的正确性。 取而代之的是,许多技术测试了模型的正确性,这些模型假定后端实现是正确的。 模型和后端实现都需要正确,以使 DL 算法产生正确的输出。 测试 DL 后端实现的至关重要的任务是具有挑战性的,因为难以获得所说明的后端的预期输出。

具有相同功能(即相同 DL 算法)的多个实现(即 DL 后端)为我们提供了一个独特的机会,可以检测这些实现之间的不一致之处,以在 DL 后端库中查找错误。 例如,如果在两个 CNN 实现(例如 TensorFlow 和 CNTK)上运行时,相同的 CNN 模型(即具有相同权重的相同 CNN 网络)具有不同的行为,则其中一个 CNN 实现很可能是不正确的,而无需了解 预期的输出。

CRADLE:跨后端验证可检测和本地化深度学习库中的错误

图 2 显示了一个错误,该错误导致两个后端不一致。输入图像(图 2a)在 ImageNet(手动标记图像的流行数据集)中被手动标记为培养皿(事实)。 图 2b 显示了在 Keras 2.2.0 上分别具有 TensorFlow 和 CNTK 后端的预训练模型 InceptionResNetV2 对图像的分类结果。 带有 TensorFlow 后端的模型将图像正确分类为培养皿是其首选,而具有 CNTK 的相同模型将图像分类为模拟时钟,而培养皿不在前 5 名。

一旦检测到不一致,最大的挑战就是在 DL 后端库的许多功能中识别出故障的功能。 例如,一次暴露图 2 中不一致错误的运行,包含 781 个后端函数的调用。 遵循 InceptionResNetV2 模型的复杂调用路径,对于开发人员来说,很难弄清 batch_normalization 函数是错误的。

为了在 DL 后端之间自动检测和定位这种不一致,我们提出并实现了一种新颖的方法-CRADLE。 给定一个 DL 模型及其输入数据,CRADLE(1)使用两个距离度量在不同后端上比较模型的输出以检测不一致的输出,并且(2)通过跟踪执行过程图中的异常传播来识别不一致的位置。 通过识别两个后端之间的差异幅度的峰值,CRADLE 指出了后端中引入不一致的功能,这对于开发人员调试和理解该错误非常有用。

包括图 2 中的示例在内,CRADLE 识别了 580 张图像(从 ImageNet 的 5,000 个随机样本中),这些图像触发了 InceptionResNetV2 模型的不一致分类。 然后,CRADLE 成功地定位了故障功能(bathnormalization)。 在界面中报告此错误之后,开发人员已修复自 Keras 2.2.1 以来的错误。 图 2c 显示了此修复程序。 批处理规范化公式在 CNTK 后端的函数 batchnormalization 中的实现不正确:它应采用(var + epsilon)的平方根而不是 var 的平方根。


推荐阅读
增加压电变送器蜂鸣器音频输出的设计技术 2020-06-17 18:15
什么是m2m,M2M架构包含那些技术组成部分? 2019-09-10 18:03
稳压二极管的稳压电路解决方案,电流不足缺陷问题 2020-10-21 16:51
什么是AAU功耗深度休眠,5G基站休眠能节省多少电费? 2020-08-21 14:33
安卓手机复杂九宫格解锁密码破解是什么原理? 2019-09-11 16:30