Time-sliced GPU调度器并行训练耗时及GPU-Util等技术疑问
关于NVIDIA GPU时间分片调度与多进程训练的疑问
我在Stack Overflow上看到相关问题,其回答指出:在最新MPS文档中,Time-sliced GPU调度器会依据未公开规则抢占正在运行的进程内核,切换至其他进程的内核;非MPS场景下,不同进程的内核不会在同一时钟周期执行。
我测试深度学习模型训练程序时发现:单进程运行与通过bash并行运行3个相同进程的耗时几乎一致,且nvidia-smi中的GPU-Util字段数值显著上升,进程输出并行生成。
现提出以下疑问:
- 该现象在Time-slicing机制下如何实现?
- 为何总耗时未达单进程的约3倍?
- 若同一时间仅运行一个上下文,为何
GPU-Util会上升? - 上下文切换是否无额外开销?
- 使用MPS也未产生差异的原因是什么?
解答
1. Time-slicing机制下多进程并行的实现逻辑
NVIDIA的时间分片调度器会在毫秒级粒度上对不同进程的GPU上下文进行切换。虽然同一时钟周期内只有一个进程的内核在执行,但调度切换速度足够快,从系统层面看多个进程的输出是并行生成的——就像CPU的时间分片多任务一样,只是切换粒度更细,用户感知不到停顿。
2. 总耗时未达单进程3倍的原因
深度学习训练的耗时并非完全由GPU计算决定:
- CPU瓶颈:如果训练程序受限于数据加载、预处理等CPU操作,GPU大部分时间处于等待状态。多进程并行时,GPU可以利用这些等待时间处理其他进程的任务,整体利用率提升,总耗时不会线性增长。
- GPU任务重叠:时间分片调度会尽可能让不同进程的GPU任务(如数据传输、内核计算)在时间上重叠。比如进程A在做CPU预处理时,调度器切换到进程B执行GPU计算,避免GPU闲置。
- 任务批次特性:深度学习训练的批次计算本身是异步的,调度器可以在批次间隙快速切换上下文,不会造成明显的额外耗时。
3. 单上下文运行时GPU-Util上升的原因
nvidia-smi的GPU-Util统计的是一段时间内GPU的忙碌比例,而非某一时刻的状态。时间分片调度下,GPU在不同进程的任务间快速切换,单位时间内的忙碌时间占比大幅提升,所以GPU-Util数值会显著上升——哪怕同一时刻只有一个上下文在运行,整体利用率还是提高了。
4. 上下文切换的额外开销
GPU上下文切换确实有开销,但开销极小:
- 现代NVIDIA GPU(如Ampere及以后架构)的上下文切换开销在微秒级,远小于深度学习训练批次的耗时(通常是毫秒级)。
- 调度器会优化切换时机,比如在进程的GPU任务完成、进入CPU等待阶段时切换,避免打断正在执行的内核,进一步降低开销影响。
- 对于深度学习这类大任务,切换开销占比可以忽略不计,所以你感知不到总耗时的明显增加。
5. 使用MPS无差异的原因
MPS主要解决的是多进程共享同一GPU上下文的场景,适合小任务的高效并行(比如推理场景)。而你的训练任务属于大批次计算:
- 时间分片调度已经能高效利用GPU空闲时间,MPS的上下文共享优势无法体现。
- 深度学习训练的内核通常是大粒度、长时间运行的,MPS的细粒度调度优势不明显,和时间分片调度的效果接近。
- 大部分现代NVIDIA GPU默认开启时间分片调度,在这种大任务场景下,MPS不会带来额外收益。
内容的提问来源于stack exchange,提问作者muser
相关产品推荐
相关产品推荐

