PyTorch Yolov3 移植步骤 ReadMe

PyTorch Yolov3 移植步骤 ReadMe

此Demo以Yolov3为例,介绍将模型移植到MLU上的步骤,本教程为比赛专项,作为参赛者模型适配的基本指南。
难易程度: |实验人次:126

注意事项

本教程为逐梦杯比赛专用教程,相关路径参考初赛开发平台。

 

比赛报名:

https://cmpmatchweb.digilinx.net.cn/cybs_home.html?id=20

 

比赛专题页:

https://competition.cambricon.com/

 

一、配置环境

声明环境变量及进入虚拟环境(该操作每次进入docker都需要进行)

   cd /workspace/volume/private/sdk/cambricon_pytorch
   source env_pytorch.sh

二、准备模型

demo位置:/workspace/volume/private/00_Yolov3_example

【注】 参赛试题位置:/workspace/algorithm/ (此目录为只读,不可操作) 需从 /workspace/algorithm/ 拷入 /workspace/volume/private/ 进行调试

准备yolov3的模型:需要将原darknet框架生成yolov3的权重yolov3.weight转换为pytorch可读取的pth格式。 本demo已经准备好yolov3.pth模型保存在00_Yolov3_example/model/online/路径下。

【注】 模型必须以pth的格式运行 ,pth中只有权重,不保存模型结构。

三、在线推理

在线推理的代码在online/yolov3目录下。

3.1 模型量化

cd online/yolov3/
bash quantize.sh #进行量化

模型在MLU上运行需要先进行量化,cambricon-pytorch提供了相应的接口来量化模型的权重。

model = models.object_detection.yolov3(img_size=416, conf_thres=0.001, nms_thres=0.5)
model.load_state_dict(torch.load(weight_path),strict=False)
mean = [0.0, 0.0, 0.0]
std  = [1.0, 1.0, 1.0]
# 调用量化工具进行量化
qconfig = {'use_avg':False, 'data_scale':1.0, 'mean': mean, 'std': std, 'per_channel': per_channel, 'firstconv':True}
quantized_model = mlu_quantize.quantize_dynamic_mlu(model, qconfig, dtype=dtype, gen_quant=True)   
......
# 保存量化模型
checkpoint = quantized_model.state_dict()
torch.save(checkpoint,'{}/yolov3_int8.pth'.format(opt.quantized_model_path))

量化过程需要在CPU上完成,此demo的量化后模型yolov3_int8.pth保存在../../model/online/目录下。

3.2 在线推理

完成量化后即可加载量化模型进行推理。 可通过python test.py -h 查看参数定义

bash run_online_accuracy.sh  #进行在线推理精度测试。
bash run_online_performance.sh  #进行在线推理性能测试。
cd ../..

模型和数据需要通过.to(torch_mlu.core.mlu_model.mlu_device())来指定设备为MLU。

model = mlu_quantize.quantize_dynamic_mlu(model)
model.load_state_dict(torch.load(quantized_weight_path),strict=False)
model.to(torch_mlu.core.mlu_model.mlu_device())
......
imgs = Variable(imgs.type(torch.HalfTensor)) if opt.half_input and opt.mlu else Variable(imgs.type(Tensor))
imgs = imgs.to(torch_mlu.core.mlu_model.mlu_device())
outputs = model(imgs)
......

利用 JIT 模块可以实现融合模式。融合模式会对整个网络构建一个静态图,并对静态图进行优化,有效提高性能。

# trace network
example = torch.randn(opt.batch_size, 3, img_size, img_size).float()
trace_input = torch.randn(1, 3, img_size, img_size).float()
if opt.half_input:
    example = example.type(torch.HalfTensor)
    trace_input = trace_input.type(torch.HalfTensor)
model = torch.jit.trace(model, trace_input.to(torch_mlu.core.mlu_model.mlu_device()), check_trace = False)

四、离线推理

离线推理的代码在offline/yolov3/src目录下。

4.1 编译代码

cd offline/
mkdir build
cd build
cmake ..
make
cd ..

完成编译后会在00_Yolov3_example/offline/build/yolov3/src目录下生成yolov3_offline_multicore可执行文件。

 

4.2 生成离线模型及推理

cd yolov3/
bash run_get_accuracy_offlinemodel.sh  #离线模型yolov3.cambricon保存在../../model/offline/目录下
bash run_offline_accuracy.sh #进行离线推理精度测试
bash run_get_performance_offlinemodel.sh #离线模型yolov3.cambricon保存在../../model/offline/目录下
bash run_offline_performance.sh #进行离线推理性能测试

通过调用torch_mlu.core.mlu_model.save_as_cambricon(model_name)接口,在进行jit.trace时会自动生成离线模型。生成的离线模型一般是以model_name.cambricon命名的离线模型文件,其中包含一个名为 model_name 的模型。

torch_mlu.core.mlu_model.save_as_cambricon('yolov3')

离线模型运行代码的编写可以参考CNRT文档(离线模型示例程序 — 寒武纪运行时库用户手册 4.10.0 文档 (cambricon.com)中的示例。

申 请 试 用