3.4 算力隔离的本质从上述介绍中,我们可以看出:算力隔离、故障隔离都是 GPU 虚拟化、GPU 池化的关键,缺一不可 。如果没有算力隔离,不管虚拟化损耗有多低,都会导致其方案价值变低;而如果缺少实例间的故障隔离,则基本无法在生产环境使用了 。
事实上,英伟达 GPU 提供了丰富的硬件特性,支持 Hardware Partition,支持 Time Sharing 。
1. Hardware Partition,亦即: 空分
Ampere 架构的 A100 GPU 所支持的 MIG,即是一种 Hardware Partition 。硬件资源隔离、故障隔离都是硬件实现的 —— 这是无可争议的隔离性最好的方案 。它的问题是不灵活: 只有高端 GPU 支持;只支持 CUDA 计算;A100 只支持 7 个 MIG 实例 。
2. nVidia MPS
除了 MIG,算力隔离表现最优秀的,是 MPS —— 它通过将多个进程的 CUDA Context,合并到一个 CUDA Context 中,省去了 Context Switch 的开销,也在 Context 内部实现了算力隔离 。如前所述,MPS 的致命缺陷,是把许多进程的 CUDA Context 合并成一个,从而导致了额外的故障传播 。所以尽管它的算力隔离效果极好,但长期以来工业界使用不多,多租户场景尤其如此 。
3. Time Sharing,亦即: 时分
nVidia GPU 支持基于 Engine 的 Context Switch 。不管是哪一代的 GPU,其 Engine 都是支持多任务调度的 。一个 OS 中同时运行多个 CUDA 任务,这些任务就是在以 Time Sharing 的方式共享 GPU 。
鉴于 MIG 的高成本和不灵活、MPS 故障隔离方面的致命缺陷,事实上就只剩下一种可能:Time Sharing 。唯一的问题是,如何在原厂不支持的情况下,利用 Time Sharing 支持好算力隔离、以保证 QoS 。这也是学术界、工业界面临的最大难题 。
3.4.1 GPU microarchitecture 和 chip真正决定 GPU 硬件以何种方式工作的,是 chip 型号 。不管是 GRID Driver 还是 Tesla Driver,要指挥 GPU 硬件工作,就要首先判断 GPU 属于哪种 chip,从而决定用什么样的软硬件接口来驱动它 。
文章插图
3.4.2 PFIFO: GPU Scheduling InternalsPFIFO 架构:
文章插图
概念解释:
PFIFOGPU 的调度硬件,整体上叫 PFIFO 。
Engine执行某种类型的 GPU 硬件单元 。常见 Engine 有:
- PGRAPH —— CUDA/Graphics
- PCOPY ——— Copy Engine
- PVENC ——— Video Encoding
- PVDEC ——— Video Decoding
- ...
ChannelGPU 暴露给软件的,对 Engine 的抽象 。一个 app 可以对应一或多个 channels,执行时由 GPU 硬件把一个一个的 channel,放在一个一个的 engine 上执行 。
channel 是软件层的让 GPU 去执行的最小调度单位 。
TSGTimeslice Group 。
由一或多个 channel(s)组成 。一个 TSG 共享一个 context,且作为一个调度单位被 GPU 执行 。
runlistGPU 调度的最大单位 。调度时,GPU 通常是从当前 runlist 的头部摘取 TSG 或 channel 来运行 。因此,切换 runlist 也意味着切换 active TSG/channel 。
PBDMApushbuffer DMA 。GPU 上的硬件,用于从 Memory 中获取 pushbuffer 。
HostGPU 上和 SYSMEM 打交道的部分(通过 PCIe 系统) 。PBDMA 是 Host 的一部分 。注意,Host 是 Engine 和 SYSMEM 之间的唯一桥梁 。
Instance Block每个 Channel 对应一个 Instance Block,它包含各个 Engine 的状态,用于 Context Switch 时的 Save/Restore;包含 GMMU pagetable;包含 RAMFC —— 其中包括 UMD 控制的 USERD 。
3.4.3 runlist/TSG/channel 的关系
- Tesla 驱动为每个 GPU,维护一或多个 runlist,runlist 或位于 GPU 显存,或位于系统内存
- runlist 中有很多的 entry,每个 entry 是一个 TSG 或一个 channel
- 一个 TSG 是 multi-channel 或 single-channel 的
- 一个 channel 必定隶属于某个 TSG
- 硬件执行 TSG 或 channel,当遇到以下情景之一时,进行 Context Switch: