下面进入今天的主题,Kubernetes 具有对机器的资源进行分配和使用的能力,比如可以指定容器最多使用多少内存以及使用多少 CPU 计算资源。那么问题来了,一般来说容器就是使用 CPU 和内存资源,那么对于需要使用显卡的 Pod,Kubernetes 也能够支持吗?答案当然是可以啦!目前 Kubernetes 不仅支持容器请求 GPU 资源,还支持请求几块显卡的 GPU 资源,这使得 Kubernetes 在深度学习和区块链等场景下也有了用武之地。
关于 Kubernetes 集群中 Docker 如何使用 GPU,Kubernetes 的官方文档已经说的很清楚了,网上也有铺天盖地的博客手把手教你怎么做。至于以 Containerd 作为容器运行时的集群如何使用 GPU,网上还找不到一篇像样的文档来告诉大家怎么做,今天我就来做吃螃蟹的第一人。
要想在容器里使用 GPU,本质上就是我们要在容器里能看到并且使用宿主机上的显卡,所有的步骤都是围绕这个来做的。当然,本文不会涉及如何安装 Containerd,也不会涉及如何安装 Kubernetes,如果这些都搞不定,建议不要往下看。
1. Nvidia 驱动
=============
某些命令以 Ubuntu 作为示例。首先宿主机上必现安装 Nvidia 驱动。这里推荐从 Nvidia 官网下载脚本安装,安装和卸载都比较方便并且适用于任何 Linux 发行版,包括 CentOS,Ubuntu 等。NVIDIA Telsa GPU 的 Linux 驱动在安装过程中需要编译 kernel module,系统需提前安装 gcc 和编译 Linux Kernel Module 所依赖的包,例如 kernel-devel-$(uname -r) 等。
-
安装 gcc 和 kernel-dev(如果没有) sudo apt install gcc kernel-dev -y。
-
访问**官网[1]**下载。
-
选择操作系统和安装包,并单击【SEARCH】搜寻驱动,选择要下载的驱动版本
-
下载对应版本安装脚本 在宿主机上执行:
$ wget https://www.nvidia.com/content/DriverDownload-March2009/confirmation.php?url=/tesla/450.80.02/NVIDIA-Linux-x86_64-450.80.02.run&lang=us&type=Tesla
- 安装 执行脚本安装:
$ chmod +x NVIDIA-Linux-x86_64-450.80.02.run && ./NVIDIA-Linux-x86_64-450.80.02.run
- 验证 使用如下命令验证是否安装成功 nvidia-smi 如果输出类似下图则驱动安装成功。
2. CUDA 驱动
===========
CUDA(Compute Unified Device Architecture)是显卡厂商 NVIDIA 推出的运算平台。CUDA™ 是一种由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。它包含了 CUDA 指令集架构(ISA)以及 GPU 内部的并行计算引擎。这里安装的方式和显卡驱动安装类似。
-
访问**官网[2]**下载
-
下载对应版本如下图
-
配置环境变量
$ echo ‘export PATH=/usr/local/cuda/bin:$PATH’ | sudo tee /etc/profile.d/cuda.sh
$ source /etc/profile
3. nvidia-container-runtime
============================
nvidia-container-runtime 是在 runc 基础上多实现了 nvidia-container-runime-hook(现在叫 nvidia-container-toolkit),该 hook 是在容器启动后(Namespace 已创建完成),容器自定义命令(Entrypoint)启动前执行。当检测到 NVIDIA_VISIBLE_DEVICES 环境变量时,会调用 libnvidia-container 挂载 GPU Device 和 CUDA Driver。如果没有检测到 NVIDIA_VISIBLE_DEVICES 就会执行默认的 runc。
下面分两步安装:
先设置 repository 和 GPG key:
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/$(. /etc/os-release;echo I D ID IDVERSION_ID)/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
安装:
$ apt install nvidia-container-runtime -y
配置 Containerd 使用 Nvidia container runtime
=========================================
如果 /etc/containerd 目录不存在,就先创建它:
$ mkdir /etc/containerd
生成默认配置:
$ containerd config default > /etc/containerd/config.toml
Kubernetes 使用设备插件(Device Plugins)[3] 来允许 Pod 访问类似 GPU 这类特殊的硬件功能特性,但前提是默认的 OCI runtime 必须改成 nvidia-container-runtime,需要修改的内容如下:
/etc/containerd/config.toml
…
[plugins.“io.containerd.grpc.v1.cri”.containerd]
snapshotter = “overlayfs”
default_runtime_name = “runc”
no_pivot = false
…
[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes]
[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc]
runtime_type = “io.containerd.runtime.v1.linux” # 将此处 runtime_type 的值改成 io.containerd.runtime.v1.linux
…
[plugins.“io.containerd.runtime.v1.linux”]
shim = “containerd-shim”
runtime = “nvidia-container-runtime” # 将此处 runtime 的值改成 nvidia-container-runtime
…
重启 containerd 服务:
$ systemctl restart containerd
4. 部署 NVIDIA GPU 设备插件
======================
一条命令解决战斗:
$ kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.7.1/nvidia-device-plugin.yml
查看日志:
$ kubectl -n kube-system logs nvidia-device-plugin-daemonset-xxx
2020/12/04 06:30:28 Loading NVML
2020/12/04 06:30:28 Starting FS watcher.
2020/12/04 06:30:28 Starting OS watcher.
2020/12/04 06:30:28 Retreiving plugins.
2020/12/04 06:30:28 Starting GRPC server for ‘nvidia.com/gpu’
2020/12/04 06:30:28 Starting to serve ‘nvidia.com/gpu’ on /var/lib/kubelet/device-plugins/nvidia-gpu.sock
2020/12/04 06:30:28 Registered device plugin for ‘nvidia.com/gpu’ with Kubelet
可以看到设备插件部署成功了。在 Node 上面可以看到设备插件目录下的 socket:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
课程,基本涵盖了95%以上Golang知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-3uB1uHWh-1712968913024)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!