AI服务器GPU算力隔离怎么做才不影响其他任务
多个任务跑在同一张GPU上时,一个训练脚本把显存吃满,另一个推理服务就会报显存不足或计算卡顿。
GPU算力隔离要解决的问题,是让不同任务在显存和计算资源上互不侵占。
能不能做到、做到什么程度,取决于显卡型号和驱动版本。
先确认显卡和驱动支持哪种隔离方式
硬件级隔离依赖NVIDIA MIG,它把一张物理卡切成多个独立实例,彼此显存和算力不共享。
软件级隔离依赖CUDA MPS和容器资源限制,只能降低抢占概率,不能做到完全隔离。
在服务器上执行以下命令查看显卡型号和MIG能力:
nvidia-smi
nvidia-smi mig -lgip
第一条命令输出GPU型号、驱动版本和当前显存占用。
第二条命令如果返回可用的MIG配置列表,说明显卡和驱动支持MIG切分;
如果提示不支持,说明只能走软件隔离。
同时确认Docker已安装NVIDIA Container Toolkit,否则容器内看不到GPU。
检查命令:
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
能正常输出显卡信息,才说明容器GPU调用链路是通的。
硬件切分:用MIG把一张卡分成多个实例
MIG适合A100、H100等数据中心卡,消费级显卡通常不支持。
切分前要停掉所有占用该GPU的进程,否则会提示设备忙。
先查看可用的GI和CI配置编号:
nvidia-smi mig -lgip
nvidia-smi mig -lcip
按编号创建实例,例如创建两个1g.5gb实例:
nvidia-smi mig -cgi 1g.5gb,1g.5gb -C
创建完成后执行nvidia-smi -L,应该看到类似MIG 1g.5gb Device 0的多条设备记录。
容器运行时通过NVIDIA_VISIBLE_DEVICES指定MIG实例UUID,例如:
docker run --rm --gpus '"device=0:1"' nvidia/cuda:12.0-base nvidia-smi
注意:MIG实例的UUID每次重建可能变化,最好在启动脚本里动态读取,不要写死在配置文件里。
软件隔离:MPS加容器资源限制
显卡不支持MIG时,可以用CUDA MPS让多个进程共享同一个GPU上下文,再配合容器显存和计算线程限制,降低互相干扰。
在宿主机启用MPS服务:
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps
export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-log
nvidia-cuda-mps-control -d
启动后,同一用户下的CUDA进程会通过MPS调度。
接着在容器启动时限制显存比例和计算线程数。
NVIDIA Container Toolkit支持以下环境变量:
docker run --rm --gpus all \
-e NVIDIA_MPS_ACTIVE_THREAD_PERCENTAGE=30 \
-e CUDA_MPS_ACTIVE_THREAD_PERCENTAGE=30 \
your-image
NVIDIA_MPS_ACTIVE_THREAD_PERCENTAGE控制该容器最多使用多少比例的计算线程。
显存限制目前没有官方环境变量,需要在应用层用框架参数控制,例如PyTorch设置torch.cuda.set_per_process_memory_fraction(0.4)。
注意:MPS不是硬隔离,某个任务如果绕过限制直接申请整卡显存,仍然可能影响其他任务。
生产环境建议优先评估MIG。
避坑与验证
常见坑有三个:一是MIG实例创建后没重启容器,容器仍看到整卡;
二是MPS服务没随开机自启,服务器重启后隔离失效;
三是多个容器共用同一个MIG实例UUID,等于没隔离。
验证隔离是否生效,可以同时启动两个任务,在宿主机执行:
nvidia-smi
nvidia-smi mig -lgi
观察每个MIG实例或每个进程的显存占用和计算利用率。
如果两个任务各自占用独立实例,且一个任务跑满时另一个任务没有明显卡顿,说明隔离基本生效。
软件隔离场景下,重点看nvidia-smi中每个进程的显存是否被限制在预期范围内。
最后提醒:GPU算力隔离不能替代任务调度。
多用户场景下,建议把隔离配置写进容器启动模板,并在监控里记录每个容器的显存和算力使用峰值,方便后续调整配额。