当前位置:   article > 正文

记训练时GPU利用率低 -> pytorch profiler分析模型性能

记训练时GPU利用率低 -> pytorch profiler分析模型性能

目录

Pytorch profiler with tensorboard.


魔改模型出现的一系列问题:


1.训练报错:参数出现在GPU & CPU中

解决:在报错位置的张量移入GPU

  1. # .to(device)
  2. # ...
  3. # self.shift = nn.Parameter(torch.tensor([0., 128., 128.]))
  4. # self.matrix = nn.Parameter(torch.from_numpy(matrix))
  5. self.shift = nn.Parameter(torch.tensor([0., 128., 128.], device=image.device))
  6. self.matrix = nn.Parameter(torch.from_numpy(matrix).to(image.device))
  7. # ...
  8. # dct_filter = torch.zeros((batch_size, channel, tile_size_x, tile_size_y))
  9. dct_filter = torch.zeros((batch_size, channel, tile_size_x, tile_size_y), device=mapper_x.device)

2.训练时,GPU利用率低,训练非常非常缓慢

(可能是CPU GPU通信导致的)

3.测试训练好的模型,load模型时出现unexpected key(s)问题

 报错原因

        保存模型参数时使用的模型状态字典(state_dict)与加载模型时使用的模型结构不匹配导致的。state_dict是一个Python字典对象,将每个模型参数的名称映射到其对应的张量值。当我们加载模型参数时,PyTorch会根据state_dict中的key与模型中的参数进行匹配,然后将参数值加载到对应的模型中。 然而,加载模型时,模型结构中没有找到与该参数名称对应的模型参数,因此出现了Unexpected key(s)的错误提示。

解决:加载模型时,手动删除不需要的key

  1. # 使用torch.load加载保存的模型状态
  2. state_dicts = torch.load(model_name)
  3. # 从保存的状态字典(state_dicts)中提取神经网络的状态字典(net)
  4. # network_state_dict = {k: v for k, v in state_dicts['net'].items() if 'tmp_var' not in k}
  5. network_state_dict = {}
  6. for k, v in state_dicts['net'].items():
  7. if 'module.inbs_couple.operations.0.r.attentionBlock.dct_layer.weight' not in k \
  8. and 'module.dct_gate.dct_trans.shift' not in k \
  9. and 'module.dct_gate.dct_trans.matrix' not in k:
  10. network_state_dict[k] = v
  11. # 使用提取的神经网络状态字典加载神经网络的参数
  12. net.load_state_dict(network_state_dict)

(这里报错的key正巧与第一步中移入GPU的张量对应,说明第一步改进存在问题啊,这里先测试模型结果,毕竟花了这么久时间钱钱跑出的模型,然后再从头开始找问题吧)


Pytorch profiler with tensorboard.

通过pytorch的profiler工具分析模型各模块运行性能

参考:

Pytorch profiler with tensorboard._pytorch profiler tensorboard-CSDN博客

pytorch profiler 性能分析 demo - 知乎 (zhihu.com)

step1.首先安装Pytorch Profiler TensorBoard plugin.(否则利用tensorboard打开时,会找不到文件,哈哈我就是忽略了这步的倒霉蛋)

pip install torch_tb_profiler

step2.根据pytorch官方文档,使用profiler来记录执行的事件

  1. from torch.profiler import profile, record_function, ProfilerActivity
  2. with torch.profiler.profile(
  3. schedule=torch.profiler.schedule(wait=2, warmup=2, active=6, repeat=1),
  4. on_trace_ready=torch.profiler.tensorboard_trace_handler(dir_name='profile/'),
  5. activities=[torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA],
  6. record_shapes=True,
  7. profile_memory=True,
  8. with_stack=True,
  9. )as prof:
  10. for i_batch, data in enumerate(dataloader):
  11. if i_batch > 2+2+6+1:
  12. print("break out")
  13. break
  14. # data load
  15. data = data.to(device)
  16. # test
  17. out = net(data)
  18. prof.step()
  19. print(f'step {i_batch}')
  20. print(prof.key_averages(group_by_stack_n=5).table(sort_by="cuda_time_total", row_limit=10))

PS:可以在任何需要性能监测的代码块外套用 record_function("label") ,如下,监测 backward()执行过程的性能:

  1. with torch.profiler.record_function("encoder"):
  2. steg_image, z_output = self.encoder(cover, secret)

step3.运行,生成trace文件于上述代码定义的文件夹下

step4. 通过tensorboard打开,trace文件

  1. tensorboard --logdir profile
  2. # autodl服务器平台下
  3. tensorboard --logdir profile --port 6007

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/267679
推荐阅读
相关标签
  

闽ICP备14008679号