首页/AI/大模型部署与运维速查/显存碎片:成因与治理
运维监控与排障50 条

显存碎片:成因与治理

长跑推理进程不断申请、释放不同尺寸的显存块,空闲空间被切成小洞,出现「总量够、没有连续大块」的分配失败;治理手段有段内扩展、调整切分策略与定期重启。

显存碎片是怎么回事

长跑的推理进程不断申请、释放不同尺寸的显存块,空闲空间被切成许多小洞,最后出现「总容量够、却没有连续大块可分配」的失败。它的典型表征是预留量高、实际占用低,报错时还显示有大片缓存未被使用。治理方向是让分配更规整,或定期把进程重启到干净状态。

基本信息

成因不同尺寸块反复申请与释放
现象总量够但申请大块失败
表征预留高、实际占用低
缓解调整分配策略或定期重启
KV 侧分页管理本身已减轻碎片

典型使用场景

  • 长跑实例偶发 OOM,而显存看着还够
  • 排查「重启就好、跑两天又坏」的规律性问题
  • 给进程加健康重启策略前先确认收益
  • 评估切换分配策略能否真正缓解
  • 把 OOM 发生时间与实例运行时长一起记录,识别碎片型规律

两个常用开关

两个常用开关
# 先试其一,不要同时开,便于归因
# PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
# PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512

# 观察预留与实际占用的差额
nvidia-smi --query-gpu=memory.used --format=csv -l 1

三个量怎么看

量含义异常表现
预留量已向驱动申请长期高于业务所需
实际占用被张量使用的部分与预留差距大
失败时机申请连续大块时峰值与碎片叠加触发
分页管理的 KV 缓存池本身已减轻 KV 侧碎片;权重加载与临时张量仍走常规分配器,需要常规手段处理,两部分要分开看。
治理顺序先看负载趋势:如果请求长度与并发在持续上涨,根因是容量而不是碎片,加重启只是把症状往后推。
碎片与容量是两个方向:前者随时间累积、重启有效;后者随负载变化、重启无效。先用这个特征区分,再决定治理方案。
重启后把显存曲线与上一次对比:确认碎片确实被清掉,而不是碰巧这批请求都比较短。

易错点

  • 把定时重启当长期方案:先确认并发与请求长度趋势,否则碎片会随负载再来
  • 同时打开多个分配器开关:相互影响且难以归因,一次只试一个并记录效果
  • 只看总显存判断够不够用:真正要看能否申请到连续大块,预留与实际占用的差额才是线索
  • 把偶发 OOM 归为模型问题:碎片型失败具有时间规律,先看重启后是否复现

数据来源与参考

  • PyTorch 官方文档:PYTORCH_CUDA_ALLOC_CONF 环境变量说明(docs.pytorch.org)
  • vLLM 官方文档:Paged Attention(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌