Google竟想将 Docker 踢出 Kubernetes 群聊,那还能欢快地跑 GPU吗?

下面进入今天的主题,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语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

课程,基本涵盖了95%以上Golang知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-3uB1uHWh-1712968913024)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值