Kubernetes 集成 Nvidia GPU (详细攻略)

这篇具有很好参考价值的文章主要介绍了Kubernetes 集成 Nvidia GPU (详细攻略)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kubernetes 中已经实验性地支持管理多个节点上的 AMD / NVIDIA GPU (显卡)。 本文重点介绍在k8s集群中,集成Nvidia显卡容器资源调度。

整个实施过程流程总共分为三大步骤:

  • 安装Nvidia驱动和CUDA。
  • 安装nvidia-docker 2, 这个是支持nvidia显卡运行的容器运行时,默认的docker运行时是runc,该模块提供docker使用gpu资源的能力。
  • 安装 k8s-device-plugin, 这个插件用来和k8s集成,该模块提供k8s集群通过kubelet动态调度gpu资源的能力。

全部安装完成后,通过运行一个gpu计算容器来验证安装正确性。下面看详细的安装过程:

一、实施环境

操作系统

Ubuntu-20.04.1

Kubernetes Cluster Version

1.22.15

Docker Version

docker-ce-20.10.21

GPU

tesla-A100

二、安装Nvidia驱动

2.1 官方驱动安装

2.1.1 驱动下载

下载地址  本示例不从官方下载驱动安装,采用更加方便的PPA方式。

2.1.2 安装

😜略

2.2 PPA方式安装

Ubuntu 社区建立了一个命名为 Graphics Drivers PPA 的 PPA,专门为 Ubuntu 用户提供最新版本的各种驱动程序。目前,率先推出的即为 Nvidia 驱动。因此我们可以通过 PPA 为 Ubuntu 安装 Nvidia 驱动程序。

2.2.1 添加PPA镜像源

add-apt-repository ppa:graphics-drivers/ppa
apt-get update

2.2.2 查看可用的驱动版本

ubuntu-drivers devices

​​​​​​​k8s gpu,kubernetes 实战,kubernetes,docker,容器,云原生,运维

2.2.3 选择合适的版本进行安装

安装建议版本:

ubuntu-drivers autoinstall

安装指定版本:

apt-get install nvidia-driver-XXX

2.2.4 安装完成后重启查看

nvidia-smi 

# cuda
nvcc -V

查看驱动版本

root@worker-05:~# cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  520.61.05  Thu Sep 29 05:30:25 UTC 2022
GCC version:  gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 

安装成功后通过 nvidia-smi 命令可以看到显卡利用状态,使用 watch 可持续监控 watch -n 5 nvidia-smi 

k8s gpu,kubernetes 实战,kubernetes,docker,容器,云原生,运维

三、安装CUDA(可跳过,安装驱动时已安装)

CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。 CUDA下载地址

3.1 选择安装平台

k8s gpu,kubernetes 实战,kubernetes,docker,容器,云原生,运维

3.2 下载和安装

🌶️如果已经安装了驱动,在安装cuda时需要跳过驱动的安装,否则,使用以下命令会更新已经安装好的驱动。

k8s gpu,kubernetes 实战,kubernetes,docker,容器,云原生,运维

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda-repo-ubuntu2004-11-8-local_11.8.0-520.61.05-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-8-local_11.8.0-520.61.05-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

🌶️ 安装时遇到了这个错误

cuda : Depends: cuda-11-8 (>= 11.8.0) but it is not going to be installed E: Unable to correct problems, you have held broken packages.

通过运行 apt clean; apt update; apt purge cuda; apt purge nvidia-*; apt autoremove; apt install cuda 得以解决,参考这里 , 直接运行这个命令,会一并升级了驱动好像。

3.3 验证

root@worker-05:~# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0

四、安装NVIDIA Docker 2

官方地址:nvidia-docker

The NVIDIA Container Toolkit allows users to build and run GPU accelerated Docker containers. The toolkit includes a container runtime library and utilities to automatically configure containers to leverage NVIDIA GPUs.

4.1 前提条件

在操作系统中已经完成了 NVIDIA driver 和 Docker engine 的安装 

4.2 安装

官方安装手册 install-guide ,主要流程有:

4.2.1 配置包仓库和GPG Key

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/$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

4.2.2 安装nvidia-docker2

apt-get update
apt-get install -y nvidia-docker2
systemctl restart docker

4.3 验证

At this point, a working setup can be tested by running a base CUDA container:

docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

k8s gpu,kubernetes 实战,kubernetes,docker,容器,云原生,运维

五、部署Nvidia Device Plugin

官方安装说明 NVIDIA device plugin for Kubernetes

The NVIDIA device plugin for Kubernetes is a Daemonset that allows you to automatically:

  • Expose the number of GPUs on each nodes of your cluster
  • Keep track of the health of your GPUs
  • Run GPU enabled containers in your Kubernetes cluster.

官方提供了快速安装和Helm这两种方式。下面以快速安装为例:

5.1 快速安装

5.1.1 前提条件

The list of prerequisites for running the NVIDIA device plugin is described below:

  • NVIDIA drivers ~= 384.81 (不等于)
  • nvidia-docker >= 2.0 || nvidia-container-toolkit >= 1.7.0
  • nvidia-container-runtime configured as the default low-level runtime
  • Kubernetes version >= 1.10

实际安装的NVIDIA驱动版本为:

NVIDIA-SMI 520.61.05 Driver Version: 520.61.05 CUDA Version: 11.8

root@worker-05:~# nvidia-docker version
NVIDIA Docker: 2.11.0
Client: Docker Engine - Community
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:02:21 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       3056208
  Built:            Tue Oct 25 18:00:04 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.9
  GitCommit:        1c90a442489720eec95342e1789ee8a5e1b9536f
 nvidia:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

5.2.2 准备GPU节点

nvidia-container-toolkit

安装与验证参考上节内容

docker default runtime配置

使用Docker作为kubernetes运行时,修改 /etc/docker/daemon.json 来配置nvidia-container-runtime作为 default low-level 运行时。

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

# 配置后需要重启
systemctl restart docker

完整的 daemon 配置参考:

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://axejqb6p.mirror.aliyuncs.com"],
  "mtu": 1500,
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "default-runtime": "nvidia",
  "runtimes": {
      "nvidia": {
          "path": "nvidia-container-runtime",
          "runtimeArgs": []
      }
  }
}

PS: 如果是 containerd 作为运行时,配置参考:configure-containerd

5.2.3 安装nvidia-device-plugin

Once you have configured the options above on all the GPU nodes in your cluster, you can enable GPU support by deploying the following Daemonset:

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.12.3/nvidia-device-plugin.yml

5.2.4 在集群中包含不同类型的GPU

一旦你安装了插件,你的集群就会暴露一个自定义可调度的资源,例如 amd.com/gpu 或 nvidia.com/gpu,可以使用节点选择器把对应的 Pod 调度到合适的节点上,详细可参考 调度 GPU

kubectl label nodes <node-with-a100> accelerator=nvidia-tesla-a100

5.2 Helm部署

待完善 参考 deployment-via-helm

六、验证:运行GPU jobs

With the daemonset deployed, NVIDIA GPUs can now be requested by a container using the nvidia.com/gpu resource type:

🌶️ 注意

  • GPU 资源只能在 limits 中指定,即:
    • 您可以只指定 GPU limits 而不指定 requests,因为 Kubernetes 会默认使用 GPU limits 的值作为 GPU requests 的值;
    • 您可以同时指定 GPU limits 和 requests,但是两者必须相等;
    • 您不能只指定 GPU requests 而不指定 GPU limits;
  • 容器(容器组)不能共享 GPU。GPU 也不能超售(GPU limits 的总和不能超过实际 GPU 资源的总和);
  • 每个容器可以请求一个或多个 GPU,不能请求一个 GPU 的一部分(例如 0.5 个 GPU)。
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  restartPolicy: Never
  containers:
    - name: cuda-container
      image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
      resources:
        limits:
          nvidia.com/gpu: 1 # requesting 1 GPU
  nodeSelector:
    accelerator: nvidia-tesla-a100
EOF

观察运行日志,看到 Test PASSED 表示容器使用gpu计算运行完成。

[root@master-01 ~]# kubectl logs gpu-pod
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

到此,大功告成!


参考:文章来源地址https://www.toymoban.com/news/detail-557538.html

  1. 从零开始入门 K8s:GPU 管理和 Device Plugin 工作机制
  2. GPU,CUDA,cuDNN的理解
  3. Kuboard-调度 GPU
  4. 如何在Ubuntu 20.04 LTS上安装Nvidia驱动程序
  5. 台式机Ubuntu系统安装Tesla系列显卡+深度学习环境搭建

到了这里,关于Kubernetes 集成 Nvidia GPU (详细攻略)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GPU虚拟化理解包含直通,k8s安装,GPU-manager

    vGPU,即真正意义上的GPU虚拟化方案,就是将一块GPU卡的计算能力进行切片,分成多个逻辑上虚拟的GPU,以vGPU为单位分配GPU的计算能力, 并将单块GPU卡分配给多台虚拟机使用,使得虚拟机能够运行3D软件、播放高清视频等,极大地提升了用户体验。真正实现了GPU资源的按需分

    2024年02月13日
    浏览(41)
  • K8S节点GPU虚拟化(vGPU)

    4paradigm提供了k8s-device-plugin,该插件基于NVIDIA官方插件(NVIDIA/k8s-device-plugin),在保留官方功能的基础上,实现了对物理GPU进行切分,并对显存和计算单元进行限制,从而模拟出多张小的vGPU卡。在k8s集群中,基于这些切分后的vGPU进行调度,使不同的容器可以安全的共享同一张物

    2024年01月16日
    浏览(58)
  • K8s集群gpu支持(直通和vgpu)

    1-1v1.8之前的老版本:基于nvidia-docker实现(基本不用了,了解) 前期准备:1、nvidia driver 2、cuda 3、nvidia-docker K8s 启动pod时指定参数,即可使用gpu (1)alpha.kubernetes.io/nvidia-gpu 指定调用nvidia gpu的数量 (2)为了能让GPU容器运行起来,需 要将Nvidia驱动和CUDA库文件指定到容器中 。这里

    2024年02月09日
    浏览(43)
  • kubernetes(k8s)安装详细教程

    闲来无事,搭一个k8s集群玩玩 最近一次搭建:全过程耗时1.5H 新建3个虚拟机,详情见:虚拟机新建 主机硬件配置说明 最低要求:2c2g 需求 CPU 内存 硬盘 角色 主机名 值 4C 8G 100GB master master01 值 4C 8G 100GB worker(node) worker01 值 4C 8G 100GB worker(node) worker02 由于本次使用3台主机完成

    2024年02月06日
    浏览(50)
  • Kubernetes(k8s)集群部署----->超详细

    💖The Begin💖点点关注,收藏不迷路💖 Kubernetes(简称k8s)是一个开源的容器编排平台,可以帮助开发人员和运维团队更轻松地管理容器化应用程序。本文将详细介绍如何进行k8s集群的部署,以帮助读者快速搭建一个高可用、可伸缩的k8s集群。 1、操作系统:至少三台物理机或

    2024年02月05日
    浏览(63)
  • Kubernetes(k8s)基础入门详细教程

    Kubernetes(通常称为K8s)是一个用于自动化容器化应用程序管理的开源平台。它可以帮助您轻松地部署、扩展和管理容器化应用程序。 Pod是Kubernetes中最小的可部署单元,它是一个或多个紧密关联的容器的组合。这些容器共享相同的网络命名空间、存储资源和生命周期。Pod通常

    2024年02月12日
    浏览(34)
  • Kubernetes(k8s)超详细的安装步骤

    目录 一、环境设置 二、基本环境配置 (一)主机名配置 1、在master虚拟机上操作 2、在node1r虚拟机上操作 3、在node2虚拟机上操作 (二)VMware网络配置 (三)虚拟机网络配置 1、在master虚拟机上操作 2、在node1r虚拟机上操作 3、在node2虚拟机上操作 4、虚拟机内部测试  (四)

    2024年02月14日
    浏览(46)
  • SpringBoot集成kubernetes-client升级k8s后初始化失败问题

    SpringBoot集成kubernetes-client升级k8s后初始化失败问题 1.问题描述 程序以前使用的k8s版本是1.16,fabric8.kubernetes-client的版本是4.10.2,springboot版本是2.3.5。由于环境切换,这次需要升级k8s的版本,现在将k8s版本升级到了1.26,程序中使用了新配置的certificate-authority-data,client-certific

    2024年02月10日
    浏览(47)
  • Kubernetes(K8s 1.28.x)部署---超详细

    目录 一、基础环境配置(所有主机均要配置) 1、配置IP地址和主机名、hosts解析 2、关闭防火墙、禁用SELinux 3、安装常用软件 4、配置时间同步 5、禁用Swap分区 6、修改linux的内核参数 7、配置ipvs功能 二、容器环境操作 1、定制软件源 2、安装最新版docker 3、配置docker加速器 4、

    2024年02月11日
    浏览(41)
  • K8S部署后的使用:dashboard启动、使用+docker镜像拉取、容器部署(ubuntu环境+gpu3080+3主机+部署深度学习模型)

    0、k8s安装、docker安装 参考:前两步Ubuntu云原生环境安装,docker+k8s+kubeedge(亲测好用)_爱吃关东煮的博客-CSDN博客_ubantu部署kubeedge  配置节点gpu: K8S调用GPU资源配置指南_思影影思的博客-CSDN博客_k8s 使用gpu 1、重置和清除旧工程:每个节点主机都要运行 2、部署新的k8s项目:

    2023年04月20日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包