技術指南

GPU 記憶體管理和碎片

AI 框架如何分配、重用和回收 GPU 上的有限內存,以及為什麼即使技術上還有大量內存,剩餘間隙(碎片)也會導致內存不足錯誤。

閱讀時間約2分鐘最後更新

概述

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 緩存,以服務許多並發聊天請求,而不會浪費內存。

降低批量大小或啟用梯度檢查點以減少啟動記憶體並避免碎片驅動的記憶體不足故障。

風險與防護欄

優化一項基準測試可以隱藏更廣泛的系統弱點。

基礎設施和維護成本常常被低估。

隨著系統變得更加複雜,安全性和可觀察性差距可能會擴大。

實施路線圖

1

在實施之前定義延遲、品質和成本目標。

2

在實際負載和資料條件下進行基準測試。

3

儀器監控錯誤、漂移和使用者影響。

4

在擴展之前準備回滾和事件回應路徑。

不斷探索

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

下一步指南

GPU調度和叢集編排

常見問題

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 快取儲存在固定大小的頁面(如作業系統虛擬記憶體)中,從而減少碎片並有效地服務許多請求。