PyTorch 查看内存占用

在深度学习中,模型的训练和推理过程需要大量的内存。了解如何查看内存占用是优化模型性能和调试内存泄漏的重要一步。本文将介绍如何使用 PyTorch 检查内存占用,并提供代码示例。

查看 GPU 内存占用

PyTorch 提供了 torch.cuda.memory_allocated()torch.cuda.max_memory_allocated() 函数,可以用于查看当前已分配的 GPU 内存和最大已分配的 GPU 内存。

import torch

# 创建一个张量并将其存储在 GPU 上
tensor = torch.zeros((1000, 1000)).to('cuda')

# 查看当前已分配的 GPU 内存
allocated_memory = torch.cuda.memory_allocated()
print(f"Allocated GPU memory: {allocated_memory / 1024**3} GB")

# 执行一些操作,使内存占用增加
result = tensor.matmul(tensor)

# 查看最大已分配的 GPU 内存
max_allocated_memory = torch.cuda.max_memory_allocated()
print(f"Max allocated GPU memory: {max_allocated_memory / 1024**3} GB")

在上面的代码中,我们首先创建一个大小为 1000x1000 的零张量,并将其存储在 GPU 上。然后,我们使用 torch.cuda.memory_allocated() 函数查看当前已分配的 GPU 内存,并将结果除以 1024**3 将其转换为 GB 单位进行显示。接下来,我们执行一些操作,使内存占用增加,然后再次使用 torch.cuda.max_memory_allocated() 函数查看最大已分配的 GPU 内存。

查看模型和张量占用的内存

除了查看 GPU 内存占用外,我们还可以查看模型和张量本身占用的内存。PyTorch 提供了 torch.Tensor.numel() 函数可以用于获取张量元素的总数,而模型的内存占用可以通过计算其参数的总数来估计。以下是一个示例:

import torch
import torchvision.models as models

# 创建一个预训练的模型
model = models.resnet50(pretrained=True)

# 统计模型参数的总数
total_params = sum(p.numel() for p in model.parameters())
print(f"Total parameters: {total_params / 1024**2} MB")

# 创建一个大小为 1000x1000 的零张量
tensor = torch.zeros((1000, 1000))

# 统计张量的元素总数
total_elements = tensor.numel()
print(f"Total elements: {total_elements / 1024**2} MB")

在上面的代码中,我们首先使用 torchvision 库中的 resnet50 函数创建一个预训练的 ResNet-50 模型。然后,我们使用一个简单的生成器表达式,计算了模型参数的总数,并将结果除以 1024**2 将其转换为 MB 单位进行显示。接下来,我们创建了一个大小为 1000x1000 的零张量,并使用 torch.Tensor.numel() 函数计算了张量元素的总数,并将结果除以 1024**2 将其转换为 MB 单位进行显示。

内存占用可视化

除了查看内存占用,有时候我们也希望将内存占用可视化,以便更好地理解和分析。下面是一个使用 mermaid 语法绘制的关系图,用于表示 GPU 内存、模型内存和张量内存的关系:

erDiagram
      GPU --o| Allocated
      GPU --o| Max Allocated
      Allocated --o| Model
      Allocated --o| Tensor

上述关系图中,GPU 表示 GPU 内存,Allocated 表示已分配的 GPU 内存,Max Allocated 表示最大已分配的 GPU 内存,Model 表示模型内存,Tensor 表示张量内存。箭头表示了它们之间的关系。

另外,我们还可以使用 mermaid 语法绘制一个旅行图,以展示模型和张量如何在内存中占用空间