CUDA多进程服务
内容提要
CUDA时间切片是GPU默认共享机制,但低利用率进程会拖慢其他进程。NVIDIA MPS允许多进程并发执行内核,提升GPU利用率。文章通过Triton内核测试展示,启用MPS后8个单SM工作负载的吞吐量从3.02提升至17.09请求/秒,约6倍改进,并提供了启用/禁用MPS及Docker配置方法。
延伸解读
适用场景与收益边界
文章中的测试刻意构造了每个进程仅占用1个SM的低利用率内核,以放大MPS的效果。实际应用中,若各进程本身已能充分利用GPU(如高占用率内核),MPS带来的提升可能远小于6倍。因此,在评估是否启用MPS时,应结合自身工作负载的GPU利用率来判断,避免预期过高。
启用MPS的注意事项
启用MPS前需将GPU设置为EXCLUSIVE_PROCESS模式,并设置CUDA_MPS_PIPE_DIRECTORY和CUDA_MPS_LOG_DIRECTORY环境变量。在Docker容器中使用时,需挂载MPS的管道和日志目录,并确保容器内进程有权限访问。此外,MPS控制进程需在宿主机上启动,容器内无法直接控制。
MPS与时间切片的本质区别
时间切片是软件层面的并发,同一时刻仅一个进程在GPU上执行,切换开销可能导致低利用率进程阻塞其他进程。MPS则允许多个进程的内核真正并发执行,减少空闲等待,提升整体吞吐。但MPS并非万能,其效果取决于内核的并发能力和GPU的SM数量。
Q&A
CUDA时间切片是什么?它有什么缺点?
CUDA时间切片是NVIDIA GPU默认的软件共享机制,它通过快速切换不同应用的执行上下文,使多个工作负载看似并发运行,但在任一时刻只有一个进程在GPU上执行。缺点是如果某个进程长时间只占用很少的GPU资源,其他进程访问GPU时可能会遇到明显延迟,导致GPU利用率低和应用性能差。
NVIDIA MPS是什么?它如何改善GPU利用率?
NVIDIA MPS(CUDA多进程服务)允许来自不同进程的CUDA内核并发执行,并支持更快的上下文切换,从而更高效地共享GPU。它通过让低利用率的多个进程的内核同时运行,提高整体GPU利用率,减少因时间切片导致的性能损失。
如何启用CUDA MPS?
在主机上执行以下命令: 1. sudo nvidia-smi -i 0 -c EXCLUSIVE_PROCESS 2. export CUDA_VISIBLE_DEVICES=0 3. export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps 4. export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-mps-log 5. mkdir -p /tmp/nvidia-mps /tmp/nvidia-mps-log 6. nvidia-cuda-mps-control -d
如何禁用CUDA MPS?
在主机上执行以下命令: 1. sudo bash -c 'echo quit | nvidia-cuda-mps-control' 2. sudo nvidia-smi -i 0 -c DEFAULT 3. sudo rm -rf /tmp/nvidia-mps/* /tmp/nvidia-mps-log/*
如何在Docker容器中启用CUDA MPS?
首先在主机上启用MPS,然后运行Docker容器时挂载MPS的管道和日志目录,并设置用户权限。示例命令: docker run -it --rm --gpus all --ipc=host \ --user $(id -u):$(id -g) \ -v /tmp/nvidia-mps:/tmp/nvidia-mps \ -v /tmp/nvidia-mps-log:/tmp/nvidia-mps-log \ --ulimit memlock=-1 --ulimit stack=67108864 \ -v $(pwd):/mnt -w /mnt \ nvcr.io/nvidia/pytorch:26.07-py3 这样容器内就可以访问MPS,并可在主机上控制启用或禁用。
文章中的实验是如何设计的?结果如何?
实验使用一个只占用单个SM的Triton内核,通过多进程启动8个worker,每个worker执行25次内核调用。当MPS禁用时,吞吐量为3.02 requests/sec;启用MPS后,吞吐量提升至17.09 requests/sec,大约6倍改进。
MPS在实际应用中效果如何?
文章指出,实验设计是为了最大化MPS的效果,实际应用中很少出现如此极端的GPU资源利用率低下的情况,因此MPS的效果可能不会那么显著。