背景
在本次 workshop 中,我们介绍了如何使用 K3S 在 AWS 上设置支持 GPU 的 Kubernetes 集群,安装 NVIDIA 驱动和插件,以及部署验证测试运行 GPU 工作负载。
前提条件
- 准备一个 AWS GPU 云实例(例如 g4dn.xlarge/Ubuntu 22.04 )
- 基本的 Kubernetes 和 Helm 知识
技术选型与系统架构设计
为了在 K3S 中利用 GPU 计算资源,确保您的 Kubernetes 集群能够识别并正确配置 GPU 是至关重要的。分别介绍下依赖的 NVIDIA 驱动程序、NVIDIA Container Toolkit,以及 nvidia-device-plugin。
- 云平台:在 AWS 上创建 GPU 实例,提供基础计算资源。
- 容器编排:使用 K3S 轻量级 Kubernetes 发行版,管理容器化应用K3S
- 驱动与插件:安装并配置 NVIDIA 驱动和插件(nvidia-container-runtime, nvidia-device-plugin)
- 应用层集成:部署 Ollama,提供 API 接口,并集成 LangChain 实现高级自动化运维功能。
NVIDIA Container Toolkit
NVIDIA Container Toolkit 提供了一套工具和库,用于在容器(如 Docker 和 Kubernetes)中运行利用 NVIDIA GPU 的应用程序。其主要目的是使容器能够访问 GPU 资源,从而加速深度学习、科学计算和其他 GPU 加速的任务。
主要功能:
- 为容器提供对 GPU 资源的访问。
- 支持在容器中运行需要 NVIDIA CUDA 的应用程序。与 Docker 和 Kubernetes 集成,方便用户在这些容器管理平台上使用 GPU 资源。
NVIDIA Driver
NVIDIA Driver-550 是 NVIDIA 为其 GPU 提供的驱动程序版本之一。驱动程序是操作系统和硬件之间的桥梁,负责管理和控制 GPU 硬件的操作。
主要功能:
- 提供底层的 GPU 管理功能,包括 GPU 的初始化、配置和资源管理。
- 支持 CUDA 应用程序和库的运行。
- 确保系统能够利用 GPU 的计算能力进行图形处理和计算任务。
nvidia-device-plugin
nvidia-device-plugin 是一个 Kubernetes 插件,用于在 Kubernetes 集群中管理和分配 NVIDIA GPU 资源。它使 Kubernetes 能够识别和分配 GPU 给容器,从而使容器化的应用程序能够利用 GPU 进行计算加速。
- 主要功能:
- 在 Kubernetes 中发现和发布 GPU 资源。
- 将 GPU 资源分配给需要它们的容器。
- 支持动态添加或移除 GPU 设备。
步骤指南
这包括配置 NVIDIA 驱动程序、安装 NVIDIA Container Toolkit,以及部署 nvidia-device-plugin 来管理和分配 GPU 资源。
准备 AWS 实例
首先,设置您的 AWS GPU 云实例。实例启动后,通过 SSH 连接到它。
代码语言:bash复制ssh -i your-key.pem ubuntu@your-instance-ip
安装 NVIDIA 驱动和工具
- 获取 NVIDIA APT 软件源 GPG 密钥
- 更新 APT 软件源配置文件
- 安装 NVIDIA 驱动和工具包
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/stable/deb/nvidia-container-toolkit.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
sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit nvidia-driver-550
设置 K3S
- 安装 K3S,并禁用不必要的组件,如 traefik 和 servicelb。
- 将 K3S 配置文件复制到 kubectl 使用的配置路径
curl -sfL https://get.k3s.io | sh -s - --disable traefik --disable servicelb --kube-apiserver-arg service-node-port-range=0-50000
mkdir -pv ~/.kube/config && cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
测试K3S 与 nvidia-container-runtime
K3s 已经找到 nvidia 容器运行时: grep nvidia /var/lib/rancher/k3s/agent/etc/containerd/config.toml
运行镜像以验证 GPU资源访问
代码语言:bash复制ctr image pull docker.io/nvidia/cuda:12.1.1-base-ubuntu22.04
ctr run --rm -t --runc-binary=/usr/bin/nvidia-container-runtime
--env NVIDIA_VISIBLE_DEVICES=all
docker.io/nvidia/cuda:12.1.1-base-ubuntu22.04
cuda-12.1.1-base-ubuntu22.04
nvidia-smi
配置 NVIDIA Device Plugin for Kubernetes
使用 helm 部署 NVIDIA Device Plugin for Kubernetes 的步骤:
- 安装 Helm
- 添加 NVIDIA 设备插件仓库
- 部署 NVIDIA 设备插件和 GPU 特性发现插件
snap install --classic helm
helm repo add nvidia-device-plugin https://nvidia.github.io/k8s-device-plugin
helm repo update
helm upgrade -i nvidia-device-plugin nvidia-device-plugin/nvidia-device-plugin --version 0.15.0 --set runtimeClassName=nvidia --namespace kube-system
helm upgrade -i nvidia-device-discovery nvidia-device-plugin/gpu-feature-discovery --version 0.15.0 --namespace gpu-feature-discovery --create-namespace --set runtimeClassName=nvidia
测试 GPU 基准和 CUDA 任务
- 验证 GPU RuntimeClass 是否被正确创建
kubectl get RuntimeClass | grep nvidia
- 验证K3S 集群 GPU Node状态
kubectl describe node | grep nvidia.com
- 部署一个 GPU 基准测试 Pod
# nbody-gpu-benchmark.yaml
apiVersion: v1
kind: Pod
metadata:
name: nbody-gpu-benchmark
namespace: default
spec:
restartPolicy: OnFailure
runtimeClassName: nvidia
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:nbody-cuda11.2.1
args: ["nbody", "-gpu", "-benchmark"]
resources:
limits:
nvidia.com/gpu: 1
env:
- name: NVIDIA_VISIBLE_DEVICES
value: all
- name: NVIDIA_DRIVER_CAPABILITIES
value: all
- 应用基准测试 Pod
kubectl apply -f nbody-gpu-benchmark.yaml
- 部署一个 CUDA 任务:
# cuda-job.yaml
apiVersion: v1
kind: Pod
metadata:
name: vec-add-pod
spec:
restartPolicy: OnFailure
runtimeClassName: nvidia
containers:
- name: cuda-vector-add
image: k8s.gcr.io/cuda-vector-add:v0.1
resources:
limits:
nvidia.com/gpu: 1
应用 CUDA 任务 Pod
代码语言:shell复制kubectl apply -f cuda-job.yaml
参考文档
- https://docs.k3s.io/zh/advanced
- https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#prerequisites