【外文翻译- OBSAN:一种用于强化深度神经网络可执行文件的越界检查工具】此文章归类为:外文翻译。
深度神经网络(DNN)模型在多种硬件平台上的快速普及推动了深度学习(DL)编译器的发展。DL 编译器以高层次的 DNN 模型规范为输入,针对不同硬件架构(如 CPU 和 GPU)生成优化的 DNN 可执行文件。尽管 DL 编译器在实际场景中的应用日益广泛,但目前尚无针对 DNN 可执行文件的保护解决方案。为填补这一关键空白,本文提出了一种名为 OBSAN 的快速检测工具,用于检查 DNN 可执行文件中的越界(OOB)行为。从整体上看,DNN 包含双向计算:正向传播用于根据输入预测输出,反向传播用于分析正向预测的形成过程。在正向传播中,神经元激活值应处于有效范围内;在反向传播中,梯度值也需要在合理范围内。超出这些范围的行为将被视为 OOB。OOB 主要与 DNN 的不安全行为相关,这通常由异常输入引起,并可能导致错误预测,甚至通过对抗性样本(AEs)实现的攻击。我们设计了 OBSAN,其中包括两个变体:FOBSAN 和 BOBSAN,分别用于检测正向传播和反向传播中的 OOB 行为。每个 OBSAN 变体都被设计为 DL 编译器的附加通道,能够集成到大规模 DNN 模型中。我们还设计了多种优化方案以降低 OBSAN 的开销。针对多种异常输入的评估表明,OBSAN 在检测 OOB 行为方面具有良好的效果,且开销较低。此外,我们还展示了 OBSAN 的两个下游应用:阻止在线对抗样本生成,以及促进基于反馈的模糊测试以强化 DNN 可执行文件。
随着在实际场景中使用深度学习(DL)技术的需求不断增长,近年来,DL 模型在从云服务器到移动设备和嵌入式设备等广泛计算平台上的部署呈现出显著趋势。为了应对复杂的部署环境并充分挖掘计算平台的优化潜力,一个有前景的方向是使用 DL 编译器 [19, 47, 68]。DL 编译器以高层次的 DNN 模型规范作为输入,为不同硬件后端生成相应的低级优化二进制代码。目前,许多边缘设备和低功耗处理器的供应商正在将 DL 编译器集成到其设计和应用中,以充分利用编译后的 DNN 模型的优势 [31, 56, 57, 65, 93]。云服务提供商(如亚马逊和谷歌)也在其 DL 服务中引入 DL 编译器,以提高性能 [9, 90]。
尽管 DL 编译器的使用日益繁荣,但尚不存在用于强化 DNN 可执行文件的技术。近年来的研究提出了一些技术,用于验证 DNN 模型的执行合法性、检测攻击和对抗样本(AEs),或进行安全模糊测试 [21–23, 58, 80, 86, 102, 102],但这些方法主要针对在 TensorFlow 或 PyTorch [7, 60] 等 DL 框架上运行的 DNN 模型。一些研究测试了 DL 框架或 DL 编译器 [30, 42, 62, 63, 71, 83, 89, 91, 104],但据我们所知,目前尚未有针对由 DL 编译器编译生成的 DNN 可执行文件的分析或安全强化技术。
软件检测工具(Sanitizer)[73] 旨在强化可执行文件并检测漏洞。它们在编译过程中对程序进行插装,插入检查代码,在运行时检测到不安全操作时触发警报。多种检测工具 [8, 50, 53, 70, 75] 已成功帮助发现 C/C++ 软件中的漏洞。受到 C/C++ 程序检测工具在保护可执行文件方面成功经验的启发,本研究提出了 OBSAN,一种用于检测 DNN 可执行文件异常行为(即越界行为,OOB)的检测工具。OOB 行为常导致错误预测和潜在攻击机会。
DNN 通常处理高维媒体数据(如图像)并进行预测。从整体上看,DNN 的计算具有双向特性,即正向传播和反向传播。正向传播通过神经元激活值预测输入结果,而反向传播通过层间梯度从输出到输入反推分析预测的形成过程。重要的是,对于被认为是正常的输入,其神经元激活值和梯度值均应处于正常范围内 [28, 46]。因此,当观察到 OOB 神经元激活值或 OOB 梯度时,表明在对抗性样本(AEs)或其他异常输入下,DNN 出现了异常行为。
我们设计了 OBSAN 的两个变体:FOBSAN 和 BOBSAN,用于分别检查 DNN 可执行文件中正向传播的神经元激活值和反向传播的梯度值是否越界。FOBSAN 通过将神经元激活值与已知的安全范围进行比较来发现异常输入,而 BOBSAN 利用梯度中丰富的信息实现这一目标。然而,与其他检测工具类似,OBSAN 面临的一个共同挑战是高运行时开销 [73],这通常制约了其在生产环境中的应用。我们提出了多种优化方案以降低 OBSAN 的开销;特别是,通过量化技术 [20],用整数运算替代浮点数运算,有效减少计算和存储需求,同时保持推断和检测的准确性。此外,我们借鉴了流行的 DNN 层剪枝技术 [25],对插入的 OBSAN 检查代码进行精简,删除那些附属于“不重要”层的 OBSAN 检查代码。我们还探索了专门针对 FOBSAN 或 BOBSAN 的优化方案。这些优化方法可以结合使用,通过协同效应有效降低 OBSAN 的开销,同时不削弱其对 OOB 的检测能力。
OBSAN 的两个变体,FOBSAN 和 BOBSAN,
设计为行业领先的深度学习(DL)编译器 TVM [19] 的中间表示(IR)层上的额外编译过程;将 OBSAN 实现为 TVM 的 Relay IR 可以避免不同 DL 框架之间的设计差异。Relay IR 通常具有良好的分析友好性,提供了类型系统、分析以及优化实用工具。我们对三个具有多样化结构、参数量高(高达 2350 万)和层数众多(超过 100)的大型深度神经网络(DNN)模型进行了评估。我们表明,原生 FOBSAN 和 BOBSAN 对对抗样本(AE)的越界检测(OOB)能力很高(错误拒绝率低于 0.5%),并且很少将正常输入误认为越界输入(错误接受率低于 1.2%)。通过量化/瘦身优化,我们成功将 FOBSAN 的开销从 121.3% 降低到 47.6%,并将 BOBSAN 的开销降低到 -34.3%(与不含 OBSAN 的基线可执行文件相比),同时保持了良好的可用性,从而促进了 OBSAN 在生产中的实际应用。
在实际使用方面,我们展示了 FOBSAN 如何在媒体数据被假定为语义合理的情况下,检测内容损坏的输入;以及 BOBSAN 如何在深度神经网络被训练用来预测一组预定义标签时,识别网络知识范围外的未定义输入——因为对这些未知输入的预测是无意义的。我们进一步展示了 FOBSAN 和 BOBSAN 如何实现在线基于查询的对抗样本生成的防护,并扩展 FOBSAN 以支持对 DNN 可执行文件的反馈驱动模糊测试。此外,我们还对 OBSAN 与现有方法进行了概念和实证对比,并探讨了将 OBSAN 迁移到其他 DL 编译器和架构的可能性。我们的主要贡献包括:
我们将本文的补充材料和 OBSAN 的源代码发布在 [2],以促进未来的研究。
从整体上看,DNN(记为 Fθ)表示一个参数化的非线性函数,支持双向计算:
1)前向传播,基于输入 x 生成预测 Fθ(x);
2)后向传播,用于分析预测结果的生成过程。以下是对两种计算形式的介绍。
DNN 的前向和后向计算
(a) 处理公鸡图像时的 DNN 前向传播。多个神经元被激活,与鸟喙相关的神经元激活最高。
(b) 做出预测后的 DNN 后向传播。梯度调整决策逻辑 (黄 → 紫),以区分母鸡和公鸡时更关注鸡冠而不是鸟喙。
前向传播。 在前向传播阶段,一个输入 x 被输入到 DNN 中,各层神经元接受来自前一层的输入数据,根据激活函数进行处理,并将结果传递到下一层。一般来说,神经元是前向传播中最小的计算单元。现有研究经验表明,单个神经元通常能够表示输入中的某些特征 [14]。例如,在处理一张公鸡的图片时(如图 1(a) 所示),某些神经元可以识别其颜色,而其他神经元(通常在更深的层中)则可以识别其喙或冠的特征。当识别图片中的某些特征(例如图 1(a) 中的“白色”)时,相应的神经元会表现出较高的激活水平。因此,可以通过神经元的激活情况来表征 DNN 的行为。通常认为,每个神经元都有一个正常的激活范围,通过观察超出正常范围的神经元激活情况,可以检测到不安全的 DNN 行为 [46, 61]。
后向传播。 梯度表征了 DNN 的决策逻辑。例如,图 1(b) 中第 i+1 层的梯度(一个二维向量,用黄色点标记)表明 DNN 主要依赖“喙”来识别公鸡。在训练阶段,DNN 根据梯度调整其决策逻辑。如图 1(b) 所示,DNN 对输入的当前预测是“母鸡”(错误的),因为它依赖于“喙”。通过将预测结果与真实标签进行比较,计算出的“距离”(即损失)通过梯度反向传播到 DNN 中。随后,通过修改 θ(例如 Fθ → Fθ'),DNN 的决策逻辑逐渐调整直至收敛,即图 1(b) 中的紫色点,其关注点转移到“冠”,从而正确预测“公鸡”。简而言之,梯度提供了有关 DNN 决策过程的丰富信息,梯度幅度与其在决策过程中的“重要性”相关。与神经元激活类似,梯度幅度也有正常范围。不安全的 DNN 行为(例如图 1(b) 中的红点,其决策逻辑既不考虑“喙”也不考虑“冠”)可能是由对抗样本输入引起的,可以通过检查超出正常范围的梯度来检测 [28]。
OBSAN 的两个变体。 为了捕获越界行为(OOB),我们提出了两种检测器,即 FOBSAN 和 BOBSAN,分别监控 DNN 可执行文件的前向和后向计算。通过观察定义在神经元激活(前向传播)和梯度幅度(后向传播)上的越界行为,这两种实现可以在多种场景下检测异常的 DNN 行为。需要注意的是,BOBSAN 是插入到预训练 DNN 可执行文件中的,它只计算梯度而不会更新 θ。我们进一步说明,TVM 编译的 DNN 可执行文件对于计算梯度还不够成熟,因此我们实现了几个新的 TVM 操作符以支持梯度计算;详见附录 B。
深度学习(DL)编译器通常接受由 DL 框架(如 TensorFlow)导出的经过充分训练的 DNN 模型的高级描述作为输入。这些 DNN 描述通常以计算图的形式编码,规定了 DNN 模型中不同算子的连接方式,而不定义每个算子如何具体实现于硬件上。
编译器前端:图优化。 通常,DL 编译器前端会将 DNN 计算图转换为与硬件无关的图中间表示(IR)。图 IR 便于进行平台无关的图级优化,例如算子融合和布局转换 [19, 68]。例如,“算子融合”将某些相邻的 DNN 算子合并以减少开销。由于 DNN 神经元在图 IR 中被保留,我们将 OBSAN 实现为 TVM 的图 IR(即 Relay IR [5])上的多个插桩过程。
编译器后端:低级优化。 图 IR 说明了每个算子的输入如何映射到输出,但不限制每个算子应该如何用机器代码实现。通常,从优化后的图 IR 派生出低级 IR,用于特定硬件的优化。一些 DL 编译器实现了自己的低级 IR,以利用硬件特性进行优化 [68]。典型的优化包括内存分配、延迟隐藏以及与循环相关的优化 [12, 19, 66, 99]。我们还发现,一些 DL 编译器可能将其自定义 IR 转换为标准工具链,如 LLVM IR [38] 或 CUDA IR [55],以挖掘低级优化机会。
代码生成。 低级 IR 通过即时编译(JIT)或预编译(AOT)模式,进一步生成用于不同硬件目标(如 CPU 和 GPU)的可执行代码。迄今为止,大多数 DL 编译器都可以生成独立的 DNN 可执行文件以及动态链接库(后者可通过用户应用代码进行链接)进行交付。本文首次讨论了针对已编译 DNN 可执行文件和动态链接库的安全强化技术。我们设计的检测器 OBSAN 被插入到由 TVM 编译的可执行文件/动态链接库中,以提供低成本的安全强化。然而,OBSAN 并不限于 TVM;详见第 X-B 节中的扩展性讨论。
Sanitizer 插入检查和专门的元数据结构以增强软件的安全性;插入的检查会在内部测试或在线执行期间监控程序的运行。当安全属性被违反时,Sanitizer 检查会中止执行并通知用户。我们引入了两种 Sanitizer:地址 Sanitizer(ASan)和未定义行为 Sanitizer(UBSan),这两者在检测许多漏洞方面都发挥了关键作用 [73]。
ASan:ASan 检测内存损坏错误并强制实现内存安全 [70]。ASan 将每个内存字节的可访问性编码到其对应的影子内存中。在编译输入程序时,ASan 对每次内存访问进行检测,检查内存地址 addr
是否有效,其方法是将 addr
映射到其相应的影子内存地址:
1 | addr_shadow = (addr >> 3) + offset |
影子字节 B
位于 addr_shadow
,其值会被加载以检查通过 addr
的访问是否安全。B
的值编码了不同的内存可访问性,其中 B = 0
表示从 addr
开始的所有 8 个字节均可访问;B = k
(1 ≤ k ≤ 7) 表示只有前 k 个字节是可访问的;任何负值都表明访问 addr
是无效的。影子内存本身位于 addr_shadow
的位置被映射到一个不可访问的“无效”区域。
UBSan:C/C++ 程序可能存在未定义行为,这可能导致严重的漏洞 [87]。UBSan [50] 能识别 C/C++ 代码中的许多未定义行为,包括越界访问、整数溢出和除零错误。我们简单介绍一下 UBSan 如何检测除零错误。
考虑以下代码:
1 | int quotient = dividend / divisor; |
当 divisor
为零时,会触发未定义行为。UBSan 通过将 divisor
复制为两个副本,并在执行除法操作之前检查第一个副本是否为零,从而检测该行为。
动机:深度学习(DL)编译器通过系统性优化来促进 DNN 模型的应用。为了从 DNN 模型中获取收益,边缘设备和低功耗处理器的供应商已将 DL 编译器整合到其系统中 [31, 56, 57, 65, 93];云服务提供商如 Amazon 和 Google 也将 DL 编译器纳入其 DL 服务,以提高性能 [9, 90]。具体来说,Amazon 已被观察到通过 DL 编译器将 DNN 模型编译到 Intel x86 CPU 上 [32, 44]。Facebook 也被观察到将编译后的 DNN 模型部署到 Intel CPU 上 [52]。总体而言,可以准确地假设,DL 编译器对在异构硬件后端上推进 DL 的发展越来越重要。
DL 编译器尚未提供安全解决方案来加固 DNN 可执行文件:已有的对抗样本(AE)检测方法由于各种原因难以应用于 DNN 可执行文件(将在第 X-A 节中提到)。最近的社区努力主要集中在测试 DL 编译器 [42, 71, 91],而不是保护 DNN 可执行文件或分析其攻击面。本工作设计了 OBSAN,这是第一个集成到生产 DL 编译器中的安全加固解决方案,作为额外的编译步骤。OBSAN 在 DNN 可执行文件中插入 Sanitizer 检查,从而以低成本检测 DNN 的一种常见可疑行为——越界(OOB)。我们展示了 OBSAN 在生产 DNN 可执行文件中的高 OOB 检测率和低成本,并且还将 OBSAN 用于促进下游攻击缓解(第 IX-A 节)以及基于反馈的 DNN 可执行文件模糊测试(第 IX-B 节)。
需要注意的是,尽管 C/C++ Sanitizer(如 ASan 和 UBSan)的误报率几乎为零,但用于 DNN 可执行文件的 Sanitizer 可能会引入一定量的误报。DNN 的 OOB 输入没有像越界 C 指针那样的明显“模式”,因此本质上更难检测。不过,OBSAN 将误报率保持在较低水平(平均 4.2%;见第 VIII-A 节),以确保正常使用几乎不受干扰。
**主要受众和需求:**OBSAN 的主要受众是那些使用 DL 编译器编译其训练好的 DNN 模型的模型所有者。OBSAN 集成到生产 DL 编译器的编译流程中,用于生成加固的 DNN 可执行文件。需要明确的是,OBSAN 是在 DNN 可执行文件的推理阶段加固它;它并不用于检测 DNN 可执行文件的“编译时”或模型训练阶段的 OOB 问题。OBSAN 在已发布的 DNN 可执行文件的生产使用期间检测 OOB 问题,并具有合理的成本(见第 VIII 节)。
为了便于初始化 OBSAN 检查,我们要求模型所有者使用能够代表模型预期良性输入的数据集。作为一种常见方法,他们可以使用标准的模型训练数据集;典型的训练数据集(如我们评估中采用的 CIFAR-10 [37])应能全面描绘正常行为。这一点在许多现有 AE 检测工作中被一致假设 [48, 74, 85]。
需要明确的是,采用的训练数据集不需要暴露给其他(不可信的)方。OBSAN 的主要受众——模型所有者,可以使用本地训练数据集训练模型,然后使用 DL 编译器将训练好的模型编译为可执行文件。在编译过程中,OBSAN 被插入到可执行文件中(类似于 ASan/UBSan 被注入到 C/C++ 可执行文件中)。然后,插入了 OBSAN 的 DNN 可执行文件被发布供使用。对于模型所有者将其训练模型出售给用户并让用户自行编译的情况,模型所有者可以分发部分优化的模型(经过需要训练数据的量化处理后;见第 V-B 节),以及与 FOBSAN 相关的范围数据记录,用户可以使用 DL 编译器编译这些模型并启用 OBSAN。在这种情况下,仅发布从训练集推导出的必要(如范围)数据。
我们设想 OBSAN 的使用可以显著增加生成对抗样本的复杂性,即使正常行为数据被公开(例如上述“范围数据”)。这与现有 AE 防御工作中一致的假设是一致的:AE 生成通常是一个多目标优化过程,而 OBSAN 检查引入了许多额外的“约束”(优化目标),需要在此过程中予以考虑。
**使用场景:**OOB(Out-Of-Bounds,越界)涵盖了多种需要用户关注的触发缺陷的深度神经网络(DNN)输入(如图2所示)。我们在此逐一讨论如下内容:
检测感知损坏的输入:大家可能知道,检测格式无效的图像(例如,RGB图像像素值超出[0, 255]范围)是相对简单的。然而,除了格式有效性之外,真实世界的图像还包含人类可感知的内容(例如,肖像照片中的耳朵)。事实上,DNN模型通常假设输入是具有真实世界意义的图像。更具体地说,输入图像的像素值会受到某些约束,从而确保内容对人类可感知 [27, 106],类似于传统程序的输入约束(例如类型或范围)。然而,DNN缺乏输入检查机制。因此,检测内容损坏的图像(如图2(b)所示)变得既具有挑战性又至关重要,因为DNN在处理这些损坏输入时可能会表现异常。据我们的观察,包含感知损坏(或感知无意义)内容的输入会触发OOB,并被OBSAN捕获。
OBSAN 的使用案例。OBSAN 可以通过检查 OOB 检测到各种异常输入 (b–e),但不会标记正常输入 (a)。在绘制这个示例时,我们增加了 (d) 和 (e) 中的攻击预算,以更好地可视化对抗性扰动对 AEs 的影响。在第 VIII 节和第 IX-A 节中评估了不同视觉质量的 AEs
**检测未定义输入:**OBSAN还可以捕获未定义输入。例如,假设一个DNN被训练用于对猫和狗图像进行分类,那么一张鱼的图像(如图2(c)所示)可以被视为未定义输入。我们强调,DNN不应随机“分类”此类图像,而是应显式地向模型所有者发出警告。然而,这并不容易,因为DNN已知对其输入往往过于自信 [13, 79]。也就是说,即使它将未定义输入随机分类为猫或狗,其关联的置信分数通常仍然很高,且与正常输入的分类置信分数几乎难以区分。然而,OOB通常可以在DNN内部观察到,这表明利用OBSAN检测未定义输入是可行的。
**检测对抗样本(AE):**除了包含损坏/未定义内容的图像外,我们还强调OBSAN可用于检测对抗样本(Adversarial Examples,AEs)。AEs是视觉上与正常图像几乎相同的图像,但通过微小的(像素级)更改会让DNN产生错误预测。AEs通常不会影响人类的判断,但会导致DNN异常行为。迄今为止,对抗样本已被广泛用于攻击DNN,在日常使用中造成了巨大困扰甚至严重后果 [18]。尽管对抗样本比损坏/未定义图像更为隐蔽,但最近的研究 [46] 表明,对抗样本也会频繁触发OOB行为。因此,我们设想OBSAN可以检测对抗样本,从而防止攻击者操纵DNN可执行文件的预测结果。需要说明的是,现有的对抗样本生成算法可分为白盒和黑盒两类:白盒方法在DNN梯度的指导下生成对抗样本,而黑盒方法具有更广泛的应用范围,仅利用DNN的预测输出作为反馈即可生成对抗样本。我们在图2(d)和图2(e)中分别展示了使用黑盒和白盒算法生成的两个对抗样本。OBSAN在第VIII节中被用于检测白盒对抗样本,并在第IX-A节中用于缓解黑盒对抗样本生成(作为下游应用)。
**扩展应用:**我们还讨论了通过对 OBSAN 进行轻微扩展而实现的两个重要的下游应用。
在线 AE 生成攻击的示意图。在第 k 次迭代中,攻击根据反馈 rk(例如,DNN 预测)将输入 ik 变异为 ik+1。通过逐步重复迭代,从初始输入 i0 生成 AE。OBSAN 可以通过中断进程并迫使攻击者回溯来缓解攻击
**缓解在线对抗攻击:**在实际中,针对DNN可执行文件的在线对抗攻击(即生成对抗样本)通过迭代访问预测输出并扰动输入来进行,如图3所示。通过干扰这一生成过程,可以扩展OBSAN来缓解在线对抗样本生成。我们发现,当变异输入“接近”对抗样本(即仅需几次迭代就能变为对抗样本)时,尽管预测尚未改变,但在大多数情况下会触发OOB行为。因此,当OBSAN检测到OOB时,可以扩展为向远程攻击者的查询返回一个虚假的(空)响应。结果,攻击者无法获得用于变异输入的反馈,被迫回溯并随机变异,如图3所示。相关评估见第IX-A节。
**实现基于反馈的模糊测试:**DNN模糊测试旨在检测DNN模型的安全缺陷或错误预测。软件灰盒模糊测试通常以代码覆盖率为指导,假设“高代码覆盖率有助于发现更多漏洞”。然而,针对DNN可执行文件的模糊测试尚未被深入研究。总体而言,对DNN可执行文件进行模糊测试是一个具有高成本和挑战性的场景,因为DNN可执行文件内部的覆盖信息难以获取,属于黑盒。然而,通过稍作扩展,OBSAN检查可以提供反馈来指导DNN可执行文件的模糊测试。在这一设置中,OBSAN的OOB检查被修改为记录神经元状态,参考先前文献 [46, 58, 61]。以最大化覆盖神经元状态为目标,可以对DNN可执行文件进行神经元覆盖率引导的模糊测试;详情见第IX-B节。
激励示例。(a) 和 (b) 显示在前向传播过程中,属于同一预测类别的输入的神经元激活是有界的。(c) 和 (d) 展示了二维空间中的 Lp 范数
**前向神经元激活:**请参考图4(a)-(b),该图展示了从一个经过良好训练的卷积神经网络中随机选择的浅层神经元和深层神经元的激活情况。每个点对应一个正常的DNN输入(即训练数据),每种颜色表示一个预测类别。尽管分布因层而异,但属于同一预测类别的输入的神经元激活往往集中在一个有界区域内(即图4(a)-(b)中的紫色区域)。通常认为,由正常输入指定的输出边界描述了每个神经元的正常行为 [46]。假设一个神经元n1,其关于类别c的正常输出范围为[l1, u1]。当某个缺陷触发输入导致n1的输出超出[l1, u1]时,就可能出现不安全/异常的DNN行为。
我们将前向OOB定义如下:
设一个神经元n关于类别c的正常输出范围为[lcₙ, ucₙ]。当某输入i*导致n的输出超出[lcₙ, ucₙ]时,发生前向OOB。
**决定激活边界[lcₙ, ucₙ]:**现有研究 [46] 通过使用训练数据对DNN模型进行分析来确定神经元正常输出范围;通常认为训练数据能够编码DNN的典型行为。如第III节所述,当使用FOBSAN加强DNN可执行文件时,需要一个训练集。总体而言,为了增强一个经过良好训练的DNN模型m,我们首先通过将训练数据输入模型m并记录每个神经元n的正常值范围[ln, un]来对其进行分析;该正常值范围被视为类别c的[lcₙ, ucₙ],其中c是训练输入所属的类别。然后,在将模型m编译为可执行文件e时,我们在每个神经元n的输出上添加一个FOBSAN检查。在e的正常使用过程中,每个FOBSAN检查将持续检测其挂钩的神经元n的输出是否超出正常范围[ln, un]。如果超过T个神经元(见下文)表现出OOB输出,FOBSAN检查将向用户报告异常。
**决定阈值 T:**由于深度神经网络(DNNs)处理的输入多样化,因此某些正常输入触发部分神经元的越界输出(OOB,Out-Of-Bound)是合理的,但这并不影响 DNN 的正常行为。我们的初步研究表明,异常输入触发的 OOB 神经元数量远多于正常输入触发的数量。因此,我们设置一个阈值 T 来检测异常输入:只有当输入触发的 OOB 神经元数量超过 T 时,FOBSAN 才会将其标记为异常输入。
直观上,如图 4(b) 所示,神经元的激活(针对某一类)分布在某些特定方向(而不是全部方向)。也就是说,可以合理地假设,当模型输入了足够的训练数据后,大多数神经元的激活范围会固定下来,只有少数神经元在输入更多训练数据时仍需扩大其输出范围。因此,在使用 90% 的训练数据更新边界 [l_c^n, u_c^n]
后,我们使用剩余的 10% 数据来同时更新边界和决定阈值 T:我们记录每当训练输入导致边界更新时触发的 OOB 神经元数量(#OOB),然后将 T 设置为:
1 | T = ( 1 −µ)a + µb |
其中,a
和 b
分别是记录的 #OOB 的最小值和最大值,0 ≤ µ ≤ 1
是用户决定的参数,用于调整用户偏好:当 µ
接近 0 时,更倾向于减少假阴性(false negatives);当 µ
接近 1 时,更倾向于减少假阳性(false positives)。在实践中,我们发现 µ = 0.3
是一个较好的选择,并使用该值来评估 FOBSAN。
**反向梯度:**深度神经网络的梯度包含了丰富的信息,描述了预测是如何被生成的(因为梯度在训练过程中调整了决策逻辑;参见图 1(b))。许多已有研究利用 DNN 的梯度来解释每个预测背后的机制 [69, 77]。如公式 (1) 所示,对于一个 l 层的深度神经网络 Fθ(x) = f_l ◦ f_{l-1} ◦ ... ◦ f_2 ◦ f_1(x)
,其参数为 θ = (θ_1, θ_2, ..., θ_l)
,输入为 x
,梯度通过 g(x)
逐层反向传播:
1 | ∂g(x) / ∂θ = (∂g(x) / ∂f_l) * (∂f_l / ∂f_{l - 1 }) * ... * (∂f_2 / ∂f_1) * (∂f_1 / ∂θ) |
最近的研究指出,当用深度神经网络的输出(即所有类别的置信分数向量)与均匀分布 U
(假设所有类别的置信分数相等)之间的 Kullback-Leibler(KL)散度来传播梯度时,其梯度幅值是有界的 [28]。梯度计算公式如下:
1 | ∂g(x) / ∂θ = ∂DKL(U||Fθ(x)) / ∂θ |
其中,x
是模型输入,U = (1/C, 1/C, ..., 1/C) ∈ R^C
,C
是类别数,DKL(p||q) = Σ_j p_j log(p_j/q_j)
。
需要注意的是,与训练过程中基于真实标签的距离(由开发者定义)传播梯度不同,这种公式不需要输入的真实标签;均匀分布 U
作为参考,用于衡量梯度的偏差。因此,这种方法可以用于对 DNN 可执行文件进行健全性检查,以处理各种输入。在此基础上,我们定义反向 OOB 为:
对于一个 l 层的深度神经网络,如果某层 k 的梯度范围(在高维空间中)为 [l_k, u_k]
,当梯度:
1 | ∂g(x∗) / ∂f_l * ... * ∂f_{k + 1 } / ∂f_k |
通过公式 g(x∗) = ∂DKL(U||Fθ(x∗))
传播时,超出 [l_k, u_k]
的范围,则发生反向 OOB。
**使用 Lp 范数决定梯度边界:**与标量值的神经元激活不同,第 k 层的梯度 G_k(x∗) = ∂g(x∗)/∂f_l * ... * ∂f_{k+1}/∂f_k
是一个高维向量。实际上,其幅值通常用 Lp 范数表示,Lp 范数表示向量到原点的距离,公式如下:
1 | Lp(G_k) = (|G_k[ 1 ]|^p + |G_k[ 2 ]|^p + ... + |G_k[d]|^p)^( 1 / p) |
图 4(c) 显示了二维空间中 Lp = 1 的点集(用线连接),不同的 p 值决定了距离准则的几何形状。图 4(d) 显示了 L2 范数在 [0.5, 0.1]
范围内的点(等价于二维梯度)。如果 DNN 某一层的梯度值落在紫色环外,则视为反向 OOB。
对于 BOBSAN,我们将 10% 的训练数据作为正常输入喂给已插装的 DNN,并收集所有输入 r
的梯度值集合 L = {Lp(G_k(r))}
,然后将 l_k
和 u_k
分别设置为 Pα(L)
和 Pβ(L)
,其中 P_x(·)
表示第 x 个百分位数。与前文讨论的 FOBSAN 类似,我们提供 α 和 β 两个可配置参数,以便调整 BOBSAN。根据经验观察,我们使用 α = 1
和 β = 99.5
来评估 BOBSAN,并建议用户根据需要调整这些参数。有关选择 p 值的建议,请参考第 V-B 节。
鉴于 TVM 的蓬勃发展及其活跃的社区支持,我们在 TVM 中实现了 OBSAN,并将解释 OBSAN 两种变体如何与 TVM 集成。随后我们讨论了三种优化方案,用于减少 OBSAN 的开销。在第 VI 节中,我们将详细讨论 OBSAN 的实现细节。
**加固后 DNN 可执行文件的输出:**图 5 展示了使用 OBSAN 保护 DNN 可执行文件的示例。DNN 模型可以是高层次的 PyTorch/ONNX 格式(图 5(a))或者是未保护的 DNN 可执行文件格式(此处省略)。通常,这些模型仅输出预测结果(如类别标签和置信度分数)。相比之下,如图 5(c) 所示,经过 OBSAN 加固的 DNN 可执行文件会额外输出 OOB(越界)“警报”(即错误信息)。这种设计选择有两个原因:
**对 DNN 模型进行插桩:**图 5(b) 展示了 OBSAN 如何集成到 TVM 中。如第 II-B 节所述,TVM 首先会将输入的 DNN 模型转换为图 IR(即 Relay IR),并执行 TVM 前端优化。更重要的是,我们在此阶段提供了一种优化方案 O1(剪枝;详情见第 V-B 节),以减少整个(插桩)模型的开销。
接下来,OBSAN 会对转换后的 Relay IR 模型进行插桩。根据 OBSAN 的不同变体,插桩操作会以不同模式运行。对于 FOBSAN,模型需要首先以所谓的“记录模式”(Record Mode)进行插桩,该模式会生成一个辅助记录器可执行文件,而非最终的受保护可执行文件。此中间可执行文件能通过将训练数据逐一输入记录器,收集每个神经元的正常输出边界(详见第 IV-A 节)。在收集完数据后,原始模型会再次以“检测模式”(Detect Mode)进行插桩,此时已记录的每个神经元 n 的边界值将嵌入到 n 的 FOBSAN 检查中,并插入到加固后的可执行文件中。
对于 BOBSAN,模型直接以检测模式进行插桩,在模型中插入计算反向 OOB 信息的指令(详见第 IV-B 节)。
从高层次看,OBSAN 的设计原则类似于软件的 Sanitizer:对于一个程序(DNN 模型),OBSAN 识别“感兴趣”的位置,插入检查以钩住这些位置并执行边界检查等保护任务。对于 FOBSAN,其插桩过程会遍历模型在 Relay IR 中的计算图,为每个神经元加入钩子。至于 BOBSAN,我们根据 DNN 的操作实现了新的 TVM 运算符,用于计算梯度;详见附录 B。为了便于理解,我们在附录 A 中展示了使用 FOBSAN 或 BOBSAN 插桩的两个 DNN 示例。
OBSAN 的工作流程。OBSAN 在插桩的不同阶段整合了三个可用的优化 O1 至 O3
**减少 OBSAN 开销的优化方案:**OBSAN 被设计为将子图插入到输入 DNN 的 Relay IR 计算图中。这使得 TVM 的图级优化和后续后端优化可以正常应用于 OBSAN。此外,我们设计并应用了三种优化方案 O1−3,以降低 OBSAN 检查的开销。如图 5(b) 所示,其中一种优化 O1 是在整个计算图上全局应用的,而 O2−3 是局部应用于插入的 OBSAN 子图的,不改变原始模型的计算图;优化细节见第 V-B 节。此外,在记录模式下,由于辅助记录器模型中没有 OOB 检测逻辑,这些优化将被省略。
OBSAN 随后对生成的模型运行 TVM 的标准后端优化过程,以确保任何后续或低级优化都能应用到整个插桩模型中,最后调用 TVM 的构建模块来生成供使用的输出 DNN 可执行文件,如图 5(c) 所示。
与传统的 Sanitizer(如 ASan/UBSan)类似,OBSAN 因广泛钩住 DNN 层/神经元而导致较高开销。因此,我们设计了以下三种优化方案 O1−3 来减少 OBSAN 的开销。其中,O1 不需要访问 Relay IR,并在早期优化阶段应用(图 5(b)),而 O2−3 应用于 OBSAN 插入的子图。此外,我们在项目网站 [2] 上展示并初步评估了一种 O2 的直观扩展。以下是优化方案的详细说明。
**O1 量化 (Quantization):**量化是一种成熟的技术,用于降低深度学习模型的计算和存储复杂度。它通过使用整数代替前向和反向传播中涉及的浮点数来实现,同时保留模型的预测精度 [34, 35, 84, 96, 105]。虽然存在多种优化 DNN 模型的技术,但量化因其在构建低功耗设备(而非 GPU)上的深度学习系统时的广泛应用而备受关注,这是像 TVM 这样的深度学习编译器的主要目标场景之一。我们利用量化来减少 OBSAN 带来的开销。
具体而言,在此步骤中,我们采用了一种后训练量化方案:通过将训练数据输入模型计算量化参数(零点和尺度),校准量化后的模型,从而创建高质量的浮点数到整数的映射。此外,我们使用混合精度量化,使量化后的模型仍然对某些中间结果(如 conv2d 操作的输出)使用全精度表示,并在必要时执行反量化和重新量化操作;这避免了单精度量化模型中可能出现的严重精度损失和溢出问题。因此,我们的量化不会显著降低预测精度(对于所有三个模型,平均仅下降 0.4%;见表 V)。
总之,我们观察到量化:
因此,我们在早期优化阶段部署了量化(如图 5(b) 所示)。我们使用了来自 ONNX Runtime 工具箱 [1] 的量化模块。OBSAN 默认的设置将浮点数转换为 8 位整数。
**O2 层级检查剪枝 (Layer-Wise Checks Pruning):**为了减少软件 Sanitizer 的性能开销,一个常见的优化方法是缩减插入的检查数量 [81, 103]。受到这些工作的启发,我们提出了 O2,用于减少 FOBSAN 和 BOBSAN 的开销。具体而言,该方案,即层级检查剪枝,通过一个可参数化的判定函数来判断某一层是否重要。如果某一层被判定为不重要,则 OBSAN 将不会对其进行钩挂。
对于 FOBSAN,我们通过首先为模型中每个可适用的层分配一个重要性评分,然后对评分低于某一可配置阈值的层进行剪枝来构造剪枝判定函数。重要性评分的计算基于一种流行的启发式方法 [11, 51]:假设某一层有 n 个标量权重参数,这些参数收集(拉平)到一个向量 w 中,则该层的重要性评分为:
S = (1/n) Σ wᵢ²,其中 wᵢ 表示 w 中的元素。
之后,根据重要性评分对各层进行排序,并从评分最低的层开始剪枝,剪除比例为一个可配置的参数 γ。
对于 BOBSAN,由于需要计算图无间断(无间隙)才能执行反向传播,用户可以配置模型的后 n 层为重要层。此外,我们明确指出,无论 DNN 模型如何,通常只需要少量层即可进行 OOB 检测。n 通常是一个小整数,而不是类似 γ 的比例。在附录 A 的图 7 中,我们将展示一个案例:应用 O2 后,仅保留了最后一层与 BOBSAN 的连接。
为了“剪枝某一层”,我们仅移除其与 FOBSAN 或 BOBSAN 插入子图的边。通过保持受保护 DNN 的计算图不变,O2 不会影响 DNN 的预测精度。相比之下,O1(量化)是对 DNN 模型和插入的 OBSAN 进行全局优化的。
**O3 确定 Lp 范数的 p 值 (Deciding p for Lp-Norm):**该优化方案专为 BOBSAN 设计。回顾第 IV-B 节,Lp 范数的不同几何解释已被描述。尽管 p 通常被用作固定的超参数,我们明确指出,选择不同的 p 值会对 OOB 检测能力产生显著影响。此外,p 的变化会影响执行开销,例如当 DNN 包含非常大的层或过多层时,计算 Lp 范数的开销在 p=2 时会更高。因此,有必要选择一个最优的 p 值,以在 BOBSAN 的有效性和效率之间取得平衡。
在此步骤中,我们基于基准测试结果探索了 p 的最优值;详见第 VIII-B 节中的结果分析。
**作为编译器的 Pass 实现:**OBSAN 的当前代码库 [2] 实现为多个 TVM 的 Pass。TVM 提供了一个 Python 接口和 API,用户可以利用这些工具实现自己的插桩 Pass。OBSAN 利用该接口完成了实现。此外,OBSAN 并不局限于 TVM,关于迁移的讨论见第 X-B 节。用户可以选择启用 FOBSAN 或 BOBSAN(或同时启用两者)。关于选择 FOBSAN 和 BOBSAN 的建议见第 VII 节。作为一个通用设置,在将 DNN 编译为可执行文件时,我们启用了 TVM 的默认优化级别。
**实现上的考量:**本文主张在 Relay IR 层面实现 OBSAN;这一设计理念在概念上与 C/C++ 编译器插入的检测工具(如 ASan 和 UBSan)类似。尽管这些检测工具可以技术性地插入到 C/C++ 源代码中,但在编译过程中插入会更具优势,因为编译器 IR(中间表示)更有利于分析,并且可以借助编译器的分析工具。此外,这也是保护大多数 DNN 模型的必要步骤,因为它使我们能够规避不同深度学习框架之间的设计差异。例如,PyTorch 在将其自适应最大/平均池化算子导出为 ONNX 时会遇到问题 [3, 6];而 ONNX [4],尽管作为一个开放的交换标准,仍缺乏许多反向算子的定义(如 AvgUnpool),我们认为这主要是由于其以前向传播为中心的设计目标所致。然而,由于 OBSAN 直接在从深度学习框架语言降低得到的编译器 IR 上插桩,这些问题得以解决。此外,在 IR 层面实现检查还可以利用 TVM 提供的分析工具和 Pass。例如,量化后图中的局部结构可能会发生变化(如被修改/插入的新节点),我们利用 TVM 的图工具和类型系统进行灵活的模式匹配,以恢复它们的原始语义。
对使用两种 OBSAN 变体进行插桩的 DNN 模型,不同类型输入的 OOB 分数分布。绿色和红色曲线分别代表正常输入和 AE 输入,未定义和感知损坏的输入分别用紫色和棕色表示
尽管如此,在编译器 IR 上插桩也带来了若干技术挑战。首先,由于深度学习编译器主要聚焦于 DNN 的前向传播,它们通常对反向操作(如计算梯度)的支持不够完善。为了解决这个问题,我们通过实现更多算子的梯度计算支持扩展了 TVM;同时,我们开发了自己的反向传播工具包,以便为 BOBSAN 插入检查。此外,选择合适的 IR 进行工作需要经过深思熟虑的考量和探索。对于 OBSAN,我们可以选择的 IR 包括 Relay IR、TIR 和 LLVM IR,按照它们在 TVM 编译管线中的层次排列。尽管 TIR 和 LLVM IR 可能允许对受保护的可执行文件进行更细粒度的优化,但原始计算图的大量信息可能会丢失。因此,我们决定选择 Relay IR 作为更适合的 IR 层。
感知破坏(perception-broken) | 未定义(undefined) | AE | |
FOBSan | ✔ | ❌ | ✔ |
BOBSan | Δ | Δ | ✔ |
表1:使用场景。∆表示部分支持。
第 III 节讨论了 OBSAN 的三个代表性使用场景。我们在表 I 中概述了 FOBSAN 和 BOBSAN 在这些用例中的适用性,并在图 6 中展示了实证依据。首先,由于“破损区域”被替换为无意义的噪声,一个破损输入可以被视为 i + δ,其中 i 是正常输入,δ 是噪声。因此,感知破损的图像主要会导致异常的前向神经元激活。因此,我们认为 FOBSAN 适合捕获表 I 中的破损输入。如图 6(a) 所示,棕色区域(表示破损输入)与绿色峰值(表示正常输入)明显分离。至于 BOBSAN,棕色区域和绿色区域有明显的峰值区别,但在图 6(b) 中也存在一定的重叠。
一个未定义的输入,尽管具有有意义的内容,却表示一个新类别,进而引发新的决策逻辑。因此,观察反向传播时,异常行为更为显著,因为反向传播表征了 DNN 的决策逻辑(见第 II-A 节)。在这方面,BOBSAN 适合检测未定义的输入。如图 6(b) 所示,紫色区域(表示未定义输入)包含的峰值与绿色区域(正常输入)明显不同。相比之下,图 6(a) 中紫色和绿色区域大多重叠。我们澄清一点,尽管 BOBSAN 在检测未定义图像上表现出了合理的能力,但这一任务本质上充满挑战。通常,“未定义输入”在感知内容上与训练数据对齐。例如,训练数据中的一张狗的图像和训练数据外的一张鱼的图像可能向 DNN 呈现出相似的视觉特征(如偏黄色的颜色和圆形形状),这为 BOBSAN 标记未定义图像带来了困难。
对抗样本(AEs)会改变 DNN 的决策逻辑。此外,从实现的角度来看,对抗样本通常通过添加精心设计的扰动生成,这也可以被表述为 i + δ(类似于破损输入)。因此,从概念上讲,对抗样本会导致异常的前向激活和反向梯度。图 6 实证显示,对抗样本可以通过 FOBSAN 和 BOBSAN 从正常输入中很好地区分。
类似于 ASan 和 UBSan 的选择方式,关注对抗样本和感知破损图像的用户可以选择启用 FOBSAN,而更多关注对抗样本和未定义图像的用户可以选择 BOBSAN。此外,由于 FOBSAN 和 BOBSAN 都能检测对抗样本,并且两者之间不存在冲突(即前向和反向计算),它们可以进一步集成为一个混合 OBSAN,以提升检测各种异常输入的性能;有关实验可见第 IX-A 节。
本节研究以下研究问题:
在回答每个研究问题之前,我们首先介绍评估的设置。随后,本节将给出对 RQ1 和 RQ2 的评估和回答。第 IX 节将回答 RQ3。
模型 | 参数 | 神经网络 | 层数 |
ResNet50 | 23.5M | 26570 | 54 |
GoogLeNet | 5.5M | 7162 | 56 |
DenseNet21 | 7.0M | 10250 | 121 |
表2:已插桩的深度神经网络(DNN)模型的统计数据。
**DNN 模型:**表 II 汇总了用于评估的三个 DNN 模型的统计信息。所有三个模型都是大规模的 DNN,具有复杂的架构和多样的 DNN 操作符集。它们广泛应用于计算机视觉(CV)任务。每个模型包含 7k 至 27k 个神经元,最多拥有 23.5M 个参数。
模型 | 编译时间(秒) | 编译/插桩时间(秒) | DNN执行大小(MB) | DNN执行(附带OBSan)大小(MB) | ||
FOBSan | BOBSan | FOBSan | BOBSan | |||
ResNet50 | 30.2 | 38.5 | 30.7 | 89.9 | 92.5 | 89.9 |
GoogLeNet | 36.6 | 49.1 | 37.2 | 21.4 | 22.7 | 21.4 |
DenseNet21 | 79.8 | 94.0 | 80.7 | 27.3 | 28.9 | 27.4 |
表3:处理时间和可执行文件大小。“Compile/Instr.” 表示在启用 OBSAN 时的编译和插装。
**处理时间与尺寸增加:**实验在一台配备 AMD Ryzen 3970X 和 256GB 内存的计算机上运行。表 III 报告了启用和未启用 OBSAN 时的编译成本。我们认为,启用 OBSAN 后仅增加约 20% 的编译时间,这一编译速度是可以接受的,因为它属于一次性操作。此外,FOBSAN 检查需要通过训练数据集样本进行初始化;我们使用完整的训练数据集(CIFAR-10 [37])进行此步骤,并报告初始化过程耗时约为 2 分钟。此外,启用 OBSAN 的 DNN 可执行文件的平均尺寸增幅不到 10%,磁盘成本可以忽略不计。
设置与指标:本节报告 OBSAN 的 OOB 检测能力和性能开销。我们通过计算误报率(FPs)和漏报率(FNs)来评估其检测 OOB 输入的准确性。为了准备测试输入,我们使用 CIFAR-10 数据集的测试集(10,000 张图像)作为正常输入集合。然后,我们使用一种先进的对抗样本(AE)生成算法,即投影梯度下降算法(PGD)[36, 49],生成 10,000 个 AE。PGD 使用默认配置,扰动预算为 ε = 0.3。值得注意的是,该算法是一种白盒攻击(需要 DNN 梯度来指导 AE 生成),理论上和实验上都被证明难以防御 [67, 98]。我们使用 PGD 针对运行在 PyTorch 上的 DNN 模型合成 AE;对于每个模型,我们生成 10,000 个 AE,并确认在未启用 OBSAN 时,这些 AE 都能触发相应 DNN 可执行文件的错误预测。
对于未定义输入,我们从 ChestX-Ray8 数据集 [88] 中选取 10,000 张图像构建测试集;这些图像的特征与 CIFAR-10 的训练数据有显著差异。最后,我们从 CIFAR-10 训练集生成了 10,000 个感知破坏的输入(perception-broken inputs),这些输入通过随机识别图像区域并用高斯噪声替换生成。这些区域是通过 OpenCV [16](一个常用的图像处理工具包)的腐蚀和膨胀变换生成的。
我们根据第 VII 节讨论的使用场景,将这四种输入集合用于 OOB 检测基准测试。具体来说,我们将相同的正常输入和 AE 输入分别输入到 FOBSAN 和 BOBSAN,因为这两种方法都可以检测这两类 OOB 输入。而对于感知破坏(PB)和未定义(UD)输入,仅将前者输入到 FOBSAN,后者输入到 BOBSAN。
根据表 IV,FPnorm 表示触发 OBSAN 警报的正常输入比例,而 FNae、FNpb 和 FNud 分别表示 OBSAN 检测漏掉的 AE、PB 和 UD 输入比例。理想情况下,FP 和 FN 的发生应该很少。此外,我们使用 TVM 的内置基准函数测量每个(启用 OBSAN 的)DNN 可执行文件的推理时间,并通过多次执行将标准差控制在较低水平(均值的 1%)。
**结果:**表 IV 报告了评估结果。总体而言,我们认为 OBSAN 表现出了令人满意的 OOB 检测能力。在所有三种模型的不同正常/异常输入中,FP 和 FN 都保持在较低水平。读者可能会注意到 BOBSAN 的 FNud 比例相对较高。如第 VII 节所述,标记未定义输入(这些输入通常与训练输入具有相似的感知内容)本质上是困难的,因此我们认为这些结果是合理的。然而,FNae 和 FPnorm 普遍较低,这表明 OBSAN 能够准确标记触发缺陷的 DNN 可执行文件输入,并且很少干扰正常执行。在生产环境中,用户可以对触发 OBSAN 警报的小部分输入进行事后分析,确认它们是否为误报。
尽管 OOB 检测能力令人鼓舞,性能开销却较为显著:FOBSAN 对每个 DNN 神经元进行了广泛的检测,平均性能慢了 102%(对于 DenseNet121,性能下降甚至高达 143%)。
我们澄清,表 IV 中的 BOBSAN 结果启用了部分优化。我们的初步研究发现,如果完全未优化(即每一层都进行挂钩),BOBSAN 的性能会慢得不可接受,难以进行有意义的比较。因此,我们对 BOBSAN 进行了优化,仅对每个 DNN 的最后一层进行挂钩(优化 O2),并设置 p = 2(优化 O3);第 VIII-B 节将进一步讨论这些优化细节。
模型 | 推理时间(毫秒) | 带OBSan的推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNpb/ud 比率 | ||||
FOBSan | BOBSan | FOBSan | BOBSan | FOBSan | BOBSan | FOBSan(PB) | BOBSan(UD) | ||
ResNet50 | 1.22 | 3.28 | 1.30 | 1.11% | 6.11% | 2.35% | 0.01% | 10.57% | 65.36% |
GoogLeNet | 3.79 | 5.75 | 4.36 | 2.52% | 9.17% | 0.00% | 0.00% | 0.06% | 77.78% |
DenseNet121 | 2.65 | 6.45 | 2.64 | 1.27% | 6.69% | 0.01% | 0.02% | 0.32% | 55.02% |
表4:OOB(越界)可检测性和开销。此处,对 BOBSAN 应用了 O2−3 优化(详情见第 VIII-B 节)。
模型 | 推理时间(毫秒) | 未保护模型推理时间(毫秒) | 预测准确率 | 未保护模型推理时间(毫秒) | OBSan变体 | OBSan | OBSan+量化 | ||||||
推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNpb/ud 比率 | 推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNpb/ud 比率 | ||||||
ResNet50 | 1.22 | 0.76 | 93.78% | 93.55% | FOBSan | 3.28 | 1.11% | 2.35% | 10.57% | 2.57 | 1.44% | 0.00% | 61.13% |
BOBSan | 1.30 | 6.11% | 0.01% | 65.36% | 0.82 | 6.31% | 0.00% | 65.79% | |||||
GoogLeNet | 3.79 | 1.63 | 92.85% | 92.59% | FOBSan | 5.75 | 2.52% | 0.00% | 0.06% | 3.60 | 2.89% | 0.00% | 25.07% |
BOBSan | 4.36 | 9.17% | 0.00% | 77.78% | 1.67 | 9.38% | 0.00% | 75.96% | |||||
DenseNet121 | 2.65 | 2.21 | 94.03% | 93.34% | FOBSan | 6.45 | 1.27% | 0.01% | 0.32% | 5.74 | 0.90% | 6.78% | 27.05% |
BOBSan | 2.64 | 6.69% | 0.02% | 55.05% | 2.28 | 4.72% | 9.64% | 73.62% |
表5:未保护模型(左半部分)和 OBSAN 保护模型(右半部分)的量化评估
模型 | 剪枝配置 | 剪枝 <br>#神经元/总数 | 剪枝 <br>神经元百分比 | 推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNpb 比率 |
ResNet50 (baseline) | N/A | N/A | N/A | 3.28 | 1.11% | 2.35% | 10.57% |
ResNet50 | 0.2 | 7680/26570 | 28.9% | 2.88 | 1.25% | 0.82% | 1.90% |
ResNet50 | 0.4 | 17152/26570 | 64.55% | 2.39 | 0.27% | 28.21% | 0.03% |
ResNet50 | 0.6 | 22016/26570 | 82.86% | 2.05 | 0.3% | 99.42% | 0.00% |
ResNet50 | 0.8 | 25024/26570 | 94.18% | 1.62 | 0.07% | 100.00% | 0.00% |
ResNet50 | 1.0 | 26560/26570 | 99.96% | 1.23 | 0.42% | 22.84% | 99.11% |
ResNet50 (w/ quant.) | 0.2 | 7680/26570 | 28.9% | 2.19 | 1.40% | 0.20% | 49.79% |
ResNet50 (w/ quant.) | 0.4 | 17152/26570 | 64.55% | 1.81 | 0.57% | 24.13% | 32.98% |
ResNet50 (w/ quant.) | 1.0 | 26560/26570 | 99.96% | 0.75 | 0.25% | 99.83% | 98.00% |
表6:FOBSAN 的逐层检查剪枝 (O2)
对 RQ1 的回答:在保护常见 DNN 模型时,OBSAN 能够以较低的 FP 和 FN(特别是 AE 的检测)实现较高的 OOB 输入检测准确性。检测未定义输入本质上具有挑战性。然而,其性能开销较为显著。
第 V-B 节引入了三种优化方案 O1−3。本节首先基准测试单个方案的效果,然后评估将它们组合使用的情况。为了便于比较,我们在表 IX 中报告了所有推荐的优化方案组合后的 OBSAN 的开销和检测能力。
**O1 量化(Quantization):**表 V 报告了量化优化的评估结果。我们认为,经过量化的模型在推理速度上有了合理的提升(表 V 的第二列)。然而,插入 OBSAN 后的量化可执行文件的速度仍然较慢。例如,未插入 OBSAN 的 ResNet50 可执行文件每次推理耗时 1.22ms(见表 IV),而插入 FOBSAN 后推理成本仍然翻倍(2.57ms)。此外,作为权衡,FNpb/ud 增加,特别是 FNud。然而,AE 输入的检测能力仍然较高;部分评估甚至报告 FNae 比例下降至 0。DenseNet121 表现为一个“异常值”,其 FNae 比例显著更高。需要澄清的是,这是因为我们对所有三个模型均使用相同的阈值选择参数(第 IV-A 节中的 µ 以及第 IV-B 节中的 α 和 β),以保持设置的简单性;在实际应用中,建议用户针对单个模型微调这些参数以探索最佳性能。
此外,量化对 FPnorm 没有负面影响,表明受保护的 DNN 可执行文件的正常使用基本不受干扰。OOB 检测能力的变化主要是由于量化过程中优先保留了正常输入的预测准确性(浮点数映射为整数)。这可能压缩了 OOB 数据的空间,并导致不同类型数据的分布趋于收敛,从而更难区分。
**O2 层级检查裁剪(Layer-Wise Checks Pruning):**优化 O2 可同时应用于 FOBSAN 和 BOBSAN。对于 FOBSAN,我们在表 VI(前六行)中报告了裁剪结果,其中裁剪配置(pruning config.)对应于第 V-B 节中提到的 γ 值。随着 γ 增加到 1,更多的检查被裁剪。对于 BOBSAN,裁剪结果如表 VII 所示,“最后 n 层”列表示从 DNN 的最后一层开始保留的层数。
总体而言,我们观察到,随着裁剪层数的增加,推理时间大幅减少,尤其是 BOBSAN 的性能提升最高可达 36 倍;当几乎所有检查都被裁剪时,推理成本几乎可以忽略不计(ResNet50 的基线为 1.22ms)。类似的结果也在其他模型中得到了验证,其数据可在项目网站 [2] 上查阅。
FOBSAN 和 BOBSAN 在不同裁剪配置下的表现有所不同:对于 FOBSAN,当 γ 从 0.2 增加到 0.8 时,FNae 稳步上升,从 0.82% 增加到 100%,但当 γ 为 1.0 时又下降到较低水平。有趣的是,FNpb 在此配置下急剧上升,从约 0% 增加到 99%,几乎完全失去了检测感知破坏输入的能力。这可以视为 OOB 分数空间的极端重新映射,类似于应用极端量化配置时的情况:与未裁剪的 ResNet50(OOB 分数范围为 [0, 26570])相比,此裁剪配置将范围限制为 [0, 10],使得区分不同类型输入变得更加困难。
对于 BOBSAN,如表 VII 所示,随着更多检查层被裁剪,各项指标均稳步改善。当仅保留最后一层的检查时,性能达到最佳;这尤其理想,因为它在最低运行时开销下提供了最佳保护。最新研究也强调,最后一层通常具有较高的 DNN 行为区分能力 [28]。然而,我们强调“仅检查最后一层”可能并不适用于所有 DNN;根据 DNN 架构(例如考虑非常浅的模型)和输入数据类型,可能还需要其他层。此外,从表 VII 可以看出,完全不裁剪的 BOBSAN 不适合作为基线:DNN 通常包含超过 100 层,在这种情况下,未裁剪的 BOBSAN 在实际应用中将变得不可行。因此,为了获得最佳结果,我们建议始终对 BOBSAN 使用裁剪优化,仅保留最后一层的检查。
模型设置 | 最后n层 | 推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNud 比率 |
ResNet50, p=2 | 5 | 47.13 | 6.21% | 18.82% | 63.63% |
ResNet50, p=2 | 4 | 35.07 | 6.16% | 24.53% | 63.64% |
ResNet50, p=2 | 3 | 18.19 | 5.93% | 13.18% | 67.16% |
ResNet50, p=2 | 2 | 7.16 | 6.06% | 1.00% | 65.40% |
ResNet50, p=2 | 1 | 1.30 | 6.11% | 0.01% | 65.36% |
表7:BOBSAN 的逐层剪枝 (O2)
模型 | p | 推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNud 比率 |
ResNet50 n=1 | 1 | 1.29 | 4.11% | 20.76% | 82.61% |
ResNet50 n=1 | 2 | 1.30 | 6.11% | 0.01% | 65.36% |
ResNet50 n=1 | ∞ | 1.29 | 5.92% | 16.79% | 67.47% |
ResNet50 n=2 | 1 | 6.72 | 2.70% | 100.00% | 89.62% |
ResNet50 n=2 | 2 | 7.16 | 6.06% | 1.00% | 65.40% |
ResNet50 n=2 | ∞ | 6.22 | 5.73% | 71.74% | 69.30% |
ResNet50 n=3 | 1 | 16.69 | 3.88% | 100.00% | 85.20% |
ResNet50 n=3 | 2 | 18.19 | 5.93% | 13.18% | 67.16% |
ResNet50 n=3 | ∞ | 15.06 | 5.92% | 72.62% | 68.80% |
表8:在不同 n 配置下,BOBSAN 的逐层检查剪枝 (O2) 中 p 的选择 (O3)
**O3 优化 Lp-范数中的 p 值:**我们通过基准测试三种常见的 p 值来探索 BOBSAN 的 Lp-范数中的最佳 p 值,并在表 VIII 中报告了结果。为了更清楚地比较不同设置,我们针对层级剪枝(O2)中的不同 n 值(1、2、3)重复了评估,其中 n = 1 是先前提到的推荐生产配置。从理论上讲,不同的 p 值会导致不同的性能损失和检测准确性,因为它们决定了 Lp-范数的计算方式。在我们的实验中,这在 n = 3 的情况下尤为明显,其中 p = 2 相较于 p = ∞ 带来了 20.78% 的额外开销,但同时在 FPnorm、FNae 和 FNud 方面提供了最佳的 OOB 可检测性。然而,这一观察结果可能并不适用于所有用户保护他们自己模型的情境。因此,我们推荐将 p = 2 作为默认值,并建议用户可以根据我们的设置进行类似的基准测试,以根据自身的权衡偏好优化该值。
针对 RQ2 的回答:层级选择(O2)通过合理的 AE 检测权衡减少了开销,同时通过增强 DNN 的鲁棒性缓解了 FPnorm。量化(O1)在精度和 OOB 检测方面造成相对较小的损失,同时合理地降低了成本。用户可以考虑将 p = 2 设置为 O3 的默认值,尤其是在启用 O2 仅挂钩最后一层的情况下。
OBSan变体 | 模型 | 推理时间(毫秒) | OBSan开销 | FPnorm 比率 | FPae 比率 | FNpb/ud 比率 | |
Vanilla | OBSan | ||||||
FOBSan <br>w/ opt | ResNet50 | 1.22 | 2.19 | 79.51% | 1.40% | 0.20% | 49.79% |
GoogLeNet | 3.79 | 3.12 | -17.68% | 2.41% | 0.00% | 26.02% | |
DenseNet121 | 2.65 | 4.80 | 81.13% | 1.21% | 5.11% | 21.43% | |
Average | 2.55 | 3.37 | 47.65% | 1.67% | 1.77% | 32.41% | |
FOBSan <br>w/ opt | ResNet50 | 1.22 | 0.82 | -32.79% | 6.31% | 0.00% | 65.79% |
GoogLeNet | 3.79 | 1.67 | -55.94% | 9.38% | 0.00% | 75.96% | |
DenseNet121 | 2.65 | 2.28 | -13.96% | 4.72% | 9.64% | 73.62% | |
Average | 2.55 | 1.59 | -34.23% | 6.80% | 3.21% | 71.79% |
表9:在启用所有推荐优化的情况下,OBSAN 的开销和检测能力
**优化组合应用:**我们还探索了将优化 O1−3 组合起来的效果,因为对于 C/C++ 编译器来说,启用所有(非冲突)优化是很常见的。我们的优化彼此兼容,并在表 IX 中评估了启用所有优化后 OBSAN 的开销和检测精度。简而言之,FOBSAN 的平均开销为 48%,BOBSAN 的平均开销为 -34%,同时仍然保持了较高的 OOB 可检测性。我们认为这些结果是有希望的,表明 OBSAN 在速度和可检测性之间达成了良好的平衡,并在生产环境中具有很高的适用性。
**推荐设置:**综上所述,我们建议在生产中尽可能同时启用所有优化并使用推荐配置:
FOBSAN:我们建议启用量化(O1)和层级剪枝(O2),并将 γ 设置为 0.2;这可以有效减少性能开销,同时不会显著影响 AE 检测,并保持 FNpb 在合理水平。此外,表 IV 显示,当启用完整的 FOBSAN 时,与无保护的可执行文件相比,ResNet50 可执行文件的速度下降了 169%。但在启用推荐优化后,开销减少到 79.51%(表 IX)。其他两种模型也得出了类似结论。
BOBSAN:我们建议启用量化(O1)、检查至最后一层(O2),并将 p 设置为 2(O3)。这一组合应提供最低的开销和较强的 OOB 保护,用户还可以根据其使用场景和权衡偏好进一步调整优化参数。如表 IX 所示,当启用此优化组合时,ResNet50、GoogLeNet 和 DenseNet121 可执行文件的推理时间分别为无保护可执行文件的 -32.79%、-55.94% 和 -34.23%。同时,BOBSAN 能够高度准确地检测 AE,例如在 ResNet50 和 DenseNet121 的情况下,FNae 均为零。
此外,我们在第 VII 节中提到了一种混合 OBSAN 的使用,即将 FOBSAN 和 BOBSAN 集成到同一可执行文件中以提供额外保护;我们的优化也与此设置兼容。在第 IX-A 节中,我们将比较混合和非混合 OBSAN 在缓解基于查询的 AE 生成攻击中的效果,其中启用了上述推荐的所有优化。我们报告称,在混合 OBSAN 的情况下,大多数攻击(平均 77%)可以被缓解,而非混合 OBSAN(仅使用 FOBSAN 或 BOBSAN)则显示出较低的效果。
在我们的模糊测试应用中(第 IX-B 节),我们预计会为每个神经元完全启用 FOBSAN,因为 FOBSAN 检查能够提供神经元覆盖率信息作为反馈来指导模糊测试。这类似于记录 C/C++ 可执行文件中的分支或基本块覆盖率。在该应用中,我们仅启用了量化,这应显著加速模糊测试过程。此外,在模糊测试中,精度并不是一个问题,因此我们仅从 FOBSAN 中获取“神经元覆盖率”反馈。
为了回答 RQ3,我们评估了 OBSAN 在两个安全应用中的能力:抑制在线对抗样本(AE)生成(第 IX-A 节)和指导基于反馈的模糊测试(第 IX-B 节)。
场景 | 配置 | AE | 推理时间(毫秒) | 每个种子的查询次数 | 攻击成功率 |
默认的 | w/o OBSan | 97.60 | 1.22 | 2.17 | 99.59% |
w/ FOBSan | 8.49 | 2.19 | 19.68 | 8.66% | |
w/ BOBSan | 96.52 | 0.82 | 4.64 | 98.49% | |
w/ HOBSan | 5.25 | 3.03 | 20.92 | 5.38% | |
复杂的 | w/o OBSan | 62.41 | 1.22 | 127.26 | 63.68% |
w/ FOBSan | 56.17 | 2.19 | 130.52 | 57.32% | |
w/ BOBSan | 30.98 | 0.82 | 146.05 | 31.61% | |
w/ HOBSan | 28.03 | 3.03 | 139.13 | 28.60% |
表10:防止在线 AE 生成
**实验设置:**在基于查询的在线对抗样本生成中,通常假设 DNN 可执行文件对攻击者来说是一个黑盒。攻击者无法访问此 DNN 可执行文件的内部信息。为了生成用于攻击 DNN 可执行文件的对抗样本,攻击者会发起基于查询的黑盒对抗样本生成,模拟通过查询方式攻击远程 DNN API 的行为。在这种情况下,攻击者可以将精心设计的输入提供给 DNN 可执行文件并观察模型的预测输出 [29, 59, 78, 95, 97]。在实验中,我们使用了一种最先进的(SOTA)对抗样本生成方法来模拟现实中的攻击者 [10]。
如表 X 所示,我们考虑了两种具有代表性的攻击者行为:
我们评估了三种 OBSAN 配置:FOBSAN、BOBSAN 和混合 OBSAN(称为 HOBSAN)。HOBSAN 在 DNN 可执行文件中插入了两种变体,并配置为当 FOBSAN 或 BOBSAN 中任一发出警报时触发警报。在每种配置下,我们还根据第 VIII-B 节的建议启用了 OBSAN 的所有适用优化。
**扩展黑盒对抗样本生成:**在该应用中,我们配置 DNN 可执行文件,使其在 OBSAN 警报触发时拒绝响应攻击者的查询。为了模拟一个可能意识到 DNN 可执行文件中使用了 OBSAN 的实际攻击者,我们扩展了所使用的 SOTA 黑盒对抗样本生成算法(第 III 节图 3 提供了示意图)。当攻击者收到无响应时,他们会通过还原最近一次的变异并执行随机变异进行“回溯”。
**结果分析:**我们从 CIFAR-10 测试集中随机选择了 100 张图像作为种子。对于每个种子,我们允许对抗样本生成算法发出查询,直到达到允许的查询次数(50 或 500 次)。每个实验重复进行五次,并对结果取平均值。表 X 报告了评估结果。需要说明的是,有两个种子被排除,因为它们已经触发了错误预测(初始准确率为 98%),我们认为在此设置下是合理的。
默认场景:SOTA 对抗样本生成算法非常有效,可以在 50 次查询内生成几乎所有种子的对抗样本(97.60/98 = 99.59% 成功率,平均每个种子 2.17 次查询)。然而,在启用 FOBSAN 后,仅能成功生成 8.49 个对抗样本(8.66% 成功率,下降 91%),且生成一个对抗样本所需的平均查询次数显著增加(19.68 次查询,增加 9 倍)。相比之下,BOBSAN 在此攻击场景中的防护效果较弱,仅略微推迟了对抗样本的生成(查询次数增加 2 倍)。HOBSAN 在此场景下提供了最佳保护,成功抵御了 95% 的攻击。这表明 FOBSAN 和 BOBSAN 对不同类型的对抗样本分别具有敏感性。
高级场景:在这种场景下,对抗样本生成算法仅能成功生成 63.7% 的种子,但生成的对抗样本整体视觉质量更高。在此设置下,FOBSAN 的表现与之前相比下降,仅能防御约 10% 的攻击,而 BOBSAN 阻止了 52% 的攻击。HOBSAN 进一步将攻击成功率降低到 43%,对高级攻击提供了 57% 的防护效果。
关于 FOBSAN 和 BOBSAN 在默认场景中的区别:在此场景中,攻击者对种子输入进行了相对较大的变异,使变异结果类似于先前实验中所测试的感知调整输入,而 FOBSAN 更擅长检测这些输入;而在高级场景中,变异更加微妙,使对抗样本更接近于未定义但自然的输入。此外,BOBSAN 在检测使用相同扰动预算生成的白盒对抗样本时也表现出色(见表 IV)。白盒对抗样本是通过梯度信息生成的,而 BOBSAN 也使用梯度进行 OOB 检测;这使得 BOBSAN 对这些对抗样本敏感。然而,此处的黑盒对抗样本是无需梯度生成的,从而规避了 BOBSAN 对基于梯度攻击的敏感性。
**动机:**我们设置了另一个下游应用,模拟 DNN 可执行文件的典型内部模糊测试场景。尽管现有的大量文献针对运行在 TensorFlow 等深度学习框架上的 DNN 模型进行模糊测试,但仅对这些框架中的 DNN 模型进行模糊测试是不够的,因为 DNN 可执行文件可能会因浮点数精度损失或深度学习编译器中的潜在错误而表现出与在深度学习框架中运行的相同模型不一致的行为 [42, 71]。因此,我们假设用户需要对已编译的 DNN 可执行文件进行模糊测试,并检测其在对抗样本下的攻击面。
模型 | 错误预测 | 神经元覆盖率百分比 | |
黑盒 | ResNet50 | 4268 | 18.48% |
GoogLeNet | 4513 | 16.10% | |
DenseNet121 | 2550 | 39.00% | |
灰盒 | ResNet50 | 44132 | 21.29% |
GoogLeNet | 49550 | 17.91% | |
DenseNet121 | 32027 | 44.09% |
表11:使用 FOBSAN 提升 DNN 可执行文件的模糊测试。“灰盒”设置表示注入了 FOBSAN 的 DNN 可执行文件,而“黑盒”设置表示没有 FOBSAN 的 DNN 可执行文件
黑盒模糊测试对输入进行随机变异;灰盒模糊测试则根据覆盖反馈对输入进行变异。软件可执行文件的模糊测试 [100] 通常通过拦截编译过程并插入计数器记录分支覆盖来实现。因此,FOBSAN 可以提供神经元级覆盖,从而实现 DNN 可执行文件的灰盒模糊测试。
**实验设置:**我们假设 DNN 模型通过 TVM 编译为插入了 FOBSAN 的可执行文件。我们对 FOBSAN 进行了轻微扩展以适应模糊测试的需求:原始 FOBSAN 的设计目的是通过训练数据集训练后比较神经元激活值以检测异常输入,而模糊测试的目标是发现错误预测,从而揭示 DNN 模型的内部缺陷。因此,我们取消了神经元激活值与参考数据的比较(也因此不需要训练),而是将神经元输出(缩放到 [0, 1])与手动设置的阈值进行比较;如果神经元输出高于阈值,则标记该神经元为已覆盖。在本实验中,我们将该阈值设置为 0.9,这是一个相对较高的值,要求神经元被高度激活才能计为“覆盖”。
如第 VIII-B 节的使用说明中所述,由于在此应用中我们不需要精确的 OOB 分数,因此我们启用了量化以降低 FOBSAN 的开销。然而,我们禁用了剪枝,因为需要完整的信息来了解哪些神经元已被覆盖。我们认为这是 FOBSAN 在日常模糊测试中可遵循的实际设置。在变异 DNN 输入时,我们采用了文献 [61, 80, 92] 提出的变异方法。我们对所有三种模型的可执行文件进行了评估。
**结果分析:**我们让每个实验运行 6 小时,并收集结果,如表 XI 所示。实验结束后,我们测量触发的错误预测数(#错误预测)和整体神经元覆盖百分比(%覆盖神经元)。同时,我们报告此次评估未导致任何崩溃,表明 DNN 可执行文件的内存利用漏洞可能有限。触发的大量错误预测表明模糊测试的高效性,这是先前任务目标所述的依据。相比之下,覆盖神经元的百分比并不特别高,黑盒和灰盒设置之间的差距小于 10%。这可以归因于采用了较高的阈值来计数“神经元覆盖”,但这不应被视为模糊测试性能的显著指标。
我们发现,在 FOBSAN 的反馈下,模糊测试的效果远高于黑盒设置。在灰盒测试中,所有三种模型触发的错误预测数均比黑盒设置高出 10 倍以上。我们认为这些结果非常有前景,并且在所有三种流行模型中表现一致。
**RQ3 的回答:**OBSAN 促进了代表性下游应用的实现,既能保护 DNN 可执行文件的实际使用安全,又能在模糊测试中提供反馈驱动的支持,从而加强 DNN 可执行文件的安全性。
许多方法已经被提出用于保护深度神经网络(DNN)模型免受超出边界(OOB)输入的影响。然而,由于各种障碍,这些方法往往难以应用于保护DNN可执行文件。从整体上看,这些方法通常是在DNN模型级别实施的,这限制了它们可以保护的DNN可执行文件的范围(例如,由于深度学习框架之间的不兼容性,详见下文)。此外,我们发现现有研究的一个主要趋势是更注重效果而非效率:我们审查的代表性方法(详见下文)中没有一篇报告其性能开销。需要指出的是,高开销会成为DNN可执行文件在生产中应用的障碍。以下,我们首先从概念层面对比OBSAN与最近的代表性研究方法,然后从准确性和开销的角度进行实证比较。
**方法论比较:**此部分我们回顾近年来关于对抗样本(AE)和OOB输入检测的研究,并比较OBSAN与这些方法在技术上的差异。为了更深入地分析,我们将该领域的显著研究分为五类,根据它们用于检测异常输入的方法学进行分类:基于覆盖率、分类、再分类、梯度和统计的方法。
① 基于覆盖率的方法 [46, 61, 85] 借用了模糊测试中的覆盖率概念(详见第三节),并基于假设OOB输入会导致覆盖率指标的增加,利用这些指标检测不良输入。从概念上讲,它们与FOBSAN类似,通常可以在DNN可执行文件上实现;我们在后续实验比较中包含了这一类方法。然而,可实现性并不等同于在实际中的适用性。例如,这些方法可能要求用户提供恶意训练数据集 [85],或者需要深度学习编译器不支持的操作(例如集合操作);考虑到采用的难度,我们在实证比较中排除了具有此类要求的方法(如 [85])。
② 基于分类的方法 [48, 74, 85] 需要为每个需要保护的DNN模型预先训练新的辅助模型;要使用这些方法,我们需要将辅助模型集成到即将发布的DNN可执行文件中以进行OOB输入检测。如第三节所述,深度学习编译器一般要求输入的DNN模型是经过良好训练的,且通常不支持训练功能。这使得上述方法难以作为独立的编译器传递过程实施,此外,训练可能带来的高时间成本也令人望而却步。需要说明的是,尽管FOBSAN在第五节中提到也有初始化阶段,但我们没有训练新模型(仅对每个训练样本进行前向传播以确定OOB阈值),因此它与深度学习编译器兼容。为了在实证比较中包含这一类方法,我们通过在外部训练一系列辅助模型并将它们编译到DNN可执行文件中来解决兼容性问题。
③ 基于再分类的方法 [40, 41, 107] 假设对抗特征通常较为微妙,可以通过修改输入来“消除”;将修改后的输入重新输入到被保护的模型中并比较修改前后的分类结果,可以检测异常输入。OBSAN与这些方法在两个方面有所不同:首先,OBSAN不依赖于对抗特征的性质;相反,它关注的是一种更广义的OOB概念,包括对抗性和“非对抗性”特征(如未定义输入)。其次,OBSAN提供浮点型OOB分数,而这些方法仅输出分步或二值分数;后者更难调优,且分析时信息量较少,如第四节所述。以下,我们将在实证中与这些方法进行比较。需要说明的是,对对抗特征的假设可能较为严格,这可能会将检测限制在特定类别的对抗攻击 [107]。
④ 基于梯度的方法 [28, 41, 45] 在推理过程中利用梯度信息,例如提取网络推理过程的压缩表示 [28, 45],或对输入进行转换以供后续使用(如再分类 [41])。如第四节B部分所述,BOBSAN也属于这一类别。从计算复杂度的角度来看,梯度计算和反向传播通常较慢,例如可能需要额外的大型矩阵乘法。此外,不同的梯度获取方法(例如相对于不同变量获取梯度)和将其转换为OOB指标的方法,会导致不同的开销和检测能力。BOBSAN当前在设计时兼顾了速度和检测能力;以下,我们将在实证中与这些方法进行比较。
⑤ 基于统计的方法 [17, 39, 43, 82] 从被保护的DNN模型的激活或分类输出中计算统计指标,并利用这些指标检测OOB输入。通常,这类方法在初始化阶段需要计算训练集的经验均值、方差等指标 [39, 82],其开销可能比OBSAN的两种变体更高(详见第五节;BOBSAN无需初始化)。以下,我们从准确性和开销方面对这一类方法进行实证评估。一些较为复杂的方法还需要修改被保护模型的训练和推理过程 [17];我们认为这些方法代价高昂且在技术上具有挑战性,即使在DNN可执行文件上也未必可行。
**实证比较:**我们探索了重新实现现有方法的技术可行性,并选出了六项方法,认为它们是最具代表性且表现良好的案例。我们在这六项方法上进行了实验,并在三种DNN模型上运行实验:DeepGauge [46]、DLA [74]、ANR [40]、ODIN [41]、GradNorm [28] 和 ViM [82]。这些方法的总结见表12;我们认为它们代表了广泛的方法论。根据是否能够检测未定义(UD)输入,我们将这些方法分为两组:“基于视觉”的方法和“基于语义”的方法,分别与FOBSAN或BOBSAN进行比较。如第三节所述,UD输入通常是DNN模型训练时未知的输入,且非恶意制造。换句话说,UD输入中没有可被检测的“视觉伪影”。基于视觉的OOB检测器,如表12所列,依赖于伪影的视觉模式(例如类似噪声的像素模式)来检测OOB输入。显然,UD输入不包含这些类似噪声的模式,无法被基于视觉的OOB检测器检测(我们通过初步实验验证了这一点)。因此,对于基于视觉的方法,我们将它们与FOBSAN进行比较。
我们还比较了表12中标注为“基于语义”的三种代表性方法。它们本质上分析输入中是否出现了新的(意外的)语义,以判断其是否异常,因而适合检测AE和UD输入。然而,我们的初步实验表明,这些方法难以检测感知破坏(PB)输入。因此,我们将这些方法与BOBSAN进行比较。
对于每种方法,我们运行基准测试以收集其推理时间、FPnorm、FNae,以及FNpb(对于前三种与FOBSAN比较的方法)或FNud(对于其余与BOBSAN比较的方法)。为了进行公平比较,我们在实验中未对OBSAN启用优化。表13(与FOBSAN比较)和表14(与BOBSAN比较)中报告了实验结果。
当仅关注良性输入和对抗样本(AE)输入时,我们发现OBSAN在检测准确性方面并不是表现最好的方法;ODIN在FPnorm和FNae比例上表现最佳。然而,ODIN的运行速度显著较慢,开销分别是FOBSAN和BOBSAN的9.64倍和17.96倍。这是因为它需要通过整个被保护模型进行反向传播以获得相对于输入的梯度信息,并利用这些信息生成增强输入,再次输入模型,这显著增加了计算复杂度,使其不适合用于生产环境中的DNN可执行文件。
在两组比较中,我们还发现DLA和GradNorm是各自组中最快的方法。然而,DLA在实际中难以采用,因为它需要训练一系列辅助分类器模型,这既不受深度学习编译器支持,又非常耗时(平均55分钟,而FOBSAN的初始化时间约为2分钟,详见第八节);GradNorm则没有额外要求,但在大模型上的准确性不如OBSAN。GradNorm在GoogLeNet上的结果(表14中FPnorm和FNae列)与BOBSAN相当。需要注意的是,GoogLeNet相对较小,其参数数量在三种模型中最少(见表2)。GradNorm在其他两个大模型上的FNae远高于BOBSAN,且其FNud几乎可以忽略。
当进一步考虑PB和UD输入时,我们观察到DeepGauge和ViM在各自组别中拥有最佳的FNpb和FNud比例,且执行开销与OBSAN相当,但它们在FPnorm和FNae方面表现不佳。综上所述,我们从实验中得出结论:FOBSAN和BOBSAN在运行时开销、确保良性输入的正常推理(合理低的FPnorm)以及对OOB输入的检测能力(FNae、FNpb、FNud)之间达到了平衡。
工作 | 方法类别 | 逻辑类别 | 对比 |
DeepGauge | Coverage | Vision-based | FOBSan (AE + PB) |
DLA | Classification | Vision-based | FOBSan (AE + PB) |
ANR | Reclassification | Vision-based | FOBSan (AE + PB) |
ODIN | Reclassification + Gradient | Semantics-based | BOBSan (AE + UD) |
GradNorm | Gradient | Semantics-based | BOBSan (AE + UD) |
ViM | Statistics | Semantics-based | BOBSan (AE + UD) |
表12:现有工作的实证比较列表。我们在大多数工作上投入了大量的工程努力,以识别解决方法并使其与深度学习编译器兼容。有关它们的扩展,请参见我们发布的代码 [2]
模型 | 方法 | 推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNpb 比率 |
ResNet50 | (None) | 1.22 | - | - | - |
DeepGauge | 3.35 | 52.62% | 0.00% | 0.00% | |
DLA | 1.40 | 20.46% | 0.00% | 77.55% | |
ANR | 4.79 | 62.92% | 86.23% | 42.49% | |
FOBSan | 3.28 | 1.11% | 2.35% | 10.57% | |
GoogLeNet | (None) | 3.79 | - | - | - |
DeepGauge | 5.84 | 31.55% | 0.00% | 0.00% | |
DLA | 3.91 | 16.3% | 0.00% | 67.63% | |
ANR | 8.12 | 80.75% | 63.15% | 58.81% | |
FOBSan | 5.75 | 2.52% | 0.00% | 0.06% | |
DenseNet121 | (None) | 2.65 | - | - | - |
DeepGauge | 6.54 | 38.65% | 0.00% | 0.00% | |
DLA | 2.75 | 17.87% | 0.00% | 16.91% | |
ANR | 6.06 | 65.11% | 74.48% | 63.53% | |
FOBSan | 6.45 | 1.27% | 0.00% | 0.32% |
表13:FOBSAN 与其他工作的比较
模型 | 方法 | 推理时间(毫秒) | FPnorm 比率 | FPae 比率 | FNud 比率 |
ResNet50 | (None) | 1.22 | - | - | - |
ODIN | 79.66 | 1.55% | 0.00% | 96.58% | |
GradNorm | 1.25 | 4.11% | 20.76% | 82.61% | |
ViM | 1.80 | 13.46% | 8.60% | 24.99% | |
BOBSan | 1.30 | 6.11% | 0.01% | 65.36% | |
GoogLeNet | (None) | 3.79 | - | - | - |
ODIN | 42.90 | 3.67% | 0.00% | 97.96% | |
GradNorm | 3.75 | 6.46% | 0.00% | 78.61% | |
ViM | 3.78 | 10.55% | 57.29% | 75.79% | |
BOBSan | 4.36 | 9.17% | 0.00% | 77.78% | |
DenseNet121 | (None) | 2.65 | - | - | - |
ODIN | 26.69 | 2.29% | 0.22% | 91.79% | |
GradNorm | 2.65 | 3.89% | 11.04% | 88.48% | |
ViM | 2.70 | 14.71% | 0.06% | 28.45% | |
BOBSan | 2.64 | 6.69% | 0.02% | 55.02% |
迁移至其他深度学习编译器和内核库。 如第 IV 节所示,OBSAN 的设计是与特定的深度学习编译器框架正交的。在当前研究中,我们基于 TVM 实现了 OBSAN,因其在实际生产环境中的流行与广泛应用。我们预计,OBSAN 的当前实现可以顺利迁移到其他深度学习编译器,例如 Glow [68],它同样能够从高级深度学习描述中生成可执行文件或共享库。尽管迁移需要额外且非平凡的工程努力,但不应引发新的研究挑战。用户可以扩展我们的代码库 [2] 以实现迁移。
迁移至其他体系结构。 OBSAN 的当前实现对运行于 64 位 x86 平台 CPU 上的深度学习可执行文件进行了插装。需要说明的是,近期的深度学习编译器测试工作也主要在相同的设置下配置深度学习编译器——生成运行在 64 位 x86 平台 CPU 上的可执行文件 [42, 71, 91]。这种设置似乎是当前深度学习编译器最成熟的配置。然而,与频繁依赖特定架构的 C/C++ 程序运行时检测工具(sanitizer)不同 [33, 70],OBSAN 的核心技术是与平台无关的。因此,可以合理地假设,将当前基于 CPU 的检测工具实现移植到其他架构(例如 GPU)不会引发新的研究挑战。
我们在第 X 节讨论了现有文献中关于检测越界(OOB)输入的研究。以下,我们回顾了有关优化检测技术的相关工作。
现有工作已经提出了一些程序分析技术,用于标记和移除冗余的检测操作。例如,通过确认数组索引的值域始终有效,移除不必要的数组边界检查 [15, 24, 54, 76, 94]。大多数现有工作主要集中在通过特定的分析手段移除插入到 C/C++ 可执行文件中的冗余检查,这些方法无法直接扩展以优化 OBSAN。ASAP [81] 观察到,位于热路径上的检测操作通常对漏洞的检测能力贡献较小,因为(未知的)漏洞大多存在于未完全测试的冷路径中。通过移除热路径上那些不太重要的检测操作,可以减少运行开销。我们的修剪优化(O2 和 O4)也识别了不太重要的神经元/层,并修剪了它们所伴随的 OBSAN 检测操作。[101, 103] 使用静态分析或启发式方法识别冗余检查。例如,如果在一个顺序程序中发现两次检查对同一数组索引进行了重复验证,则可以在不影响安全性的前提下移除第二次检查。然而,鉴于深度学习层/神经元很难在语义上完全相同,识别“冗余”的 OBSAN 检测操作是一个模糊的问题。
随着将深度学习模型编译为可执行文件的趋势日益显著,对深度学习可执行文件的安全增强尚未实现。我们提出了 OBSAN,这是一种用于捕获深度学习可执行文件越界行为的检测技术。我们证明了 OBSAN 的高越界检测能力,并通过应用各种优化措施,将其运行开销降至较低水平,从而促进其在生产环境中的应用。我们展示了两种下游应用,并讨论了其可扩展性。
更多【外文翻译- OBSAN:一种用于强化深度神经网络可执行文件的越界检查工具】相关视频教程:www.yxfzedu.com