随着人工智能、大数据分析和高性能计算技术的快速发展,GPU资源的高效利用成为企业关注的焦点。GPU虚拟化技术作为一项关键技术,能够显著提高资源利用率,降低硬件成本,并提供灵活的资源调度能力。本文分析了多种GPU虚拟化方式,期望为研究者和工程师们提供有价值的参考,助力其在相关领域的技术探索与应用。
GPU虚拟化是指通过软件技术,将物理GPU资源虚拟化为多个逻辑GPU资源,以便多个虚拟机或容器能够共享同一个物理GPU设备。这种虚拟化技术包括以下几种主要方式:
• 直通(Pass through):将整个物理GPU设备直接分配给一个虚拟机或容器,适用于对GPU性能要求较高的应用,但缺乏灵活性和资源共享能力。
• 共享(Sharing):将物理GPU设备划分为多个逻辑单元,多个虚拟机或容器可以共享同一个GPU资源,实现了资源的共享和隔离,提高了资源利用率,适用于并发较高但对性能要求不高的应用,但在性能和隔离性方面存在一定的限制。
• 全虚拟化(Full Virtualization):通过软件模拟GPU硬件,使得虚拟机或容器可以独立运行,适用于对资源隔离和安全性要求较高的应用,但由于性能损耗较大,主要应用于对安全性要求较高的场景。
• GPU池化(GPU Pooling):将多个物理GPU资源统一管理和调度,实现了资源的按需分配和动态调整,提供了更高的资源利用率和调度灵活性。
GPU虚拟化技术经历了从简单虚拟化到任意虚拟化,再到远程调用和资源池化的发展历程。每一步的发展都带来了更高的资源利用率和更强的灵活性。
图1:GPU虚拟化技术发展四阶段
虚拟化技术实现体现三个层次,即用户层、内核层和硬件层。然后在根据技术的应用场景分为隔离场景(容器和虚机)和硬件场景(虚拟桌面、渲染和AI计算)两个维度,不同的技术可能仅适用它对应的场景。
图2:GPU虚拟化技术实现
(一)GPU 用户层虚拟化技术
图3:本地 API 拦截和 API forwarding
1.应用调用 libwrapper:应用程序(APP)调用 libwrapper 中的函数。
2.拦截和解析:libwrapper拦截应用的函数调用,解析参数。
3.调用底层库:使用解析后的参数,通过 dlopen 动态打开底层库,调用相同名称的函数。
4.返回结果: 调用完成后,libwrapper 将结果返回给应用程序。
• 静态链接变动态链接:应用程序和底层库的静态链接需要变为动态链接。
• 动态库加载:libwrapper需要使用 dlopen 动态加载底层库。
我们可以通过GPU 用户层的 API 拦截与转发技术实现在用户态对底层库的 API 调用进行控制和管理。
技术2:远程 API forwarding
图4:远程 API forwarding
远程 API 转发技术允许 GPU 资源在不同的物理机器之间共享。通过将 GPU 调用转发到远程机器上的底层库,系统可以实现 GPU 资源池化,从而使不具备 GPU 的机器也能够利用 GPU 进行计算。
1.网络调用底层库:libwrapper 通过网络调用位于不同机器上的底层库。
2.库分为两部分:客户端(client):负责转发请求;服务器端(server):负责接收请求并调用底层库。
3.GPU 池化: 可以将多个 GPU 组成调用池,允许多个客户端调用这些 GPU,从而实现让不具备 GPU 的机器也能使用 GPU 的功能。
• 类似 RPC 的函数调用:调用函数需要进行参数的序列化和反序列化。
• 性能优化:对于本机来说,远程数据传输的性能对函数调用的延迟影响很大。通常可以通过 RDMA(远程直接内存访问)进行网络加速。
该技术可以实现远程 GPU 的 API 转发,优化 GPU 资源的利用,增强系统的计算能力。
技术3:半虚拟化 API forwarding
图5:virgl+virtio-gpu实现
半虚拟化API 转发技术通过虚拟化和半虚拟化的方式,实现虚拟机中的应用程序对宿主机GPU资源的调用,从而在虚拟化环境中高效地利用GPU资源。
• 共享内存:virtio通过共享内存的方式在虚拟机和宿主机之间共享数据,减少了数据拷贝。
通过半虚拟化API转发技术,可以实现虚拟机环境下的GPU半虚拟化API转发,有效利用宿主机的GPU资源。
(二)GPU内核层虚拟化
图6:内核层GPU驱动拦截
内核层GPU驱动拦截技术通过在内核中创建一个模块来拦截对GPU驱动的访问,从而实现对GPU资源的虚拟化管理。此方法适用于容器化应用。
• 理解系统调用:需要了解底层库调用GPU驱动的系统调用的具体含义。
用户进程通过系统虚拟化层(hypervisor)提供的虚拟化接口,访问(真实的)虚拟化接口。
图7:GPU驱动半虚拟化
内核层GPU驱动半虚拟化技术通过在虚拟机环境中实现对GPU资源的虚拟化管理,适用于虚拟机应用。
• 适用范围:适用于虚拟机应用。
(三)GPU硬件层虚拟化
图8:透传GPU
1. 虚拟机GPU驱动:虚机的GPU驱动无需做任何修改,能够直接访问真实的硬件资源。
2. GPU透传:整个GPU透传给虚拟机,确保性能损耗最小。
• 适用范围:适用于虚拟机应用和云GPU服务器。
• 资源共享限制:由于无法实现GPU资源共享,一般认为这不属于严格意义上的GPU虚拟化。
这项技术在需要高性能GPU访问的虚拟化环境中非常有效。
图9:NVIDIA vGPU方案
1. 特定驱动安装:虚拟机内核需要安装特定的GPU虚拟化驱动,即GRID驱动,与物理机安装的驱动不同。
2. 显存分配:显存按照固定切分,直接分配给虚拟机。
3. 算力调度:采用时分方案,按时间片将GPU算力分配给虚拟机。
• 适用范围:适合云GPU服务器。
• 收费模式:该软件需要付费使用。
NVIDIA vGPU提供了一种高效的方式来管理虚拟机中的GPU资源,适用于需要高性能图形和计算能力的场景。
NVIDIA MIG方案适合容器化部署,云原生场景。
图11:NVIDIA MIG vGPU
1. 资源切分: 显存和算力按照 MIG 硬件的切分方式,直接分配给虚拟机。
2. 性能优势: 相较于传统的 vGPU,MIG vGPU 在算力损耗方面更小。
• 适用范围:适合虚拟机应用和云 GPU 服务器。
通过 MIG vGPU,用户可以更高效地利用 GPU 资源,提升虚拟化环境中的性能表现。
(四)GPU虚拟化技术对比
表1:GPU虚拟化技术对比
(五)业界GPU虚拟化方案对比
表2:业界GPU虚拟化方案对比
本章节主要探索容器环境下GPU资源管理的技术,首先介绍Kubernetes管理 GPU 资源的插件机制,然后尝试在Kubernetes环境下对NVIDIA GPU资源整卡模式及vGPU模式使用进行探索。
(一)GPU虚拟化在容器中的实现
图12:Device Plugin 与 Kubelet 交互过程
(二)Kubernetes上对NVIDIA GPU资源管理探索
1. NVIDIA GPU 整卡模式
2. NVIDIA vGPU 模式
本文介绍了GPU虚拟化技术基本概念及相关技术,尝试了在容器环境下对NVIDIA GPU资源管理的探索。GPU虚拟化技术在亚信科技智能计算引擎产品(AISWare ACE)中也得到了应用,提供GPU资源管理模块,支持NVIDIA CUDA多版本管理,为模型训练提供整卡、vGPU等能力。但当前也存在一些技术挑战。
(二)未来的发展方向与研究热点
[1]https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/
[2] https://github.com/NVIDIA/k8s-device-plugin
[3] GPU虚拟化白皮书 – Imagination