AI服务器上为容器配置GPU与资源限制的ContainerOps实践
在AI服务器上做ContainerOps配置,最先要解决的不是上Kubernetes,而是让单个容器正确拿到GPU,同时用资源限制避免一个训练任务把整机内存吃光。
本文从零基础出发,讲清安装、配置和验证三个环节,适用于单机或少量GPU服务器、使用Docker运行推理或训练容器的场景。
先确认驱动和容器运行时
配置容器GPU之前,宿主机必须已经装好与GPU匹配的NVIDIA驱动,并且nvidia-smi能正常输出。
如果这一步不通过,后面安装容器工具包也不会生效。
执行检查:
nvidia-smi
预期看到GPU型号、驱动版本和显存占用表。
若提示命令不存在,先安装驱动,不要继续往下走。
接着确认Docker已安装并运行:
docker version
docker info | grep -i runtime
docker info默认不会列出nvidia运行时,这属于正常现象,安装工具包后才会出现。
安装NVIDIA Container Toolkit
NVIDIA Container Toolkit是让Docker容器访问GPU的官方组件,它会给Docker注册一个nvidia运行时。
以Ubuntu/Debian系为例,按官方仓库方式安装:
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
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
最后两步是关键:nvidia-ctk runtime configure负责修改Docker的运行时配置,重启Docker后生效。
执行完再运行docker info | grep -i runtime,应能看到nvidia。
用参数或Compose声明GPU与资源限制
最直接的方式是在docker run中指定GPU和资源上限:
docker run --rm --gpus all \
--memory=16g --cpus=4 \
--shm-size=2g \
nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
--gpus all把全部GPU暴露给容器;--memory限制容器内存,防止OOM拖垮宿主机;--shm-size对多进程训练很重要,默认64MB往往不够。
如果只想用某一张卡,可写成--gpus '"device=0"'。
生产环境更推荐用Compose文件管理,把资源限制固化下来:
services:
inference:
image: nvidia/cuda:12.4.0-base-ubuntu22.04
command: nvidia-smi
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
mem_limit: 16g
cpus: 4.0
shm_size: 2gb
注意deploy.resources.reservations.devices在Compose v2中用于声明GPU,mem_limit和cpus是单机Compose的资源限制写法。
保存为compose.yaml后执行docker compose up即可。
常见报错与配置避坑
遇到could not select device driver "" with capabilities:,
[[gpu]]
通常说明NVIDIA Container Toolkit没装好或Docker没重启,
先复查docker info里是否有nvidia运行时。
容器内nvidia-smi报驱动版本不匹配,多半是宿主机驱动与CUDA镜像版本跨度太大,换一个与驱动兼容的CUDA基础镜像即可,不要盲目在容器里重装驱动。
设置了--memory后进程被系统杀掉,
先看docker inspect里的OOMKilled字段,
再结合docker stats观察实际内存曲线,
适当上调限制,
而不是直接去掉限制。
多卡训练时容器只看到一张卡,检查--gpus写法是否被shell转义破坏,以及NVIDIA_VISIBLE_DEVICES环境变量是否被镜像覆盖。
验证配置是否真正生效
配置完成后不要只看容器是否启动,要同时验证GPU可见性和资源限制:
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
docker stats --no-stream
第一条命令应输出与宿主机一致的GPU列表;
第二条命令应看到容器内存和CPU占用被限制在设定值以内。
再进入容器执行cat /sys/fs/cgroup/memory.max(cgroup v2环境),可核对内存上限是否与--memory一致。
如果容器能启动但GPU任务报CUDA error:,
no kernel image is available
说明镜像的CUDA架构与GPU算力不匹配,
属于镜像选择问题,
不是ContainerOps配置本身。
把以上步骤跑通后,AI服务器的容器化基础就算落地了。
后续再接入编排平台或监控时,GPU和资源限制这两项配置仍然是排错时最先要核对的地方。