GPU 节点接入与初始化
本文把 GPU 机器接入 CubeStudio 集群的完整流程合并为一篇,按顺序包括:
- 安装 NVIDIA 驱动与 CUDA
- 配置容器运行时(docker / containerd)的 NVIDIA 支持
- 将机器加入 k8s 集群并打标签
- 部署 GPU 设备插件、监控、弹性伸缩
- 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:983中USER_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:1241、myapp/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/下源码为准。