昇腾社区首页
中文
注册
开发者
下载

使用前准备

准备软件

准备数据

以下采集的数据为内存泄漏的数据。

  1. 使用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()
    
  2. 采集完成后,输出db格式的文件。
  3. 将文件下载至本地保存。