
目前人工智能火热,各种机器学习、训练,免不了要使用到gpu资源。本文主要介绍K8S环境下,如何让POD使用Node上的GPU资源。
K8S本身实现了设备插件(Device Plugin),让 Pod 可以访问类似 GPU 这类特殊的硬件功能特性。
服务器安装好显卡后,可以在系统中查看到显卡的信息

某些情况下可能无法正确显示显卡型号,如上图2216为pci id,可以去下面的网站上查询pci id对应的显卡型号
https://admin.pci-ids.ucw.cz/mods/PC/10de?action=help?help=pci

3 安装N卡驱动
注:在安装Cuda Toolkit时会自动安装相应的显卡驱动。因此并不需要我们自己再下载安装显卡驱动。本节只是为了展示安装显卡驱动的方法。
https://www.nvidia.com/Download/Find.aspx
上述网站中找到对应显卡型号的驱动并下载

驱动是一个.run格式的可执行文件,赋予权限后直接安装即可
chmod +x NVIDIA-Linux-x86_64-550.54.14.runbash NVIDIA-Linux-x86_64-550.54.14.run
如果安装过程中出现错误,需要根据相应的错误进行处理。安装完成后,执行nvidia-smi可查看到显卡相关信息。

4 安装Cuda Toolkit
CUDA是一个并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅。Cuda和驱动之间有相应的对应关系
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
所以如果是手动安装的nvidia显卡驱动,需要保证满足Cuda Toolkit版本的最低要求。例如,安装Cuda Toolkit 12.x版本,要求显卡驱动版本要高于525.60.13。如果未安装显卡驱动,在安装Cuda Toolkit时,会自动合适的显卡驱动版本。

选择对应的系统版本下载脚本进行安装
https://developer.nvidia.com/cuda-downloads

安装Cuda toolkit
wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda_12.3.0_545.23.06_linux.run sudo sh cuda_12.3.0_545.23.06_linux.run
安装完成后显示如下
=========== = Summary = =========== Driver: Installed Toolkit: Installed in /usr/local/cuda-11.3/ Samples: Installed in /root/, but missing recommended libraries Please m ake sure that - PATH includes /usr/local/cuda-11.3/bin - LD_LIBRARY_PATH includes /usr/local/cuda-11.3/lib64, or, add /usr/local/cuda-11.3/lib64 to /etc/ld.so.conf and run ldconfig as root To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-11.3/binTo uninstall the NVIDIA Driver, run nvidia-uninstall
检查所安装的cuda版本
/usr/local/cuda/bin/nvcc -V

5 安装nvidia-container-toolkit并配置runtime
NVIDIA Container Toolkit 使用户能够在容器中使用GPU。该工具包包括一个容器运行时库和实用程序,用于自动配置容器以利用 NVIDIA GPU。
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html
5 .1 安装nvidia-container-toolkit
安装步骤可参考官方文档
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
安装完成后检查命令是否可以正常使用
nvidia-container-cli --version

5.2 配置runtime
sudo nvidia-ctk runtime configure --runtime=containerdsystemctl restart containerd
该命令会修改
/etc/containerd/config.toml文件,使containerd能使用NVIDIA Container Runtime
官方教程
https://github.com/NVIDIA/k8s-device-plugin#quick-start ##N卡
https://github.com/ROCm/k8s-device-plugin#deployment ##A卡
https://intel.github.io/intel-device-plugins-for-kubernetes/cmd/gpu_plugin/README.html ##Intel
接下来就是在k8s中安装插件,使得pod能使用上gpu资源,可以参考官方教程,也可以直接使用helm安装
helm repo add nvdp https://nvidia.github.io/k8s-device-pluginhelm repo updatehelm upgrade -i nvdp nvdp/nvidia-device-plugin --namespace nvidia-device-plugin --include-crds --create-namespace --version 0.14.3
检查pod是否运行正常,device-plugin会作为一个daemonset,在每个node上启动一个device-plugin的pod
kubectl get all -n nvidia-device-plugin

CrashLoopBackOff是由于对应的node节点上没有GPU设备,可忽略
https://kubernetes.io/zh-cn/docs/tasks/manage-gpus/scheduling-gpus/
编辑pod的yaml文件,request处写好需要的gpu资源
#此处省略部分内容 resources: limits: cpu: "1" memory: 2Gi nvidia.com/gpu: "1" ##表明请求一个gpu requests: cpu: "1" memory: 2Gi nvidia.com/gpu: "1"
apply上述yaml文件,可以看到pod已经正常加载了gpu资源

可以通过给有gpu卡的node打上label,创建pod时使用selector,保证pod正常调度上有GPU卡的Node上。
关注公众号 singless,获取更多有价值的文章