信息时期涌现出的海量数据不停推动着智能本事的转变. 2006年, Hinton等东谈主[1]初次提倡深度神经汇集(deep neural network, DNN)的观念, 从此开启深度学习(deep learning, DL)时期. 之后, 随同海量数据存储资本的快速下跌和图形处理器(graphics processing unit, GPU)等基础硬件策画性能的不停进步, DNN所具备的执意身手得以充分阐扬, 渐渐成为引颈东谈主工智能海潮的要道本事[2]. 在深度学习本事发展的驱动阶段, 相关东谈主员在联想搭建不同功能的DNN模子时常常需要编写无数的重叠代码. 因此, 为了提高使命着力, 更好地已矣深度学习任务, 相关东谈主员入手将开发DNN模子的必要过程编写成算子(operator)和应用轮番接口(application program interface, API)供其他东谈主径直调用, 从而大幅责问了深度学习本事的门槛. 在不停积攒发展的过程中, 涌现出越来越多的用于构建DNN模子的DL框架暗网人兽, 比如TensorFlow[3]、PyTorch[4]和MindSpore[5]等.
如图1所示, DL框架渐渐占据对应用场景和硬件适配的双向主导权, 起到起承转合的作用——进取联络海量应用场景, 举例图像处理[6], 语音识别[7], 以至是自动驾驶系统[8]等安全要道领域; 向下适配各类硬件基础设施, 快乐不同硬件架构和部署环境下的策画需求. 以2023年华为发布的PanGu-Σ[9]大言语模子(large language model, LLM)为例, PanGu-Σ参数目多达1.085万亿, 在完成各类汉文言语理罢免务时的性能达到业界先进的水平. 这类大限制复杂深度学习模子的踏实运行, 恰是依赖于MindSpore深度学习框架的极优联想与正确已矣.
Fig. 1 Application diagram of deep learning frameworks 图 1 深度学习框架应用表示图比较于DL框架的无为应用, DL框架中潜在的问题常常容易被疏远, 其安全性和质料难以得到保险. 举例, 2016年谷歌的一辆自动驾驶汽车因为里面深度学习系统对路况的失实假定而低速撞向公交车的侧面, 激勉车祸[10]; 2.3.24以下版块的PyTorch接收了不安全的YAML文献加载花样[11], 攻击者利用这个安全随意不错将坏心代码添加到经过预教练模子真是立文献中, 导致模子性能责问或资源中断. DL框架手脚东谈主工智能领域的要道基础软件, 其安全性和质料尤为伏击. 但面前DL框架关系的测试相关还比较滞后, 其颓势本性难以明确, 测试方法和评价方针尚未系统化, 况兼尚莫得以DL框架为相关对象的综述论文发表.
手脚DL框架测试相关综述, 本文共调研分析55篇与DL框架测试相关径直关系的论文(关系论文来源已上传至https://github.com/maxy-635/DLFrameworkSurvey). 在了解DL框架颓势本性的基础上, 本文主要柔柔奈何高效地生成测试输入(测试输入生成问题), 奈何判断DL框架的输出活动是否适当预期(测试预言问题), 以及奈何评估DL框架测试的有用性和充分性(测试评估问题)这3个相关问题. 本文梳理现存的DL框架测试相关论文, 聚焦基于不同测试输入阵势的DL框架测试方法, 总结奈何期骗拖沓测试等要道本事来措置框架测试中的上述3个相关问题. 本文不错匡助DL框架相关领域的相关东谈主员尽快了解智力域的最新进展和亟待措置的难题, 同期有助于DL框架开发和调换东谈主员了解面前DL框架中存在的颓势特色, 掌抓开端进的DL框架测试本事. 具体来讲, 本文主要孝顺如下.
(1) 系统化梳理针对DL框架颓势本性的实证相关使命, 总结DL框架颓势的类别偏执本性.
(2) 分析DL框架测试亟需措置的相关问题偏执对应测试本事, 总结不同测试本事的应用情况和局限性.
(3) 分析基于不同输入阵势的DL框架测试方法, 探究每篇论文中奈何期骗具体测试本事措置相关问题.
(4) 总结面前DL框架测试尚未措置的难点问题, 并对将来的相关场所给出建议.
2 深度学习框架配景常识本节简要先容深度学习框架的配景常识, 包括其发展历程和基本架构.
2.1 发展历程深度学习框架和深度学习算法之间相互依赖的良性轮回推动了深度学习框架和器用的快速发展. 如图2所示, 本文将DL框架发展历程总结为3个阶段, 并总结归纳不同阶段DL框架的本事特征.
Fig. 2 The development history of deep learning frameworks 图 2 深度学习框架发展历程21世纪初至2010年, 第1阶段的DL框架以剧本式言语为本事特征, 主要面向部分学术相关领域. 神经汇集的观念被提倡之后, 一些不错用于描摹和联想DNN的器用入手出现, 比如Matlab[12]、OpenNN[13]、Torch[14]和Theano[15]等. 这些早期的开发器用使用时主要接收剧本式编程, 通过浅易确立文献的阵势构造神经汇集, 其有限的活泼性难以快乐深度学习本事的快速发展需求.
2012年入手, 第2阶段的DL框架入手以数据流图(dataflow graph, 也称策绘图)为本事特征, 通过张量(tensor)在算子之间的流动完成模子教练的任务, 主要面向大限制产业应用. 谷歌东谈主工智能相关团队接收静态图编程范式研发的TensorFlow于今仍是最流行的DL框架之一. Facebook东谈主工智能相关团队接收动态图编程范式, 在Torch的基础上开发出PyTorch. 从此, TensorFlow和PyTorch分别成为DL框架“数据流图时期”两种编程范式的代表. 同期被研发出的DL框架还有Caffe[16]、Chainer[17]、Caffe2[18]、CNTK[19]、MXNet[20]和Keras[21]等, 开发东谈主员不错使用这些框架快速搭建复杂的DNN模子.
2019年于今, 第3阶段的DL框架渐渐发展成以“动静和洽, 即时编译”为本事特征, 主要面向特定领域优化. 第3阶段的DL框架普遍接收动静和洽的编程范式, 不错将动态图和静态图的优点相结合, 兼顾编程的活泼性和策画的高效性. 华为面向端、边、云场景研发了MindSpore, 通过即时编译的阵势已矣编译阶段中间抒发式自动差分的攻击. 值得疑望的是, 第3代DL框架面向特定领域进行优化, 通过将特定领域言语(domain-specific language)[22]镶嵌到Python、Java和C++等传统编程言语中. 举例JAX[23]将NumPy的上风与硬件加快相结合, 得当高性能机器学习领域相关.
2.2 基本架构深度学习框架架构各有不同, 但都具备一些共有的基本功能和本性. 如图3所示, 本文参考关系辛苦[24], 将DL框架从底层已矣到应用分为4个层级, 由低到高分别是算子已矣、策绘图(computation graph)优化、API调用和DNN模子构建. 其中, DNN模子是DL框架的径直应用, 部分测试相关使命将DNN模子手脚测试DL框架的输入, 考证DL框架已矣是否存在颓势, 因此在本节中一并进行先容.
Fig. 3 Composition and application architecture of deep learning frameworks 图 3 深度学习框架组成及应用架构(1) DL框架提供了构建DNN模子的器用和接口. 开发东谈主员不错利用DL框架提供的API来自界说DNN模子的结构, 成立优化算法和选拔亏本函数等, 使模子在践诺任务中得到应用. 此外, DL框架不错将联想出的DNN模子攻击为策绘图的阵势进行优化.
(2) API是DL框架中一组函数、类和方法的聚拢, 用于界说高档的抽象关系, 不错便捷地被用户径直调用来构建、教练和部署DNN模子. 笔据DL任务的使命经过, 不错将API其分为4类.
1) 数据处理: 已矣数据清洗、数据攻击和数据归一化等功能, 使其快乐DNN模子的相应圭表.
2) 模子搭建: 构建模子结构并为模子确立一组超参数, 比如用户不错调用Keras中Sequential类API联想DNN模子的每一层.
3) 模子教练: 已矣反向传播算法, 自动微分和权重更新等功能.
4) 模子推理: 匡助用户快速部署预教练的DNN模子, 包括预测精准度等评估方针的功能已矣.
(3) 策绘图是DNN模子在后端施行时的一种中间表示(intermediate representation), 其中的每个节点(node)代表算子, 边(edge)代表数据. 数据输入在策绘图中“流动”并调用关系基本算子完成数据攻击和策画任务. 不错将策绘图关系功能已矣分为3类.
1) 图构造: 对DNN模子进行分析, 获取汇集层之间的伙同拓扑关系以及参数变量成立等信息, 将圆善的模子描摹编译为可被后端策画硬件调用施行的代码文本.
2) 图优化: 已矣常量折叠、大家子抒发式摒除和算子交融等, 以提高策画性能.
3) 图施行: 笔据策绘图结构和策画依赖关系对算子进行调度, 对图进行切分来获取子图以进行散播式施行, 提高策画着力.
(4) 算子是DL框架中最基本的组件, 举例卷积算子、池化算子等. 在策绘图中, 算子将张量等参数手脚输入, 用于施行特定的策画操作.
《乳色吐息》无删减在线观看 3 本文综述方法本节内容先容奈何围绕DL框架测试相关伸开综述, 包括论文收罗、论文分析和本文举座的综述结构这3方面内容.
3.1 论文收罗由于DL框架测试是一个软件工程和东谈主工智能交叉的相关领域, 很难径直利用少数几个要道词就得到覆盖内容较全面的论文. 为了对该相关问题作念系统地调研和梳理, 本文接收要道词组合检索战略和“滚雪球”查找战略[25](snowballing strategy)收罗DL框架测试相关关系论文, 具体智力如图4所示.
Fig. 4 Paper collection method 图 4 论文收罗方法本文华取要道词组合检索战略, 通过以下相关对象和相关方法要道词的相互组合在伏击的文献数据库(Web of Science、IEEE Xplore和arXiv)中检索出备选论文, 之后通过阅读全文将与相关主题不关系的论文去除, 得到和相关内容径直关系的种子论文36篇.
① deep learning [framework|library]+[exploratory|empirical|comprehensive] study
② deep learning [framework|library]+[bug|fault|issues|problem]+understanding
③ deep learning [framework|library]+[fuzz|metamorphic|differential|mutation] testing
④ deep learning [API|operator|graph]+[fuzz|metamorphic|differential|mutation] testing
本文进一步选定两次“滚雪球”查找战略, 最初通过查阅种子论文的援用文献和被引文献, 得到更多新论文. 其次, 分别由两位共事通过阅读论文标题和摘抄进行判断, 去除与相关主题不关系的论文, 当审阅意见不一致时, 通过阅读正文内容并进行接洽决定是否将该篇论文纳入综述范围. 通过重叠两遍“滚雪球”战略, 共检索到17篇关系论文.
为使综述内容愈加全面和准确, 本文在检索论讳疾忌医程中, 如果在种子论文中发现高引著述, 则笔据其第一作家或通讯作家跟踪其关系相关内容的论文. 除海外学术会议与期刊外, 本文对 《策画机学报》 《软件学报》 《策画机相关与发展》 《策画机工程与科学》 等国内策画机和软件工程领域高质料科技期刊的论文进行东谈主工检索, 手脚国内关系相关使命来源的补充. 终末, 为止2023年9月底, 本文最终详情出与DL框架测试相关径直关系的论文55篇.
3.2 论文分析为更好地了解深度学习框架测试相关的国表里相关近况, 本节对调研到的论文特征进行统计和分析. 如图5所示, DL框架测试相关论文大多在近两年发表(2023年部分论文尚未公开), 剖判DL框架测试相关尚处于初期且正处于快速发展阶段, 将来会受到更多相关东谈主员的柔柔.
Fig. 5 Distribution of published papers by year 图 5 论文发表的年份散播本文对已发表论文所属的出书物及出书物类型, 第一单元偏执所在国度进行统计分析. 如图6所示, 与期刊比较, 会议中收录的相关使命较多, 占比杰出60%; 大部分论文均发表在由中国策画机学会评级为A和B的会议或期刊中, 具有一定的泰斗性. 举例, 软件工程海外会议(international conference on software engineering, ICSE)是软件工程领域公认的旗舰学术会议. 此外, 中国和好意思国事对DL框架相关使命最多的两个国度; 好意思国的伊利诺伊大学香槟分校发表论文数目最多, 其次是中国的南京大学、天津大学和北京航空航天大学等高等院校.
Fig. 6 Distribution of published papers by features 图 6 论文特征散播 3.3 综述结构手脚DL框架测试相关综述, 本文在梳理总结DL框架颓势本性的基础上, 主要探讨奈何高效地生成测试输入(测试输入生成问题), 奈何判断DL框架的输出活动是否适当预期(测试预言问题), 以及奈何评估DL框架测试的有用性和充分性(测试评估问题)这3个要道问题. 本文通过梳理现存的DL框架相关论文, 笔据不同的测试输入阵势, 将现存相关使命总结为3类, 分别是: 以DNN模子为输入的系统测试, 以策绘图为输入的系统测试和以特定参数为输入的组件测试. 此外, 本文在对每篇论文进行分析时要点探讨奈何笔据不同测试输入阵势的特色, 结合具体测试要道本事来措置测试相关问题.
本文后续章节对DL框架测试相关作念综述分析, 具体组织结构如图7所示. 本文第4节对DL框架颓势本性实证相关进行总结, 主要包括实证相关方法阐发和颓势本性的总结分析两部安分容, 其中后者分为面向一般类别颓势的举座性相关和面向特定类别颓势的针对性相关两部分; 第5节主要对DL框架测试中要点柔柔的测试输入生成、测试预言和测试评估3个相关问题偏执对应的测试要道本事进行分析; 第6节从测试方法的总体联想角度探讨, 笔据不同的测试输入阵势, 将现存相关使命进行分类、分析和总结; 第7节对DL框架将来相关场所进行预计; 第8节对本文全篇内容进行总结.
Fig. 7 The structure of survey on deep learning frameworks testing 图 7 深度学习框架测试相关综述结构 4 深度学习框架颓势本性软件颓势指存在于软件中的那些不但愿或不可禁受的偏差, 其末端是软件运行于某一特定条款时出现软件故障[26]. 软件系统常常限制渊博, 功能复杂, 在其开发和调换过程中, 岂论开发和测试东谈主员有何等丰富的训戒, 都不可幸免地存在颓势. 颓势会对软件系统的可靠性酿成要紧阻难, 尤其是对于安全要道软件, 一朝出现故障会酿成巨大的经济和安全亏本.
DL框架手脚东谈主工智能领域中的一类软件, 雷同会存在不同特征的颓势. 惟有对DL框架里面颓势有宽裕充分的意志, 相关东谈主员才不错联想出更有针对性的颓势检测与定位方法. 因此, 领略颓势本性是提高DL框架质料, 保证DL应用安全踏实的基础. DL框架颓势本性是本文首要柔柔的内容, 本节内容最初对现存使命普遍接收的实证相关方法进行阐发; 其次, 本节内容将现存使命分为面向一般类别颓势的举座性相关和面向特定类别颓势的针对性相关两类进行总结分析. 如后文图8所示, 面前边向特定类别颓势的相关占比65%, 面向一般类别颓势的相关占比35%. 关系相关着力将有助于开发东谈主员选定相对应的措施减少颓势, 同期也有助于相关东谈主员有针对性地联想颓势检测和定位方法.
Fig. 8 Distribution of published papers by bug characteristics 图 8 颓势本性关系论文散播 4.1 相关方法阐发实证相关(empirical study)具有明显的径直训戒特征, 从无数的数据和训戒事实中通过科学归纳总结出具有普遍意旨的论断或轨则, 并经过严格的锤真金不怕火. 如图9所示, DL框架颓势本性的实证相关一般包括从颓势数据库中抓取颓势数据, 笔据颓势性质打标签, 对确凿的颓势数据集进行分析这3个智力. 通过实证相关方法, 不错从不同方面了解DL框架颓势本性, 比如颓势产生的根底原因(简称颓势根因), 颓势产生的影响, 颓势开发模式等.
Fig. 9 Empirical study on bug characteristics 图 9 颓势本性实证相关(1) 抓取颓势数据
本文通过梳理现存论文发现, DL框架实证相关中抓取的颓势数据来源于GitHub[27]、Stack Overflow[28]和通用随意暴露(common vulnerabilities and exposures, CVE)[29]这3个颓势库. 其中, GitHub是一个面向开源及额外软件模样的托管平台, 颓势数据是由开发者提交的, 因此颓势数据的质料和数目都与开发者关系. Stack Overflow是一个面向轮番员的问答网站, 颓势数据是由轮番员提交的, 因此颓势数据的质料和数目都与轮番员关系. CVE是一个大家数据库, 主要包含已知系统安全方面随意的详折服息, 不错匡助用户在各自孤独的各类随意数据库中庸随意评估器用中分享数据. 在DL框架的使用和测试过程中, 用户和开发东谈主员不错通过在GitHub平台中提交颓势酬劳的阵势反馈他们所碰到的颓势, 或将难以调试的颓势提交到Stack Overflow问答社区中去接洽, 经过证实的颓势或安全随意会被上传到CVE中. 在实证相关中, 相关东谈主员一般通过联想网页爬虫轮番来获取颓势数据, 包括提交者对颓势的描摹, 颓势酬劳的提交时辰和关闭时辰以及开发者和用户的接洽等.
(2) 颓势打标分类
颓势酬劳中的内容是开发东谈主员和用户在使用软件的过程中碰到的问题, 包含了软件使用和测试过程中的伏击颓势数据. 相关东谈主员一般通过阅读并领略开发东谈主员和用户提交的颓势酬劳, 依据一定的判断条款对颓势本性进行判断并打标签, 完成颓势分类.
通过东谈主工阅读颓势酬劳的花样所需时辰和东谈主力资本较高, 有部单干作相关奈何对颓势酬劳自动分类. Long等东谈主[30]为了对DL框架中非功能性颓势进行相关, 在分层注见地汇集(hierarchical attention network)[31]基础上提倡MHNurf. MHNurf不错利用GitHub中颓势酬劳的文本内容、代码段和评述等多维度语义信息自动证实其中是否包含非功能性颓势. 实验对比夸耀, MHNurf的性能要优于传统颓势酬劳分类器.
(3) 颓势信息分析
相关东谈主员在对颓势分类末端进行分析总结之后, 闲居会接收统计学中的关系性分析方针来评估不同分类末端之间的关系性. Du等东谈主[32]接收lift function[33]分析不同类型颓势之间, 颓势根因和颓势影响之间的关系性. 两个非孤独类别$ A $和$ B $之间的${\textit{lift}}$值不错通过公式(1)策画:
$ {\textit{lift}}(A, B) = \frac{{P(AB)}}{{P(A)P(B)}} $ (1)其中, $ P(A) $和$ P(B) $分别表示类别$ A $和$ B $的概率, $ P(AB) $表示一个颓势同期属于类别$ A $和$ B $的概率. 假定类别$ A $和类别$ B $分别代表某类颓势症状和颓势根底原因, 如果${\textit{lift}}(A, B)$值大于1, 则类别$ A $和类别$ B $是正关系的, 剖判属于类别$ A $的颓势症状很有可能是由类别$ B $中的颓势根底原因酿成的.
Chen等东谈主[24]利用斯皮尔曼秩关系统共(Spearman’s rank coefficient of correlation)[34]评估磨灭颓势本性在不同框架中的散播是否具有共性. 该相关对不同颓势根因和颓势影响的数据散播策画斯皮尔曼秩关系统共, 策画末端均大于0.8. 由此解释, 不管从颓势根因如故颓势影响来看, 4个DL框架(TensorFlow、PyTorch、MXNet和DeepLearning4J)具有高度的共性, 因此磨灭种测试方法表面上是完全不错适用于不同DL框架的.
4.2 颓势本性分析相关东谈主员接收第4.1节中阐发的实证相关方法, 不错从颓势酬劳分析出多种颓势本性, 包括不同颓势类型的颓势根因、颓势影响和颓势开发模式等. 本文将现存使命分为面向一般类别颓势本性的举座性相关和面向特定类别颓势的针对性相关两类.
4.2.1 面向一般类别颓势的举座性相关一般类别颓势是指按照一组颓势分类依据, 对DL框架中的一般性颓势进行轮廓性分析, 而不是对某些特定颓势进行具体分析. 如表1、表2所示, 为明确关系含义, 本文轮廓探讨现存使命, 将以颓势根因和颓势影响两种颓势本性为分类依据的一般颓势类别进行简要总结.
Table 1 Summary of bug characteristics categorized by root cause 表 1 以颓势根因为分类依据的颓势本性总结 Table 2 Summary of bug characteristics categorized by bug impact 表 2 以颓势影响为分类依据的颓势本性总结各项实证相关使命的具体相关对象不同, 颓势分类依据不同, 要点相关的颓势本性也不完全调换, 在明确基本颓势本性的基础上, 本文对面前一般类别颓势本性实证相关使命进行总结, 具体信息如表3所示.
Table 3 Empirical study on characteristics of general bugs 表 3 一般类别颓势本性实证相关Chen等东谈主[24]笔据功能不同, 将DL框架的架构分为5个层级, 并在这5个层级中对DL框架的颓势本性分别相关. 这项使命总结出13个颓势根因. 数据类型零乱, 张量款式失配, 深度学习算法已矣失实和运行环境不兼容这4个颓势根因是DL框架区别于其他软件系统特有的. 其中深度学习算法已矣失实是最主要的颓势根因. DL框架的不同层级具有不同的颓势散播特征, 其中算子施行这部分包含的颓势数目最多. 和Islam等东谈主[35]的联绑缚尾雷同, 这项使命雷同发现崩溃(crash)是存在最普遍的颓势症状, 占比达48.25%. 此外, 作家为考证该联绑缚尾的对框架测试相关的指导意旨, 开发出原型DL框架测试器用TenFuzz. TenFuzz通过对TensorFlow中单元测试组件进行突变生成测试输入, 并交叉考证不同版块TensorFlow对应的输出从而已矣差分测试, 告成检测到6个确凿颓势.
Islam等东谈主[35]对5个DL框架进行了相关, 包括Caffe、Keras、TensorFlow、Theano和Torch. 在该相关中, 作家分析了来自Stack Overflow的2716个帖子和来自GitHub的500个颓势开发提交, 以探索颓势产生的原因和酿成的影响. 在该相关中, 作家总结出6种颓势根因和6种颓势影响. 其中, 崩溃在5个DL框架的颓势影响中均占比最高. 此外, 作家对比发现, 除API误用之外, 其他颓势根因在Stack Overflow和GitHub两个平台中的散播情况基本一致.
Jia等东谈主[37]对TensorFlow中的颓势进行了相关. 他们分析了在2017年12月–2019年3月之间的202个TensorFlow的颓势开发提交, 其中84个有对应的颓势酬劳. 在这项使命中, 作家对颓势根因、颓势影响以及不同组件中颓势的比例进行了分析, 并通过lift function评估不同风物和根因之间的关系性强弱. 值得疑望的是, 该相关发当今TensorFlow框架自身的颓势中, 算法或接口已矣上的失实最为常见, 占一王人颓势的38.21%.
Yang等东谈主[38]在掌抓DL框架层级特征的基础上, 构建出一套颓势分类体系, 从源代码入部属手长远探究DL框架中的颓势根因和颓势风物, 并提倡可行的措置决议. Yang等东谈主对来源于8个DL框架的1127个颓势酬劳进行分析, 发现框架中最主要的颓势根因是算法已矣失实和贫苦条款检查两种. 从颓势风物来看, 和基于DL的软件不同, DL框架自身由于颓势而出现的挂起和着力低风物小数, 更多的是输出失实和崩溃. 此外暗网人兽, 作家从343个颓势补丁中总结出15种颓势开发模式, 比如在代码库中增多张量款式和数据类型方面的检查等.
以往使命大多选拔对基于Python的DL框架进行相关, 而忽略了对基于其他编程言语的框架进行相关的使命. Quan等东谈主[39]选拔基于JavaScript的DL框架TensorFlow.js[40]进行相关, 分析其中的颓势本性. 接收TensorFlow.js开发的模子不错在浏览器上径直运行, 对平台和设备的依赖性低. 作家从风物、根因和开发模式这3方面对GitHub中与TensorFlow.js关系的颓势进行分析. 相关发现: 崩溃是最普遍存在的颓势风物, 其次是性能劣化; 轮番编写失实是占比最高(51%)的颓势根因; 改动框架或第三方库的版块是最普遍颓势开发花样, 不错措置大部分颓势.
上述使命都是从根底原因以及风物等方面对颓势进行分析, Du等东谈主[32,36]初次基于颓势触发和失实传播条款对深度学习系统中环境依赖颓势本性进行了相关. 该相关参考传统软件颓势分类体系[41], 将确凿颓势分为波尔颓势(Bohrbug)、老化颓势(aging-related bug)和非老化曼德博颓势(non-aging-related Mandelbug)这3个主要类别. 其中波尔颓势是一类触发和失实传播条款都比较浅易的颓势, 因此这类颓势比较容易被复现. 而曼德博颓势的触发和失效的发生之间存在一定的时辰滞后, 或者受到一些迤逦身分的影响, 导致其触发或失实的传播十分复杂. 该相关发现, 在3个DL框架中, 杰出2/3真是凿颓势是波尔颓势, 在通盘颓势类型中占比最高. 波尔颓势最主要的根因是语义失实, 老化颓势最主要的根因在于内存方面的问题. 在颓势影响方面, 一半以上的波尔颓势和曼德博颓势会酿成轮番崩溃或者特殊. 开发曼德博颓势花消的时辰比开发波尔颓势的时辰更长.
4.2.2 面向特定类别颓势的针对性相关如表4所示, 除一般类别颓势本性实证相关, 部单干作针对某些特殊子类的颓势本性进行愈加考究的相关.
Table 4 Empirical study on characteristics of specific bugs 表 4 特定类别颓势本性实证相关Cao等东谈主[42]对基于TensorFlow和Keras开发的深度学习系统中的性能问题进行相关. 在API误用, 模子确立失实, DL框架, 数据和策画硬件这5种性能颓势的根因类型中, DL框架中包含的颓势占比10.7%, 其中包括某个框架版块存在颓势和某个框架版块与硬件不匹配两类. 比如, TensorFlow 1.X版块在CUDA 11.1上得不到完全赈济, 会导致启动模子教练过程的时辰较长.
Makkouk等东谈主[43]针对Tensorflow和PyTorch中的性能颓势(performance bug)进行实证相关, 具体从性能颓势数目占比的变化趋势, 性能颓势和非性能颓势在颓势复杂进度等方面的区别, 性能颓势的根因这3方面进行分析. 相关发现, 2016–2021年, 性能颓势在通盘颓势中的占比一直在增多, 剖判性能颓势表现出的问题日益严重. 比较非性能颓势, 性能颓势常常愈加复杂, 开发难度更大, 需要多花消94.46%的时辰, 多修改35.71%的代码量. 此外, 相关发现内存使用着力低是导致DL框架性能问题最主要的根因, 具体包括内存资源未实时开释和内存分派失实两方面. 作家进一步分析得知, DL框架更容易发生内存关系的性能颓势主要与底层编程言语的不对理使用和运行时框架里面组件和外部资源之间闲居的数据搬运这两方面关系.
Long等东谈主[44]针对性能颓势和精度颓势(accuracy bug)进行实证相关. 该相关发现包含确凿颓势的颓势酬劳践诺上占比很低; 接近一半的颓势是由开发东谈主员在日常调换更新过程中检测到的, 而不是基于用户提交的颓势酬劳发现的. 剖判面前有用颓势酬劳少, 而且框架的开发调换东谈主员对颓势酬劳利用率很低. 在颓势酬劳中自动地证实是否存在确凿的颓势, 并不错识别哪些颓势值得修正雷同是很伏击的使命.
在深度学习算法中存在无数数值策画, 确保框架的鲁棒性和可靠性最大的挑战即是数值踏实问题(numerically stable problem). 数值不踏实颓势很难径直表现出来, 常常会跟着模子教练过程而渐渐积攒终末影响模子的性能. 为此, Kloberdanz等东谈主[45]对DL框架中的数值不踏实颓势本性作了实证相关, 通过长远分析GitHub颓势库中252个与数值踏实性关系的提交, 总结其不踏实模式, 影响和措置方法等, 归纳出第1个深度学习领域数值不踏实颓势和措置决议的数据库——DeepStability. 相关发现, 由数值不踏实导致的颓势主要有数值上溢出(占比47%), 数值精度亏本(占比34%)和数值下溢出(占比16%)这3种, 其中数值精度亏本会导致其汇集权重和偏置更新不准确, 从而导致模子教练过程劣化. 该相关指出不错选定修改数学策画公式, 增多数值精度或改变变量类型, 使用不同的算法, 阻挡输入范围等花样缓解数值不踏实问题.
Tambon等东谈主[46]针对静默颓势(silent bug)进行实证相关, 这种颓势闲居会导致失实的策画末端或活动, 但不会表现出崩溃或挂起等明显的症状, 是以很难被发现. 作家笔据颓势影响将TensorFlow和Keras里的77个可复现的静默颓势分红7类, 相关发现策画失实占比最高, DL模子策画的某一步存在颓势可能会导致接下来每一步都存在失实的末端, 并渐渐累积.
系统关系的颓势常常会导致性能退化, 安全性艰苦保险和资源不对理利用等, 是决定DL框架可靠性和用户体验的要道. Ren等东谈主[47]专门对DL框架和传统软件系统中系统关系的颓势(system-related bug)进行了对比实证相关. 他们发现内存分派不妥, 内存泄漏, 多线程失实和性能退化是出现频率最高的4类问题, 而确立失实在传统软件系统中极度普遍, 在DL框架中则很少发生. 此外, 深度框架调换东谈主员和用户在接洽API失配问题上消耗的时辰最多, 需要更多的信息为措置问题提供参考.
Liu等东谈主[48]针对4个DL框架(TensorFlow、MXNet、PaddlePaddle和MindSpore)中的老化颓势进行了实证相关, 老化颓势是一种跟着运行时辰增多, 纰谬渐渐累积, 进而表现出性能退化, 系统响应变慢等风物的曼德博颓势(Mandelbug). 比较于其他类型的颓势, 老化颓势的失效机理愈加复杂, 因此检测和开发老化颓势的难度也更大. 相关发现, 79%的老化颓势与内存问题关系, 其中内存泄漏问题是酿成老化颓势最主要的原因. 此外, 比较传统软件系统, 数值关系的老化颓势在DL框架通盘老化颓势中占比更高. 这是由于深度学习是数据驱动的学习模式, 在模子运行过程会存在无数高维度数值策画过程, 容易将DL框架中的数值纰谬累积, 终末酿成老化颓势.
DL应用易受到DL系统(包括策画硬件、操作系统、驱动轮番、运行环境和DL框架)中依赖颓势(dependency bug)的影响. Huang等东谈主[49]针对DL系统中依赖颓势的根因、影响和开发模式进行相关, 作家发现DL框架是引入依赖颓势占比最多(占比77.5%)的层级, 其中Keras (占比15.6%)、TensorFlow (占比51.2%)和PyTorch (占比3.7%)是最容易发生依赖颓势的DL框架, 最主要的原因是DL框架与更底层的软件系统和硬件不兼容.
软件系统中的安全随意(security vulnerability)是指系统在联想、实施和调换过程中的一类特殊颓势, 可能会被攻击者利用来碎裂系统, 窃取数据或施积坏心代码[54]. 与其他类型的软件颓势不同, 安全随意大多触及软件系统的安全性和保护机制. 举例一个轮番如果存在身份考证不及的问题, 可能导致黑客不错利用这个随意来攻击系统. 这个轮番自身不存在功能已矣上的颓势, 但从系统安全的角度分析, 身份考证不及违背了系统安全准则, 因此是一个安全随意. 因此, 开发东谈主员需要选定额外的措施来确保软件系统的安全性, 对安全问题进行长远的测试和审查. DL框架简化了DL应用的联想和开发难度, 但也为用户狡饰了它所使用的组件依赖, 带来许多守密的安全性问题. 每种DL框架都是已矣在宽广外部基础库和组件之上, 举例TensorFlow中包含多达97个Python模块, 任安在DL框架以及它所依赖的组件中的安全随意都会阻难到框架之上的应用.
360安全相关院在2017年互联网安全大会东谈主工智能本事应用安全论坛中展示出6个安全攻击案例, 包含框架依赖库中颓势导致的堆溢出(heap overflow), 整数溢出(integer overflow), 崩溃和拒却做事(denial-of-service)等安全随意. 举例由于Numpy科学策画中的pad函数存在代码逻辑失实导致基于TensorFlow的语音识别应用出现拒却做事的安全随意[50].
Chen等东谈主[51]觉得DL框架中出现的安全随意一般在于两方面: 攻击者利用DNN运行机制反过来生成对抗样本; DL框架所依赖的外部库中存在颓势. 这两种情况都有可能导致在DL框架基础的应用存在安全随意. 作家在调研分析CVE中DL框架随意的过程中发现, 这些随意常常会被攻击者挖掘并进行攻击. 为了更好意志框架的安全问题, 作家从攻击阶段、对抗常识、攻击频率、攻击主见和攻击范围5个方面将DL框架的攻击方法进行分类, 同期对具体的攻击和端庄方法建立映射关系, 为关系领域东谈主员提供参考. 举例关系东谈主员不错接收大样本剔除特殊值的方法[55]来端庄数据投毒攻击(data poisoning attack)[56].
Wang等东谈主[52]从类型、根因、风物、开发模式和开发使命量这5个方面对收罗到的596个机器学习框架安全随意进行分析和相关. 作家在596个随意触及的19个通用随意陈设(common weakness enumeration, CWE)[57]类别基础上, 总结出5种安全随意类别. 其中, 数值和内存关系的随意最为普遍. 相关发现, 贫苦对张量性质的检查是产生数据类型失实和内存失实一个普遍性原因, 开发东谈主员不错通过添加张量性质检查器来开发这方面的随意. 同期, 作家将安全随意数据集公开并开发出DeepMut器用来印证实证相关中的发现和论断.
传统的静态代码分析器用在分析DL框架中愈加深度的语义信息和数学方法方面身手有限, 难以检测出DL框架安全随意. Filus等东谈主[53]接收正交颓势分类法(orthogonal defect classification), 通过将语义信息攻击为评估方针, 对颓势进行分类. 作家对从CWE收罗到的104例TensorFlow安全随意进行分析, 并将其分为越界读取数据、越界写入数据、空指针、不对适的输入校验和整数溢出6类, 分别从安全随意的严重进度和安全随意对TensorFlow秘密性、圆善性和可用性的影响进行要点分析. 相关发现大部安分存关系的安全随意是由于贫苦或者不正确的检查语句导致的, 危害进度也最高. 此外, 这项使命总结出TensorFlow检查项列表便捷TensorFlow用户和开发者进行代码审查, 摒除可能存在的编程失实.
区别于以上径直对深度学习框架的颓势本性进行相关, 还有部分相关通过对基于框架的表层应用中出现的问题进行分析, 获取一些对于框架中颓势本性关系的训戒常识. Sun等东谈主[58]通过对329个来自于GitHub的颓势酬劳进行分析, 将基于上述框架的应用轮番颓势分为7类, 分析出12种颓势的开发模式, 并对开发时辰等进行评估. 相关发现, 开发框架颓势时, 接收if模式最为普遍, 主要包括添加if模块, 改动if判断条款两种. 在颓势开发需要的时辰方面, 大部分颓势(68.39%)不错由开发东谈主员在1个月之内措置, 40.73%的颓势不错在1周之内措置. Zhang等东谈主[59]通过构建问题自动分类的本事, 对Stack Overflow中触及深度学习应用的问题和恢复进行相关. 末端夸耀, 崩溃和模子移动是TensorFlow出现最多的两方面问题, 笔据收到恢复的时辰和谜底质料来看, 性能关系的问题是最难恢复的问题. Liu等东谈主[60]对DL框架中的本事债务进行分析, 本事债务是一种框架开发阶段为责问开发时辰而糟跶框架质料留传的隐性问题. 相关发现, 在TensorFlow等7个DL框架中, 需求债(占比7.09%–31.48%)会导致功能已矣失实, 算法债(占比5.62%–20.67%)会导致系统性能下跌. 兼容性债是对其他模样的不训练依赖, 在Keras和Caffe中, 兼容债占比杰出10%.
5 深度学习框架测试要道本事在领略DL框架颓势本性的基础上, 奈何高效地生成测试输入, 奈何判断DL框架的输出活动是否适当预期, 奈何评估测试的质料和效果是DL框架测试经过中主要柔柔的要点问题, 亦然DL框架测试靠近的3个挑战. 针对这3个相关问题, 本文对调研到的测试要道本事进行分析和总结.
5.1 测试输入生成测试输入生成(test input generation)是DL框架测试相关最初要面对的挑战. 测试输入生成, 即在轮番测试过程中, 按照一定的算法或战略自动搜索输入空间, 不停生成测试输入, 以快乐不同的测试主见. 面对限制渊博, 联想逻辑复杂的软件系统, 通过东谈主工的花样生成测试输入存在着力较低, 资本高等问题. 尤其是在深度学习领域, 输入空间维度高且十分渊博, 简直不可能通过东谈主工花样来生成宽裕的测试输入.
经过调研, 面前具备轮番测试输入自动生成身手的测试本当事人要有拖沓测试、随即测试和蜕变测试等, 其中拖沓测试的想想在DL框架测试输入生成中得到无为应用. 拖沓测试(fuzz testing)是一种自动或半自动地生成非预期输入来测试软件系统, 通过监视轮番特殊(崩溃或断言失败等)来发现软件系统颓势和安全随意的软件测试方法[61]. 因为拖沓测试是不对逻辑的, 仅仅产生参差数据攻击轮番, 更可能发现其他测试方法很难发现的安全随意. 拖沓测试的中枢在于测试输入生成战略, 即生成能触发轮番特殊的输入. 本文笔据测试输入生成花样的不同将拖沓测试分为基于生成的拖沓测试(generation-based fuzz testing)和基于突变的拖沓测试(mutation-based fuzz testing) [62].
奈何期骗拖沓测试, 针对DL框架的特色生成测试输入是本文在调研分析过程中要点柔柔的相关问题.
5.1.1 基于生成的拖沓测试基于生成的拖沓测试是基于特定的轨则径直生成快乐一定拘谨条款的测试输入, 并在不停迭代的拖沓过程中更新测试输入库的拖沓测试本事. 基于生成的拖沓测试上风在于生成的测试输入大多适当被测试轮番的要求, 不错径直期骗到测试施行中, 因此测试着力较高. 基于生成的拖沓测试闲居包括4个智力: 界说或构造输入轨则, 生成驱动种子输入, 施行测试和监测输出活动. 其中第1步是基于生成的拖沓测试方法中枢智力, 相关东谈主员不错笔据输入本性径直界说输入生成轨则, 也不错是通过算法推理构造出输入生成轨则.
在以DNN模子为输入的系统测试方法中, 要求模子里面结构快乐一定的拘谨条款. 举例, 在构建卷积神经汇集时, 需要确保卷积核通谈数和输入图像通谈数相匹配, 以确保卷积运算不错正确地进行. NeuRI[63]利用归纳轮番轮廓的方法推理出不错构造有用模子的轨则, 在这组轨则下完成模子的生成. 在以特定参数为输入的组件测试中, 测试输入需要快乐的拘谨主要包括张量维度、张量款式、张量类型、参数类型、参数数值和参数依赖关系等. 如图10所示, DocTer[64]利用天然言语处理(natural language processing, NLP)的方法, 对官方文档中对于API参数拘谨的天然言语描摹进行依存关系分析(dependency parsing)生成一组语律例定, 从而索求出具体的API参数拘谨. 在一组拘谨条款下, DocTer不错生成有用参数输入和领域值参数输入完成对API的颓势检测.
Fig. 10 Test input generation of DocTer 图 10 DocTer测试输入生成本事 5.1.2 基于突变的拖沓测试基于突变的拖沓测试对已有的种子输入实施突变来生成数目更多, 散播愈加全面的测试输入. 基于突变的拖沓测试不需要预界说复杂的输入拘谨条款, 而是在已知有用输入的基础上生成更接近践诺情况的输入, 比较于基于生成的拖沓测试更容易已矣, 不错责问测试战略联想和实施的难度. 基于突变的拖沓测试主要包括选拔种子输入, 联想并实施突变轨则, 施行测试, 优化更新种子输入库和突变轨则和监测输出活动等智力. 其中突变轨则的联想和实施是基于突变的拖沓测试方法中枢智力, 一般需要具体笔据实施对象的特色进行分析.
在以DNN模子为输入的系统测试中, 为获取各类化的模子, 常常以DNN模子结构中的层和伙同权重为突变轨则的实施对象. LEMON[65]共联想7种层间的突变轨则和5种层内突变轨则, 举例移除DNN模子中的某一层; 对相邻层之间的权重添加噪声, 实施高斯拖沓突变等. 在以特定参数为输入的组件测试中, 主要对API或算子中的参数联想并实施突变轨则. 如图11所示, FreeFuzz[66]针对API中的参数类型和参数数值等性质实施突变来生成更各类性的参数输入, 以检测被测API对于不同类型、不同范围和不同长度参数的处理身手.
偷拍自拍 Fig. 11 Test input generation of FreeFuzz 图 11 FreeFuzz测试输入生成本事拖沓测试不是基于详情逻辑联想的测试方法, 因此需要无数的时辰和策画资源来生成和施行无数的测试用例, 并对测试末端进行分析和归纳. 部分DL框架测试相关使命接收灰盒拖沓测试的想想, 在测试迭代的过程中, 利用某些中间信息(覆盖度量方针或输出不一致进度)指导测试输入生成和测试输入选拔, 有用提高拖沓测试的着力和发掘一般性颓势和安全随意的身手.
5.2 测试预言测试预言(test oracle)是一种判断待测轮番在给定测试输入下的施行末端是否适当预期的机制[67]. 测试预言难以明确是软件系统测试中普遍存在的难题, 它导致测试东谈主员只可选拔一些不错先见末端的有限测试用例进行测试, 而不可圆善有用地进行测试.
深度学习领域存在许多省略情的身分, 比如具体已矣花样和运行环境的各异, 算法的随即性, 浮点数值策画纰谬等. 省略情身分将导致调换功能已矣的两个DL框架测试用例即使在调换的输入下, 其输出也会不可幸免地存在各异, 因此难以分辨是框架内的颓势如故省略情身分导致的问题. 相关东谈主员测试DL框架时不错接收预言近似(oracle approximation)的花样缓解省略情身分带来的测试预言问题, 判断践诺输出和预言之间的各异是否在容忍纰谬之内, 而不是要求待测代码的输出与预期完全格外. 预言近似问题界说如公式(2)所示, 其中$ tolerance $为容忍纰谬:
$ \left| {{\textit{output}} - oracle} \right| \leqslant tolerance $ (2)Nejadgholi等东谈主[68]对DL框架内出现的预言近似断言(oracle approximation assertion)进行实证相关, 笔据DL框架中的源代码对测试预言和原意纰谬类型进行分析总结. 作家发现TensorFlow中25%的断言接收了预言近似断言的方法对代码段进行测试, 其中73%的预言类型和65%的原意纰谬都是开发东谈主员笔据代码特征自界说的. 为适合TensorFlow版块演化, 开发东谈主员还会不停地修改API偏执对应的测试预言和原意纰谬阈值. 测试预言近似的方法只可对测试预言问题起到缓解作用, 普适性较差.
如安在DL框架测试中措置或缓解测试预言问题是本文在调研分析过程中要点柔柔的相关. 经过调研发现, 在DL框架测试相关中, 相关东谈主员入手参考缓解传统软件测试预言难的本事, 比如蜕变测试和差分测试.
5.2.1 蜕变测试蜕变测试(metamorphic testing)是一种主要缓解测试预言问题的黑盒测试方法, 主要依据被测软件系统的领域常识和已矣方法建立蜕变关系(metamorphic relation), 利用蜕变关系来生成新的测试用例, 通过考证蜕变关系是否被保持来决定测试是否通过[69]. 举例, 测试TensorFlow中深度学习算子tf.math.sigmoid时, 当测试输入为1, 径直详情Sigmoid函数的输出是否正确是十分贫瘠的, 然而不错利用其数学属性援手测试该算子. 举例, 已知Sigmoid函数的性质: ${\textit{Sigmoid}}(x) + {\textit{Sigmoid}}( - x) = 1$, 笔据测试输入1生成另一个输入为−1, 通过测试${\textit{Sigmoid}}(1)$与${\textit{Sigmoid}}( - 1)$相加是否等于1判断该算子已矣是否存在颓势. 如果${\textit{Sigmoid}}(1) + {\textit{Sigmoid}}( - 1) = 1$, 则这种蜕变关系得到保持, 一定进度上剖判深度学习算子tf.math.sigmoid功能正常.
连年来, 蜕变测试也被应用到DL框架的测试中. Ding等东谈主[70]通过联想系统级、数据集级和数据元素级3种不同层级的蜕变关系来产生新的测试数据, 从而考证测试DL任务过程中DL框架的功能正确性. 具体来讲, 这项使命通过分析DL图像分类任务, 重组教练数据集和生成新图像这3种花样对分类准确率的影响来考证3种层级的蜕变关系是否得到保持. 举例, 在教练数据汇聚的每个类别中加入10%的新图像后, 其分类准确率不应该受到影响. 终末, 作家将蜕变关系实施到用于生物细胞图像自动分类的DL分类器中, 告成解释该方法的有用性. FreeFuzz[66]在针对DL框架中的API进行测试时, 参考数值精度和运行速率之间的蜕变关系, 比如接收float16数值精度的API, 其运行速率应该比接收float32数值精度的API快. 通过这种花样, FreeFuzz告成检测到DL框架性能方面的颓势.
5.2.2 差分测试给定调换的测试输入, 调换功能已矣的软件系统应输出调换的末端. 利用这一丝, 差分测试(differential testing)方法通过不雅测两个调换功能已矣的软件系统或轮番在调换输入下的输出是否存在各异来检测可能存在的颓势[71]. 由于DL框架的开源本性, 相关东谈主员不错便捷地已矣功能等价的实例. 这种功能等价的实例不错是不同框架下调换DNN模子的已矣, 磨灭框架下调换策绘图的已矣, 磨灭框架下调换API的已矣和磨灭API在不同策画硬件上的已矣等. 差分测试更适于检测代码逻辑失实和数值纰谬等语义颓势, 是措置测试预言问题最有用的方法之一, 如故在DNN模子测试, DL框架测试和DL编译器测试等领域得到无为应用.
Pham等东谈主[72]首创性地从差分测试的角度对DL框架伸开相关, 提倡测试方法CRADLE. CRADLE接收不同DL框架已矣调换结构的DNN模子, 通过检测模子输出的不一致进度, 迟缓定位框架内存在的颓势. 值得疑望的是, 输出不一致进度评估方针在以DNN模子为输入的系统测试方法中, 为已矣差分测试提供伏击参考. 之后部分相关使命将CRADLE中提倡的不一致进度方针手脚参考, 有助于已矣以DNN模子为输入的自动化测试, 发掘更多的颓势. 以下是CRADLE中评估输出不一致进度的要道方针, 主要包括输出层间距、守密层间距和守密层间距变化率.
输出层间距$D\_{\mathit{CLASS}}$不错评估用于分类任务的DNN模子在两个不同DL框架后端已矣下的预测末端各异, 具体界说如公式(3)和公式(4)所示. 公式(3)中$ C $为真值(ground-truth)标签, $ Y = [{y_1}, {y_2}, {y_3}, \ldots , {y_N}] $为表示模子预测末端的N维向量, $ ran{k_{C, Y}} $为真值标签$ C $出当今输出向量$ Y $中的位次, $ k $默许为5. 公式(4)中的$ {Y^1} $和$ {Y^2} $分别为调换DNN模子在以DL框架1和DL框架2为后端已矣时的模子预测末端向量.
$ {\sigma _{C, Y}} = \left\{ {\begin{array}{*{20}{l}} {{2^{k - ran{k_{C, Y}}}}, }&{ran{k_{C, Y}} < k} \\ {0, }&{ran{k_{C, Y}} \geqslant k} \end{array}} \right. $ (3) $ D\_{{\mathit{CLASS}}_{C, {Y^1}, {Y^2}}} = \left| {{\sigma _{C, {Y^1}}} - {\sigma _{C, {Y^2}}}} \right| $ (4)此外, CRADLE基于平均十足偏差(mean absolute deviation)距离联想同期适用于回来模子和分类模子的输出层间距方针$ D\_MAD $. 如公式(5)和公式(6)所示, $ G = [{g_1}, {g_2}, {g_3}, \ldots , {g_N}] $为真值标签组成的向量, $ Y = [{y_1}, {y_2}, {y_3}, \ldots , {y_N}] $为表示模子预测末端的N维向量, $ {Y^1} $和$ {Y^2} $分别为调换DNN模子在以DL框架1和DL框架2为后端已矣时的模子预测末端向量.
$ \delta _{Y, G} = \frac{1}{N}\sum\limits_{i = 1}^N {\left| {{y_i} - {g_i}} \right|} $ (5) $ D\_MA{D_{{{G}}, {Y^1}, {Y^2}}} = \frac{{\left| {{\delta _{{Y^1}, G}} - {\delta _{{Y^2}, G}}} \right|}}{{{\delta _{{Y^1}, G}} + {\delta _{{Y^2}, G}}}} $ (6)如公式(7)–公式(9)所示, CRADLE提倡守密层间距$ \delta $和守密层间距变化率$ R $, 在差分测试检测到不一致输出基础上, 对DNN模子守密层输出向量进行分析, 从而已矣颓势定位. 公式(7)中, $ {\delta _{S_l^1, S_l^2}} $为调换模子在DL框架1和DL框架2为后端已矣下, 在磨灭守密层$ l $输出N维向量的平均十足偏差. 公式(8)中, ${\delta _{{\rm{pre}}}}$为DNN模子中位于守密层L之前且与L相伙同层的$ {\delta _{S_l^1, S_l^2}} $最大值. 公式(9)中, 守密层间距变化率$ {R_L} $界说为在某一守密层L处, $ {\delta _{S_l^1, S_l^2}} $相较于${\delta _{{\rm{pre}}}}$数值的变化率, $ \tau $取10–7.
$ {\delta _{S_l^1, S_l^2}} = \frac{1}{N}\sum\limits_{i = 1}^N {\left| {S_l^1 - S_l^2} \right|} $ (7) $ {\delta _{{\rm{pre}}}} = \mathop {\max }\limits_{l \in pre(L)} ({\delta _{S_l^1, S_l^2}}) $ (8) $ {R_L} = \frac{{{\delta _{S_l^1, S_l^2}} - {\delta _{{\rm{pre}}}}}}{{{\delta _{{\rm{pre}}}} + \tau }} $ (9)除构建调换模子手脚差分测试的对象外, 也有相关针对DL框架中的策绘图伸开差分测试. 如图12所示, EAGLE[73]这项使命通过构建两个逻辑功能等价的策绘图, 不雅测其输出是否一致来检测框架中可能存在的颓势.
Fig. 12 Test oracle of EAGLE 图 12 EAGLE测试预言差分测试的无为应用有助于缓解测试预言问题, 但也靠近新的挑战, 即DL框架的开发东谈主员需要不停地了解第三方库在版块更新中的代码改动情况来评估其对框架里面差分测试用例带来的影响. Prochnow等东谈主[74]提倡DiffWatch, 这种方法不错自动检测DL框架中的差分测试用例, 并将其分为有断言的测试用例和有预言的测试用例两类; 然后监测外部库代码更新可能给差分测试带来的影响, 为开发东谈主员经管差分测试用例和代码调换提供匡助.
差分测试有其局限性: 如果两个功能等价的实例中包含雷同的颓势, 则在输出上莫得明显各异, 差分测试将无法检测到这些颓势, 容易漏报. 此外, 差分测试输出不一致不一定是由践诺的颓势导致的, 需要相关东谈主员进一步证实. 因此, 相关东谈主员一般结合其他测试方法联想DL框架测试方法.
5.3 测试评估在对软件系统进行测试之后, 还需进一步评估和估计软件测试质料和效果. 在对框架测试的相关使命中, 主要包括对测试有用性和测试充分性两方面的评估. 除通过检测出的颓势数目和类型来评估测试有用性之外, 相关者还接收变异测试评估测试用例的质料和有用性. 在测试充分性方面, 相关者主要通过联想测试覆盖度量进行评估. 需要剖判的是, 测试充分性是测试有用性的先决条款, 但充分的测试并不老是意味着测试有用性较高. 在有些情况下, 即使进行了无数的测试, 也可能会出现一些未被发现的颓势和问题. 奈何愈加全面地评估测试战略的质料和效果是本文在调研分析过程中要点柔柔的相关问题.
5.3.1 测试覆盖度量1975年, Goodenough等东谈主[75]最初在软件系统测试领域引入了测试充分性(test adequacy)这一观念. 测试充分性是指一组测试数据在软件系统中的表现是否大致充分响应该软件的总体表现. 测试覆盖度量是用来评估测试充分性的伏击方针, 传统软件测试中比较常用的代码覆盖度量(举例行覆盖、分支覆盖和条款覆盖等)主若是针对软件代码联想的, 估计的是测试输入对轮番源代码施行的进度. 连年来, 相关东谈主员针对DNN模子特色不停提倡测试覆盖度量. 比如, Pei等东谈主[76]在白盒测试框架DeepXplore中最初提倡用神经元覆盖(neuron coverage)手脚度量, 并用神经元覆盖率指导DNN模子的测试输入生成. 但DL框架里面组件的特征与传统软件和DNN模子各异较大, 针对源代码联想的代码覆盖和针对神经汇鸠合构联想的神经元覆盖等均不完全适用于DL框架测试. 奈何针对DL框架的特色联想测试覆盖度量方针是本文在调研分析过程中要点柔柔的相关问题.
经过调研, 本文总结现存使命提倡的基于框架里面组件特征联想的测试覆盖度量, 如表5所示. 面前API覆盖是评估DL框架测试充分性最常用的度量方针, 此外还有部分相关东谈主员提倡更有针对性的测试覆盖度量. 举例, COMET[77]要点柔柔API调用的3个性质(层输入、层参数值和层序列)来度量层API调用的各类性和充分性. 基于这3个性质, 作家提倡层类型覆盖、层对覆盖和层参数覆盖这3种覆盖准则来驱动模子突变过程, 生成不错覆盖更多API的模子对框架进行测试, 提高测试充分性. GraphFuzz[78]在从策绘图的角度对DL框架进行测试的相关中, 提倡算子级覆盖这种愈加细粒度的充分性准则, 主要包括算子类型覆盖、张量款式和参数覆盖, 基于策绘图表面的算子入度覆盖、出度覆盖和边覆盖. 这项使命在进行拖沓测试的过程中, 将最大算子级覆盖率手脚主见来表示模子推理阶段的输出失实, 提高了框架测试的充分性和有用性.
Table 5 Coverage metrics of deep learning frameworks testing 表 5 深度学习框架测试覆盖度量 5.3.2 变异测试如图13所示, 变异测试(mutation testing)是一种基于故障注入的测试本事, 将按照不同轨则变异生成的失实代码段插入到被测轮番中, 以考证面前测试输入是否不错发现注入的失实[85]. 被注入失实的代码段称为变异体(mutant), 在适当拘谨条款的前提下, 将原有代码段转变成变异体的操作符为变异算子(mutation operator). 在注入变异后, 测试输入能发现该失实, 即变异体被“杀死”, 则标明测试输入是有用的; 反之, 变异体“存活”则标明需要补充该变异的测试输入. 变异测试的伏击作用在于评估测试输入的有用性, 即检测颓势的身手.
Fig. 13 Overview of mutation testing 图 13 变异测试概况Harzevili等东谈主[52]为了印证他们在DL框架安全随意实证相关上的发现和论断, 开发出自动变异测试器用DeepMut. 笔据已知的安全随意模式和攻击花样, DeepMut不错已矣在代码段中引入特定的安全感知变异算子, 以评估框架对外来攻击的抗争身手. DeepMut将TensorFlow手脚实验对象, 最终发当今现存DL框架测试用例下, 3000个变异体中有杰出1000个变异体莫得被现存“杀死”, 剖判面前测试用例质料较低, 应该尽快提高测试用例的质料和覆盖范围. Jia等东谈主[86]联想13类变异算子将故障注入DL框架, 并通过不雅测轮番运行的输出活动, 判断现存测试输入是否不错有用检测注入的失实. 相关发现, 杰出60%植入的颓势在相应测试输入下不会发生崩溃, 其输出活动与正常末端莫得显赫各异, 写在测试用例的断言并莫得发现许多植入颓势, 剖判面前测试用例质料较低. 以上相关标明变异测试在评估测试有用性, 特别是评估测试用例质料方面的伏击作用.
变异测试的局限性在于可能会导致源代码的语义变化, 生成无效的变异体, 奢华测试资源. 其次, 变异测试对框架测试评估的效果依赖于变异算子. 如果变异算子已矣的操作不够全面或者不够准确, 可能会导致变异测试的效果欠安.
6 深度学习框架测试方法本文在第5节中阐发的测试要道本事是指措置DL框架测试中某一问题的具体本事, 而仅接收单一的测试本事并不可对DL框架进行全面的颓势检测和质料评估. 本节所阐发的测试方法是用来指导测试施行的举座性决议, 要点探讨奈何针对具体被测对象和测试相关问题合理确立不同的测试本事, 以确保测试的有用性、充分性和着力.
测试输入生成是DL框架测试方法中的第1步, 亦然最为要道的一步. 测试输入的质料决定通盘测试方法的践诺作用效果, 高质料的输入不错高效揭露DL框架中枢代码中的颓势. 本节对现存相关使命进行梳理和分析, 笔据不同的测试输入阵势, 将DL框架测试方法分为以DNN模子为输入的系统测试(system testing), 以策绘图为输入的系统测试和以特定参数为输入的组件测试(component testing)这3类. 除输入阵势的不同, 这3类测试方法区别在于, 前两类系统测试方法通过DNN模子或策绘图调用关系组件完成DL任务, 侧重于对DL框架举座功能已矣方面是否存在颓势进行系统性测试; 此后者主要针对DL框架中的基本组件(API和算子)进行愈加细粒度的测试.
6.1 以DNN模子为输入的系统测试本节主要阐发以DNN模子为输入的系统测试相关, 包括这一类测试方法的总体概述和每一项关系使命的具体分析.
6.1.1 总体概述如图14所示, 以DNN模子为输入的系统测试一般结合基于拖沓测试的测试输入生成本事, 基于差分测试的测试预言本事以及测试输入选拔算法来已矣. 这类相关使命的主要特征在于需要构建出圆善的DNN模子, 通过对比调换输入时, 磨灭DNN模子在不同DL框架已矣下的输出是否一致, 来检测框架内可能存在的颓势.
Fig. 14 Overview of system testing for DL frameworks with DNN models as input 图 14 以DNN模子为输入的DL框架系统测试概况本文通过进一步分析发现, 这类相关使命的难点在于奈何尽可能多地生成有用且各类化的DNN模子手脚测试输入, 有用即模子结构和参数确立自身不存在问题, 各类化即要求模子结构不尽调换, 尽可能覆盖各类性的API和算子. 为了已矣这一主见, 相关东谈主员在测试输入生成方面接收基于突变的拖沓测试或基于生成的拖沓测试两种方法; 同期接收差分测试方法措置测试预言不解确的问题. 此外, 为了提高测试着力, 使颓势检测更有针对性, 部单干作引入启发式搜索算法, 利用测试过程的中间信息(测试覆盖率或输出不一致进度等)指导拖沓测试中的测试输入生成; 或者引入选拔算法, 在输入选拔上过程中, 给以颓势发现身手更强的种子模子更大的优先级. 这一类测试方法的举座想路基本一致, 然而在具体算法选拔和实施上不尽调换, 比如接收基于突变的拖沓测试生成新模子的使命常常需要额外引入对突变算子的选拔算法, 接收基于生成的拖沓测试生成模子的使命要点在于相关奈何构造一组合理的模子生成轨则.
以DNN模子为输入的系统测试普遍接收差分测试本事来缓解测试预言难的问题, 不错检测到除崩溃之外的多种类型颓势. 但由于DNN模子教练或预测过程中需施行无数非线性操作, 因此需要花消较多的策画资源和时辰才能在差分测试中检测到输出之间的各异. 此外, 差分测试不一致的输出不一定是由践诺颓势导致的, 需要额外的使命进行颓势证实和颓势定位. 以DNN模子为输入的系统测试将DL框架视为一个抽象的举座系统, 其测试主见在于考证通盘DL框架功能已矣是否存在颓势, 因此测试粒度更粗. 此外, 以DNN模子为输入的系统测试只可覆盖到使用频率较高的API组件, 难以覆盖用户较少调用的API, 或者某种稀有的API调用花样, 测试充分性较低.
6.1.2 关系使命如表6所示, 本节将现存相关使命提倡的以DNN模子为输入的系统测试方法进行梳理和对比, 要点先容奈何措置测试输入生成、测试预言和测试评估方面存在的难点问题, 并对比分析每项使命的优漏洞和适用范围.
Table 6 Summray of system testing for DL frameworks with DNN models as input 表 6 以DNN模子为输入的DL框架系统测试方法总结CRADLE[72]最早入手从DNN模子的角度对DL框架测试伸开相关, 这项使命结合差分测试的方法, 转变性地提倡输出层间距D_CLASS和$ D\_MAD $以及守密层间距变化率$ {R_L} $两类方针, 分别用于颓势检测和颓势定位. 输出层间距用于评估由调换DNN模子在不同DL框架已矣下的输出不一致进度, 在对比发现可能存在颓势的框架后, 笔据守密层间距变化率不错定位产生颓势的某一层, 从而进一步详情颓势践诺位置. 这项使命告成地在Keras不同库后端中发现12个颓势. CRADLE提倡的两个方针屡次被后续使命接收, 为以DNN模子为输入的系统测试这一类使命奠定了基础, 然而该项使命只触及对已有的开源模子进行差分测试, 无法生成新的模子以覆盖DL框架中更多的API, 测试充分性较差. 此外, 纰谬累积等省略情身分酿成的输出不一致进度可能和颓势酿成的输出不一致进度是附进的, 这一局限性为后续颓势定位和证实酿成贫瘠.
AUDEE[87]在CRADLE的基础上转变性地引入新模子生成方面的使命, 一定进度上措置了测试充分性问题. 这项使命接收基于遗传算法的启发式搜索方法, 联想3种不同的突变战略来探索汇鸠合构、模子权重和种子数据集的不同组合, 已矣愈加复杂的模子. 值得疑望的是, AUDEE将CRADLE的守密层间距手脚遗传算法的适合度方针来指导测试输入生成过程, 在模子不停迭代突变的过程中, 适合度方针不错不停放大模子在不同DL框架上的输出不一致进度. 实验标明, AUDEE告成地在TensorFlow等4个DL框架中检测到26个颓势, 包括逻辑颓势、崩溃和非数值失实这3种类型. AUDEE天然不错通过突变生成更多复杂的模子, 但其种子模子结构并莫得发生骨子改变.
LEMON[65]雷同把要点放在奈何生成数目更多, 各类性更强的模子中. 与AUDEE不同的是, LEMON主要以汇集模子的层为突变对象, 径直改变已有模子的结构. LEMON共联想7种层间的突变轨则和5种层内突变轨则. 通过该对种子输入实施突变, 不错生成更多新的模子. 由于输入空间过大, 为提高着力并保证模子各类性, LEMON选定轮盘赌算法(roulette wheel selection)[92]手脚种子模子选拔战略, 使之前很少被选中的种子模子鄙人一轮迭代中有更大可能被选中. 此外, 基于CRADLE的输出层间距方针$ D\_MAD $, LEMON联想累计不一致进度方针手脚突变轨则选拔战略的伏击依据. LEMON接收马尔可夫链蒙特卡罗(Markov chain Monte Carlo, MCMC)算法手脚突变轨则选拔战略, 通过参考突变轨则的历史活动, 并加入一定的随即性, 从而决定每个突变轨则的排序优先级. 比较于AUDEE, 这项使命的跨越在于入手对DNN模子中的结构进行突变, DNN模子各类性得到极大提高.
Zou等东谈主[88]觉得LEMON的突变轨则难以生成新的算子之间相互调用关系, 因此模子各类性较差. Zou等东谈主提倡Ramos, 通过联想分层和启发式方法生成模子, 其中每一层代表一组算子之间的相互调用关系. 通过对算子调用边进行突变, 来已矣更各类化的算子调用组合. 为幸免不同DL框架相似API的参数确立不同导致的颓势误报, Zou等东谈主提倡了一组API映射轨则, 并将其应用于不同框架下的模子代码攻击, 来已矣差分测试. Zou等东谈主在TensorFlow、PyTorch和MindSpore上考证Ramos方法的性能, 实验末端夸耀, Ramos对崩溃的误报率为0, 同期不错触发更多的策画失实.
Shen等东谈主[89]指出了LEMON[65]中部分突变轨则的局限性, 举例增多层(layer addition)轨则要求相邻的层类型和结构要严格匹配, 这种突变拘谨雷同阻挡了生成模子的各类性, 不利于检测出崩溃一类的颓势. 因此, 作家提倡FAME, 通过对LEMON中的突变轨则进行优化校阅, 并补充联想API突变轨则来生成包含无数有用的模子.
Wu等东谈主[79]觉得以往使命接收输出不一致手脚主要方针驱动通盘测试过程有一定的局限性. 他们提倡DeepCov, 在LEMON的基础上, 要点探讨模子层之间的伙同关系, 联想增多要道层(strategic layer addition)的突变轨则和层边覆盖(edge layer coverage)准则手脚模子选拔过程中的适合度方针.
Li等东谈主[77]提倡覆盖率领的模子生成方法——COMET对框架进行测试. 针对模子运行资本高, 测试着力低的问题, COMET在不影响模子各类性的前提下, 最初对模子限制进行压缩. 针对模子各类性差的问题, COMET针对层类型、层对和层参数这3个方面提倡多种类型的突变轨则. 与LEMON不同的是, COMET将压缩后的种子模子和突变轨则的组合营为MCMC选拔战略的实施对象, 以确保突变轨则对于特定种子模子的有用性. COMET雷同参考CRADLE中的输出层间距方针$ D\_MAD $来评估模子在不同DL框架上对输出不一致进度, 最终已矣差分测试. 值得疑望的是, 除分支覆盖外, 作家要点提倡层类型覆盖、层对覆盖和层参数覆盖这3种评估测试充分性的覆盖度量. 实验末端夸耀, COMET在测试充分性方面完全杰出了CRADLE和LEMON的性能, 况兼告成检测到之前未报谈的颓势29个.
Li等东谈主[90]发现之前相关使命一般觉得不同突变轨则选拔战略发现颓势的着力是一致的, 比如LEMON和COMET中接收的MCMC算法对通盘突变轨则成立了调换的选拔权重, 一定进度上影响了颓势检测着力. 因此, 作家提倡MMOS, 联想多阶段的突变算子选拔战略和基于多臂赌博机(multi-armed bandit)模子[93]的突变算子能量调度战略, 告成提高了颓势检测的着力.
Liu等东谈主[63]觉得以往相关艰苦对模子算子拘谨的考量, 无法使用不同的算子径直构造有用且各类的模子. 为了措置这个问题, 他们提倡一种通过轮廓分析API拘谨来生成模子的方法——NeuRI. 在FreeFuzz[66]抓取到的开源代码基础上, NeuRI跟踪分析这些代码, 收罗其中触及的API调用信息; 然后利用这些信息实施归纳轮番轮廓(inductive program synthesis)[94]来推理出不错构造有用模子的轨则; 在这些轨则的指导下, 通过在已知有用的DNN轮番不停中插入正确的算子代码段来完成模子的生成.
Schumi等东谈主[91]引入Prolog来生成有用的模子. Prolog是一种逻辑编程言语, 它不错笔据事实和轨则自动分析其中的逻辑关系, 况兼允许用户通过查询, 完成复杂的逻辑运算, 无为应用在NLP等东谈主工智能领域[95]. 基于Prolog对TensorFlow中通盘与层构造关系的API[96]分析出的可施行语义信息, 不错在拖沓测试过程中对层关系API进行确立从而自动生成圆善有用的模子. 同期, Prolog分析出的可施行语义信息可手脚明确的测试预言完成差分测试. 实验标明, 该相关提倡的方法告成检测到TensorFlow中14个颓势, 有助于提高DL框架质料.
6.2 以策绘图为输入的系统测试本节阐发以策绘图为DL框架测试输入的系统测试相关, 主要包括这一类测试方法的总体概述和每一项使命的具体分析.
6.2.1 总体概述策绘图(也称数据流图)是一种用来描摹运算的有向无环图(directed acycline graph)数据结构. 策绘图由节点和边组成, 每个节点都表示一种由算子施行的运算, 边表示张量的流动场所. 2009年, 深度学习三巨头之一的Bengio为了理清数据输入和各类运算之间的关系, 初次将策绘图引入东谈主工智能领域[97].
如图15所示, DL框架通过策绘图来组织和施行模子的策画过程, 其中界说了数据流转花样, 数据策画花样以及各类策画节点之间的相互依赖关系[98]. 策绘图手脚DNN模子在后端施行时的一种中间表示, 不错为各类DNN模子的结构和运行过程提供和洽的抽象描摹, 联络前端编程言语和接口, 同期便捷底层库的编译优化.
Fig. 15 Example of computation graph execution process 图 15 策绘图施行过程示例在已矣深度学习任务时, DL框架把DNN模子和洽行换为策画机大致识别的策绘图, 通过策绘图调用关系算子已矣反向传播算法中的自动梯度策画, 更新汇集权重. 以策绘图为输入的系统测试方法, 不错匡助检测DL框架在描摹DNN模子结构, 节点操作或边数据流时是否存在颓势, 确保通盘DL框架已矣的正确性.
6.2.2 关系使命如表7所示, 本节将以策绘图为输入的系统测试关系相关使命进行分析和总结.
Table 7 Summary of system testing for DL frameworks with computation graph as input 表 7 以策绘图为输入的系统测试方法总结为了使自动生成的模子愈加各类化, 尽可能多地覆盖库中不同层类型函数, Muffin[80]参考神经汇集架构搜索方法(neural architecture search)[99]使用策绘图的结构模版(举例链式结构和单元结构)来生成模子结构信息, 利用策绘图的节点入度生成层信息, 在此基础上逐层描摹DNN模子. 在实施差分测试时, 不同于之前的相关使命多柔柔模子的推理阶段, Muffin阐扬监测模子教练阶段的数据, 通过模子输出不一致检测可能存在的颓势. 这项使命初次已矣对DL框架教练关系功能已矣进行测试, 告成已矣98.305%的覆盖率, 并在3个框架中检测到39个之前未知的颓势.
图论不错匡助相关息争释神经汇集的拓扑结构[100], Luo等东谈主[78]从策绘图的角度启程, 提倡GraphFuzz. 通过联想4种模子级突变战略和2种源级突变战略对DNN模子对应的策绘图进行突变, 来探索模子结构、参数和数据输入的组合. 同期引入一系列基于图论的算子级覆盖度量指导种子库更新过程, 接收蒙特卡罗树搜索(Monte Carlo tree search, MCTS)算法[101]手脚种子选拔战略在种子库中选拔子图. 实验末端夸耀, 比较随即搜索, 基于MCTS的搜索在提高算子级覆盖率和检测特殊方面表现更好.
EAGLE[73]选定磨灭DL框架已矣等价策绘图来施行差分测试的想路. 最初笔据文档中API的描摹和DL框架中已知颓势的特征挖掘信息, 总结出16条策绘图等价轨则; 用关系的API实例化这些轨则, 从而生成两个功能等价的策绘图手脚DL框架的输入; 利用差分测试的想想, 通过对比两个策绘图的输出是否一致, 从而测试框架中是否存在颓势. 作家将EAGLE方法实施在TensorFlow和PyTorch, 告成检测到13个之前尚未发现的颓势, 9个颓势已得到开发东谈主员的证实并进行开发.
6.3 以特定参数为输入的组件测试本节阐发以特定参数为输入的组件测试方法相关使命, 主要包括这一类测试方法的总体概述和每一项使命的具体分析.
6.3.1 总体概述在传统软件系统中, 组件一般指系统中相对孤独且具有特定功能的模块或单元, 开发东谈主员不错通过组件测试对每个组件孤独运行时的功能进行考证. 如本文第2.2节所述, API和算子均是DL框架的里面组件, 仅仅其复杂进度和使用场景不同. 前者为用户提供更高抽象级别的接口, 此后者更接近基本功能函数的底层代码, 谨慎已矣具体的策画操作. 在DL框架测试领域, 部分相关使命针对DL框架里面API或算子进行颓势检测, 从而已矣愈加细粒度的测试.
在软件测试领域, 参数是指在调用API或算子时传递给里面代码的输入值. 不同于传统软件系统, DL框架组件测试中输入的特定参数具有明显的领域特征, 其参数款式和使用花样与具体DL任务和DL框架里面轮番圭表关系. 举例, DL框架闲居接收张量来表示高维数据, 用于赈济高效的数值策画和模子教练. 此外, 部分参数的数据维度和数据类型等性质不惟独, 需要笔据不同深度学习场景下的数据处理和策画需求而详情. 如图16所示, 以TensorFlow中二维卷积API[102](tf.nn.conv2d)部分参数为例, 参数input的数据类型是张量, 其数据类型不错是half或bfloat16等, 参数strides的数据类型不错是整数型(int)或列表(list).
Fig. 16 Partial arguments of tf.nn.conv2d 图 16 tf.nn.conv2d部分参数以特定参数为输入的组件测试主要特征在于径直针对DL框架中的API或算子尽可能生成快乐拘谨的参数输入来检测其中是否存在颓势. 如图17所示, 相关东谈主员在测试输入生成方面一般接收基于突变的拖沓测试和基于生成的拖沓测试两种方法, 难点在于奈何快乐特定参数的拘谨, 比如参数的维度、款式、数值、类型以及参数之间的依赖关系等. 部分相关使命在接收基于生成的拖沓测试方法时, 以DL框架官方文档为信息来源, 来获取特定参数的具体拘谨; 部分相关使命在接收基于突变的拖沓测试方法时, 一般以开源的API调用代码段手脚种子, 通过对种子中的参数实施多维度突变来生成更多的测试输入. 此外, 一部单干作接收差分测试方法措置测试预言不解确的问题, 或者径直监测是否出现崩溃等显式的颓势. 为了提高测试着力, 少部单干作引入启发式搜索算法, 利用测试过程的中间信息指导拖沓测试中的测试输入生成.
Fig. 17 Overview of component testing for DL frameworks with specific arguments as input 图 17 以特定参数为输入的DL框架组件测试方法概况比较以DNN模子或策绘图为输入的系统测试方法, 以特定参数为输入的组件测试方法愈加细粒度, 不错径直覆盖到更多的深度学习功能性组件, 测试充分性较强, 测试资本较低. 但以特定参数为输入的组件测试方法闲居难以对组件之间的交互以及系统的举座功能已矣进行测试, 而常常某些颓势惟有在组件之间的相互调用时才会被检测出来. 以特定参数为输入的组件测试雷同靠近测试充分性不及的问题, 不管是接收基于生成的拖沓测试或基于突变的拖沓测试的测试输入生成方法, 都难以全面地覆盖到DL框架中的API库. 此外, 现存相关使命生成的参数输入不同进度地存在不适当拘谨的问题, 影响通盘测试过程的着力.
6.3.2 关系使命如表8所示, 本节对以特定参数为输入的组件测试关系使命进行总结和分析, 同期对每项使命对应的测试层级(API和算子)加以分辨. 其中, 针对算子的测试相关使命更多地将其底层C/C++代码手脚具体实施对象.
Table 8 Summary of component testing for DL frameworks with specific arguments as input 表 8 以特定参数为输入的组件测试方法总结Christou等东谈主[103]利用API之间的层级关系提倡从下到上的颓势检测战略——IvySyn. DL框架的低阶API一般是用C/C++编写的, IvySyn则利用这种低阶API的静态代码本性对其实施基于突变的拖沓测试, 从而发现输出崩溃的“违纪输入”. IvySyn笔据低阶API到高阶API的映射关系, 利用“违纪”输入合成不错触发内存失实的代码段, 用这种花样来检测DL框架中的内存安全随意.
FreeFuzz[66]这项使命已矣了API级的全自动测试经过. FreeFuzz通过运行从开源信息中收罗到的代码片断来抓取API中间过程信息, 包括API中的参数类型、参数数值以及输入或输出张量的款式. 将这些中间过程信息手脚种子输入, 通过对其实施不同突变战略的拖沓测试来生成更多API的输入和参数. 调换API为适配不同硬件, 其具体代码已矣花样也有所不同. FreeFuzz接收差分测试的方法, 对比调换API在不同硬件设备(CPU, GPU)上输出的不一致来检测策画失实颓势; 利用数值精度和运算速率之间的蜕变关系实施蜕变测试来检测性能颓势; 通过监测API运行过程来检测崩溃和特殊. FreeFuzz这项使命的局限性在于, 难以对该开源代码片断未触及的API进行测试, 测试覆盖率有限. 此外, DL框架在不同的硬件平台上代码已矣逻辑相似, 因此这种差分测试中接收的测试预言关系不解确, 最终导致不错检测到的颓势类型有限.
DeepREL[82]受传统软件测试的启发, 通过界说两种不同粒度的API等价轨则和用天然言语处理方法寻找等价API来两部安分容已矣差分测试. 等价轨则包括输出值等价和输出情状等价, 其中输出值等价是指在调换输入下, 功能调换的API其输出值应该是一致的; 而输出情状等价是指API输出情状一般有运行告成, 出现特殊, 出现崩溃这3种可能的末端. 在调换参数下, 功能相似的API天然输出值不尽调换, 但输出情状应该是调换的. DeepREL接收NLP的方法从API文档中找到功能等价或相似的一双API后, 用FreeFuzz中突变生成的测试输入来调用告成配对的API. 通过差分测试对比一双API的输出是否快乐上述两类等价轨则, 如果不快乐, 则剖判相应API可能存在颓势. DeepREL比较FreeFuzz的提高在于期骗两种等价轨则使差分测试中预言关系愈加明确, 成心于充分测试出多种颓势类型, 但输入各类性依然有限.
为了使测试覆盖到更多的API序列, Deng等东谈主[83]选定基于突变的拖沓测试想想, 利用大言语模子[108]生成测试输入, 提倡TitanFuzz. 在圭表的输入指示下, 生成式大言语模子(generative LLM, 举例Codex[109])不错自动生成高质料的种子代码段组成种子库; 和以往拖沓测试相关雷同, 为了不停膨胀种子库, TitanFuzz选定进化战略(evolution strategy)[110], 利用适合度函数指导种子选拔过程, 利用多臂赌博机算法指导突变轨则优先级排序; 在选拔某个突变轨则之后, TitanFuzz利用填充式大言语模子(infilling LLM, 举例Incoder[111])已矣代码补全, 生成变异体代码, 获取更各类的参数输入. 因此, TitanFuzz不错在不停拖沓迭代的过程中生成更多复杂的代码段, 使其不错调用更各类的API序列. TitanFuzz通过在不同的硬件设备上施行差分测试来检测可能存在的颓势, 比如策画失实和崩溃. 实验末端夸耀, 这项使命在代码行覆盖, API覆盖方面的践诺作用效果已超出以往相关使命. 此外, 这项使命率先将LLM应用在DL框架测试相关中, 利用LLM生成测试输入, 具有一定的首创性.
Deng等东谈主[84]觉得历史触发颓势的代码段中常常包含对发现颓势有用的要素, 比如某个不老例的API调用, 参数领域值等. Deng等东谈主提倡FuzzGPT, 利用LLM学习历史触发颓势代码段的特征, 以生成新的测试用例. FuzzGPT通过少样本学习(few-shot learning)指示本事, 利用LLM分析出历史触发颓势代码段中存在颓势的API, 进行颓势数据标注, 构造颓势数据集. FuzzGPT将标注好的颓势数据手脚指示, 使LLM生成或剪辑包含新参数输入的代码段. 此外, FuzzGPT接收构造出的颓势数据集对LLM进行模子参数微调, 使LLM更好地适配该任务. 通过接收差分测试方法, 分别在CPU和GPU上运行LLM生成的代码段, FuzzGPT告成检测到49个之前未被发现的颓势. 比较于TitanFuzz, 这项使命在利用LLM学习历史触发颓势代码的特征, 使生成测试输入方面更有针对性.
Yang等东谈主[104]觉得夙昔相关大多柔柔模子推理阶段的测试, 他们提倡∇Fuzz, 参考FreeFuzz中测试输入生成方法, 要点对模子教练阶段中自动微分(automatic differentiation)功能组件进行测试, 已矣全自动测试过程. 自动微分是DL框架为已矣反向梯度传播算法提供的中枢功能组件聚拢, 为用户屏蔽了繁琐的求导细节和过程. ∇Fuzz通过自动创建遮拦器函数, 将API调用抽象成从输入到输出的函数映射, 然后对每个API映射出的函数偏执低阶和高路线度进行差分测试来检测自动微分过程中是否存在颓势.
有用的API测试输入都应该快乐一定的拘谨. Kang等东谈主[81]提倡SkipFuzz, 在测试输入生成方面选定了以往相关不一样的旅途. SkipFuzz接收主动学习(active learning)[112]的方法, 通过使用拖沓测试过程中获取的API函数信息推断输入拘谨, 从而生成有用的参数输入. 通过这种花样, SkipFuzz生成的参数输入更各类性, 有用参数输入所占的比例也高于之前的相关使命, 并有用缓解了拖沓测试过程中测试输入冗余的问题.
Xie等东谈主[64]从API文档中的信息启程对API进行测试, 提倡DocTer. API文档包含无数对参数确立的天然言语描摹, DocTer通过接收依存关系分析方法分析部分API文档均分析出闲居出现的句法模式[113], 从而构造出一系列输入生成轨则. 在这些轨则下, 通盘API的依存关系分析树(dependency parse tree)都不错映射成具有深度学习领域特征的输入拘谨, 再基于这些拘谨来生成无数的拖沓测试输入. DocTer要点相关测试输入的领域值对检测API颓势的有用性. 此外, DocTer还通过生成无效输入来检测API输出是否会发上崩溃或者特殊, 如果莫得发生, 雷同剖判该API可能存在颓势. 这项使命比较于FreeFuzz和DeepREL等关系使命的跨越在于, 不需要受限于种子输入, 生成的API参数输入愈加无为. 但在构造API参数拘谨阶段, 需要东谈主工介入对一部分API信息进行数据标注, 花消东谈主力较多.
算子是DL框架中基本功能函数的代码已矣, 用来施行各类基本的数据策画与维度攻击, 比如数据归一化(data normalization), 激活函数(activation function)等. 从广义上讲, 任何一个函数的具体已矣都不错觉得是一个算子. 算子的策画正确性, 策画着力和策画精度等对DL框架的质料有决定性的影响.
为更准确地索求DL算子的复杂拘谨, 提高测试用例有用率, Shi等东谈主[105]径直对DL算子源代码进行分析, 提倡ACETest. 作家发现DL算子源代码中输入考证代码和功能性代码一般是解耦的两部分, 因此不错在轮番阻挡流图(control flow graph)上从失实处理函数调用处进行反向跟踪, 定位输入考证代码段. 从代码施行旅途均分析索求输入拘谨, 构建有用且各类化的参数输入, 从而发现DL算子中功能性代码中的颓势. 作家将ACETest实施在TensorFlow和PyTorch的算子上, 告成检测出108个新颓势, 其中5个颓势被收录在CVE中. ACETest转变性地将动态象征施行的想想期骗在DL框架算子测试领域, 然而在缓解测试预言方面身手不及, 只可检测到崩溃一类的颓势.
深度学习算子在施行无数非线性复杂策画的过程中容易出现精度问题[114], 算子精度的纰谬难以评估. Zhang等东谈主[106]提倡针对算子精度的拖沓测试方法——Predoo. Predoo比较分析对TensorFlow框架中的7个典型非线性算子(conv2d、norm、pooling、ReLU、Sigmoid、Softmax和tanh)在不同精度设定下的策画末端进行比较分析, 评估底层策画硬件的不同对算子精度的影响. 该方法通过将算子测试任务转变为一个搜索问题, 以最大化输出精度纰谬为主见, 寻找DL框架中算子可能存在的不一致性.
在Predoo的基础上, Zhang等东谈主[107]转变性地提倡了一种基于覆盖信息散播率领的差分拖沓测试框架——Duo. 与Predoo不同的是, Duo这项使命不再局限于数值精度问题, 而是对7个典型非线性算子(conv2d、norm、pooling、ReLU、Sigmoid、Softmax和tanh)的质料问题进行轮廓性测试相关. 该使命对种子参数输入实施两类突变战略, 已矣算子测试输入自动生成; 通过蒙特卡罗算法和能量调度算法优化拖沓测试施行过程, 并结合输出散播特征等信息, 对拖沓过程的种子库进活动态更新; 终末通过差分测试已矣对算子的已矣颓势、运行耗时和精度纰谬等多维度评估. 实验末端标明, Duo不错检测出已矣失实, 施行时辰资本高和精度纰谬大这3种类型颓势.
谷典典等东谈主[98]针对DL框架内算子已矣失实导致的一类颓势, 将不同算子的共性策画逻辑抽象为“元算子”(meta-operators), 联想并已矣了基于元算子的DL框架颓势检测. 这项使命通过算子细粒度替换的花样, 对不同DL框架已矣下模子中的每个算子进行一一检测, 记载每一次算子替换之后模子的推断末端和模子参数梯度关统共据, 评估前后两次数据的变化各异, 进一步定位颓势. 作家将基于“元算子”的测试方法应用在包含失实策画颓势算子的深度学习模子中, 考证了该颓势检测战略的有用性. 但这项使命提倡的“元算子”策画机制, 其策画着力和策画时内存占用情况仍有进一步优化的空间.
7 将来相关场所深度学习本事如故被无为应用到各个领域, 手脚其中的要道基础软件, 深度学习框架的性能和质料渐渐受到产业界和学术界的无为柔柔. 连年来相关东谈主员针对深度学习框架伸开了无数相关, 也取得了一定的着力, 但该领域仍靠近着许多挑战. 本节内容对尚未措置的难点问题进行分析并预计进一步的将来相关场所, 但愿不错为关系相关东谈主员提供参考.
(1) 相关更高效更可靠的测试输入生成本事
测试输入生成本事存在各类性和有用性两个难题, 主要表当今生成的测试输入各类性受限, 导致测试覆盖率较低; 生成的测试输入有用性较差, 部分测试输入不适当圭表, 影响测试着力. 现存的相关使命为保证测试输入有用性, 接收各类方法不同进度地快乐其拘谨和圭表, 测试输入各类性和可拓展性因此受到阻挡. 奈何提倡更高效、更可靠的测试输入生成方法, 保证测试输入的有用性和各类性的同期, 减少测试输入的冗余, 提高测试输入的利用率和质料, 仍然是一个亟待措置的相关问题.
面前大言语模子已告成应用到软件工程领域的多个场所, 其教练数据集包含无数来自GitHub等平台的开源代码数据, 因此不错学习到软件工程领域愈加复杂的常识、轨则、模式和逻辑. 已有使命标明, LLM在代码生成[115]和颓势开发[116]等方面的身手十分优秀. 比较以往测试输入生成相关, LLM不错学习到愈加复杂的DL框架隐式拘谨, 因此LLM将来会更无为地应用到DL框架测试中. 在用户的指示输入下, LLM不错生成适当深度学习领域圭表的测试输入. 值得疑望的是, 大模子和具体的下流任务之间差距巨大, 常常浅易的指示输入难以得到渴望的输出响应. 奈何期骗指示工程(prompt engineering)[117]本事, 对输入文本信息按照特定模板进行处理, 相关奈何把具体任务重组成一个更能充分利用LLM处理的阵势, 从而利用LLM为DL框架组件生成更高效更可靠的测试输入是一个极度值得探究的场所.
(2) 相关奈何测试并提高DL框架安全性
DL框架是一个高复杂度的软件系统, 在开发过程中不免存在安全随意, 举例对抗攻击、隐秘清楚和拒却做事等, 这些随意将严重阻难深度学习系统的安全. Le Quoc等东谈主[118]基于TensorFlow提倡secureTF平台, 引入包括加密策画和拜访阻挡等多项本事, 为数据集、模子和代码提供安全性保险. Rosetta[119]通过隐秘策画算法将DL框架里的各类算子攻击为“隐秘算子”, 即算子的功能不发生改变, 同期赈济在隐秘保护前提下的使用, 为东谈主工智能提供保护隐秘的措置决议.
现存使命大多是基于DL框架开发安全保护机制, 并莫得对DL框架自身的安全性进行测试评估, DL框架里面的安全随意可能一直存在. 将来不错进一步相关奈何通过静态代码审查, 拖沓测试等本事挖掘DL框架的安全随意, 或者提倡更有针对性的DL框架安全性测试的方法.
(3) 相关奈何针对新一代DL框架组件特征进行测试
新一代DL框架为适合发展需求, 其里面组件呈现出愈加复杂化、各类化的特征. 举例, 计图加入了元算子已矣机制, 大幅进步了深度学习任务开发的活泼性. JAX接收特定领域言语对科学策画关系组件进行优化. 奈何针对DL框架中新的功能和结构特征联想测试方法亦然将来需要面对的相关场所之一.
大模子为通用东谈主工智能提供了措置方法, 但大模子的汇鸠合构、数据参数和策画资源占用十分渊博, 需要散播式教练提高着力. 散播式教练通过散播式用户接口, 已矣模子的散播化, 在施行单节点教练的同期, 不错已矣多节点之间的通讯协调, 从而加快教练. 微软为赈济超大限制模子教练, 基于PyTorch开发了新一代DL框架DeepSpeed[120], 其散播式教练关系组件的质料将影响教练着力和资本. 当DL框架散播式教练关系API和算子优化存在颓势时, 将导致数据通讯着力低和节点失效. 奈何针对DL框架散播式教练接口和组件进行测试, 也瑕瑜常挑升旨的相关场所.
(4) 相关面向DL框架的颓势预测本事
跟着DL框架里面代码限制的扩大和复杂度的不停提高, 仅探讨在DL框架发布前进行颓势检测常常使命量大, 资本更高. 期骗颓势预测本事, 相关东谈主员不错笔据DL框架中索求的度量信息来尽早预测可能存在的颓势, 基于预测末端不错合理地分派资源, 通过再行联想或开发DL框架中的颓势模块, 提高DL框架质料的同期提高框架开发着力. 面前大部分相关仅柔柔测试方法, 小数触及针对DL框架的颓势预测相关. 奈何将软件颓势预测方法应用到DL框架, 在DL框架开发和调换阶段尽早挖掘出颓势模块是一个极度挑升旨的相关场所.
传统颓势预测是在软件开发过程的某个阶段, 对软件模块进行一次性的预测, 然而由于其粒度粗、即时性低和不可追忆等问题, 传统颓势预测如故难以快乐DL框架开发对软件质料的需求. 即时颓势预测是在软件开发过程中, 对每次代码提交进行实时的预测. 面前已有使命针对DL框架作即时颓势预测相关[121], 但仍然靠近DL框架的关统共据集限制较小, 质料较差和对源代码的要道特征信息索求不及等问题, 导致即时颓势预测效果较差以及普适性不及. 相关奈何更好地将即时颓势预测本事期骗到DL框架上是一个极度意旨的相关场所.
8 总 结本文通过对DL框架测试相关关系的论文进行充分分析和总结, 主要从DL框架颓势本性实证相关, DL框架测试要道本事和基于不同测试输入阵势的测试方法这3个方面对DL框架关系相关进行了详确全面的综述, 同期对面前存在的问题进行总结, 对将来相关场所进行预计. 本文主要论断和发现包括以下几个方面.
(1) 相关热度
本文发现, 仅在近5年入手有DL框架测试相关关系论文发表, 剖判面前相关尚处于初期. 近3年论文数目有随时辰上涨的趋势, 况兼相等一部分论文发表在软件工程等领域的顶会、顶刊上, 剖判DL框架测试当今以及将来都是一个备受柔柔的相关场所.
(2) 相关内容
本文主要相关DL框架颓势本性、测试要道本事和测试方法3部安分容. 在了解DL框架颓势本性的基础上, 本文主要柔柔测试输入生成、测试预言和测试评估这3个相关问题, 从基于不同测试输入阵势的测试方法角度进行探究, 总结奈何期骗拖沓测试等测试要道本事来措置DL框架测试中的上述相关问题.
从践诺的颓势本性分析末端来看, DL框架的颓势本性复杂各类, 况兼DL框架版块更新速率快, 需要更科学考究的实证相关来为DL框架测试相关作念指导. 面前DL框架测试要道本事和测试方法存在一定局限性, 对DL框架颓势的检测和挖掘身手还有待提高, 部分实证相关发现的DL框架颓势类型并莫得被现存测试方法充分检测到.
(3) 面前相关的不及和将来相关场所
在无数相关东谈主员的探究下, DL框架测试相关渐渐训练, 部分测试本事和测试方法如故得到践诺考证. 但值得疑望的是, 面前仍然存在一些难点问题亟待措置, 比如面前相关存在测试输入生成身手不及, 针对DL框架安全性相关不及, 艰苦针对新一代DL框架特征的测试相关等问题.
将来不错相关奈何期骗大言语模子等新兴本事为DL框架测试生成更高质料的输入暗网人兽, 相关奈何针对性地接收拖沓测试等本事充分挖掘DL框架的安全随意并对DL框架安全性进行评估, 相关奈何将即时颓势预测本事期骗到DL框架开发和调换过程中等. 期待将来会有更多的相关东谈主员共同勤苦, 鼓励DL框架不停训练.