第 79 题:显存碎片问题在分布式场景下更严重吗?如何解决?
题目
显存碎片问题在分布式场景下更严重吗?如何解决?
完整讲解
一、显存碎片从哪来
显存分配/释放顺序与 tensor 生命周期不一致,会产生空洞:总空闲足够,但没有连续块满足新申请,导致 OOM 或分配失败。动态图、变长序列、临时 tensor 多、以及 不同 rank 或不同 stage 分配节奏不同 都会加剧碎片。
二、分布式下是否更严重
- 可能更严重:多进程/多卡下,各 rank 的 alloc 顺序与 size 不完全一致(如 DDP 梯度、PP 各 stage 激活、TP 分片),导致每卡碎片模式不同,某卡先 OOM;或 collective 同步点 前后大量临时 tensor 同时释放,形成「波浪式」分配,易产生碎片。
- 也可能相当:若各 rank 执行严格一致、分配模式相同,碎片程度与单卡类似,但 单卡 OOM 会拖挂整组,所以对碎片更敏感,需要更主动的应对。
三、解决思路
- 预分配与池化:启动时按最大需求预分配大块,内部再切分(类似 memory pool),减少运行时零散 alloc/free。
- 统一分配顺序:尽量让各 rank 的 alloc 顺序与 size 一致(如统一 layer 顺序、统一 gradient buffer 申请),减轻碎片差异。
- 重算换显存:activation checkpointing 减少峰值激活,间接减少大块分配与释放的波动。
- 碎片整理:部分框架支持「compact」或重排(代价高);或重启进程清空显存。实践中以「预分配 + 一致顺序 + checkpoint」为主。
面试要点
- 碎片 = 空闲不连续;分布式下各 rank 分配节奏不一或 collective 前后波动可能加重。
- 单卡 OOM 拖挂整组,分布式对碎片更敏感。
- 手段:预分配/池化、统一分配顺序、checkpoint、少用临时大 tensor。
记忆要点
- 分布式下分配节奏不一易加重碎片;单卡 OOM 影响全组。
- 预分配 + 一致顺序 + checkpoint 是主要手段。
- 避免 collective 前后大量临时 tensor 同时 alloc/free。