2026/5/28 14:25:02
网站建设
项目流程
重庆新闻经典论坛,汕头网站优化系统,深圳网站设计专业乐云seo,提供做pc端网站核心铁律#xff1a;/dev/nvidia0 物理 GPU 第 1 块#xff0c;/dev/nvidia1 物理 GPU 第 2 块…… 一个编号文件就对应一块实实在在的 GPU 硬件#xff0c;程序认这个文件就等于认这块 GPU
以 ** 服务器插了 4 块物理 GPU#xff08;对应/dev/nvidia0~nvidia3#xff…核心铁律/dev/nvidia0 物理 GPU 第 1 块/dev/nvidia1 物理 GPU 第 2 块…… 一个编号文件就对应一块实实在在的 GPU 硬件程序认这个文件就等于认这块 GPU以 ** 服务器插了 4 块物理 GPU对应/dev/nvidia0~nvidia3** 为例结合官方文档与实践规范修正细节完整保留全流程逻辑新增一站式测试脚本与避坑指南形成 “原理 操作 验证 排错” 的完整闭环。1. 宿主机底层准备先让系统 “看见” GPU 文件这一步是所有操作的基础没做好后面全白搭需严格遵循版本兼容要求装 GPU 驱动要求安装与 GPU 型号匹配的 NVIDIA 官方驱动版本≥418.81.07支持 CUDA 的最低驱动版本 newer 驱动向下兼容旧 CUDA 版本需先禁用系统自带的 nouveau 内核模块否则驱动无法加载。禁用 nouveau 步骤必做bashsudo tee /etc/modprobe.d/blacklist-nouveau.conf blacklist nouveau sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf options nouveau modeset0 sudo update-initramfs -u sudo reboot验证禁用重启后执行lsmod | grep nouveau无输出则禁用成功。驱动安装后效果系统自动在/dev目录生成两类文件核心设备文件/dev/nvidia0-nvidia34 块 GPU 对应 4 个文件少一个说明识别失败辅助控制文件/dev/nvidiactl总控制器、/dev/nvidia-modeset模式设置、/dev/nvidia-uvm统一内存管理—— 必须与核心文件同时存在。验证驱动执行nvidia-smi能看到 4 块 GPU 的型号、驱动版本、CUDA 版本说明驱动安装成功。装 “桥梁工具”nvidia-container-toolkit作用让容器运行时containerd/CRI-O能识别并挂载 GPU 设备文件版本需≥1.7.0。配置 containerd关键修正需注册 NVIDIA 运行时bash# 安装工具后配置运行时 nvidia-ctk runtime configure --runtimecontainerd --set-as-default # 验证配置/etc/containerd/config.toml 中会新增 nvidia 运行时配置 cat /etc/containerd/config.toml | grep -A 5 nvidia # 重启containerd生效 systemctl restart containerd2. 给 GPU 节点设 “门禁”标签 污点GPU 很贵需通过 “标签 污点” 确保资源不被滥用新增 K8s 默认识别标签第一步打标签除自定义标签外需保留 K8s 默认 GPU 标签设备插件依赖此标签调度bash# 自定义标签标记GPU数量和型号 kubectl label nodes 你的GPU节点名 gpu-count4 gpu-modelTesla-T4 # 默认标签K8s识别GPU节点的核心标签必加 kubectl label nodes 你的GPU节点名 feature.node.kubernetes.io/pci-10de.presenttrue第二步加污点设 “门禁”仅允许带容忍的 Pod 调度bashkubectl taint nodes 你的GPU节点名 hardwaregpu:NoSchedule注意若 GPU 节点已存在其他 NoSchedule 污点需在 Pod 中添加对应容忍否则设备插件 Pod 无法部署。3. 部署 GPU 设备插件让 K8s “认识” GPU 资源K8s 本身不识别 GPU需部署 NVIDIA Device Plugin“翻译官”必须用 DaemonSet 方式核心要求K8s 集群版本≥1.10插件与 K8s 版本需兼容推荐 v0.14.0 及以上插件通过 NVML 库扫描 GPU依赖宿主机驱动和运行时配置正确。部署命令官方稳定版本bashkubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml关键验证新增查看插件 Pod 状态kubectl get pods -n kube-system -l appnvidia-device-plugin需为 Running查看插件日志排查故障核心kubectl logs -n kube-system 插件Pod名无 “CUDA error”“connection refused” 等错误验证 K8s 资源注册kubectl describe node 你的GPU节点名 | grep nvidia.com/gpu能看到capacity: nvidia.com/gpu: 4说明资源已上报。插件的 3 个核心工作扫描节点/dev/nvidia0~3及 NVML 库确认 GPU 数量和健康状态向 K8s APIServer 注册资源nvidia.com/gpu: 4纳入集群资源管理实时监控 GPU 状态若某块 GPU 故障如驱动崩溃立即上报 K8s 标记为不可用。4. 写 Pod 配置申请 GPU 要对应文件Pod 配置需严格遵循 K8s GPU 调度规范修正环境变量用法与资源声明规则4.1 基础版 Pod YAML随机分配 2 块 GPUyamlapiVersion: v1 kind: Pod metadata: name: gpu-2-pod spec: containers: - name: cuda-app image: nvidia/cuda:12.2.0-runtime command: [nvidia-smi] resources: limits: nvidia.com/gpu: 2 # 必选GPU只能在limits中声明requests默认等于limits requests: nvidia.com/gpu: 2 # 可选若指定必须与limits值相等K8s强制要求 env: - name: NVIDIA_DRIVER_CAPABILITIES # 新增指定容器所需驱动能力nvidia-smi依赖utility value: compute,utility nodeSelector: gpu-count: 4 gpu-model: Tesla-T4 feature.node.kubernetes.io/pci-10de.present: true # 匹配默认GPU标签 tolerations: - key: hardware operator: Equal value: gpu effect: NoSchedule4.2 进阶版 Pod YAML指定 GPU 卡号 / UUIDNVIDIA_VISIBLE_DEVICES支持卡号、UUID 两种指定方式修正原单一用法yamlapiVersion: v1 kind: Pod metadata: name: gpu-specify-pod spec: containers: - name: cuda-app image: nvidia/cuda:12.2.0-runtime command: [nvidia-smi] env: - name: NVIDIA_VISIBLE_DEVICES # 方式1指定卡号0和2 value: 0,2 # 方式2指定UUID需先通过nvidia-smi -L获取 # value: GPU-5da6e67e-fd5a-88fb-7a0e-109c3284f7bf,GPU-242b3020-8e5c-813a-42d9-475766d52f9d - name: NVIDIA_DRIVER_CAPABILITIES value: compute,utility resources: limits: nvidia.com/gpu: 2 nodeSelector: feature.node.kubernetes.io/pci-10de.present: true tolerations: - key: hardware value: gpu effect: NoSchedule关键说明NVIDIA_VISIBLE_DEVICES还支持all所有 GPU、none禁用 GPU等值需配合NVIDIA_DRIVER_CAPABILITIES使用才能生效。5. K8s 调度 挂载把 GPU 文件 “搬” 到容器里提交 Pod 配置后K8s 自动完成 5 个关键步骤补充核心细节调度器筛选节点同时满足 3 个条件 ——① 有feature.node.kubernetes.io/pci-10de.presenttrue标签② 容忍hardwaregpu污点③nvidia.com/gpu空闲数≥2分配 GPU 资源K8s 通过设备插件获取空闲 GPU 列表随机选择 2 个如nvidia1、nvidia3并锁定资源防止重复分配设备文件挂载nvidia-container-toolkit不仅挂载核心文件nvidia1、nvidia3和辅助文件还会挂载驱动依赖的动态链接库如/usr/local/nvidia/lib资源隔离通过 cgroup 限制容器仅能访问分配的 GPU同时通过环境变量LD_LIBRARY_PATH自动配置库路径确保程序能调用 GPU容器启动nvidia-smi依赖NVIDIA_DRIVER_CAPABILITIESutility才能运行否则会提示 “command not found” 或 “no devices found”。6. 一站式测试脚本部署→验证→删除编写gpu-test-all.sh脚本补充错误处理与关键验证步骤避免手动操作失误6.1 脚本内容bash#!/bin/bash # K8s GPU测试一键脚本含错误处理 # 使用前替换 你的GPU节点名 为实际节点名称 set -e # 遇到错误立即退出避免资源残留 # 定义变量 POD_NAMEgpu-2-pod NODE_NAME你的GPU节点名 YAML_FILEgpu-test-pod.yaml # 前置检查确认kubectl能连接集群 if ! kubectl cluster-info /dev/null; then echo ERROR: 无法连接K8s集群请检查kubeconfig配置 exit 1 fi # 前置检查确认节点存在 if ! kubectl get node ${NODE_NAME} /dev/null; then echo ERROR: 节点 ${NODE_NAME} 不存在请检查节点名 exit 1 fi # 步骤1生成Pod YAML文件 echo 1. 生成GPU测试Pod YAML文件 cat ${YAML_FILE} EOF apiVersion: v1 kind: Pod metadata: name: ${POD_NAME} spec: containers: - name: cuda-app image: nvidia/cuda:12.2.0-runtime command: [nvidia-smi] env: - name: NVIDIA_DRIVER_CAPABILITIES value: compute,utility resources: limits: nvidia.com/gpu: 2 requests: nvidia.com/gpu: 2 nodeSelector: gpu-count: 4 gpu-model: Tesla-T4 feature.node.kubernetes.io/pci-10de.present: true tolerations: - key: hardware operator: Equal value: gpu effect: NoSchedule EOF # 步骤2部署Pod echo -e \n 2. 部署GPU测试Pod kubectl apply -f ${YAML_FILE} # 步骤3等待Pod执行完成nvidia-smi执行后Pod会变为Completed状态 echo -e \n 3. 等待Pod执行完毕最长等待30秒 if ! kubectl wait pod/${POD_NAME} --forconditionCompleted --timeout30s; then echo -e \nERROR: Pod执行超时或失败查看日志kubectl logs ${POD_NAME} kubectl delete pod ${POD_NAME} --force rm -f ${YAML_FILE} exit 1 fi # 步骤4验证1 - 查看容器内的GPU设备文件 echo -e \n 4. 容器内的GPU设备文件 kubectl exec ${POD_NAME} -- ls /dev/nvidia* # 步骤5验证2 - 查看GPU信息日志核心验证 echo -e \n 5. GPU信息日志 kubectl logs ${POD_NAME} | grep -E GPU|Driver Version|CUDA Version # 步骤6删除Pod释放GPU资源 echo -e \n 6. 删除Pod释放GPU资源 kubectl delete -f ${YAML_FILE} rm -f ${YAML_FILE} echo -e \n 测试完成所有GPU资源已释放 6.2 脚本使用方法替换脚本中的你的GPU节点名为实际节点名称赋予执行权限chmod x gpu-test-all.sh运行脚本./gpu-test-all.sh。6.3 预期输出设备文件2 个核心 GPU 文件如nvidia1、nvidia3 3 个辅助文件GPU 日志显示 2 块 GPU 的型号、驱动版本、CUDA 版本无报错最终状态Pod 被成功删除kubectl describe node 节点名中nvidia.com/gpu空闲数恢复为 4。7. 手动验证 回收若不想用脚本可手动执行以下操作新增故障排查命令部署 Podkubectl apply -f gpu-test-pod.yaml查看 Pod 状态kubectl get pods -w等待状态变为 Completed验证 1容器内 GPU 文件kubectl exec -it ${POD_NAME} -- ls /dev/nvidia*验证 2GPU 信息kubectl logs ${POD_NAME}排错命令新增若 PodPendingkubectl describe pod ${POD_NAME}查看 “Events” 栏常见原因资源不足、污点未容忍、节点标签不匹配若 PodCrashLoopBackOffkubectl logs ${POD_NAME} --previous查看启动错误常见原因驱动不兼容、运行时未配置手动回收kubectl delete pod ${POD_NAME}8. 核心细节 避坑指南8.1 关键规范GPU 资源声明规则只能在limits中指定requests若指定必须与limits相等K8s 不支持 GPU 资源的弹性调度因 GPU 是独占设备环境变量必填项NVIDIA_DRIVER_CAPABILITIES必须指定至少包含compute运行nvidia-smi需加utility否则容器无法调用 GPU 或工具插件部署要求必须用 DaemonSet且 Pod 需能访问 kubelet 的设备插件套接字/var/lib/kubelet/device-plugins/nvidia.sock否则无法注册资源。8.2 常见坑与解决方案问题现象根本原因解决方案插件 Pod 启动失败日志显示 “CUDA error: no CUDA-capable device”驱动未安装或 nouveau 未禁用重新安装驱动执行禁用 nouveau 步骤并重启PodPending提示 “Insufficient nvidia.com/gpu”节点未上报 GPU 资源或资源已被占用1. 查看插件日志2. 验证kubectl describe node是否有nvidia.com/gpu3. 检查节点是否有未删除的 GPU Pod容器内执行nvidia-smi提示 “command not found”未配置NVIDIA_DRIVER_CAPABILITIESutility在 Pod YAML 中添加该环境变量运行时配置后仍无法挂载 GPUcontainerd 未重启或未设为默认运行时