把运行时注册到 containerd
一句话总结
要在容器中使用GPU,必须有驱动程序(内核)+工具包(注入工具)+**运行时注册(config.toml)**这三个。即使只缺少一个,症状也一样是“看不到GPU”。
为什么需要这个?
安装驱动程序后nvidia-smi也可以正常运行,但在容器内看不到GPU。这是常见的情况,原因通常是运行时未注册。
怎么行动
三层
| 层 | 什么 | 确认方法 |
|---|---|---|
| 内核 | nvidia.ko模块,/dev/nvidia*设备节点 |
lsmod | grep nvidia,ls /dev/nvidia* |
| 用户空间 | libcuda.so,libnvidia-ml.so等 |
nvidia-smi,ldconfig -p | grep nvidia |
| 容器注入 | nvidia-container-cli,CDI规格,运行时注册 |
nvidia-ctk cdi list,config.toml |
容器中没有内核(与主机共享)。所以需要做的就是把用户空间库和设备节点放入容器中,而做这件事就是工具包。
containerd config.toml
containerd config default在创建基本文件后添加运行时间。不要用手组装头文件——部分头文件根据containerd主版本全部变更。
config version 2(containerd 1.x):
version = 2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
SystemdCgroup = true
在config version 3(containerd 2.x)中,CRI设置分为运行时和映像两个部分。
version = 3
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.nvidia.options]
BinaryName = '/usr/bin/nvidia-container-runtime'
SystemdCgroup = true
**版本2文件在2.x中也支持,并自动转换。版本1从2.0开始不支持。**贴了从网上收集的片段,如果没有任何效果的话,大部分都是这个版本不一致。
nvidia-ctk代替我进行编辑。
nvidia-ctk runtime configure --runtime=containerd --set-as-default=false
--set-as-default=false很重要。如果将基本运行时间改为nvidia,**即使是不使用GPU的板块也会经历该运行时间。**如果运行时间出现问题,整个群集都会受到影响。
SystemdCgroup
基本值都是false。但是,在基于systemd的主机上建议使用true。因为只有kubelet改为systemd cgroup驱动程序,而保持containerd不变,两个管理员就会有不同的cgroup视图。这种不一致会以资源限制运行异常或进程被提取的方式出现。
RuntimeClass
让注册的运行时间由工作负载选择。
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: nvidia
handler: nvidia # config.toml 의 runtimes.<이름> 과 일치해야 한다
spec:
runtimeClassName: nvidia
containers:
- name: cuda
resources:
limits:
nvidia.com/gpu: 1
**handler值和config.toml的运行时名称必须完全一致。**不一致的话,帕德RunContainerError弹出,消息中显示“no runtime for ... is configured”。
管理型节点的陷阱
在管理型节点组中,在节点引导时config.toml这种情况重生很多。**用手修改的设置在节点更换的瞬间消失,更糟糕的是,只在部分节点上留下,造成无法再复制的差异。**如果需要更改设置,就需要修改引导脚本或启动模板,或者修改节点映像本身。进入节点修改的是诊断,而不是部署。
在现场相遇的样子
**驱动程序更新后GPU无法捕获。**忘记了CDI规格的生成。规格中包含带有版本的库路径。
**只有GPU板启动慢。**每次容器启动时,都需要注入库并更新ldcache,这需要成本。图像越大,效果就越明显。
下次实习要做的事情
config.toml在e nvidia注册运行时间并通过TOML解析器进行验证。配置CDI规格并编写RuntimeClass YAML。即使没有实际GPU,也可以验证所有设置的准确性。