使用前准备
准备软件
准备数据
以下采集的数据为内存泄漏的数据。
- 使用msLeaks工具执行如下命令,在每个Step中申请一个大小为4 x 10MB的Tensor,并追加到全局变量leak_mem_list列表中(不会随train_one_step释放),采集3个Step的Python Trace数据。
msleaks --level=0,1 --events=alloc,free,access,launch --analysis=decompose --data-format=db python test.py
其中test.py的示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
import torch import torch_npu from torchvision.models import resnet50 import msleaks import msleaks.describe as describe leak_mem_list = [] def train_one_step(model, optimizer, loss_fn, device): # 对代码块做标记,代码块内所有内存申请事件的owner属性都会打上标签leaks_mem describe.describer(owner="leaks_mem").__enter__() # 内存泄漏代码段 leak_mem_list.append(torch.randn(1024 * 1024 * 10, dtype=torch.float32).to(device)) # 结束标记 describe.describer(owner="leaks_mem").__exit__(None, None, None) # 单次训练代码段 inputs = torch.randn(1, 3, 224, 224).to(device) labels = torch.rand(1, 10).to(device) pred = model(inputs) loss_fn(pred, labels).backward() optimizer.step() optimizer.zero_grad() def train(model, optimizer, loss_fn, device, steps=1): for i in range(steps): train_one_step(model, optimizer, loss_fn, device) device = torch.device("npu:0") torch.npu.set_device(device) # 设置device model = resnet50(pretrained=False, num_classes=10).to(device) # 加载模型 optimizer = torch.optim.Adam(model.parameters(), lr=1e-2) # 定义优化器 loss_fn = torch.nn.CrossEntropyLoss() # 定义损失函数 # 开启采集python函数调用数据 msleaks.tracer.start() train(model, optimizer, loss_fn, device, steps=3) # 开始训练 # 停止采集python函数调用数据 msleaks.tracer.stop()
- 采集完成后,输出db格式的文件。
- 将文件下载至本地保存。
父主题: 内存泄漏分析