基本信息
**原文名称:**Large Language Models are Zero-Shot Fuzzers: Fuzzing Deep-Learning Libraries via Large Language Models
**原文作者:**Yinlin Deng;Chunqiu Steven Xia;Haoran Peng等
**原文链接:**https://doi.org/10.1145/3597926.3598067
**发表期刊:**The ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA),2023
**开源代码:**暂未开源
一、引言
深度学习系统在目前的各个领域都无处不在,这些深度学习系统都建立在主流的深度学习库上。
例如TensorFlow和Pytorch。它们为深度学习系统的搭建提供了各种API。检测这些深度学习库中的程序错误对几乎所有下游的深度学习系统在确保用户的安全和效率上非常重要。
但目前对深度学习库的模糊测试主要集中在两个层面,API层面和模型层面。其中API层面的模糊测试通过生成不同的输入来测试单个目标API,而模型层面的模糊测试则是先生成完整的深度学习模型,通过在不同的后端上比较模型输出来发现潜在的问题。
API层面模糊测试的局限性在于缺少复杂的API序列,无法发现由复杂API序列导致的错误;模型层面模糊测试虽然可能对API序列进行测试,但变异规则却有严格的限制,从而遗漏许多可能导致错误的复杂API序列。
因此,基于上述问题,作者提出了TitanFuzz,利用大语言模型对深度学习库进行模糊测试,并提出以下方法:
(1) 为了生成种子库,通过使用生成式大语言模型生成用于模糊测试的高质量种子程序库,并通过基于Transformer架构的大语言模型来对种子库进行变异;
(2) 为提高变异后种子程序的有效性,对变异过程中的种子程序通过适配度函数进行评分并筛选高质量的种子程序。
二、概述
TitanFuzz的基本框架如下图所示,主要由两部分组成:
**(1) 初始种子库生成:**利用Codex大语言模型来生成用于模糊测试的初始种子;
**(2) 种子库变异:**通过InCoder对初始种子库进行变异,并保留优质的种子;
其基本流程为:
(1)利用Codex大语言模型生成深度学习的种子程序片段。
(2)选择性的将程序片段中函数的前缀、后缀、参数和函数名进行屏蔽标记。
(3)利用InCoder恢复这些屏蔽标记来达到变异的目的。
(4)通过beta伯努利多臂老虎机机制筛选出更有效的变异方式,以及一个适配度函数来降低重复的代码片段的产生。
(5)将这些代码分别在CPU和GPU上运行。
图1 TitanFuzz结构图
三、种子生成及变异
1. Codex
在初始的种子库生成的过程中,利用Codex作为生成式模型。Codex大语言模型基于现流行的GPT-3的架构。
模型权重基于训练过的GPT-3进行初始化,然后在开源代码文件语料库上进行微调。利用Prompt提示词工程使得Codex能够更加高效的生成代码片段。
如图2所示,提示模型执行三个任务:
(1)导入目标库
(2)生成输入数据
(3)调用待测试的目标API
图2 Prompt生成种子程序示例
给予Codex模型提示以后,初始的种子程序就可以通过Codex自动完成。
2. InCoder
为了对初始种子库进行变异,文章中采用了InCoder模型进行代码填充的工作。
图3 种子程序变异的4种方式
如图3所示,先分别对代码的四个位置进行了屏蔽标记的操作,分别是argument(参数替换), prefix(上文更改), suffix(下文更改), method(函数替换)。
对这些部分替换为屏蔽跨度标记后,交给InCoder尝试对屏蔽的部分进行恢复,恢复后的代码与屏蔽之前的代码发生了变化,从而使得种子得到变异。
图4 对种子进行变异操作
对于种子变异的过程可以用图4所示的伪代码来进行描述。给予一个种子库、目标API和时间预算。在一定的时间预算下对种子进行变异。
四、变异操作的选择
1. 多臂老虎机
变异操作的选择可以被表述为一个多臂老虎机(multi-arm bandit,MAB)的问题。
假设,对于不同的深度学习库API,产生有趣输出的变异操作是不一样的,所以要在生成循环的过程中自适应地学习每个变异操作的有效性。
而生成的程序片段的有效性可以为变异操作的有效性提供参考。因此,将变异操作选择问题建模为beta伯努利多臂老虎机问题
对于一个基本的MAB问题可以通过以下情形来描述。
你进了一家赌场,假设面前有 K 台老虎机(arms)。假设每台老虎机 都有一定概率 p吐出一块钱,或者不吐钱( 概率1−p)。
假设你手上只有 T枚代币(tokens),而每摇一次老虎机都需要花费一枚代币,也就是说你一共只能摇 T次,那么如何做才能使得期望回报最大呢?
对贝叶斯学派来说,我们在一进入赌场就对每台老虎机的概率 p 就有一个先验分布假设,比如一个很常见的我们可以用Beta分布。
如果我们认为大概率 p都应该是0.5,即对半开,而不太可能出现一些很极端的情况,我们就可以选择Beta(1,1)分布作为我们的先验分布。
采用贝叶斯框架并选择标准beta分布,对于,以及、可以有以下式子来表述
2. 适配度函数
和变异操作选择一样,如何判断变异后的程序是有趣且独特的程序片段也是非常重要的,因此设计了一个适配度函数来对每个生成的程序进行计算得分。
设计适配度函数的思路可以简单理解为,生成的程序具有更深的执行路径,更多样的计算图,更复杂的API调用序列。
数据流图的深度在函数中用D来表示,定义为图的任何路径中的最大边数。每个代码片段中存在的唯一库API调用的数量在公式中用U来表示。公式中的R为重复调用的API数量。
根据公式,TitanFuzz倾向于涉及长链API序列和更独特的API的输入程序。从而尽可能的覆盖不同API之间的交互。
结合多臂老虎机和适配度函数,可以用图5所示的伪代码进行表述。
图5 变异操作的选择
五、实验设计及结果
(一)实验模型
对于初始种子程序生成,使用了基于code-davinci-002引擎的Codex Completion模型为每个API采样了25个程序。模型的参数基于先前的研究[1,2]选择p=0.95、max_tokens=256、temperature=0.4.
在种子变异的部分上,利用Hugging Face上的InCoder 1.3B模型对Codex生成的种子程序进行处理。模型参数基于先前的研究[1]设置p=0.95、temperature=1.
(二)实验设置
本实验的测试目标为2种流行深度学习库,TensorFlow(v2.10)和PyTorch(v1.12),这两深度学习库在先前的测试工作中已经被广泛研究[3,4,5]。
在每一个API上分配了1分钟的时间预算,同时在每个库中随机抽取了100个公共的API,测试了真实程序bug挖掘能力,并进行了5次消融实验。
(三)实验设备
64核心256GB内存的工作站, 4张RTX A6000GPU显卡,系统环境为Ubuntu20.04.5LTS。
(四)具体实验
1. 实验一:与现有的Fuzzer比较
该实验将 TitanFuzz 与用于测试深度学习库库的最先进的 API 级(FreeFuzz[6]、DeepREL[7])和模型级(LEMON[8]、Muffin[9])fuzzer进行了比较,选择了目前性能最好的DeepREL最为基线。
表一显示了API覆盖率的对比,相较于DeepREL,TitanFuzz的覆盖率分别在PyTorch和TensorFlow上增长了91.11%和24.09%。
表1 API覆盖率对比
表二显示了代码行覆盖率,较DeepREL分别提升了50.84%和30.38%。
表2 行覆盖率对比
图6显示了行覆盖率随时间的变化,由于TitanFuzz基于大语言模型,在时间成本上会显著高于其它的Fuzzer。并且DeepREL在大约10秒之后没有出现太多的增长,而TitanFuzz在50秒的测试后覆盖率仍然有增长的趋势。增长可以归功于使用LLM对代码进行填充,以及生成过程中变异操作的选择。
图6 覆盖率随时间的增长曲线
2. 实验二:关键环节消融实验
1) 种子生成
该实验的测试了在种子程序生成过程的Prompt提示词工程的作用,分别对是否使用API签名(只提供函数名而不提供参数)、是否使用step-by-step(不提供图2中的Task1和Task2,只提供库的版本和函数名)的方式来生成种子。并测试了在不同temperature值下生成可用层序的数量。
图7 不同参数下生成可用程序的数量
最终发现在temperature=0.4的情况下,在生成有效的Pytorch和TensorFlow程序上达到了一个较好且平衡。
2) 变异策略
这部分实验检测了变异策略的有效性,当使用全部变异策略的时候,得到的程序数量和覆盖率最高,如表3所示
表3 变异策略对程序生成的影响
3) 适配度函数参数
这个实验探究了适配度函数对生成程序的影响,只有当D、U、R三个参数同时存在的时候,才能获得最多的有效程序。
表4 变异策略对程序生成的影响
4) 变异策略的选择算法
在该实验中,测试了随机选择以及采用beta伯努利多臂老虎机机制的区别。如表5所示,多臂老虎机机制生成了更多有效的程序。
表5 变异策略对程序生成的影响
5) Codex和InCodex程序生成
由表6可以看出,Codex在生成高质量种子上表现更加优异,但是Codex生成每个种子的速度更慢。
InCoder作为一个较小的填充式模型,可以用更快的速度对种子程序进行突变。Codex和InCoder配合可以尽可能的减小生成程序的代价。
表6 Codex和InCoder的种子生成能力
3. 实验三:真实环境发现的Bug
TitanFuzz共检测到65个bug,已确认其中 53 个(19个崩溃错误和34个计算错误)是有效的。53个bug中有41个是先前未发现的bug(其 8个已修复)。
在这 53 个bug中,只有9个能被API级的fuzzer探测到,而模型级fuzzer没有探测到上述任何一个。值得注意的是,通过直接使用 Codex 生成的种子而不进行任何变异,就可以发现 10 个已知的bug。
表7 Bug的发现数量
六、局限及不足
1. 内部:
内部有效性的主要威胁来自TitanFuzz的实现。为应对这一威胁,对代码仔细进行了测试和审查,以确保代码正确运行。
2. 外部:
有效性外部威胁来自benchmark的选择。通过选取最流行的两个深度学习库TensorFlow和Pytorch来缓解该威胁。结果表明TitanFuzz在这两个库上都有最先进的结果。
七、总结
本文提出并实现了TitanFuzz,这是第一个通过大型预训练语言模型对深度学习库进行模糊测试的例子。
TitanFuzz首先使用生成式LLM(如Codex)通过提示词工程提供高质量的种子程序,然后利用填充式LLM(如InCoder)对种子程序进行变异。
在两个流行的深度学习库(PyTorch和TensorFlow)上进行的广泛评估表明,TitanFuzz显著提高了覆盖API的数量和代码覆盖率。此外,TitanFuzz还能检测出65个错误,其中41个被证实是未发现的。
总之,这项工作展示了直接利用现代LLM进行模糊测试的前景。
参考文献
[1] FRIED D, AGHAJANYAN A, LIN J, et al. InCoder: A Generative Model for Code Infilling and Synthesis[J]. 2022.
[2] CHEN M, TWOREK J, JUN H, et al. Evaluating Large Language Models Trained on Code[J]. Cornell University - arXiv,Cornell University - arXiv, 2021.Michal Zalewski. American Fuzzy Lop (2.52b). http://lcamtuf.coredump.cx/afl, 2019.
[3] WANG J, LUTELLIER T, QIAN S, et al. EAGLE: Creating Equivalent Graphs to Test Deep Learning Libraries[J].Xuejun Yang, Yang Chen, Eric Eide, and John Regehr. Finding and understanding bugs in c compilers. In Proceedings of the 32nd ACM SIGPLAN Conference on Programming Language Design and Implementation, PLDI’11, New York, NY, USA, 2011.
[4] WEI A, DENG Y, YANG C, et al. Free Lunch for Testing: Fuzzing Deep-Learning Libraries from Open Source[J].
[5] XIE D, LI Y, KIM M, et al. DocTer: Documentation Guided Fuzzing for Testing Deep Learning API Functions[C/OL]//Proceedings of the 31st ACM SIGSOFT International Symposium on Software Testing and Analysis. 2022. http://dx.doi.org/10.1145/3533767.3534220. DOI:10.1145/3533767.3534220.
[6] WEI A, DENG Y, YANG C, et al. Free Lunch for Testing: Fuzzing Deep-Learning Libraries from Open Source[J].1
[7] Yinlin Deng, Chenyuan Yang, Anjiang Wei, and Lingming Zhang. 2022. Fuzzing deep-learning libraries via automated relational API inference. In Proceedings of the 30th ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering (ESEC/FSE 2022). Association for Computing Machinery, New York, NY, USA, 44–56. https://doi.org/10.1145/3540250.3549085
[8] WANG Z, YAN M, CHEN J, et al. Deep learning library testing via effective model generation[C/OL]//Proceedings of the 28th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. 2020. http://dx.doi.org/10.1145/3368089.3409761. DOI:10.1145/3368089.3409761.
GU J, LUO X, ZHOU Y, et al. Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing[J]. 2022.
—END—