前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于 LLM 的 AI OPS 探索系列 - 搭建支持 GPU 的 Kubernetes 集群

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

原创
作者头像
行者深蓝
修改2024-07-15 12:03:10
870
修改2024-07-15 12:03:10
举报
文章被收录于专栏:云原生应用工坊

背景

在本次 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

参考文档

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
    • 前提条件
      • 技术选型与系统架构设计
        • NVIDIA Container Toolkit
        • NVIDIA Driver
        • nvidia-device-plugin
    • 步骤指南
      • 准备 AWS 实例
        • 安装 NVIDIA 驱动和工具
          • 设置 K3S
            • 测试K3S 与 nvidia-container-runtime
              • 运行镜像以验证 GPU资源访问
                • 配置 NVIDIA Device Plugin for Kubernetes
                  • 测试 GPU 基准和 CUDA 任务
                  • 参考文档
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档