k8s-21 K8S中支持GPU 生产实践
K8S GPU节点操作(参考https://juejin.cn/post/7116037775291318280)
NVIDIA GPU 设备插件部署
官方的 NVIDIA GPU 设备插件 有以下要求:
- Kubernetes 的节点必须预先安装了 NVIDIA 驱动
- Kubernetes 的节点必须预先安装 nvidia-docker 2.0
- Docker 的默认运行时必须设置为 nvidia-container-runtime,而不是 runc
- NVIDIA 驱动版本 ~= 384.81
perl复制代码 安装nvidia-docker2.0工具
# 1、set yum安装仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | \
sudo tee /etc/yum.repos.d/nvidia-docker.repo
# 2 、安装nvidia-docker2软件包并重新加载Docker守护程序配置:
sudo yum install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
3、重启下docker
sudo systemctl restart docker
# 4 查看docker nvidia-container-runtime运行时配置
$ cat /etc/docker/daemon.json
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
# 注意因为安装nvidia-docker2覆盖了docker配置,需要重新加入,这里面预知了相关docker镜像仓库源,能够加快镜像的拉取
sudo tee /etc/docker/daemon.json <<EOF
{
"default-runtime": "nvidia",
"registry-mirrors": [ "https://1nj0zren.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
EOF
集群已经启动满足上述要求的话,接着部署 NVIDIA 设备插件:
bash
复制代码kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
测试验证docker能正常挂载使用GPU
bash
复制代码docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
生产上K8S 多GPU类型管理
生产上GPU节点类型很多,许多计算对GPU的需求不一,有的需要V100、有的需要P40、有的普通的T4就可以了,有的还需要多几多卡,因此需要对其进行统一管理,资源隔离,K8S提供了节点打标的方式对Node进行标记,可以通过这种方式进行简单的处理:
ini复制代码#可以通过配置节点标签去调度GPU,比如为你的节点加上它们所拥有的加速器类型的标签
kubectl label nodes <node-with-k80> accelerator=t4
kubectl label nodes <node-with-p100> accelerator=nvidia-tesla-p100
K8S调度GPU任务运行测试
目的:主要测试tensorflow能够使用gpu 而且需要测试k8s可以调度到gpu节点上进行使用
- 创建一个测试 pod yaml文件如下:
yaml复制代码在Master节点上创建~/tf-pod.yaml文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: tf-pod
spec:
containers:
- name: tf-container
image: tensorflow/tensorflow:latest-gpu
command: [ "/bin/sh" ]
args: [ "-c", "while true; do echo hello; sleep 100;done" ]
resources:
limits:
nvidia.com/gpu: 1 # requesting 1 GPUs
- 部署到k8s上:
bash复制代码#在k8smaster节点执行
kubectl apply -f gpu.yaml
- 参看pod状态
sql复制代码[root@aly-001 house]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tf-pod 1/1 Running 0 13m
- 进入pod内部
sql
复制代码kubectl exec tf-pod -it -- bash
- 执行nvida-smi
- 运行tf程序
python复制代码import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))
- 执行结果
-
测试总结
pod通过resource使用gpu资源K8S调度器可以根据pod的选择调度到有对应资源的节点上,同时在容器中能够正常的挂载gpu设备。
相关问题
问题一 : kubelet describe nodes aly-gpu-node-001 没有发现有GPU资源
bash复制代码[root@aly-hn1--001 house]# kubelet logs -f nvidia-device-plugin-daemonset-9fzwz
2022/04/24 10:00:06 Loading NVML
2022/04/24 10:00:06 Failed to initialize NVML: could not load NVML library.
2022/04/24 10:00:06 If this is a GPU node, did you set the docker default runtime to `nvidia`?
2022/04/24 10:00:06 You can check the prerequisites at: https://github.com/NVIDIA/k8s-device-plugin#prerequisites
2022/04/24 10:00:06 You can learn how to set the runtime at: https://github.com/NVIDIA/k8s-device-plugin#quick-start
k8s-device-plugin Failed to initialize NVML: could not load NVML library #47
重新设置运行时,让docker启动采用nvida运行时
yaml复制代码#正常运行的nvidia-device-plugin的日志为:
[root@aly-master-house]# kubelet logs -f nvidia-device-plugin-daemonset-fq9tk
2022/04/24 10:03:19 Loading NVML
2022/04/24 10:03:19 Fetching devices.
2022/04/24 10:03:19 Starting FS watcher.
2022/04/24 10:03:19 Starting OS watcher.
2022/04/24 10:03:19 Starting GRPC server
2022/04/24 10:03:19 Starting to serve on /var/lib/kubelet/device-plugins/nvidia.sock
2022/04/24 10:03:19 Registered device plugin with Kubelet
最终通过kubelet 查看节点发现了nvidia.com/gpu 为1卡
问题2 执行nvidia-smi 报错
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
解决方式:删除重新安装驱动
其它实践
- GPU虚拟化 通常K8S调度GPU最小调度单位是1卡,这样有些对GPU利用率不高而又独占GPU任务,gpu利用率不高, K8S管理GPU多了之后,为了加强GPU的使用率,可以通过GPU虚拟化的能力,能够把一卡拆成多卡进行调度,K8S 请求resouce可以零点几卡进行调度。
- 深度学习kubeflow等框架的部署 通常企业使用深度学习建模会使用tensorflow、pytorch、cafe、还会有深度学习多机多卡训练的需求,采用horovod之类的进行深度学习训练,自己去实现非常困难,好在开源社区有了一些方案,可以通过部署kubeflow借助其提供的能力去进行深度学习任务提交,kubeflow采用k8s operator 、crd等方案为tensorflow、pytorch、tensorflow分布式进行了支持,可以部署kubeflow然后进行深度学习建模。
- 训练推理加速 通常一线互联网QPS比较高,模型加载、GPU推理等都有需求,这块接触不多,不做过多的叙述。
参考文档
mp.weixin.qq.com/s/NU8Cj6DL8… www.kubernetes.org.cn/7486.html 官方指南:kubernetes.io/docs/tasks/… github.com/NVIDIA/k8s-… NVIDIA device plugin问题解决方案聚集地:github.com/NVIDIA/k8s-… 阿里云GPU实例指南 StartInstance - API参考| 阿里云 华为云服务生命周期管理 docs.nvidia.com/datacenter/… Repository configuration www.tensorflow.org/guide/gpu zhuanlan.zhihu.com/p/159139809 gitlab.com/nvidia/cont…

浙公网安备 33010602011771号