GPU 内存管理和碎片
AI 框架如何分配、重用和回收 GPU 上的有限内存,以及为什么即使技术上还有大量内存,剩余间隙(碎片)也会导致内存不足错误。
概述
Understanding it is key to fitting big models and avoiding mysterious crashes.
深入探讨
GPU 内存是固定且宝贵的:一张卡可能总共有 24、80 或 192 GB,由模型权重、激活、梯度、优化器状态和临时缓冲区共享。调用驱动程序在每个操作上分配内存会很慢,因此像 PyTorch 这样的框架使用缓存分配器,预先获取大块并分发子块,然后将释放的块保留在池中以供重用。问题是碎片:随着不同大小的张量被分配和释放,可用空间会分成分散的块。您总共可以有 5 GB 空闲空间,但无法分配连续的 2 GB 张量,因为没有一个间隙足够大。这就是为什么尽管看似有可用空间,训练仍可能因内存不足错误而崩溃。
技术洞察
PyTorch 的 CUDA 缓存分配器将内存分割成块流,并重用与请求大小匹配的释放块,从而避免昂贵的 cudaMalloc/cudaFree 调用。当分割的块无法重新组合时,就会出现碎片。 torch.cuda.empty_cache、PYTORCH_CUDA_ALLOC_CONF Expandable_segments 选项和内存快照等工具会有所帮助。较新的方法借用了虚拟内存的思想,将非连续的物理页映射到连续的虚拟范围,因此尽管有碎片,大型请求仍能成功。
战略影响
成本与预算
多年来,架构决策决定着性能和运营成本。
更清晰的判决
技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。
质量控制
更好的工程选择可以减少生产中的可靠性事故。
GPU 内存管理和碎片的未来
受操作系统的启发,内存管理变得更加智能和分页。虚拟内存式分配器和分页注意力(用于在推理过程中管理 KV 缓存)等技术可显着减少浪费和碎片。期望框架默认使用可扩展、碎片整理的分配器,通过内置分析器获得更好的可见性,以及与卸载和重新计算的更紧密耦合,以便系统自动处理 GPU、CPU 和磁盘内存,以保持高利用率并很少发生崩溃。
现实世界的实施
尽管保留内存显示可用空间,但训练运行仍会因“CUDA 内存不足”而崩溃,通过设置 PYTORCH_CUDA_ALLOC_CONF 以启用可扩展段来修复此问题。
使用 torch.cuda.memory_summary 或内存快照来诊断哪些张量和碎片正在占用 GPU 的 80 GB。
vLLM 的 PagedAttention 管理固定大小页面中的注意力 KV 缓存,以服务许多并发聊天请求,而不会浪费内存。
降低批量大小或启用梯度检查点以减少激活内存并避免碎片驱动的内存不足故障。
风险与防护栏
优化一项基准测试可以隐藏更广泛的系统弱点。
基础设施和维护成本常常被低估。
随着系统变得更加复杂,安全性和可观察性差距可能会扩大。
实施路线图
在实施之前定义延迟、质量和成本目标。
在实际负载和数据条件下进行基准测试。
仪器监控错误、漂移和用户影响。
在扩展之前准备回滚和事件响应路径。
不断探索
Free newsletter
Get the daily AI briefing
Three verified AI stories every weekday morning, written in plain English. Free forever, no ads.
One email each weekday. Unsubscribe in one click. We never sell or share your address.
Test yourself
Take the GPU Memory Management and Fragmentation quiz
Instant feedback on every answer, and a shareable certificate with a verifiable ID once you pass a course.
Support free AI education. AI Understanding is a 501(c)(3) nonprofit — no ads, no paywall, ever. Make a donation
常见问题
What is GPU Memory Management and Fragmentation?
AI 框架如何分配、重用和回收 GPU 上的有限内存,以及为什么即使技术上还有大量内存,剩余间隙(碎片)也会导致内存不足错误。理解它是拟合大型模型和避免神秘崩溃的关键。
什么是 GPU 内存碎片?
碎片意味着总的可用内存是足够的,但是它被分成了碎片,因此没有一个间隙对于大张量来说足够大。
为什么像 PyTorch 这样的框架使用缓存内存分配器?
为每个操作调用 cudaMalloc/cudaFree 的速度很慢,因此缓存分配器会抓取大块并重用池中释放的块。
您看到 5 GB 可用空间,但无法分配 2 GB 张量。可能的原因是什么?
当空闲内存存在但不是一个足够大的连续块来满足请求时,就会出现这种典型的碎片症状。
哪种 PyTorch 设置通过允许内存段灵活增长来帮助减少碎片?
设置 PYTORCH_CUDA_ALLOC_CONF 以启用 Expandable_segments 可以让分配器增长段并减少与碎片相关的故障。
vLLM 的 PagedAttention 如何减少推理过程中的内存浪费?
PagedAttention 将 KV 缓存存储在固定大小的页面(如操作系统虚拟内存)中,从而减少碎片并有效地服务许多请求。