引言
随着最近一两年生成式大模型的迭代出新,尤其是以 ChartGPT 为代表的大语言模型,几乎一夜间让所有人都看到了人工智能改变世界的潜力。而作为持续发力 GPU 通用计算(CUDA)的 AI 专业显卡提供商,Nvidia 公司成为了当之无愧的技术赢家,从其屡创新高的市值中就可见一瞥。
Kubernetes(简称K8S)作为一种容器编排平台,具有许多独特的优势,尤其是其弹性伸缩的能力,可以实现底层资源的超高利用率。纵观当下的科技产业界,到处是大模型推理、微调训练的需求与 Nvidia 专业显卡一卡难求的矛盾局面。在这种矛盾背景下,将 NVIDIA 显卡与 K8S 容器平台结合起来,组成一个高效的 GPU 算力调度平台,无疑是解决这一难题的最佳技术方案。这种结合将充分发挥每块显卡的算力,并通过 Kubernetes 的弹性伸缩特性,实现对 GPU 算力的灵活调度和管理,为大规模 AI 模型的训练和推理提供了可靠的基础支持。
本文将重点介绍 Nvidia GPU 在 K8S 容器平台上的包括虚拟化、调度和安全性在内的算力管控相关技术。
名词解释
CUDA |
CUDA(Compute Unified Device Architecture)是 NVIDIA 公司推出的并行计算平台和编程模型。它允许开发人员利用 NVIDIA GPU 的并行计算能力来加速应用程序的执行。CUDA 包含了一系列的编程接口和工具,使得开发者可以通过使用标准的 C/C++ 编程语言来编写 GPU 加速的程序。 |
RootFS |
根文件系统(Root Filesystem),是 Linux 系统启动后所加载的文件系统,也是文件系统的最顶层。它包含了操作系统中的核心文件和目录结构,包括 /bin、/sbin、/etc、/lib、/dev、/proc、/sys 等 |
Volta、Pascal、Kepler 等 |
不同的 nvidia GPU 架构名称。完整定义如下: |
基于 K8S 的 GPU 虚拟化框架
GPU 虚拟化,除了 GPU 厂商能够在硬件和驱动层面对各种资源进行划分进而形成隔离的虚拟化方案之外,其他主流方案本质上都是对 CUDA 调用的劫持与管控,这里包括阿里的 cGPU、百度的 qGPU、火山引擎的 mGPU 和灵雀云的 vGPU 方案等。考虑到厂商对于硬件的把控和深入理解,即使出自厂商的 “软” 虚拟化方案,也可以通过硬件配合从而获得更好的效果。下文会重点介绍 Nvidia 公司的虚拟化方案以及基于 Nvidia 方案增强的灵雀云 vGPU 方案。
容器侧:CUDA 工具集
在 K8S 容器平台下,一个典型的 GPU 应用软件栈如下图所示。其中,最上层的是多个包含了业务应用在内的容器。每个容器都分别包含了业务应用、CUDA 工具集(CUDA Toolkit)和容器 RootFS;中间层是容器引擎(docker)和安装了 CUDA 驱动程序的宿主机操作系统;最底层是部署了多个 GPU 硬件显卡的服务器硬件。
图示:基于 Nvidia 的 GPU 应用软件栈
主要组件
CUDA 工具集包含了 nvidia-container-runtime(shim)、nvidia-container-runtime-hook 和 nvidia-container library、CLI 工具。对比 CUDA 工具集嵌入前后架构图的差异,我们可以很清楚地看到 CUDA 工具集中的组件嵌入位置,甚至推断出其作用。
图示:CUDA toolset 嵌入前的容器软件栈
图示:CUDA toolkit 嵌入后的容器软件栈
-
nvidia-container-runtime(shim):
该组件曾经是 runc 的一个完整分支,其中注入了特定于 NVIDIA 的代码。自2019年以来,它已经成为安装在主机系统上的本机 runC 的一个轻量级包装器。nvidia-container-runtime 接受 runc spec作为输入,将 NVIDIA 容器运行时钩子(nvidia-container-runtime-hook)作为预启动钩子注入其中,然后调用本机 runc,并传递修改后的具有该钩子设置的 runc spec。对于 NVIDIA 容器运行时 v1.12.0 版本及更高版本,这个运行时(runtime)还对 OCI 运行时规范进行了额外修改,以注入特定的设备和挂载点,这些设备和挂载点不受 NVIDIA 容器 CLI 控制。
-
nvidia-con