torch.cuda.memory_stats

torch.cuda.memory_stats(device=None)[源代码]

为指定设备返回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分配调用的次数,其中包括cuMemMapcudaMalloc

  • "num_device_free": CUDA 释放调用的次数,包括 cuMemUnmapcudaFree

可以通过环境变量配置缓存分配器,使其不对大于指定大小的块进行拆分(参见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.deviceint, 可选) – 选定的设备。如果 current_device() 返回当前设备(当 deviceNone (默认值)时),则返回该设备的统计信息。

返回类型

Dict[str, Any]

注意

关于GPU内存管理的更多信息,请参见内存管理

注意

使用backend:cudaMallocAsync时,某些统计信息无意义,始终显示为零。