AI服务器GPU时间切片:用MPS让多任务共享显卡
GPU时间切片不是把一张卡物理切成多张,而是让多个进程通过时间片轮转共享同一个GPU的计算单元。
在AI服务器上,如果你有多个用户要跑小模型推理、Jupyter调试或短任务训练,又不想给每人分整卡,最直接的落地方式就是启用NVIDIA MPS(Multi-Process Service)。
先确认你的场景适合用MPS
MPS适合单卡多进程、低并发、单进程显存需求小的场景。
如果每个任务都要跑满显存或需要独立故障隔离,应该考虑MIG或整卡分配。
检查当前GPU是否支持MPS,登录服务器后执行:
nvidia-smi
nvidia-smi -q | grep -i mps
如果输出中能看到MPS相关字段,说明驱动层面支持。
接着确认CUDA版本和驱动版本匹配:
nvidia-smi --query-gpu=driver_version --format=csv
nvcc --version
MPS需要GPU处于默认计算模式,不能是独占进程模式。
查看命令:
nvidia-smi --query-gpu=compute_mode --format=csv
如果显示Exclusive_Process,先改回默认:
sudo nvidia-smi -c DEFAULT
启动MPS控制守护进程
MPS由一个控制进程管理,所有客户端通过它共享GPU。
启动命令:
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps
export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-mps-log
mkdir -p $CUDA_MPS_PIPE_DIRECTORY $CUDA_MPS_LOG_DIRECTORY
nvidia-cuda-mps-control -d
执行后检查进程是否存活:
ps -ef | grep mps
应该能看到nvidia-cuda-mps-control和nvidia-cuda-mps-server。
如果启动失败,先看日志目录下的文件:
cat /tmp/nvidia-mps-log/*.log
常见原因是/tmp权限不对或之前残留的套接字文件未清理。
可以停掉控制进程后删除目录再重来:
echo quit | nvidia-cuda-mps-control
rm -rf /tmp/nvidia-mps /tmp/nvidia-mps-log
用环境变量控制显存和并发
MPS默认不限制每个客户端的显存占用,多个进程可能把卡挤爆。
可以在启动客户端前设置:
export CUDA_MPS_ACTIVE_THREAD_PERCENTAGE=50
export CUDA_MPS_PINNED_DEVICE_MEM_LIMIT=0=8G
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE限制该客户端可用的GPU线程百分比,CUDA_MPS_PINNED_DEVICE_MEM_LIMIT限制固定显存上限。
注意这两个变量要写在运行Python或推理程序的那个终端里,不是写在MPS控制进程里。
验证是否生效,运行一个简单CUDA程序后查看:
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv
应该看到多个进程同时出现在计算应用列表中,且显存没有超过你设置的上限。
避坑:MPS不是万能切片
MPS共享的是计算时间片,故障隔离和显存隔离能力弱。
一个进程触发GPU错误可能影响同卡其他进程。
另外,MPS对容器内使用有额外要求,Docker需要挂载MPS套接字目录并保持--ipc=host或共享IPC命名空间。
如果任务对延迟敏感,MPS的时间片轮转可能带来抖动;
如果任务需要独占显存,应改用MIG或直接整卡分配。
停止MPS时先退出所有客户端,再执行:
echo quit | nvidia-cuda-mps-control
最后用nvidia-smi确认没有残留的MPS进程,避免下次启动冲突。