Kubernetes(K8s)集群中使用 GPU

devtools/2025/3/14 22:04:03/

在 Kubernetes(K8s)集群中使用 GPU,需要完成安装驱动、部署插件、配置 containerd、实现 GPU 虚拟化及部分使用等一系列步骤,下面为你详细介绍。

1. 安装 GPU 驱动

以 NVIDIA GPU 为例,因为在深度学习和机器学习场景中 NVIDIA GPU 应用广泛,以下是在 Linux 系统上安装 NVIDIA 驱动的步骤:

1.1 检查系统和 GPU 信息

首先需要确认系统的内核版本和 GPU 型号,使用以下命令:

uname -r  # 查看内核版本
lspci | grep -i nvidia  # 查看 GPU 型号
1.2 禁用 Nouveau 驱动

Nouveau 是 Linux 系统默认的开源 NVIDIA 驱动,需要先禁用它,以免和 NVIDIA 官方驱动冲突。编辑 /etc/modprobe.d/blacklist-nouveau.conf 文件:

sudo nano /etc/modprobe.d/blacklist-nouveau.conf

添加以下内容:

blacklist nouveau
options nouveau modeset=0

保存文件后,更新 initramfs:

sudo update-initramfs -u
1.3 安装 NVIDIA 驱动

可以从 NVIDIA 官方网站下载适合你 GPU 型号和系统内核版本的驱动程序,也可以使用包管理器进行安装。以 Ubuntu 系统为例:

sudo apt update
sudo apt install nvidia-driver-<version>  # <version> 替换为适合的驱动版本号

安装完成后,重启系统:

sudo reboot

重启后,使用 nvidia-smi 命令验证驱动是否安装成功,如果能正常显示 GPU 信息,则说明驱动安装成功。

2. 部署 NVIDIA 设备插件

NVIDIA 设备插件是一个 Kubernetes 插件,用于向 K8s 集群暴露 GPU 资源。可以使用以下 YAML 文件进行部署:

apiVersion: apps/v1
kind: DaemonSet
metadata:name: nvidia-device-plugin-daemonsetnamespace: kube-system
spec:selector:matchLabels:name: nvidia-device-plugin-dstemplate:metadata:annotations:scheduler.alpha.kubernetes.io/critical-pod: ""labels:name: nvidia-device-plugin-dsspec:tolerations:- key: CriticalAddonsOnlyoperator: Exists- key: nvidia.com/gpuoperator: Existseffect: NoSchedulecontainers:- image: nvcr.io/nvidia/k8s-device-plugin:v0.14.1name: nvidia-device-plugin-ctrsecurityContext:allowPrivilegeEscalation: falsecapabilities:drop: ["ALL"]volumeMounts:- name: device-pluginmountPath: /var/lib/kubelet/device-pluginsvolumes:- name: device-pluginhostPath:path: /var/lib/kubelet/device-plugins

使用以下命令部署该 DaemonSet:

kubectl apply -f nvidia-device-plugin.yaml

3. 配置 containerd

3.1 修改 containerd 配置文件

通常,containerd 的配置文件位于 /etc/containerd/config.toml。可以通过以下命令编辑该文件:

sudo nano /etc/containerd/config.toml

在文件中添加或修改以下内容:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = trueBinaryName = "runc"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]privileged_without_host_devices = falseruntime_engine = ""runtime_root = ""runtime_type = "io.containerd.runc.v2"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]BinaryName = "/usr/bin/nvidia-container-runtime"SystemdCgroup = true[plugins."io.containerd.grpc.v1.cri"]default_runtime_name = "nvidia"

上述配置中,我们添加了一个名为 nvidia 的运行时,其对应的二进制文件为 /usr/bin/nvidia-container-runtime,并将其设置为默认运行时。

3.2 安装 nvidia-container-toolkit

nvidia-container-toolkit 能让容器运行时(如 containerd)支持 GPU 设备。可以使用包管理器进行安装,例如在 Ubuntu 系统上:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
3.3 重启 containerd 服务

修改配置文件后,需要重启 containerd 服务使配置生效:

sudo systemctl restart containerd

4. GPU 虚拟化及部分使用

4.1 GPU 虚拟化

在 K8s 中,NVIDIA 提供了一些技术来实现 GPU 虚拟化,例如 NVIDIA Multi - Process Service(MPS)和 NVIDIA vGPU。

  • NVIDIA MPS:允许一个物理 GPU 被多个进程同时使用,通过时间片轮转的方式实现资源共享。要使用 MPS,需要在节点上启动 MPS 服务,然后在容器中配置使用 MPS。
  • NVIDIA vGPU:将一个物理 GPU 分割成多个虚拟 GPU 实例,每个实例有独立的显存和计算资源。使用 vGPU 需要特定的硬件和软件许可证支持。
4.2 GPU 部分使用

在 K8s 中,可以通过请求部分 GPU 资源来实现 GPU 的部分使用。在 Pod 的 YAML 文件中,可以通过 resources.requestsresources.limits 字段来请求和限制 GPU 资源。例如:

apiVersion: v1
kind: Pod
metadata:name: gpu-partial-use-pod
spec:containers:- name: gpu-partial-use-containerimage: nvcr.io/nvidia/cuda:11.0-baseresources:requests:nvidia.com/gpu: 0.5  # 请求 0.5 个 GPUlimits:nvidia.com/gpu: 0.5  # 限制最多使用 0.5 个 GPUcommand: ["nvidia-smi"]

需要注意的是,部分 GPU 资源请求的支持依赖于 NVIDIA 驱动和设备插件的版本,某些版本可能不支持分数形式的 GPU 资源请求。

5. 验证配置

部署完成后,可以创建一个简单的 Pod 来验证 GPU 是否可以正常使用。以下是一个示例 Pod 的 YAML 文件:

apiVersion: v1
kind: Pod
metadata:name: gpu-test-pod
spec:containers:- name: gpu-test-containerimage: nvcr.io/nvidia/cuda:11.0-baseresources:requests:nvidia.com/gpu: 1limits:nvidia.com/gpu: 1command: ["nvidia-smi"]

使用以下命令创建该 Pod:

kubectl apply -f gpu-test-pod.yaml

然后查看 Pod 的日志:

kubectl logs gpu-test-pod

如果能看到 NVIDIA GPU 的信息,则说明配置成功。

通过以上步骤,你可以在使用 containerd 作为容器运行时的 K8s 集群中正确配置和使用 GPU 资源,并实现一定程度的 GPU 虚拟化和部分使用。


http://www.ppmy.cn/devtools/167123.html

相关文章

大语言模型-1.3-GPT、DeepSeek模型介绍

简介 本博客内容是《大语言模型》一书的读书笔记&#xff0c;该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

【面试题系列】 Redis 核心面试题(二)答案

本文主要介绍Redis 的面试题&#xff0c;涵盖持久化、集群、缓存策略、事务等方面 一、持久化机制 1. RDB 与 AOF 的核心区别及适用场景&#xff1f; 答案&#xff1a; 特性RDBAOF存储内容内存快照&#xff08;二进制文件&#xff09;写命令日志&#xff08;文本格式&#x…

k8s面试题总结(十二)

1.简述ETCD适应的场景&#xff1f; 适用于数据高一致性的场景&#xff0c;确保分布式环境中的数据是一致的。适用于服务高可用时的场景。适用于多节点数据分布式存储的场景。适用于服务之间协调和交互使用的场景。 2.Etcd集群之间是怎么同步数据的&#xff1f; 在etcd集群中…

Vue:其他指令

Vue&#xff1a;其他指令 2.13.1、v-text v-text 指令用于将数据填充到标签体当中&#xff0c;并且是以覆盖的形式填充。与原生JS中的 innerText 功能类似&#xff0c;填充的内容中即使存在HTML标签也只是会当做一个普通的字符串处理&#xff0c;不会解析。例如&#xff1a; …

J6打卡——pytorch实现ResNeXt-50实现猴痘检测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, d…

机器学习模型-从线性回归到神经网络

在当今的数据驱动世界中&#xff0c;机器学习模型是许多应用程序的核心。无论是推荐系统、图像识别&#xff0c;还是自动驾驶汽车&#xff0c;机器学习技术都在背后发挥着重要作用。在这篇文章中&#xff0c;我们将探索几种基础的机器学习模型&#xff0c;并了解它们的基本原理…

MinIO问题总结(持续更新)

目录 Q: 之前使用正常&#xff0c;突然使用空间为0B&#xff0c;上传文件也是0B&#xff08;部署在k8s中&#xff09;Q: 无法上传大文件参考yaml Q: 之前使用正常&#xff0c;突然使用空间为0B&#xff0c;上传文件也是0B&#xff08;部署在k8s中&#xff09; A: 1、检查pod状态…

Hi3516DV300 移植Qt

之前在NXP的板子上&#xff0c;移植过了ARM Linux 移植 tslib、Qt和OpenCV_linux qt tslib-CSDN博客 不过海思移植Qt时还是有不少问题的。 一、Qt 下载与编译 1. Qt 下载 Index of /archive/qt/5.12/5.12.9/single tar -xf qt-everywhere-src-5.12.9.tar.xz2. 修改交叉编译…