GPU 节点接入与初始化

给集群新增 GPU 机器时,从装驱动/CUDA、配置容器运行时 NVIDIA 支持、加入 k8s 并打标签,到部署设备插件/监控/弹性伸缩的完整流程

部署安装 / 节点准备
GPU显卡nvidia英伟达驱动drivercudafabricmanagernvidia-docker2nvidia-container-toolkitnvidia-device-plugindcgm-exporterprometheus-adapter弹性伸缩hpavgpugpu-type

GPU 节点接入与初始化

本文把 GPU 机器接入 CubeStudio 集群的完整流程合并为一篇,按顺序包括:

  1. 安装 NVIDIA 驱动与 CUDA
  2. 配置容器运行时(docker / containerd)的 NVIDIA 支持
  3. 将机器加入 k8s 集群并打标签
  4. 部署 GPU 设备插件、监控、弹性伸缩
  5. CUDA 版本说明

前置:节点应已安装容器运行时。containerd 的安装见 安装 Containerd。如果是 Jetson 边缘盒子,请改用 Jetson 节点初始化


1. 安装 NVIDIA 驱动与 CUDA

1.1 卸载之前的驱动

ubuntu 卸载 gpu 包:

sudo apt-get --purge remove -y *nvidia*
sudo apt autoremove
sudo apt-get --purge remove -y "*cublas*" "cuda*"
sudo apt-get --purge remove -y "*nvidia*"
sudo rm -rf /usr/bin/*nvidia*
sudo rm -rf /usr/local/bin/*nvidia*

centos 卸载 gpu 包:

sudo yum remove nvidia-*
rpm -qa|grep -i nvid|sort
yum  remove kmod-nvidia-*
sudo yum remove nvidia-*

# sudo yum remove cublas-* cuda-*

卸载后需 reboot 才能重新安装。

1.2 安装新的驱动与 CUDA

先装依赖:

# ubuntu安装依赖
sudo apt-get install -y freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
# centos安装依赖
sudo yum install freeglut-devel gcc gcc-c++ make kernel-devel libX11-devel libXmu-devel libXi-devel mesa-libGL mesa-libGLU mesa-libGLU-devel

安装 550 的驱动(安装后重启):

wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run
bash ./NVIDIA-Linux-x86_64-550.54.14.run

安装 cuda(安装后重启):

wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run
bash ./cuda_12.4.0_550.54.14_linux.run

如果上面安装不成功,也可以用命令推荐安装(ubuntu-drivers devices 查看推荐):

apt install -y nvidia-driver-550-server
# 或者 apt install nvidia-driver-550  # 最新稳定版

# 重启机器

1.3 fabricmanager(多卡 NVLink 机型)

fabricmanager 必须和驱动版本一致,并且不能自动更新(一般会自动安装,不需要手动安装):

# 且需在之前的版本
sudo apt-get install nvidia-fabricmanager-520

driver_version=520.61.05
driver_version_main=$(echo $driver_version | awk -F '.' '{print $1}')
# wget http://mirrors.cloud.aliyuncs.com/nvidia-cuda/ubuntu2004/x86_64/nvidia-fabricmanager-${driver_version_main}_${driver_version}-1_amd64.deb
wget https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64/nvidia-fabricmanager-${driver_version_main}_${driver_version}-1_amd64.deb

dpkg -i nvidia-fabricmanager-${driver_version_main}_${driver_version}-1_amd64.deb

sudo systemctl enable nvidia-fabricmanager.service
sudo service nvidia-fabricmanager start

systemctl status nvidia-fabricmanager

1.4 配置系统环境变量(一般不需要)

vi /etc/profile

export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:$CUDA_HOME/bin

export LD_LIBRARY_PATH=/usr/lib64:$CUDA_HOME/lib64

2. 配置容器运行时的 NVIDIA 支持

驱动装好后,需要给容器运行时安装 NVIDIA 运行时,使容器能识别 GPU。docker 运行时用 nvidia-docker2,containerd 运行时用 nvidia-container-toolkit

2.1 在线安装

ubuntu 在线安装

# 删除所有 NVIDIA 相关的软件源
sudo rm -f /etc/apt/sources.list.d/nvidia*.list
# 删除冲突的 GPG 密钥
sudo rm -f /usr/share/keyrings/nvidia*.gpg

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

apt update -y
# docker 运行时安装 nvidia-docker2
apt install -y nvidia-docker2
# containerd运行时安装nvidia-container-toolkit
apt install -y nvidia-container-toolkit

centos 在线安装

docker 运行时安装 nvidia-docker2

yum install docker-ce -y
#yum install -y yum-utils
#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
cp nvidia-docker.repo /etc/yum.repos.d/nvidia-docker.repo
yum makecache
yum install -y nvidia-docker2

containerd 运行时安装 nvidia-container-toolkit

yum install -y yum-utils
sudo yum-config-manager --add-repo https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo
yum makecache
yum install -y nvidia-container-toolkit

2.2 离线安装

wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/install/nvidia-docker2.tar.gz  && tar -zxvf nvidia-docker2.tar.gz && rm nvidia-docker2.tar.gz
cd nvidia-docker2
dpkg -i ./*.deb
dpkg -l | grep nvidia-docker2

2.3 docker 修改配置

cat > /etc/docker/daemon.json <<EOF
{
    # 镜像加速器,拉取docker官方镜像时需要
    "registry-mirrors": ["https://hub.rat.dev/","https://docker.xuanyuan.me", "https://docker.m.daocloud.io","https://dockerproxy.com"],
    # dns可不配置
    "dns": ["114.114.114.114","8.8.8.8"],
    # k8s集群可以同时拉取多个镜像
    "max-concurrent-downloads": 30,
    # 默认系统根目录下,如果磁盘有限可以改为其他有空间的目录,占用存储会越来越多
    "data-root": "/data/docker",
    # 内部如果有http的镜像仓库,可以添加
    "insecure-registries":["docker.oa.com:8080"],
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
EOF

systemctl stop docker
systemctl daemon-reload
systemctl start docker

注意:daemon.json 是严格 JSON,不支持注释。上面注释仅为说明用途,实际写入文件时请删除所有 # 注释行。

2.4 containerd 修改配置

编辑 /etc/containerd/config.toml

添加 nvidia 运行时:

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        # 添加下面的内容
        [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"

修改默认运行时为 nvidia:

    [plugins."io.containerd.grpc.v1.cri".containerd]
      default_runtime_name = "nvidia"

重启配置生效:

systemctl daemon-reload
systemctl restart containerd

2.5 测试容器识别 GPU

docker run --name test --gpus all -it nvidia/cuda:11.8.0-devel-ubuntu22.04 bash

docker run --name test --gpus all -it ccr.ccs.tencentyun.com/cube-studio/ubuntu-gpu:cuda11.8.0-cudnn8-python3.9  bash

注:ccr.ccs.tencentyun.com/cube-studio/ubuntu-gpu:cuda11.8.0-cudnn8-python3.9 与平台默认的用户 GPU 镜像一致(install/docker/config.py:983USER_IMAGE)。


3. 将机器加入 k8s 集群并打标签

如果已经部署了 k8s 和 CubeStudio,这里只是把 GPU 机器加入到 k8s 集群;如果还没部署 k8s 和 CubeStudio,可以先参考 单机部署 部署 k8s 集群和 CubeStudio。

加入 k8s 集群后为机器添加标签,标签用于管理和选择机型设备:

gpu=true        用于表示 gpu设备
vgpu=true       用于表示 vgpu设备
gpu-type=V100   用于表示gpu型号,或者gpu-type=T4

train=true      用于训练
service=true    用于推理
notebook=true   用于开发

org=public      用于表示属于的public资源组

说明:这些标签会被平台用作 node_selector 调度 pod。例如 notebook 的节点选择器形如 gpu=true,notebook=true,org=public,训练任务形如 cpu=true;train=true;org=public(见 myapp/views/view_aihub.py:228,437)。gpu-type 主机标签值要求大写,平台据此匹配异构 GPU 机型(见 myapp/config.py:1241myapp/tasks/schedules.py:1344)。


4. 部署 GPU 设备插件、监控与弹性伸缩

4.1 部署 k8s GPU 设备插件(平台自带)

部署文件:install/kubernetes/gpu/nvidia-device-plugin.yml

它在 kube-system 命名空间创建名为 nvidia-device-plugin-daemonset 的 DaemonSet,会在每台 GPU 机器上部署 pod,用于让 scheduler 识别该机器可用的 GPU 算力。

4.2 检查 k8s 机器可占用 GPU 资源

kubectl get node -o yaml
status:
  capacity:
    cpu: '20'
    memory: 81846828Ki
    nvidia.com/gpu: '1'                # 英伟达gpu的资源占用

如果不存在可占用 GPU,那可能是因为机器上 k8s 之外存在占用。需要先关停机器上的 GPU 占用进程,然后重启 kubelet。rancher 重启 kubelet 的方法是 docker restart kubelet

4.3 部署 k8s 监控组件(平台自带)

部署文件:install/kubernetes/gpu/dcgm-exporter.yaml

它在 monitoring 命名空间创建名为 dcgm-exporter 的 DaemonSet,会在每台 GPU 机器上部署 pod,用于监控 GPU 的使用率(见 install/kubernetes/gpu/dcgm-exporter.yaml:2-5)。

4.4 调度占用 GPU

直接写占用卡数目;对于异构 GPU 环境,也可以指定占用的卡型,例如 1(T4)2(V100)0.1

4.5 基于 GPU 利用率进行弹性伸缩(平台自带)

需要先将 GPU 指标采集到 prometheus,再将 prometheus 指标转换为对象指标控制 HPA。

install/kubernetes/prometheus/prometheus_adapter/ 目录下会部署 kubeflow-prometheus-adapter(命名空间 kube-system),用于将 prometheus 指标转换为对象指标(见 install/kubernetes/prometheus/prometheus_adapter/prometheus_adapter.yaml:12-13)。


5. 关于 CUDA 版本

机器安装英伟达驱动和对应版本 CUDA,比如驱动 550、CUDA 12.4。

在 k8s CubeStudio 容器中使用的 CUDA 版本要低于主机的 CUDA 版本(如 12.4)。实际 pytorch 等代码中需要适配的是镜像中的 CUDA 版本,不需要关心主机上的 CUDA 版本。

例如:主机 CUDA 12.4,在 k8s 中使用 CUDA 11.8 的 GPU 镜像,那就需要在镜像环境中安装兼容 CUDA 11.8 的 pytorch。

说明:文中驱动 550 / CUDA 12.4 / fabricmanager 520 等版本号为示例,请按实际机型与上游发布选择匹配版本。具体部署清单以 install/kubernetes/gpu/install/kubernetes/prometheus/prometheus_adapter/ 下源码为准。

最后更新 2026-07-04完整文档以官方仓库为准:GitHub Wiki