概述
Understanding it is key to fitting big models and avoiding mysterious crashes.
深入探讨
GPU 内存是固定且宝贵的:一张卡可能总共有 24、80 或 192 GB,由模型权重、激活、梯度、优化器状态和临时缓冲区共享。调用驱动程序在每个操作上分配内存会很慢,因此像 PyTorch 这样的框架使用缓存分配器,预先获取大块并分发子块,然后将释放的块保留在池中以供重用。问题是碎片:随着不同大小的张量被分配和释放,可用空间会分成分散的块。您总共可以有 5 GB 空闲空间,但无法分配连续的 2 GB 张量,因为没有一个间隙足够大。这就是为什么尽管看似有可用空间,训练仍可能因内存不足错误而崩溃。
现实世界的实施
A training team examines allocator statistics before testing expandable segments on a variable-batch workload.
A developer uses memory_summary and a memory snapshot to investigate active tensors and inactive split blocks.
An inference team uses vLLM’s paged KV-cache management to reduce cache-allocation waste.
A training team lowers batch size or checkpoints activations after confirming live tensor memory is the limiting factor.
GPU 内存管理和碎片的未来
受操作系统的启发,内存管理变得更加智能和分页。虚拟内存式分配器和分页注意力(用于在推理过程中管理 KV 缓存)等技术可显着减少浪费和碎片。期望框架默认使用可扩展、碎片整理的分配器,通过内置分析器获得更好的可见性,以及与卸载和重新计算的更紧密耦合,以便系统自动处理 GPU、CPU 和磁盘内存,以保持高利用率并很少发生崩溃。
付诸实践
为什么这很重要
- 成本与预算. 多年来,架构决策决定着性能和运营成本。
- 更清晰的判决. 技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。
- 质量控制. 更好的工程选择可以减少生产中的可靠性事故。
留意
- 优化一项基准测试可以隐藏更广泛的系统弱点。
- 基础设施和维护成本常常被低估。
- 随着系统变得更加复杂,安全性和可观察性差距可能会扩大。
后续步骤
- 在实施之前定义延迟、质量和成本目标。
- 在实际负载和数据条件下进行基准测试。
- 仪器监控错误、漂移和用户影响。
- 在扩展之前准备回滚和事件响应路径。
不断探索
常见问题
What is GPU Memory Management and Fragmentation?
AI 框架如何分配、重用和回收 GPU 上的有限内存,以及为什么即使技术上还有大量内存,剩余间隙(碎片)也会导致内存不足错误。理解它是拟合大型模型和避免神秘崩溃的关键。
什么是 GPU 内存碎片?
碎片意味着总的可用内存是足够的,但是它被分成了碎片,因此没有一个间隙对于大张量来说足够大。
为什么像 PyTorch 这样的框架使用缓存内存分配器?
为每个操作调用 cudaMalloc/cudaFree 的速度很慢,因此缓存分配器会抓取大块并重用池中释放的块。
A CUDA allocation fails despite apparently unused reserved memory. What should a developer investigate?
Allocator statistics and snapshots help distinguish fragmentation from live tensors or other allocations. The error alone does not prove a single cause.
Which PyTorch allocator option can be tested for changing-size workloads that leave unused memory slivers?
Expandable segments can reduce waste for selected allocation patterns. Availability and benefit depend on allocator configuration and workload.
vLLM 的 PagedAttention 如何减少推理过程中的内存浪费?
PagedAttention 将 KV 缓存存储在固定大小的页面(如操作系统虚拟内存)中,从而减少碎片并有效地服务许多请求。