×

签到

分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

【CN-PT3】Cambricon PyTorch 推理入门 小飞人2023-07-13 11:43:12 回复 查看 社区交流 干货资源
【CN-PT3】Cambricon PyTorch 推理入门
分享到:

知乎链接:https://zhuanlan.zhihu.com/p/592961107

1、Cambricon PyTorch 推理概述


Cambricon PyTorch 包含两种推理模式:Eager 模式和 JIT 模式,分别对应不同应用需求。

  • Eager 模式:使用 CNNL 作为后端,其优势是简单易用,无需量化,推理过程灵活可逐层调试。

  • JIT 模式:使用 MagicMind 作为后端,其优势是可以设置多种量化模式和多种图优化,达到最佳推理性能。

该部分和上上一篇【CN-PT1】的 2.4 章节部分一样。

2、Cambricon PyTorch 推理实践

2.1 示例介绍

本次依旧使用ResNet50,具体可见上一篇【CN-PT2】的 2.1 章节部分。

2.2 Eager 模式推理


  1. Set_device:指定 MLU 硬件设备ID

  2. Load Dataset:加载推理数据集至Host 端内存

  3. Load Model:加载网络模型和权重至 Host 端内存

  4. Model To Device:将模型权重 copy 至 Device 端

  5. Set Model To Eval:将模型转换为 eval 模式,调用 PyTorch Dispatch 和 Catch DisPatch 模块,完成算子分发

  6. Dataset To Device:为网络模型输入创建 CnnlTensor 和对应的Device 端内存空间

  7. Forward:逐算子启动 CNNL Runtime 执行推理

核心代码

import torch_mlu.core.mlu_model as ct# 设置硬件设备ct.set_device(0)# 加载模型并设置float数据类型model = models.resnet50(pretrained=True).float()# 模型加载MLU并设置推理模式model.to(ct.mlu_device()).eval()# 数据加载至MLU并推理data = data.to(ct.mlu_device(), non_blocking=True)index = traced_model(data).cpu().detach().numpy()[0].argsort()[::-1]

2.3 JIT 模式推理(PyTorchMM)

  1. 1、Set_device:指定 MLU 硬件设备ID

  2. 2、Load Dataset:加载推理数据集至Host 端内存

  3. 3、Load Model:加载网络模型和权重至 Host 端内存

  4. 4、Model To Device:将模型权重 copy 至 Device 端

  5. 5、Set Model To Eval :将模型转换为 eval 模式

  6. 6、Jit Trace:使用 MagicMind 后端进行图优化图融合,得到 MagicMind 支持的 Sub-Graph,并调用 MagicMind Builder 生成 MagicMind Model

  7. 7、Dataset To Device:为网络模型输入创建 CnnlTensor 和对应的 Device 端内存空间

  8. 8、Forward:启动 MagicMind Runtime 执行推理


核心代码

import torch_mlu.core.mlu_model as ct# 设置硬件设备ct.set_device(0)# 设置JIT算子融合ct._jit_override_can_fuse_on_mlu(True)# 加载模型并设置float数据类型model = models.resnet50(pretrained=True).float()# 模型加载MLU并设置推理模式model.to(ct.mlu_device()).eval()# jit trace jit_input = torch.randn(1,3,224,224).to(ct.mlu_device(), non_blocking=True)traced_model = torch.jit.trace(model, jit_input , check_trace=False)# 数据加载至MLU并推理data = data.to(ct.mlu_device(), non_blocking=True)index = traced_model(data).cpu().detach().numpy()[0].argsort()[::-1]

2.4 具体代码运行

可见文末相关连接3 代码库 pytorch_infer。

① 运行 eager 模式

运行上节一样的代码,参数需要调整,增加pretrained 和 evaluate

python resnet50_imagenet.py --gpu 0 --arch resnet50 --pretrained --evaluate --workers 10 /data/datasets/imagenet/

参数说明:

  • --gpu 使用第几张卡训练

  • --arch 选用架构

  • --pretrained 使用预训练模型

  • --evaluate 开启检测形式

  • --workers 线程数量,用于加速数据加载

  • 数据路径为/data/datasets/imagenet/ 下载和格式如下(使用前注意准备和替换):

image-net.org/

imagenet
  ├── train
  │   ├── n01440764
  │   ├── n01443537
  │   ├── ...
  ├── train.txt   
  ├── val
  │   ├── n01440764
  │   ├── n01443537
  │   ├── ...
  └── val.txt    #其中一条:val/n03623198/ILSVRC2012_val_00030341.JPEG 997

结果:


② 运行 jit 的融合模式

软件版本或拉取镜像需要注意是 Torch 1.6,否则不能运行MM的推理模式。据悉目前 1.9的版本没有适配该方案。

python resnet50_imagenet_mm.py --gpu 0 --arch resnet50 --pretrained --evaluate --workers 10 /data/datasets/imagenet/

参数同上,结果如下。从结果对比不难看出,结果是相同的,jit 的推理速度提升很大。

测试中遗留问题(后期再看看):

gpu选择其他卡会提示错误,比如选择卡2:Expected all tensors to be on the same device, but found at least two devices, mlu:0 and mlu:2!


说明:代码见 代码库的:cambricon_mlu_learning/13_PyTorch/pytorch_infer

相关链接

1.    在线课程:在线课程寒武纪开发者社区 (cambricon.com)

2.    文档资料:文档中心寒武纪开发者社区 (cambricon.com)

3.    代码库:pytorch_modelzoo: cambriocn pytorch训练和推理模型集合 (gitee.com)


版权所有 © 2024 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭