Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubelet从入门到放弃系列:GPU加持

Kubelet从入门到放弃系列:GPU加持

作者头像
zouyee
发布于 2021-03-06 14:52:39
发布于 2021-03-06 14:52:39
1.3K00
代码可运行
举报
文章被收录于专栏:Kubernetes GOKubernetes GO
运行总次数:0
代码可运行

友情提示:全文3090多文字,预计阅读时间5分钟

摘要

《Kubelet从入门到放弃系列》将对Kubelet组件由Linux基础知识到源码进行深入梳理。上一篇zouyee带各位看了Kubelet从入门到放弃:拓扑管理,其中提及设备插件,在本文<Kubelet从入门到放弃系列:与GPU齐飞>,今天zouyee跟段全峰童鞋为各位介绍Kubernetes如何利用Nvidia系列GPU,后续介绍Device Plugin的相关概念以及Kubelet组件源码逻辑。

一、需求说明

1.1 需求说明

在Kubernetes 1.8之前,用户使用GPU等设备时,推荐使用Accelerators Feature Gate的内置方式,延续Kubernetes的插件化的实现理念,各司其职,在Kubernetes 1.10版本后,引入设备插件框架,用户可以将系统硬件资源引入到Kubernetes生态。本文将介绍NVIDIA GPU如何安装部署,Device Plugins的相关介绍、工作机制和源码分析,包括插件框架、使用和调度GPU、和异常处理及优化等相关内容。

1.2 相关说明

在Kubernetes 1.10中Device Plugins升为Beta特性,在Kubernetes 1.8时,为了给第三方厂商通过插件化的方式将设备资源接入到Kubernetes,给容器提供Extended Resources。

通过Device Plugins方式,用户无需要改Kubernetes的代码,由第三方设备厂商开发插件,实现Kubernetes Device Plugins的相关接口即可(仔细想想,Kubernetes中的volume管理是否也是类似的逻辑?CSI、CNI、CRI?)。

目前Device Plugins典型实现有:

a) AMD GPU插件

b)Intel设备插件:GPU、FPGA和QuickAssist设备

c)KubeVirt用于硬件辅助的虚拟化设备插件

d)Nvidia提供的GPU插件

e)高性能低延迟RDMA卡插件

f)低延迟Solarflare万兆网卡驱动

g)SR-IOV网络设备插件

h)Xilinx FPGA设备插件

Kubelet启动Device plugins服务端,对应设备商启动Device Plugin服务,对外暴露几个gRPC Service提供服务,并通过/var/lib/kubelet/device-plugins/kubelet.sock与Kubelet通信。

二、部署介绍

2.1 部署说明

当前Nvidia GPU提供三种部署方式:docker方式、Containerd方式及Operator方式。

因docker后续不再内置,相关说明可以查看关于Kubernetes废弃内置docker CRI功能的说明,下文将主要介绍 Containerd部署,Operator方式后续单独成文,当前nvidia-container-toolkit已经支持containerd和cri-o两种部署方式,在接受containerd部署前,先说明前期遇到的相关问题:

a. 默认runtime设置

其中Kubelet问题描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Events:
  Type     Reason         Age                   From               Message
  ----     ------         ----                  ----               -------
  Normal   Scheduled      10m                   default-scheduler  Successfully assigned gpu-operator-resources/nvidia-device-plugin-daemonset-f99md to cl-gpu-md-0-f4gm6
  Warning  InspectFailed  10m (x3 over 10m)     kubelet            Failed to inspect image "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2": rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial unix /run/containerd/containerd.sock: connect: connection refused"

其中Nvidia Device Plugin Daemonset某一个Pod相关错误,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# kubectl logs ‐f nvidia‐device‐plugin‐daemonset‐q9svq ‐nkube‐system
2021/02/11 01:32:29 Loading NVML
2021/02/11 01:32:29 Failed to initialize NVML: could not load NVML library.
2021/02/11 01:32:29 If this is a GPU node, did you set the docker default runtime to `nvidia`?
2021/02/11 01:32:29 You can check the prerequisites at: https://github.com/NVIDIA/k8s-device-plugin#prerequisites
2021/02/11 01:32:29 You can learn how to set the runtime at: https://github.com/NVIDIA/k8s-device-plugin#quick-start
2021/02/11 01:32:29 If this is not a GPU node, you should set up a toleration or nodeSelector to only deploy this plugin on GPU nodes

该问题由于containerd的配置文件containerd.toml未将default_runtime_name = "runc"修改为default_runtime_name = "nvidia",相关问题:https://github.com/NVIDIA/gpu-operator/issues/143

b. kubelet cgroup driver配置

相关问题:https://github.com/NVIDIA/libnvidia-container/issues/119

在kubelet配置的cgroup driver为systemd时,Nvidia的container prestart hook在处理cgroup路径逻辑与containerd不一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
containerd[76114]: time="2020-12-04T08:52:13.029072066Z" level=error msg="StartContainer for "7a1453c6e7ab8af7395ccc8dac5efcffa94a0834aa7b252e1dcd5b51f92bf13e" failed" error="failed to create containerd task: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: Running hook #0:: error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: mount error: open failed: /sys/fs/cgroup/devices/system.slice/containerd.service/kubepods-pod80540e95304d8cece2ae2afafd8b8976.slice/devices.allow: no such file or directory: unknown"

解决方案为升级libnvidia-container或者container-toolkit。

接下来,介绍部署相关内容。

2.2 Containerd方式

‍‍‍ 1)版本说明

软件

版本说明

CentOS

7

内核

4.19.25

GPU型号

Tesla T4

driver版本

418.39

CUDA版本

10.1

K8S

1.18.5

Nvidia Device Plugin

0.7.3

Containerd

v1.4.3

runc‍‍‍‍

1.0.0-rc1

2)安装

注:下文为内网离线部署,若各位在联网环境下,只需参考部署步骤及部署配置即可

a. 安装驱动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ tar ‐zxvf gpu.tar.gz 
## 安装依赖 
$ cd gpu/runtime 
$ tar ‐zxvf dependency.tar.gz 
$ cd dependency 
## 查看是否支持CUDA的Nvidia的GPU 
$ cd ./lspci/ 
$ yum localinstall ‐y *.rpm 
$ lspci | grep ‐i nvidia ## 安装devel 
$ cd ../devel 
$ yum localinstall ‐y *.rpm 
## 安装gcc $ cd ../gcc 
$ yum localinstall ‐y *.rpm 
## 卸载nouveau驱动 
$ lsmod | grep nouveau 
$ rmmod nouveau 
## 安装驱动,过程见下面附的图片。如果要更新驱动,从https://developer.nvidia.com/cuda‐75‐downloads‐ archive下载 
$ cd ../../../driver 
$ sh cuda_10.1.105_418.39_linux.run ## 测试驱动,有如下输出则正常安装

结果验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ nvidia‐smi

附:安装驱动图

(1) 输入accept,回车

(2) 选择install,回车

2)配置Containerd

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 更新runc,下载地址https://github.com/opencontainers/runc/releases 
$ cd ../runtime 
$ cp runc /usr/bin/ 
## 更新containerd,下载地址 https://github.com/containerd/containerd/releases 
$ tar ‐zxvf containerd‐1.4.3‐linux‐amd64.tar.gz 
$ cp bin/* /usr/bin/ 
## 安装nvidia‐container‐runtime,yum源https://nvidia.github.io/nvidia‐docker/centos7/nvidia‐ docker.repo,yum安装:yum install ‐y nvidia‐container‐runtime $ tar ‐zxvf nvidia‐container‐runtime.tar.gz 
$ cd nvidia‐container‐runtime 
$ yum localinstall ‐y *.rpm
修改containerd启动参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置containerd的参数 
$ mkdir /etc/containerd/ 
$ vi /etc/containerd/config.toml 
# 配置containerd.service 
$ vi /usr/lib/systemd/system/containerd.service 
$ systemctl daemon‐reload 
$ systemctl restart containerd 
# 配置crictl 
$ tar ‐zxvf crictl‐v1.18.0‐linux‐amd64.tar.gz 
$ mv crictl /usr/bin/ 
$ vi /etc/profile alias crictl='crictl ‐‐runtime‐endpoint unix:///run/containerd/containerd.sock' 
$ source /etc/profile 
# 测试containerd和nvidia‐container‐runtime安装是否成功 
$ cd test‐image 
$ ctr images import cuda‐vector‐add_v0.1.tar 
$ ctr images push ‐‐plain‐http registry.paas/cmss/cuda‐vector‐add:v0.1

执行检验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ctr run ‐t ‐‐gpus 0 registry.paas/cmss/cuda‐vector‐add:v0.1 cp nvidia‐smi
结果如下

清理容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ctr c rm cp

配置config.toml

执行containerd config default > /etc/containerd/config.toml生成配置,并做如下修改:

注意:如上所述,1)default_runtime_name值为nvidia,2)新增一个runtimes 3)若有内部镜像仓库,可修改docker.io为内部仓库名称

配置containerd.service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Unit] 
Description=containerd container runtime 
Documentation=https://containerd.io After=network.target

[Service] 
ExecStartPre=/sbin/modprobe overlay 
ExecStart=/usr/bin/containerd 
KillMode=process 
Delegate=yes 
LimitNOFILE=1048576 
# Having non‐zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container‐local accounting. LimitNPROC=infinity 
LimitCORE=infinity 
TasksMax=infinity 
[Install] 
WantedBy=multi‐user.target    

c. 部署Device Plugin

在部署完Kubernetes集群后,修改kubelet运行时配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ vi /apps/conf/kubernetes/kubelet.env ‐‐container‐runtime=remote ‐‐container‐runtime‐endpoint=unix:///run/containerd/containerd.sock
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd device‐plugin 
$ docker load ‐i k8s‐device‐plugin_v0.7.3.tar 
$ docker push
// https://github.com/NVIDIA/k8s-device-plugin/tree/master/deployments/static
$ kubectl apply ‐f nvidia‐device‐plugin.yml 
$ kubectl logs ‐f nvidia‐device‐plugin‐daemonset‐q9svq ‐nkube‐system 
2021/02/08 06:32:36 Loading NVML 2021/02/08 06:32:42 Starting FS watcher. 2021/02/08 06:32:42 Starting OS watcher. 2021/02/08 06:32:42 Retreiving plugins. 2021/02/08 06:32:42 Starting GRPC server for 'nvidia.com/gpu' 2021/02/08 06:32:42 Starting to serve 'nvidia.com/gpu' on /var/lib/kubelet/device‐ plugins/nvidia‐gpu.sock 2021/02/08 06:32:42 Registered device plugin for 'nvidia.com/gpu' with Kubelet

d. 功能测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd test‐image 
# 启动测试pod 
$ kubectl apply ‐f demo.yml
// https://github.com/NVIDIA/gpu-operator/blob/master/tests/gpu-pod.yaml
$ kubectl logs ‐f cuda‐vector‐add 
[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

未完,待续.

三、参考资料

1. https://kubernetes.io/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/

2.https://github.com/kubernetes/community/blob/master/contributors/design-proposals/resource-management/device-plugin.md

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DCOS 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在 Kubernetes 上调度 GPU 资源
Kubernetes 实现了 Device Plugins[1] 以允许 Pod 访问类似 GPU 这类特殊的硬件功能特性。作为运维管理人员,你要在节点上安装来自对应硬件厂商的 GPU 驱动程序,并运行来自 GPU 厂商的对应的设备插件。
我是阳明
2021/10/20
2.5K1
【K8s】kubeadm 安装 k8s 集群
本篇文章主要是通过 VMware 来创建虚拟机,在虚拟机上通过 kubeadm 安装 k8s 集群;
Librant
2025/01/13
3230
辞旧迎新,新手使用Containerd时的几点须知
相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockershim。不过社区也说了,在1.20之后的版本的kubelet会放弃对dockershim部分的支持。
云原生小白
2021/05/13
1.1K0
辞旧迎新,新手使用Containerd时的几点须知
GPUManager虚拟化方案
GPU是一种用于矩阵计算的PCIe设备,一般用于解码、渲染和科学计算等并行计算场景,不同场景对GPU使用方式不同,使用的加速库也各不相同,本文提到的GPU虚拟化主要针对科学计算场景,使用的加速库为nvidia cuda。
何猛
2020/08/25
22K87
GPUManager虚拟化方案
一文搞定 Containerd 的使用
在学习 Containerd 之前我们有必要对 Docker 的发展历史做一个简单的回顾,因为这里面牵涉到的组件实战是有点多,有很多我们会经常听到,但是不清楚这些组件到底是干什么用的,比如 libcontainer、runc、containerd、CRI、OCI 等等。
CNCF
2021/08/26
11.1K0
一文搞定 Containerd 的使用
1.Containerd容器运行时初识与尝试
本章主要讲解,目前K8S使用率最多的容器运行时讲解, 由于k8s在2020年宣布1.20版本之后将弃用dockershim(其中也有kubernetes与Docker爱恨情仇)时才把containerd拉回大众的视野之中,本章主要讲解containerd基础入门。
全栈工程师修炼指南
2021/07/25
2.9K0
1.Containerd容器运行时初识与尝试
如何丝滑般将 Kubernetes 容器运行时从 Docker 切换成 Containerd
前面我们了解了 containerd 的发展历史和基本使用方式,本节我们就来尝试下使用 containerd 来作为 Kubernetes 集群的容器运行时。
我是阳明
2021/08/20
1.1K0
如何丝滑般将 Kubernetes 容器运行时从 Docker 切换成 Containerd
kubernetes GPU管理与Device Plugin机制
Kubernetes 在 Pod 的 API 对象里,并没有为 GPU 专门设置一个资源类型字段,而是使用了一种叫作 Extended Resource(ER)的特殊字段来负责传递 GPU 的信息。
rxg456
2025/03/26
920
kubernetes GPU管理与Device Plugin机制
Kubernetes V1.15管理NVIDIA GPU容器
注意:在企业级生产环境里通常都会使用Centos来运行服务,但由于GPU环境下需要安装GPU驱动、cuda、cudnn之类的依赖库,导致操作不方便,因此可能会使用Ubuntu来运行GPU相关服务,两种发型版的systemd服务启动配置默认不同,因此在自动化安装时需要适配到多个发行版
BGBiao
2019/10/09
1.2K0
Kubernetes如何通过Devi
Device Plugins Device Pulgins在Kubernetes 1.10中是beta特性,开始于Kubernetes 1.8,用来给第三方设备厂商通过插件化的方式将设备资源对接到Kubernetes,给容器提供Extended Resources。 通过Device Plugins方式,用户不需要改Kubernetes的代码,由第三方设备厂商开发插件,实现Kubernetes Device Plugins的相关接口即可。 目前关注度比较高的Device Plugins实现有: Nvidia
Walton
2018/04/16
1.8K0
Kubernetes如何通过Devi
Containerd 的前世今生和保姆级入门教程
1. Containerd 的前世今生 很久以前,Docker 强势崛起,以“镜像”这个大招席卷全球,对其他容器技术进行致命的降维打击,使其毫无招架之力,就连 Google 也不例外。Google 为了不被拍死在沙滩上,被迫拉下脸面(当然,跪舔是不可能的),希望 Docker 公司和自己联合推进一个开源的容器运行时作为 Docker 的核心依赖,不然就走着瞧。Docker 公司觉得自己的智商被侮辱了,走着瞧就走着瞧,谁怕谁啊! 很明显,Docker 公司的这个决策断送了自己的大好前程,造成了今天的悲剧。
程序猿DD
2023/04/17
1.2K0
Containerd 的前世今生和保姆级入门教程
Kubernetes 多卡GPU使用和分析
Kubernetes中通过device plugin将GPU作为一种resource来使用,因此需要先创建一个device plugin将GPU信息注册到Kubernetes中。NVIDIA官方提供了一个GPU device plugin,详情可见https://github.com/NVIDIA/k8s-device-plugin。
langwu 吴英文
2019/09/01
11K1
Containerd的两种安装方式
Containerd 的默认配置文件为 /etc/containerd/config.toml,可以使用containerd config default > /etc/containerd/config.toml命令创建一份模块配置文件
鱼找水需要时间
2023/08/06
8.2K0
Containerd的两种安装方式
17-Kubernetes进阶学习之集群升级迁移和维护实践
描述:Kubernetes 使用 Etcd 数据库实时存储集群中的数据,可以说 Etcd 是 Kubernetes 的核心组件,犹如人类的大脑。如果 Etcd 数据损坏将导致 Kubernetes 不可用,在生产环境中 Etcd 数据是一定要做好高可用与数据备份,这里介绍下如何备份与恢复 Etcd 数据。
全栈工程师修炼指南
2022/09/29
1K0
17-Kubernetes进阶学习之集群升级迁移和维护实践
使用Bitfusion在K8s上共享GPU资源
注:微信公众号不按照时间排序,请关注公众号“亨利笔记”,并加星标以置顶,以免错过更新。
Henry Zhang
2021/08/05
1.9K1
使用 GPU-Operator 与 KubeSphere 简化深度学习训练与监控 GPU
本文将从 GPU-Operator 概念介绍、安装部署、深度训练测试应用部署,以及在 KubeSphere 使用自定义监控面板对接 GPU 监控,从原理到实践,逐步浅析介绍与实践 GPU-Operator。
CNCF
2021/03/15
2.7K0
使用 GPU-Operator 与 KubeSphere 简化深度学习训练与监控 GPU
如何在Kubernetes集群中利用GPU进行AI训练
Author: xidianwangtao@gmail.com 注意事项 截止Kubernetes 1.8版本: 对GPU的支持还只是实验阶段,仍停留在Alpha特性,意味着还不建议在生产环境中使用Kubernetes管理和调度GPU资源。 只支持NVIDIA GPUs。 Pods不能共用同一块GPU,即使同一个Pod内不同的Containers之间也不能共用同一块GPU。这是Kubernetes目前对GPU支持最难以接受的一点。因为一块PU价格是很昂贵的,一个训练进程通常是无法完全利用满一块GPU的
Walton
2018/04/16
2.9K0
如何在Kubernetes集群中利用GPU进行AI训练
辞旧迎新,新手使用Containerd时的几点须知
相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockershim。不过社区也说了,在1.20之后的版本的kubelet会放弃对dockershim部分的支持。
云原生小白
2021/01/05
1.8K0
辞旧迎新,新手使用Containerd时的几点须知
Containerd 介绍与使用
在学习 Containerd 之前我们有必要对 Docker 的发展历史做一个简单的回顾,因为这里面牵涉到的组件实战是有点多,有很多我们会经常听到,但是不清楚这些组件到底是干什么用的,比如 libcontainer、runc、containerd、CRI、OCI 等等。
王先森sec
2023/10/17
1.7K0
Containerd 介绍与使用
【K8s】Kubernetes 容器运行时之 Docker 与 Containerd
在 Kubernetes 中,容器运行时(Container Runtime)是集群 Node 节点的核心组件之一。
行者Sun
2024/09/13
4530
【K8s】Kubernetes 容器运行时之 Docker 与 Containerd
相关推荐
在 Kubernetes 上调度 GPU 资源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验