百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

测试深度学习库中的Oracle近似研究

sinye56 2024-10-09 19:34 5 浏览 0 评论

摘要

深度学习(DL)应用程序日益普及,测试 DL 库日趋重要。与测试确定输出的通用软件(例如,将输出与 Oracle 进行相等性比较)不同,深度学习库的测试通常需要执行 Oracle 近似,即,输出允许在 Oracle 的限定范围内。然而,尚未有 Oracle 近似方面的相关研究。因此,本文研究测试四个流行的 DL 库而实施的 Oracle 近似断言。本文的研究表明,存在不可忽略的部分断言,这些断言在测试 DL 库时利用 Oracle 近似值。另外,本文通过全面的手动研究确定了正在执行 Oracle 近似的 Oracle 常见来源。此外,本文发现开发人员经常修改与 Oracle 近似相关的代码,即使用其他近似 API,修改 Oracle 或被测代码的输出,并使用不同的近似阈值。最后,本文进行了深入的研究,以了解 Oracle 逼近断言演变的原因。本文的发现揭示了随着 DL 库中代码的发展,开发人员在维护 Oracle 近似实践时可能面临的重要维护挑战。

关键字:软件质量保证,软件测试,测试深度学习库,测试 Oracle

1、 研究背景

深度学习(DL)技术被广泛应用于解决重要的现实世界问题,例如图像和语音识别以及自动驾驶汽车。由于深度学习技术的复杂性和广泛应用,从业人员构建了 DL 库,以使 DL 技术更易于应用程序开发人员访问。现代 DL 应用程序严重依赖于流行的 DL 库,例如 TensorFlow,PyTorch,Theano 和 Keras。DL 库的质量保证实践至关重要,因为它会影响基于其构建的数百万个应用程序。

但是,很少有人关注研究 DL 库中的质量保证实践(即,由 DL 库开发人员编写的测试用例)。这样的测试用例保证了 DL 库中实现的正确性。测试用例不足或质量不佳会影响 DL 库的质量。此外,从 DL 库生成的模型也可能受到负面影响。DL 库,尤其是核心算法模块,大量编码数学公式和算术运算。DL 库中的相应测试用例具有独特的属性,以前的测试用例经验研究并未对此进行研究。

测试 DL 库通常需要 Oracle 近似(简称 OA),而不是明确声明被测代码(CUT)的输出和 Oracle 之间的相等性。由于各种原因,DL 库中需要 Oracle 近似值。 DL 库中实现的输出在每次测试运行中可能会略有不同(例如,由于随机性)。对于测试预言浮动数字的情况,测试人员可能很难在代码中精确定义预言。此外,允许 CUT 的输出与计算的预言值略有不同,例如,当预言机是其他 DL 实现时(即差异测试)。Oracle 逼近是 DL 库在实现断言时采用的基本测试实践。下面是 Keras 的 OA 断言的示例。在代码段中,p 是定义的 Oracle(第 2 行)。 OA 断言(第 4 行)比较了来自二项分布(即 rand,Keras 函数的输出)的样本均值是否足够接近所定义的 Oracle p。定义可接受范围的值称为近似阈值,即下面的代码片段中的 0.015。

Oracle 近似对开发人员提出了新的挑战。首先,开发人员需要为 OA 断言选择合适的预言源。错误的测试预言可能会引入不稳定的测试结果,即不稳定的测试。在代码演化过程中,某些测试 Oracle 的来源可能比其他源更脆弱,并且需要更频繁的更新(即修改测试 Oracle 或可接受的 Oracle 范围)。其次,Oracle 近似值要求开发人员正确确定可接受的 Oracle 的范围。如果范围太宽松,则测试用例将无法检查实现的正确性。如果范围太小,则测试用例将不断失败,并向开发人员引入失败的错误警告。最后,开发人员可能会在 OA 断言的维护和演变中遇到挑战。例如,在 TensorFlow 中测试递归神经网络(RNN)组件时,开发人员将 Keras 的输出用作 Oracle,并使用 Oracle 逼近实现比较。但是,为了适应 Keras 的最新更新,TensorFlow 开发人员必须修改近似阈值(即放宽范围),以避免持续的测试失败。

因此,为了更好地应对挑战,了解 DL 库中当前的 OA 做法很重要。在这项工作中,本文迈出了重要的第一步,研究了 DL 库中的 OA 实践。特别地,本文在四个流行的 DL 库中研究 Oracle 近似的实践和演变。本文的研究提供了定量和定性的结论,以总结常见的实践并强调维护挑战,这些挑战可能会激发未来的研究,从而为开发人员在采用和维护 OA 实践方面提供更好的工具支持,并更好地利用 Oracle 近似值来保证 DL 库的质量。

2、 研究内容

本文通过研究四个流行的 DL 库(即 TensorFlow,PyTorch,Theano 和 Keras)来回答以下四个研究问题(RQ)。

RQ1:在测试深度学习库中实现了多少个 Oracle 近似(OA)断言?

本文研究了在测试 DL 库中 OA 断言的普遍性。本文调查了开发人员在实现 OA 断言时使用的常用 API。本文发现,在 DL 库中,OA 断言存在不可忽略的部分(5%-25%)。 TensorFlow,PyTorch,Theano 和 Keras 通常使用 Numpy 的断言 API 来表示 OA 断言。开发人员可能会大量使用自定义函数来表达 Oracle 近似断言(即 TensorFlow 中的 80%)。

RQ2:OA 断言中使用的常见的预言和阈值类型是什么?

本文进行了一项手动研究,以确定 OA 断言中使用的常见测试 Oracle 类型。本文派生了一个标签系统来指导这一分类过程。本文的研究表明,OA 断言中使用了各种不同的测试预言和阈值。研究还表明,有很大一部分(27%-72%)的测试预言是通过计算得出的。这表明应用自动化的非 Oracle 测试技术(例如,变质测试,差异测试)应仔细考虑并利用 Oracle 近似实践。

RQ3:开发人员对 OA 断言执行哪些代码更改?

本文发现开发人员经常更改 OA 断言,即占所有提交的 7%-20%。在 OA 断言的代码更改中,开发人员经常对 OA 断言执行非外观修改,即最多占所有更改的 34%。开发人员可以从将来的工具支持中受益,以帮助他们更好地管理基于 OA 断言的代码演化。

RQ4:开发人员为什么要对 OA 断言进行更改?

本文对 TensorFlow 中一个测试模块(即内核测试目录下)的所有与 OA 相关的提交进行了深入分析。总共,本文深入分析了 OA 断言中的 71 个提交,包括分析提交中的代码更改,分析其他相关代码,读取提交消息以及在提交之前和之后执行测试用例。

本文发现,OA 断言通常随着代码的发展而被修改。开发人员出于各种原因修改 OA 断言,例如增加测试范围,适应不同的硬件规格,支持不同的数据表示或避免测试失败。本文的研究表明,在保持 OA 断言方面存在挑战,因为没有系统的支持来帮助开发人员管理 OA 断言,例如,检测不正确的阈值以及在代码演变时建议对 OA 断言进行更改。

3、 总结

在本文中,我们提供了有关在测试 DL 库中使用 oracle 近似的实证研究。我们的研究是了解在计算密集型软件(例如 DL 库)中使用 oracle 近似值的当前实践的重要的第一步。我们的工作回答了四个研究问题。首先,我们研究 DL 库测试案例中 oracle 近似的普遍性。我们发现,多达 25%的断言使用 oracle 近似值。其次,我们研究并总结了预言机多样性和预言机近似中使用的阈值。在许多情况下,通过计算可以获得用于 oracle 近似中的 oracle。第三,我们研究开发人员对 oracle 近似断言执行的常见代码更改。最后,我们总结了在 oracle 近似值上代码更改背后的原因。我们的发现揭示了开发人员在 oracle 近似中可能面临的维护挑战,并可能激发未来的研究,以便为开发人员提供更好的工具支持,以更好地管理 oracle 近似实践。

4、 致谢

本文由南京大学软件学院 2018 级博士杨乙霖翻译转述

相关推荐

Linux基础知识之修改root用户密码

现象:Linux修改密码出现:Authenticationtokenmanipulationerror。故障解决办法:进入单用户,执行pwconv,再执行passwdroot。...

Linux如何修改远程访问端口

对于Linux服务器而言,其默认的远程访问端口为22。但是,出于安全方面的考虑,一般都会修改该端口。下面我来简答介绍一下如何修改Linux服务器默认的远程访问端口。对于默认端口而言,其相关的配置位于/...

如何批量更改文件的权限

如果你发觉一个目录结构下的大量文件权限(读、写、可执行)很乱时,可以执行以下两个命令批量修正:批量修改文件夹的权限chmod755-Rdir_name批量修改文件的权限finddir_nam...

CentOS「linux」学习笔记10:修改文件和目录权限

?linux基础操作:主要介绍了修改文件和目录的权限及chown和chgrp高级用法6.chmod修改权限1:字母方式[修改文件或目录的权限]u代表所属者,g代表所属组,o代表其他组的用户,a代表所有...

Linux下更改串口的权限

问题描述我在Ubuntu中使用ArduinoIDE,并且遇到串口问题。它过去一直有效,但由于可能不必要的原因,我觉得有必要将一些文件的所有权从root所有权更改为我的用户所有权。...

Linux chown命令:修改文件和目录的所有者和所属组

chown命令,可以认为是"changeowner"的缩写,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件(或目录)的所属组。当只需要修改所有者时,可使用...

chmod修改文件夹及子目录权限的方法

chmod修改文件夹及子目录权限的方法打开终端进入你需要修改的目录然后执行下面这条命令chmod777*-R全部子目录及文件权限改为777查看linux文件的权限:ls-l文件名称查看li...

Android 修改隐藏设置项权限

在Android系统中,修改某些隐藏设置项或权限通常涉及到系统级别的操作,尤其是针对非标准的、未在常规用户界面显示的高级选项。这些隐藏设置往往与隐私保护、安全相关的特殊功能有关,或者涉及开发者选项、权...

完蛋了!我不小心把Linux所有的文件权限修改了!在线等修复!

最近一个客户在群里说他一不小心把某台业务服务器的根目录权限给改了,本来想修改当前目录,结果执行成了根目录。...

linux改变安全性设置-改变所属关系

CentOS7.3学习笔记总结(五十八)-改变安全性设置-改变所属关系在以前的文章里,我介绍过linux文件权限,感兴趣的朋友可以关注我,阅读一下这篇文章。这里我们不在做过的介绍,注重介绍改变文件或者...

Python基础到实战一飞冲天(一)--linux基础(七)修改权限chmod

#07_Python基础到实战一飞冲天(一)--linux基础(七)--修改权限chmod-root-groupadd-groupdel-chgrp-username-passwd...

linux更改用户权限为root权限方法大全

背景在使用linux系统时,经常会遇到需要修改用户权限为root权限。通过修改用户所属群组groupid为root,此操作只能使普通用户实现享有部分root权限,普通用户仍不能像root用户一样享有超...

怎么用ip命令在linux中添加路由表项?

在Linux中添加路由表项,可以使用ip命令的route子命令。添加路由表项的基本语法如下:sudoiprouteadd<network>via<gateway>这...

Linux配置网络

1、网卡名配置相关文件回到顶部网卡名命名规则文件:/etc/udev/rules.d/70-persistent-net.rules#PCIdevice0x8086:0x100f(e1000)...

Linux系列---网络配置文件

1.网卡配置文件在/etc/sysconfig/network-scripts/下:[root@oldboynetwork-scripts]#ls/etc/sysconfig/network-s...

取消回复欢迎 发表评论: