不知道你是否好奇GPU到底是个啥?
如果你好奇的话,可以看一下这个链接。有个小姐姐的文章说的比较好,简单的理解就是GPU是显卡的一部分
怎么查看我的机器上有没有GPU
这里我理解不太透彻,只能表示一下自己的理解:按理说只要有显卡就有GPU,但是不是所有的GPU都能拿来供我们的程序使用,应该也受计算框架的影响吧。
对于K8S来说,目前支持的GPU,是AMD和NVIDIA。
我的环境用的英伟达的,机器是阿里云的ECS,下面是在ECS的控制台上看到的
我们登录机器执行
#
lspci
# 查看使用情况
nvidia-smi
Fan:显示风扇转速,数值在0到100%之间,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是N/A;
Temp:显卡内部的温度,单位是摄氏度;
Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能;
Pwr:能耗表示;
Bus-Id:涉及GPU总线的相关信息;
Disp.A:是Display Active的意思,表示GPU的显示是否初始化;
Memory Usage:显存的使用率;
Volatile GPU-Util:浮动的GPU利用率;
Compute M:计算模式;
下边的Processes显示每块GPU上每个进程所使用的显存情况。
安装GPU驱动
对于ECS有的型号,第一次登录时可以自动安装驱动的,我的就是
如果你的是物理机或者是不能自动安装,就需要去官网下载驱动,自行安装了,可以参考下面步骤
- lspci 查看显卡的信息, 如果你看到是一些莫名其妙的东西,因为根据图中的信息,你根本不知道怎么下载
- 进去http://pci-ids.ucw.cz/read/PC/10de/1eb8 这个网站, 把你上面的信息粘贴过来,进行翻译
- 去NVIDIA的官网上进行下载 https://www.nvidia.com/download/index.aspx?lang=en-us#
- 下载下来以后应该是一个执行文件
#上传到服务器
# chmod 755 <你的文件>
# ./NVIDIA-Linux-x86_64-440.64.00.run -no-x-check -no-nouveau-check -no-opengl-files
#一路ok就行了
安装nvidia-docker
如果是公网的话比较容易,直接按照官网的步骤执行就行了,注意docker的版本呀,一定要是19.03+
,否则在更改daemon是会报错
https://github.com/NVIDIA/nvidia-docker
centos的话执行下面的命令
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
sudo yum install -y nvidia-container-toolkit
安装nvidia-container-runtime
- 这个也直接yum就可以了
yum install -y nvidia-container-runtime
- 修改docker的配置文件, /etc/docker/daemon.json ,如果这个文件没有的话自己创建
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
- 检查一下你的机器上是否有/usr/bin/nvidia-container-runtime这个文件
如果单独用docker启动容器的话,可以使用docker run --gpus all --rm nvidia/cuda:11.0-base nvidia-smi
这种方式
支持GPU的 - 基础操作
- 如果环境中只有部分机器是有GPU的,所以我们的省着用了,只能让特殊的应用(pod)才能跑到有GPU的节点上。 需要通过taint和label来完成
# gpu-dev 是我环境中带有GPU节点名字
# taint 调度时用
kubectl taint nodes gpu-dev gpu=1:NoSchedule
kubectl taint nodes gpu-dev gpu=1:NoExecute
#
kubectl label nodes gpu-dev accelerator=nvidia-1eb8
- 如果所有的机器都有GPU,就可以忽略这一步了
支持GPU的 - k8s操作
- 下载daemonset的文件
# 连接的地址最好获取最新的,这个连接的地址是在https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/#deploying-nvidia-gpu-device-plugin 中获取的
curl -O https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
- 修改nvidia-device-plugin.yml
tolerations:
# This toleration is deprecated. Kept here for backward compatibility
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
- key: CriticalAddonsOnly
operator: Exists
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
- key: "gpu"
operator: "Equal"
value: "1"
effect: "NoSchedule"
- key: "gpu"
operator: "Equal"
value: "1"
effect: "NoExecute"
nodeSelector:
accelerator: "nvidia-1eb8"
- 修改网络插件的daemonset, 我的是flannel
# kubectl edit ds kube-flannel-ds-amd64 -n kube-system
tolerations:
- effect: NoSchedule
operator: Exists
- effect: NoSchedule
key: gpu
operator: Equal
value: "1"
- effect: NoExecute
key: gpu
operator: Equal
value: "1"
wait a moment,see blow!!! 等待所有的flannel pod都启动起来
- 启动NVIDIA的daemonset
kubectl create -f nvidia-device-plugin.yml
wait a moment ~~~~ 等待所有的pod启动起来
查看k8s的GPU资源
kubectl describe node gpu-dev
如果不放心的话,启动一下下面这个POD,如果能启动起来,说明k8s能使用GPU资源,如果集群没有GPU资源的话,会一直pending
apiVersion: v1
kind: Pod
metadata:
name: cuda-vector-add
spec:
restartPolicy: OnFailure
containers:
- name: cuda-vector-nginx
image: "nginx"
resources:
limits:
nvidia.com/gpu: 1
tolerations:
- key: "gpu"
operator: "Equal"
value: "1"
effect: "NoSchedule"
- key: "gpu"
operator: "Equal"
value: "1"
effect: "NoExecute"
问题记录
- 当你发现node上识别不到GPU时,并且通过
kubectl logs nvidia-device-plugin-daemonset-xxxx -n kube-system
时发现,could not load NVML library时, 请检查一下docker的demon.json 是否正确,可以和上文进行对比。
先写到这里了,有问题请留言,三克油