快速搭建GPU环境 | Docker、k8s中使用GPU
快速搭建GPU环境 | Docker、k8s中使用GPU
本文详细介绍了在裸机、Docker容器以及Kubernetes集群中部署和使用GPU的完整流程,包括GPU驱动安装、CUDA工具包配置以及GPU监控设置等关键步骤。无论是进行深度学习模型训练还是其他GPU加速计算任务,本文都能为读者提供全面的技术指导。
一、裸机部署
在裸机上使用GPU需要安装以下组件:
- GPU驱动
- CUDA工具包
二者的关系如NVIDIA官网上的图所示:
GPU驱动包含了GPU驱动和CUDA驱动,CUDA工具包则包含了CUDA运行时。
首先确认机器上是否有GPU:
lspci | grep NVIDIA
可以看到,该设备有1张Tesla V100 GPU。
安装GPU驱动
到NVIDIA驱动下载页面下载对应的显卡驱动:
复制下载链接:
wget https://cn.download.nvidia.com/tesla/550.144.03/nvidia-driver-local-repo-ubuntu2204-550.144.03_1.0-1_amd64.deb
安装驱动:
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential dkms
sudo dpkg -i nvidia-driver-local-repo-ubuntu2204-550.144.03_1.0-1_amd64.deb
sudo apt install -y nvidia-driver-550
nvidia-smi
至此,GPU驱动已安装完成,系统能正常识别GPU。
安装CUDA工具包
对于深度学习程序,通常需要依赖CUDA环境,因此需要在机器上安装CUDA工具包。
下载对应的安装包:
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-4
配置PATH环境变量。
测试
使用Python和PyTorch进行测试:
import torch
def check_cuda_with_pytorch():
"""检查PyTorch CUDA环境是否正常工作"""
try:
print("检查PyTorch CUDA环境:")
if torch.cuda.is_available():
print(f"CUDA设备可用,当前CUDA版本是: {torch.version.cuda}")
print(f"PyTorch版本是: {torch.__version__}")
print(f"检测到 {torch.cuda.device_count()} 个CUDA设备。")
for i in range(torch.cuda.device_count()):
print(f"设备 {i}: {torch.cuda.get_device_name(i)}")
print(f"设备 {i} 的显存总量: {torch.cuda.get_device_properties(i).total_memory / (1024 ** 3):.2f} GB")
print(f"设备 {i} 的显存当前使用量: {torch.cuda.memory_allocated(i) / (1024 ** 3):.2f} GB")
print(f"设备 {i} 的显存最大使用量: {torch.cuda.memory_reserved(i) / (1024 ** 3):.2f} GB")
else:
print("CUDA设备不可用。")
except Exception as e:
print(f"检查PyTorch CUDA环境时出现错误: {e}")
if __name__ == "__main__":
check_cuda_with_pytorch()
二、Docker环境
在Docker环境中使用GPU需要安装nvidia-container-toolkit
。
安装nvidia-container-toolkit
# 配置生产仓库
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/stable/deb/nvidia-container-toolkit.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
# 选择性配置实验包仓库
sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
# 更新包列表
sudo apt-get update
# 安装NVIDIA容器工具包
sudo apt-get install -y nvidia-container-toolkit
配置使用该runtime
支持Docker、Containerd、CRI-O、Podman等CRI。
新版toolkit带有一个nvidia-ctk
工具,执行以下命令即可一键配置:
sudo nvidia-ctk runtime configure --runtime=docker
systemctl restart docker
Docker环境中的CUDA调用:
使用一个带CUDA Toolkit的镜像即可。最后我们启动一个Docker容器进行测试,其中命令中增加--gpu
参数来指定要分配给容器的GPU。
docker run --rm --gpus all nvidia/cuda:12.0.1-runtime-ubuntu22.04 nvidia-smi
三、k8s环境
在k8s环境中使用GPU需要部署以下组件:
- gpu-device-plugin:用于管理GPU
- gpu-exporter:用于监控GPU
安装device-plugin
device-plugin一般由对应的GPU厂家提供,比如NVIDIA的k8s-device-plugin。
安装命令:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.15.0/deployments/static/nvidia-device-plugin.yml
device-plugin启动之后,会感知节点上的GPU设备并上报给kubelet,最终由kubelet提交到kube-apiserver。
可以在Node可分配资源中看到GPU:
root@test:~# k describe node test|grep Capacity -A7
Capacity:
cpu: 48
ephemeral-storage: 460364840Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 98260824Ki
nvidia.com/gpu: 2
pods: 110
安装GPU监控
安装DCCM exporter结合Prometheus输出GPU资源监控信息:
helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
helm repo update
helm install --generate-name gpu-helm-charts/dcgm-exporter
查看metrics:
curl -sL http://127.0.0.1:8080/metrics
测试
在k8s创建Pod要使用GPU资源很简单,和cpu、memory等常规资源一样,在resource中申请即可。
比如,下面这个yaml里面我们就通过resource.limits申请了该Pod要使用1个GPU:
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
restartPolicy: Never
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
resources:
limits:
nvidia.com/gpu: 1 # requesting 1 GPU
启动后,查看日志:
kubectl logs gpu-pod
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done
至此,k8s环境中的GPU配置完成。