Skip to content

oscomp/first-prize-osk2025-GPU-RPlayer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RPlayer:基于重放的可信GPU计算框架

赛题 proj325 - 面向AI计算的可信GPU计算框架
小组成员 黄家俊 杨南
指导教师 郭力维

1. 项目简介

RPlayer是一个可信GPU计算框架,通过记录GPU在完整软件栈中的执行过程,并将其参数化并迁移至可信执行环境(TEE)中重放,从而实现可信GPU计算。

RPlayer 主要参考了基于录制重放的设备驱动复用相关工作,gpureplay-linux-kernelgpureplay-circle-tinystack。在此基础上,RPlayer在RPi5平台完整记录GPU计算过程,于可信执行环境中重放,实现TEE中端到端的AI推理,并验证得到可解释的计算结果(如图像分类标签)。此外,RPlayer还进一步考察了多种计算框架在该机制下的应用与适配,并将其首次延伸扩展至大模型场景。

2. 赛题目标

目前AI计算应用广泛并且发展迅猛,由于需要处理大量的并发计算,目前的AI框架会调用GPU等加速器来提升AI算力。

然而AI框架运行的敏感数据以及模型本身都会受到攻击并泄露,如攻击者使用提权漏洞获取内核权限并直接读取传递给GPU的数据信息。

为了防止恶意的攻击者,需要构建一套可信 GPU 计算框架,保证AI计算安全。本项目旨在使用 CPU TEE 技术,利用软硬件协同手段为GPU构造隔离计算环境,并保证AI计算数据在内核中的安全流通。

预期目标

  • 扩展 CPU TEE 安全能力,并应用于GPU中,保证GPU中的数据传输与计算安全;
  • 加固AI计算使用的内核模块,防止内核特权攻击;
  • 可信GPU模块的安全高效切换,不干扰原有系统的运行;

3. 方法调研

TEE

TEE 旨在从硬件层面确保代码及数据的可信性,为CPU提供了运行可信应用的安全区域。因此,我们以 TEE 作为本项目的关键基础。

OP-TEE 是 TEE 的一种内核实现,为安全区域的可信应用提供基础内核服务,如内存分配与上下文切换。

GPU in TEE

为使复杂GPU软件栈得到来自 TEE 的强安全隔离防护,我们考虑了如下两类方法:

  • 基于划分:HETEE、StrongBox、LDR。核心思想是分离负载、软件栈等层面的可信与不可信部分。
  • 基于 Record & Replay (RnR):GPUReplay、RT-TEE。核心思想是记录普通系统的行为,并在可信系统重放。

考虑到目标是AI计算,软件栈层级复杂,我们主要参考了基于 RnR 的方法,GPUReplay

RnR & GPUReplay

RnR的原理:利用设备内部确定性有限自动机,记录(Record)关键驱动行为并重放(Replay),以复现状态转移。基于两点核心观察:

  • 设备通过软硬件接口(如中断、DMA和IO寄存器读写)与驱动交互,视作驱使GPU状态转移的关键事件
  • 执行请求时,设备的状态转移与IO数据的内容无关

RnR 原理

GPUReplay 分为两步:第一步称为 Record,预先记录GPU在完整的软件栈上执行计算的过程,得到 Recording;第二步称为 Replay,利用 recording 和新的输入数据,执行GPU计算。

GPUReplay 设计概览

安全性

GPUReplay 绕过了GPU软件栈,使GPU能够通过 recording 及应用提供的数据直接进行运算,大大减小了GPU暴露在外的攻击面,从而降低了GPU计算的安全威胁。

与 TEE 的结合

原作者通过向 OP-TEE 新增驱动的方式,在不大幅修改原有代码的情况下,实现了基于 Mali Bifrost GPU 的 replayer 在 OP-TEE 的移植。不使用 GPUReplay 的应用将在普通世界的GPU软件栈上运行,使用 GPUReplay 的应用将在安全世界借助 replayer 运行。这证明了 GPUReplay 方法的可移植性,为我们结合 TEE 与 GPUReplay 以实现可信GPU计算框架提供了思路。

我们认为,同 TEE 结合的 GPUReplay 方法能够有效地完成本项目的预期目标。

  • GPUReplay 能够通过让CPU免于执行GPU软件栈的方式,扩展 CPU TEE 在GPU计算上的安全性。
  • GPUReplay 能够通过重放GPU执行记录的方式,减少AI计算内容对外界的暴露程度。

理想情况的 TEE GPUReplay

4. 具体实现

虽然 GPUReplay 方法并不局限于某一类GPU,但为了记录GPU的行动并对GPU驱动进行插桩,必须知道GPU的接口信息并获取GPU驱动的代码。最终,我们选用了 Raspberry Pi 5(简称 RPi 5)作为我们的硬件目标环境。RPi 5 所使用的 VideoCore 7 GPU 在Linux系统有开源的 V3D 驱动,且 RPi 5 本身有较为完善的文档支持与庞大的开源社区,是比较理想的开发目标。详见 docs/environments.md

由于 RPi 系列机器使用的内存均为DRAM,无法隔离安全世界与非安全世界,因此 RPi 系列机器并不能真正实现安全的可信执行环境。不过,由于 RPi 系列机器的易用性和广泛性,我们认为用 RPi 5 进行概念验证仍然是不错的选择。

目前,网络上还没有将 OP-TEE OS 移植到 RPi 5 的相关资料。我们参考了一篇将OP-TEE移植到RPi4的资料,将 OP-TEE OS 手动移植到了 RPi 5。详见 docs/optee-os.md

OP-TEE OS 构建流程

RPlayer

RPlayer 是本项目的主体,以 RPi 5 为平台,运用 GPUReplay 方法,分为 recorder 和 replayer 两部分。其中,recorder 是对原 V3D 驱动程序插桩后得到的新驱动程序;replayer 是 OP-TEE 应用,在 OP-TEE 的可信支撑下重放GPU计算,包含运行在 Linux 之上的 Client Application(CA) 及由 OP-TEE OS 提供防护的 Trusted Application(TA) 。

GPUReplay 方法中,实现 record(记录)的程序称为 Recorder。recorder 需要记录GPU的各项行动,包括存取寄存器、设置GPU页表、设置GPU内存映射、在CPU与GPU间传输数据、等待中断等。此外,recorder 还需要定位 recording 所涉及的输入与输出数据。由于 replay 减少了CPU运行的负荷,recorder 还需要同步CPU与GPU的行动。

本项目 recorder 是经过插桩的GPU驱动程序,运行在内核态。recorder 通过插桩,记录了GPU寄存器存取情况与GPU用到的内存数据,最终产生用于 replay 的 recording,即 GPU 活动记录。详见 docs/recorder.md

此外,本项目的 recorder 集成了在 Linux 内核态下的 replay 功能,可用于测试重放的基本功能。

recorder 原理

GPUReplay 方法中,实现 replay(重放)的程序称为 Replayer。replayer 提供了如下API:(1)获取与释放GPU;(2)加载 recording,验证 recording 的安全性,分配所需的GPU内存;(3)replay主逻辑,根据 recording 及应用提供的输入与输出缓存,执行GPU运算。

完整的 replayer 程序分为三个部分,分别是(1)静态验证器,用于验证 recording 的安全性;(2)解释器,用于整理和执行 recording;(3)模拟GPU硬件的微型驱动。replayer 既可以是用户态程序(1与2)与内核模块(3)的混合,也可以是一整个内核模块,整合了以上三个部分。

本项目分别包含内核模块形式的 replayer 及 OP-TEE 应用形式的 replayer。前者经测试已能完整复现GPU计算结果,后者包含 CA 及 以 OPTEE OS 接口形式实现的 Pseudo TA。详见 docs/replayer.md

OP-TEE replayer 设计概览

就计算框架而言,我们分别考察了 NCNN、PyTorch、ExecuTorch 等框架在 GPUReplay 方法下的适用性,还能提取 NCNN 的重放输出。详见docs/workloads.md

5. 重大挑战

OP-TEE 支持不足

目前,OP-TEE 仅对 RPi 3 有较为全面的支持,对 RPi 4 及 RPi 5 均无官方支持。RPi 3 并没有供 Mesa 等 GPU 运行时使用的 drm/v3d 驱动,所以无法适配当下的绝大部分 GPU 计算框架。我们最终选用了计算能力更强、支持 Mesa 的 RPi 5 作为主要开发平台,因此我们需要手动实现 OP-TEE 对 RPi 5 的适配。

在适配过程中,我们遇到了一些技术问题。首先,我们发现 OP-TEE OS 在 RPi 5 设备的初始化并不稳定,即使先前成功初始化,在没有修改任何配置的情况下,后续也可能无法完成初始化。经过 JTAG debug 后,我们发现 RPi 5 设备串口没有正常输出 OP-TEE 日志,因此陷入了无限循环。我们修改了冲刷函数,解决了该问题。

flush函数无限循环

此外,我们还发现 OP-TEE OS 的内存对 GPU 计算而言是严重的性能瓶颈。为此,我们修改了 OP-TEE OS 的相关配置,使其拥有 128 MB 的内存。

难以选取计算框架

在设备驱动之外,本项目主要考虑的 GPU 负载分为三部分:GPU 运行时、计算框架、AI 应用。如果设备不支持某一计算框架依赖的 GPU 运行时,就不能支持该计算框架及其上层的 AI 应用。本项目选用的 RPi 5 只能支持一小部分 GPU 运行时。在目前主流的运行时当中,RPi 5 仅支持 Vulkan 及其 Mesa 实现。这对我们考察计算框架带来了不小的挑战。

最终,我们在 RPi 5 上考察了 NCNN、PyTorch 和 ExecuTorch 的 GPU 计算能力。其中,NCNN 对 Vulkan 的适配最为完善;PyTorch 的 Vulkan 分支已被废弃;而 ExecuTorch 虽已能够支持包括 Llama 在内的大语言模型的 GPU 加速推理,但其支持程度仍不充分。

GPU 负载层级

难以提取计算输入/输出

为了实现更具泛化性的 GPU 可信计算,本项目还需要支持动态的计算输入与输出。我们对 NCNN SqueezeNet 的计算过程进行了深入分析,发现 NCNN 提交给 GPU 的指令在不同图片输入下保持不变。基于这一特性,我们无需手动修改 GPU 计算记录即可在重放过程中提交不同的图片输入。

在输出方面,我们进一步分析了 NCNN 的内存结果,发现其存储图片标签的位置相对固定,因此能够较为直接地提取计算输出。

此外,我们还发现设备在重放过程中无法正确等待部分提交作业的中断。进一步分析后发现,这些中断对应的作业具有异常高的执行次数。将这些作业的执行次数调低后,重放端的输出结果并未发生变化,仍与记录端保持一致。

csd 中断错误

6. 项目结构

source

存放了 RPlayer 的源代码,包括:

  • recorder:存放内核驱动形式的 recorder 及 parser。该驱动也包含了 replayer 的内核模块形式实现。
  • replayer:存放 OP-TEE 应用形式的 replayer,包含 CA(host文件夹) 及 TA(ta文件夹) 两部分。
  • optee:存放 OP-TEE 移植到 RPi 5 所需的一些文件。

apps

存放 RPlayer 测试所用的部分 AI 应用,包括 SqueezeNet、MobileNet、NanoDet 及 Llama。其中,SqueezeNet 有较为完整的测试,包含以下文件夹:

  • record:包含GPU计算记录的输入、日志输出、内存输出及示例程序。
  • replay:包含重放后得到的内存,及辅助查看 record 结果的应用。

docs

存放项目文档,包括:

7. 项目分工

黄家俊负责 OP-TEE OS 及 recorder 相关;杨南负责 replayer 相关。

郭力维老师为我们确认了本次比赛的选题,并联系到了 GPUReplay 论文的原作者 Heejin Park 与 Felix Xiaozhu Lin。两位原作者提供了极大的帮助。

8. 比赛收获

本次比赛对我们而言是绝佳的锻炼机会。项目可能很小,但已经能让我们对系统方向的研究有切身的体会了。就项目本身而言,我们也算是完整地考察了 GPU 计算的运作机制。

9. 参考资料

[1] J. Zhu et al., "Enabling Rack-scale Confidential Computing using Heterogeneous Trusted Execution Environment”

[2] Y. Deng et al., “StrongBox: A GPU TEE on Arm Endpoints”

[3] H. Yan et al., “LDR: Secure and Efficient Linux Driver Runtime for Embedded TEE Systems”

[4] H. Park et al., “GPUReplay: a 50-KB GPU stack for client ML”

[5] J. Wang et al., “RT-TEE: Real-time System Availability for Cyber-physical Systems using ARM TrustZone”

[6] Tencent, https://github.com/Tencent/ncnn

[7] Meta, https://github.com/pytorch/executorch

[8] F. N. Landola et al., “SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size”

[9] A. G. Howard et al., “MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications”

[10] Meta, https://github.com/meta-llama/llama

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages