GPU
Kubernetes 支持容器请求 GPU 资源(目前仅支持 NVIDIA GPU),在深度学习等场景中有大量应用。
使用方法
Kubernetes v1.8 及更新版本
从 Kubernetes v1.8 开始,GPU 开始以 DevicePlugin 的形式实现。在使用之前需要配置
kubelet/kube-apiserver/kube-controller-manager:
--feature-gates="DevicePlugins=true"在所有的 Node 上安装 Nvidia 驱动,包括 NVIDIA Cuda Toolkit 和 cuDNN 等
Kubelet 配置使用 docker 容器引擎(默认就是 docker),其他容器引擎暂不支持该特性
NVIDIA 插件
NVIDIA 需要 nvidia-docker。
安装 nvidia-docker:
# Install docker-ce
curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
# Test nvidia-smi with the latest official CUDA image
sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi部署 NVDIA 设备插件
GCE/GKE GPU 插件
该插件不需要 nvidia-docker,并且也支持 CRI 容器运行时。
NVIDIA GPU Operator
Nvidia GPU Operator 是一个 Kubernetes Operator,用于在 Kubernetes 集群中部署和管理 Nvidia GPU。
请求 nvidia.com/gpu 资源示例
nvidia.com/gpu 资源示例Kubernetes v1.6 和 v1.7
alpha.kubernetes.io/nvidia-gpu已在 v1.10 中删除,新版本请使用nvidia.com/gpu。
在 Kubernetes v1.6 和 v1.7 中使用 GPU 需要预先配置
在所有的 Node 上安装 Nvidia 驱动,包括 NVIDIA Cuda Toolkit 和 cuDNN 等
在 apiserver 和 kubelet 上开启
--feature-gates="Accelerators=true"Kubelet 配置使用 docker 容器引擎(默认就是 docker),其他容器引擎暂不支持该特性
使用资源名 alpha.kubernetes.io/nvidia-gpu 指定请求 GPU 的个数,如
注意
GPU 资源必须在
resources.limits中请求,resources.requests中无效容器可以请求 1 个或多个 GPU,不能只请求一部分
多个容器之间不能共享 GPU
默认假设所有 Node 安装了相同型号的 GPU
Dynamic Resource Allocation (DRA) 方式使用 GPU
从 Kubernetes v1.26 开始,可以使用 DRA 方式来管理 GPU 资源,相比传统的 Device Plugin 方式,DRA 提供了更灵活的 GPU 分配和管理能力。
DRA GPU 配置
1. 创建 GPU ResourceClass
2. 创建 GPU ResourceClaim
3. 使用 DRA GPU 的 Pod
v1.33 DRA GPU 新特性
1. GPU 分区(MIG 支持)
2. GPU 污点和容忍度
3. 管理员访问控制
DRA GPU 监控和调试
多种型号的 GPU
如果集群 Node 中安装了多种型号的 GPU,则可以使用 Node Affinity 来调度 Pod 到指定 GPU 型号的 Node 上。
首先,在集群初始化时,需要给 Node 打上 GPU 型号的标签
然后,在创建 Pod 时设置 Node Affinity:
使用 CUDA 库
NVIDIA Cuda Toolkit 和 cuDNN 等需要预先安装在所有 Node 上。为了访问 /usr/lib/nvidia-375,需要将 CUDA 库以 hostPath volume 的形式传给容器:
附录:CUDA 安装方法
安装 CUDA:
安装 cuDNN:
首先到网站 https://developer.nvidia.com/cudnn 注册,并下载 cuDNN v5.1,然后运行命令安装
安装完成后,可以运行 nvidia-smi 查看 GPU 设备的状态
AI/ML 推理工作负载的网关管理
对于运行在 GPU 上的 AI/ML 推理服务,可以使用 Gateway API Inference Extension 来进行智能路由和负载平衡。
Gateway API Inference Extension 配置
性能优势
使用 Gateway API Inference Extension 管理 GPU 推理工作负载具有以下优势:
智能路由:基于 GPU 利用率、内存使用情况等实时指标进行路由决策
降低延迟:特别是在高查询率下,延迟显著降低
提高 GPU 利用率:更有效的资源分配和负载平衡
支持模型版本管理:安全的金丝雀发布和 A/B 测试
请求优先级:重要请求可以获得优先处理
监控 GPU 推理服务
参考文档
最后更新于