基于 LLM 的 AI OPS 探索系列 - 搭建支持 GPU 的 Kubernetes 集群

2024-07-15 12:03:10 浏览数 (2)

背景

在本次 workshop 中,我们介绍了如何使用 K3S 在 AWS 上设置支持 GPU 的 Kubernetes 集群,安装 NVIDIA 驱动和插件,以及部署验证测试运行 GPU 工作负载。

前提条件

  1. 准备一个 AWS GPU 云实例(例如 g4dn.xlarge/Ubuntu 22.04 )
  2. 基本的 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 加速的任务。

主要功能:

  1. 为容器提供对 GPU 资源的访问。
  2. 支持在容器中运行需要 NVIDIA CUDA 的应用程序。与 Docker 和 Kubernetes 集成,方便用户在这些容器管理平台上使用 GPU 资源。

NVIDIA Driver

NVIDIA Driver-550 是 NVIDIA 为其 GPU 提供的驱动程序版本之一。驱动程序是操作系统和硬件之间的桥梁,负责管理和控制 GPU 硬件的操作。

主要功能:

  1. 提供底层的 GPU 管理功能,包括 GPU 的初始化、配置和资源管理。
  2. 支持 CUDA 应用程序和库的运行。
  3. 确保系统能够利用 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 驱动和工具包
代码语言:bash复制
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 使用的配置路径
代码语言:bash复制
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 特性发现插件
代码语言:bash复制
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 是否被正确创建
代码语言:bash复制
kubectl  get RuntimeClass | grep nvidia
  • 验证K3S 集群 GPU Node状态
代码语言:shell复制
kubectl describe node | grep nvidia.com
  • 部署一个 GPU 基准测试 Pod
代码语言:yaml复制
# 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
代码语言:shell复制
kubectl apply -f nbody-gpu-benchmark.yaml
  • 部署一个 CUDA 任务:
代码语言:yaml复制
# 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
LLM

0 人点赞