torch.cuda.memory_stats¶
- torch.cuda.memory_stats(device=None)[source][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
: 大分配池的统计信息(截至 2019 年 10 月,用于大小 >= 1MB 的分配)。small_pool
: 小分配池的统计信息(截至 2019 年 10 月,用于大小 < 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,某些统计信息无意义,始终报告为零。