torch.cuda.memory.memory_stats#
- torch.cuda.memory.memory_stats(device=None)[source]#
返回给定设备的 CUDA 内存分配器统计信息的字典。
此函数的返回值是一个统计字典,其中每个统计项都是一个非负整数。
核心统计信息
"allocated.{all,large_pool,small_pool}.{current,peak,allocated,freed}":内存分配器接收到的分配请求数量。"allocated_bytes.{all,large_pool,small_pool}.{current,peak,allocated,freed}": 已分配内存的大小。"segment.{all,large_pool,small_pool}.{current,peak,allocated,freed}":从cudaMalloc()预留的段的数量。"reserved_bytes.{all,large_pool,small_pool}.{current,peak,allocated,freed}": 已预留内存的大小。"active.{all,large_pool,small_pool}.{current,peak,allocated,freed}":活动内存块的数量。"active_bytes.{all,large_pool,small_pool}.{current,peak,allocated,freed}": 活动内存的大小。"inactive_split.{all,large_pool,small_pool}.{current,peak,allocated,freed}":不活动、不可释放的内存块的数量。"inactive_split_bytes.{all,large_pool,small_pool}.{current,peak,allocated,freed}":不活动、不可释放的内存量。
对于这些核心统计信息,值按以下方式细分。
内存池类型
all: 所有内存池的组合统计信息。large_pool:大分配池的统计信息(截至 2025 年 6 月,用于大小 >= 1MB 的分配)。small_pool:小分配池的统计信息(截至 2025 年 6 月,用于大小 < 1MB 的分配)。
指标类型
current:此指标的当前值。peak:此指标的最大值。allocated:此指标的历史总增长量。freed:此指标的历史总减少量。
除了核心统计数据外,我们还提供了一些简单的事件计数器
"num_alloc_retries":导致缓存刷新和重试的cudaMalloc调用失败的次数。"num_ooms":抛出的内存不足错误数量。"num_sync_all_streams":synchronize_and_free_events调用次数。"num_device_alloc":CUDA 分配调用次数。这包括 cuMemMap 和 cudaMalloc。"num_device_free":CUDA 释放调用次数。这包括 cuMemUnmap 和 cudaFree。
缓存分配器可以通过环境变量进行配置,使其不分割大于定义大小的块(请参阅 CUDA 语义文档的内存管理部分)。这有助于避免内存碎片,但可能会带来性能损失。其他输出有助于调整和评估影响。
"max_split_size":大于此大小的块不会被分割。"oversize_allocations.{current,peak,allocated,freed}":内存分配器接收到的超大分配请求数量。"oversize_segments.{current,peak,allocated,freed}":从cudaMalloc()预留的超大段数量。
缓存分配器可以通过环境变量进行配置,以四舍五入内存分配以减少碎片。有时四舍五入的开销可能高于其帮助减少的碎片。以下统计信息可用于检查四舍五入是否增加了过多开销。
"requested_bytes.{all,large_pool,small_pool}.{current,peak,allocated,freed}":客户端代码请求的内存,与 allocated_bytes 进行比较,以检查分配四舍五入是否增加了过多开销。
- 参数
device (torch.device 或 int, 可选) – 选定的设备。如果
device为None(默认),则返回当前设备(由current_device()指定)的统计信息。- 返回类型
注意
有关 GPU 内存管理的更多详细信息,请参阅 内存管理。
注意
在使用 backend:cudaMallocAsync 时,某些统计信息无意义,始终报告为零。