本章介绍Cambricon PyTorch的API运行模式、使用方法以及支持的典型网络的示例。
支持的典型网络
类别 |
名称 |
|---|---|
分类网络 |
PreActResNet50、PreActResNet101、inception_v3、vgg16、mobilenet、mobilenet_v2、mobilenet_v3、googlenet、densenet121、squeezenet1_1、resnet18、resnet34、resnet50、resnet101、resnet152、efficientnet、resnext50_32x4d、resnext101_32x8d |
检测网络 |
SSD、SSD MobileNet v1、SSD MobileNet v2、YOLOv2、YOLOv3、YOLOv4、YOLOv5、EAST、MTCNN、Faster-RCNN(fpn)、centernet |
超分网络 |
FCN8s、SegNet、VSDR、FSRCNN |
其他网络 |
BERT |
注意
Python API使用
Cambricon PyTorch 以不改变原有PyTorch接口行为为原则,在Catch扩展包中添加MLU设备以及MLU算子、在原生PyTorch上打补丁,实现了PyTorch的大部分特性。
Cambricon PyTorch支持CPU和MLU设备类型。可以使用to方法将CPU设备上的tensor以及nn.Module转为MLU对象。
Cambricon PyTorch支持将输入tensor设置成HalfTensor或FloatTensor。Half模式仅支持MLU和CUDA,不支持CPU。建议使用HalfTensor输入,因为在MLU上Half类型的输入tensor运算比Float类型输入tensor运算性能更优。目前每个网络的demo程序中都添加了一个half_input参数,用于将输入tensor可以设置成HalfTensor或FloatTensor。可使用以下方式进行FloatTensor和HalfTensor相互转换。
a = torch.rand((1,3,224,224), dtype=torch.float)
a_half = a.type(torch.HalfTensor)
a_float = a_half.type(torch.FloatTensor)
以加法算子为例,使用Python API运行如下:
import torch
import torch_mlu.core.mlu_model as ct
a = torch.rand((1,3,224,224), dtype=torch.float)
b = torch.rand((1,3,224,224), dtype=torch.float)
out_mlu = a.to(ct.mlu_device()) + b.to(ct.mlu_device())
out_cpu = out_mlu.cpu()
以上代码展示了如何使用MLU设备完成加法运算,a.to(ct.mlu_device()) 操作实际上是将a转移至MLU。
对torch.nn模块中的操作,可执行如下代码:
import torch
import torch_mlu.core.mlu_model as ct
input = torch.randn(4,10,dtype=torch.float)
relu = torch.nn.ReLU().float()
relu_mlu = relu.to(ct.mlu_device())
out_mlu = relu_mlu(input.to(ct.mlu_device()))
out_cpu = out_mlu.cpu()
上述代码展示了如何使用MLU设备完成ReLU激活操作。
在线推理
在线逐层和融合推理
在线推理指使用原生PyTorch提供的Python API直接运行网络。在线推理包括逐层模式和融合模式两种。
逐层模式使用Python API逐个调用每个算子时,每个MLU算子都在底层的C++接口中经过创建句柄、编译指令、拷贝输入、前向计算、拷贝输出等过程。逐层模式便于观察数据的流动和变化,但是效率较低。
融合模式将所有算子作为一个fusion算子,只对fusion算子执行编译指令过程,减少了小算子之间的 数据拷贝(不仅是主从设备间,还包括RAM和DDR之间的拷贝),极大地提高了效率。使用JIT模式只需对整个网络进行 一次编译,避免了多次编译产生的开销。
算子测试示例
下面以卷积算子为例,执行在线逐层测试和在线融合测试。
在Cambricon Catch中已经添加了常用网络需要的MLU算子,每个MLU算子都分别用单个文件添加了对该算子的测试。 每个文件均可使用Python直接运行并测试。
执行 <catch>/test/run_test.py 脚本可以对所有MLU算子进行测试:
python run_test.py --ignore_cnnl_blacklist --ignore_cnml_blacklist
执行单个脚本即对单个算子,例如abs算子,进行测试:
python test_abs.py
若不需要测试具体某个函数,在其函数顶部加上@unittest.skip(“not test”)即可。
在 <catch>/test/cnml/op_test/ 和 <catch>/test/cnnl/op_test/ 中包含了对所有MLU单算子的测试。下述代码是对MLU卷积算子的测试。
def test_conv2d_int8(self):
in_chl_ = random.randint(1, 100)
out_chl_ = random.randint(1, 100)
batch_= random.randint(1, 16)
kernel_size_ = random.randint(1, 10)
h_shape_ = random.randint(100, 1000)
w_shape_ = random.randint(100, 1000)
in_shape = (batch_, in_chl_, h_shape_, w_shape_)
weight_shape = (out_chl_, in_chl_, kernel_size_, kernel_size_)
bias_shape = (out_chl_)
inputs = torch.rand(in_shape, dtype=torch.float)
filters = torch.rand(weight_shape, dtype=torch.float)
bias = torch.ones(bias_shape, dtype=torch.float)
_,input_scale = self.get_scale_int8(inputs)
_,filter_scale = self.get_scale_int8(filters)
# convert input tensor from cpu to mlu
inputs_mlu = self.to_mlu(inputs)
stride_v = [1,4]
padding_v = [2,2]
dilation_v = [1,1]
groups_v = 1
# pack using Parameter
weight_p = Parameter(filters)
bias_p = Parameter(bias)
scale_p = Parameter(torch.tensor([input_scale, filter_scale]))
qmode_p = Parameter(torch.tensor([1], dtype=torch.int), requires_grad=False)
# instance CPU's Conv2d
conv2d_cpu = torch.nn.Conv2d(in_chl_, out_chl_, kernel_size_, stride=stride_v, padding=padding_v, dilation=dilation_v, groups=groups_v)
# instance MLU's Conv2d
conv2d_mlu = torch_mlu.core.quantized.modules.MLUConv2d(in_chl_, out_chl_, kernel_size_, stride=stride_v, padding=padding_v, dilation=dilation_v, groups=groups_v)
# assign weight/bias to CPU's Conv2d
conv2d_cpu.weight, conv2d_cpu.bias = weight_p, bias_p
# assign weight/bias/scale/qmode to MLU's Conv2d
conv2d_mlu.weight, conv2d_mlu.bias, conv2d_mlu.scale, conv2d_mlu.quantized_mode = weight_p, bias_p, scale_p, qmode_p
output_cpu = conv2d_cpu(inputs)
# layer-by-layer testing
out_mlu = conv2d_mlu.to(ct.mlu_device())(inputs_mlu)
self.assertTensorsEqual(output_cpu, out_mlu.cpu(), 0.02, use_MSE = True)
# fusion testing
conv2d_trace = torch.jit.trace(conv2d_mlu.to(ct.mlu_device()), inputs_mlu, check_trace=False)
out_fusion = conv2d_trace(inputs_mlu)
self.assertTensorsEqual(output_cpu, out_fusion.cpu(), 0.02, use_MSE = True)
上述代码中,构建了一个MLUConv2d层作为网络,先直接通过逐层模式进行测试,后通过trace的形式,生成一个tracedModel。在tracedModel中保存了网络所对应的融合图,然后直接给定MLU的输入tensor就可以完成在MLU设备上的运算。通过trace的形式,可以只进行一次指令编译和生成,效率更高。
分类网络在线示例
<catch>/examples/online/test_clas_online.py 脚本用于对目前Cambricon PyTorch中支持的分类网络进行在线测试,使用的数据集为imagenet。运行分类网络步骤如下:
设置数据集路径和网络权重路径。
# set pretrained model path export TORCH_HOME = "YOUR TORCH HOME PATH" export IMAGENET_PATH = "YOUT IMAGENET_PATH"
执行以下脚本运行分类网络。mmode参数可以设置为运行CPU、MLU逐层、MLU融合模式,本例中为运行MLU逐层模式。
python test_clas_online.py -dataset_path $IMAGENET_PATH -network resnet50 -mmode MLU -image_number 10
test_clas_online.py中可设置以下参数:
-dataset_path:设置数据集路径。
-images:设置样本路径。
-image_number:设置实际希望运行的样本数量。
-batch_size:设置每次推理的样本数量。
-mmode:选择运行模式。可设置为CPU、MLU、MFUS,分别表示CPU,MLU在线逐层和MLU在线融合。
-network:选择要运行的网络。
-mcore:选择设备。默认为MLU270。
-quantized_mode:选择权重的量化模式。可设置为0、1、2、3、4,分别表示原始网络权重、int8量化、int16网络、分通道int8网络、分通道int16网络。默认值为1。
-half_input:设置输入tensor是Float或Half类型。
-core_number:设置运行网络所运用的MLU核心数。
-input_channel_order:选择输入图片通道顺序。默认为RGBA。
-quantization:选择网络是否需要量化。当选择量化模式时,mmode参数要选择CPU模式。
-quantized_model_path:设置量化权重要保存的路径。
注意
image_number必须为batch_size的整数倍。
Cambricon PyTorch支持的分类网络均已添加到 <vision>/torchvision/models/quantization 目录下,安装vision 后可使用以下方法获得具体的网络结构以及训练好的权重。
import torchvision.models as models
from torchvision import transforms
nets = ['resnet34','PreActResNet50','PreActResNet101','inception_v3','resnet50',
'vgg16','mobilenet','mobilenet_v2', 'mobilenet_v3', 'resnet101',
'googlenet', 'densenet121', 'squeezenet1_1', 'resnet18', 'resnet152',
'resnext50_32x4d', 'resnext101_32x8d']
for net_name in nets:
quantized = True if args.mmode != "CPU" else False
net = getattr(models.quantization, net_name)(pretrained=True, quantize=quantized)
net.eval().float()
检测网络在线示例
<catch>/examples/online/ 目录下存放了是每个检测网络的实现,在此目录下执行各个网络,首先需要设置环境变量指定权重与数据集路径。
# set pretrained model path
export TORCH_HOME = "YOUR TORCH_HOME PATH"
export VOC_DEVKIT = "YOUR VOC_DEVKIT PATH"
export COCO_PATH_PYTORCH = "YOUR COCO PATH"
export FDDB_PATH_PYTORCH = "YOUR FDDB PATH"
export ICDAR_PATH_PYTORCH = "YOUR ICDAR PATH"
Cambricon PyTorch目前支持SSD、SSD Mobilenet v1、SSD Mobilenet v2、YOLOv2、YOLOv3、YOLOv4、YOLOv5、MTCNN、EAST、Faster-RCNN(fpn)检测网络,下面分别介绍每个网络的在线逐层示例。
SSD
<catch>/examples/online/ssd 目录下存放的是SSD网络的实现,执行以下脚本即可在MLU上运行SSD网络的在线推理。
每个类别的检测结果会保存在该目录的result文件夹中,每张图片检测时间以及每个类别的AP和meanAP会输出到终端。
python eval.py --voc_root $VOC_DEVKIT --mlu true --jit true --save_pt false --offline_mode false --image_number 4952 --quantized_mode 1 --quantization false --input_channel_order 0
参数解释
--voc_root:设置数据集的路径。
--mlu:设置为true时即为选择在MLU上运行。不设置jit参数的情况下运行在线逐层的模式。
--jit:设置为true时即为选择使用jit运行融合模式,当参数
mlu也为True的情况下运行在线融合的模式。--image_number:设置实际希望运行的样本数量。
--half_input:设置输入tensor为Float或Half类型。
--quantized_mode:设置使用的权重为原始权重、int8、int16、分通道int8和分通道int16量化的权重。
--quantization:设置是否使能量化模式。量化模式时参数--mlu和--jit都必须设置成false。
--input_channel_order:选择输入图片通道顺序。默认为RGBA。
--batch_size:设置模型运行的batch数。
SSD Mobilenet V1
<catch>/examples/online/ssd_mobilenet_v1 目录下存放的是SSD Mobilenet V1网络的实现,执行当前脚本即可在MLU上运行在线逐层模型。
执行完该脚本后,每个类别的检测AP以及meanAP会输出到终端。
python test_on_coco.py --dataset_root $COCO_PATH_PYTORCH/COCO --mmode MFUS --image_number 1000 --batch_size 1 --save_pt false --quantized_mode 1 --core_number 1 --half_input 0 --quantization false --input_channel_order 0
参数解释
--dataset_root:设置COCO数据集。
--mmode:设置为CPU、MLU、MFUS分别表示运行CPU、MLU逐层、MLU融合模式。不设置其他参数情况下即为运行在线逐层模型。
有关其他参数的解释信息,参见 python eval.py脚本的 参数解释 。
SSD Mobilenet v2
<catch>/examples/online/ssd_mobilenet_v2 目录下存放的是SSD Mobilenet v2网络的实现,执行以下脚本:
python eval_ssd.py --net mb2-ssd-lite --dataset $VOC_DEVKIT --label_file ./labelmap.txt --mlu true --jit true --offline_mode false --half_input 0 --quantized_mode 1 --batch_size 1 --image_number 4952 --input_channel_order 0
参数解释
--net:运行的网络结构。
--dataset:测试的数据集目录,指向voc数据集。
--label_file:数据集标签文件。
有关其他参数的解释信息,参见 python eval.py脚本的 参数解释 。
YOLOv2
<catch>/examples/online/yolov2 目录下存放的是YOLOv2网络的实现,执行以下脚本:
python valid.py --mlu true --jit true --save_pt false --offline_mode false --image_number 1000 --dataset_path $VOC_DEVKIT --quantized_mode 1 --quantization false --input_channel_order 0
参数解释
有关其他参数的解释信息,参见 python eval.py脚本的 参数解释 。
在 <catch>/examples/online/yolov2 目录下运行 scripts/voc_eval.py 脚本可以计算每个类别的AP以及meanAP并输出到终端,如下所示。
python scripts/voc_eval.py results/comp4_det_test_ 1000 $VOC_DEVKIT
YOLOv3
<catch>/examples/online/yolov3 目录下存放的是YOLOv3网络的实现。在该目录下执行以下脚本即可在MLU上运行YOLOv3网络的在线模式,每个类别的AP以及meanAP会输出到终端。
python test.py --mlu true --jit true --save_pt false --offline_mode false --batch_size 1 --core_number 1 --ann_dir $COCO_PATH_PYTORCH/COCO --image_number 1000 --half_input 1 --quantized_mode 1 --coco_path $COCO_PATH_PYTORCH/COCO --quantization false --input_channel_order 0
参数解释
--ann_dir:指定annotation file的路径。
有关其他参数的解释信息,参见 python eval.py脚本的 参数解释 。
YOLOv4
<catch>/examples/online/yolov4 目录下存放的是YOLOv4网络的实现。在此目录下执行以下脚本即可在MLU上运行YOLOv4网络的在线融合,并将meanAP精度输出到终端。
python eval.py -half_input 0 -quantized_mode 1 -datadir $COCO_PATH_PYTORCH/COCO
参数解释
有关该脚本的参数解释信息,参见 python eval.py脚本的 参数解释 。
规模限制
运行YOLOv4网络的前向融合推理时,core_number和batch_size需设置如下:
MLU270:core_number可设置为1、4或16,batch_size可设置为1、4。
MLU220:core_number可设置为1,batch_size可设置为1。
YOLOv5
<catch>/examples/online/yolov5 目录下存放的是YOLOv5网络的实现。在此目录下执行以下脚本即可在MLU上运行YOLOv5网络的在线融合,并将meanAP精度输出到终端。
python test.py --mlu true --jit true --save_pt false --offline_mode false --batch_size 16 --core_number 16 --ann_dir $COCO_PATH_PYTORCH/COCO --image_number 4992 --half_input 0 --quantized_mode 2 --coco_path $COCO_PATH_PYTORCH --quantization false --input_channel_order 0
参数解释
有关该脚本的参数解释信息,参见 python eval.py脚本的 参数解释 。
MTCNN
<catch>/examples/online/mtcnn 目录下存放的是MTCNN网络的实现。在此目录下执行以下脚本即可在MLU上运行MTCNN网络的在线模式,运行评估脚本,将每个类别的AP以及meanAP输出到终端。
python test.py --mlu true --jit true --quantized_mode 1 --img_num 2845 --fddb_path $FDDB_PATH_PYTORCH --quantization false
参数解释
有关其他参数的解释信息,参见 python eval.py脚本的 参数解释 。
export SCRIPTS_PATH="../../offline/scripts/"
python $SCRIPTS_PATH/meanAP_FDDB.py ./eval/FDDB_dets.txt $FDDB_PATH_PYTORCH/FDDB/ellipseList.txt ./mtcnn_roc.jpg
EAST
<catch>/examples/online/east 目录下存放的是EAST网络的实现。在此目录下执行以下脚本即可在MLU上运行EAST网络的在线融合,并将hmean精度输出到终端。
python eval.py --mlu 1 --jit 1 --save_pt 0 --offline 0 --core_number 1 --batch_size 1 --half_input 0 --quantized_mode 1 --img_num 500 -input_channel_order 0
参数解释
有关该脚本的参数解释信息,参见 python eval.py脚本的 参数解释 。
规模限制
运行EAST网络的前向融合推理时,core_number和batch_size需设置如下:
MLU270:core_number可设置为1、4或16,batch_size可设置为1、4或16。
MLU220:core_number可设置为1或4,batch_size可设置为1或4。
CenterNet
<catch>/examples/online/centernet 目录下存放的是CenterNet网络的实现。在此目录下打开 src 文件夹,执行以下脚本即可在MLU上运行CenterNet网络的在线融合,并将精度输出到终端。
python test.py ctdet --arch hourglass --anno_dir $COCO_PATH_PYTORCH --coco_path $COCO_PATH_PYTORCH --batch_size 4 --core_number 16 --use_mlu 1 --jit 1 --half_input 0
参数解释
有关该脚本的参数解释信息,参见python eval.py脚本的 参数解释 。
Faster-RCNN
<catch>/examples/online/faster-rcnn/ 目录下存放的是Faster-RCNN网络的实现,在此目录下执行以下脚本即可在MLU上运行Faster-RCNN(fpn)网络的在线融合,并将每个类别的AP以及meanAP输出到终端。
python test_faster-rcnn.py --mlu true --jit true --save_pt false --offline_mode false --batch_size 1 --ann_dir $COCO_PATH_PYTORCH/COCO --image_number 1000 --dump false --half_input 0 --quantization false --img_size 800 --quantized_mode 1 --coco_path $COCO_PATH_PYTORCH --input_channel_order 0
参数解释
有关该脚本的参数解释信息,参见 python eval.py脚本的 参数解释 。
规模限制
运行Faster-RCNN网络的前向融合推理时,core_number和batch_size需设置如下:
MLU270:core_number可设置为1、4或16,batch_size可设置为1或4。
MLU220:core_number可设置为1或4,batch_size可设置为1。
注意事项
由于该网络中使用的性能优化后的ROI_Align算子只支持batch_size=1的数据规模,在运行网络多batch前向推理的时候使用了如下逻辑:
在前向推理运行到该算子时,将数据按照batch_size(N维)进行拆分;
对每一个batch的数据进行ROI_Align计算;
获得每一个batch的计算结果后,将它们按照N维拼接起来从而获得该层多batch的输出数据。
下列代码是在该算子对多batch数据处理的逻辑:
result = []
for i in range(batch_size):
result.append(torch.ops.torch_mlu.multiscale_roialign(input_feature_map[i],
input_rois[i],
num_channels,
...))
result_multibatch = torch.cat(tuple(result), dim = 0)
return result_multibatch
具体实现方法请参考 <vision>/torchvision/ops/poolers.py 中class MultiScaleRoIAlign的前向函数。
超分网络在线示例
<catch>/examples/online/ 目录存放的是每个超分网络的实现。在此目录下执行各个网络,首先需设置环境变量指定权重与数据集路径。
# set pretrained model path
export TORCH_HOME = "YOUR TORCH_HOME PATH"
export VOC_DEVKIT = "YOUR VOC_DEVKIT PATH"
export SET5DATA = "YOUR SET5 PATH"
Cambricon PyTorch目前支持FCN8s、SegNet、VDSR、FSRCNN超分网络。
下面分别介绍每个网络的在线逐层示例。
FCN8s
<catch>/examples/online/fcn8s 目录下存放的是FCN8s网络的实现,执行以下脚本即可在MLU上运行FCN8s网络的在线推理。
每张图片的超分结果会保存在指定目录下,测试数据集的mIoU会输出到终端。
python evaluate.py -dataset_path $VOC_DEVKIT -images ../../data/voc2012/file_list_736 -image_number 736 -quantized_mode 1 -core_number 16 -mmode MFUS -batch_size 1 -half_input 1
参数解释
-dataset_path:设置数据集的路径。
-images:设置测试集file_list路径。
-image_number:设置实际希望运行的样本数量。
-quantized_mode:设置使用的权重为原始权重、int8、int16、分通道int8和分通道int16量化的权重。
-mmode:设置网络运行模式,支持设置’CPU’,‘MLU’,‘MFUS’三种模式。
-quantization:设置是否使能量化模式。量化模式时参数-mmode必须设置成’CPU’。
-offlinemodel:设置是否生成离线模型。生成离线模型时参数-mmode必须设置成’MFUS’。
-mname:生成离线模型的名称。
-mcore:选择设备,默认是MLU270。
-batch_size:指定batch size。此处的batch_size表示每次分发给MLU的样本数量,MLU会自动分配到所使用的每个核上。
-core_number:设置运行网络时用到的MLU核数。
-half_input:设置输入tensor为Float或Half类型。
-image_height:设置输入图片高度。
-image_width:设置输入图片宽度。
-output_path:设置输出结果保存路径。
SegNet
<catch>/examples/online/segnet 目录下存放的是SegNet网络的实现。执行以下脚本即可在MLU上运行SegNet网络的在线推理。
每张图片的超分结果会保存指定目录下,测试数据集的mIoU会输出到终端。
python evaluate.py -dataset_path $VOC_DEVKIT -images ../../data/voc2012/file_list_1449 -mmode MFUS -quantized_mode 1 -image_number 1449 -core_number 16 -batch_size 1 -half_input 1
参数解释
有关该脚本的参数解释信息,参见 python evaluate.py脚本的 参数解释 。
VDSR
<catch>/examples/online/vdsr 目录下存放的是VDSR网络的实现,执行以下脚本即可在MLU上运行VDSR网络的在线推理。
每张图片的超分结果会保存在out目录下,测试数据集的mIoU会输出到终端。
python eval.py -mmode MFUS -quantized_mode 1 -quantization False -image_number 5 -batch_size 4 -core_number 4 -dataset $SET5DATA -images $SET5DATA/data_list.txt
参数解释
有关该脚本的参数解释信息,参见 python evaluate.py脚本的 参数解释 。
FSRCNN
<catch>/examples/online/fsrcnn 目录下存放的是FSRCNN网络的实现,执行以下脚本即可在MLU上运行FSRCNN网络的在线推理。
每张图片的超分结果会保存在当前目录下,测试数据集的mIoU会输出到终端。
python test.py --image_file "data_list.txt" --quantization 0 --device mlu --jit 1 --core_number 1 --batch_size 16 --save_img 0 --half_input 1 --quantized_mode 1 --save_pt 0 --save_img 1
参数解释
有关该脚本的参数解释信息,参见 python evaluate.py脚本的 参数解释 。
自然语言处理网络在线示例
<catch>/examples/online/bert目录下存放的是BERT网络的实现,在此目录下执行以下脚本。此示例中,0为推理模式,8为batch_size,128为seq_length。
./run_squad.sh 0 8 128
离线推理
离线推理指序列化已编译好的算子到离线文件,生成离线模型。离线模型不依赖于PyTorch框架,只基于CNRT(Cambricon Neuware Runtime Library,寒武纪运行时库)单独运行。离线模型为.cambricon文件,生成离线模型可使用Cambricon PyTorch的Python接口将模型转为离线模型。
有关如何生成离线模型的信息,参见 离线模型生成工具 。离线推理示例程序只展示了部分CNRT相关的接口,实际使用时要考虑多种其他问题。更多信息,参见《寒武纪CNRT开发者手册》。
离线推理示例程序位于 <catch>/examples/offline/ 路径下。对于离线模型的多核设置,使用genoff.py脚本设置 batch_size 、 core_number 和 input_format 参数,CNRT会在推理时自动分配最优的软硬件资源。要编译示例程序,请执行 ./scripts/build_offline.sh。
在多核离线示例程序运行中可设置以下参数:
-batch_size:指定batch size。此处的batch_size表示每次分发给MLU的样本数量,MLU会自动分配到所使用的每个核上。
-core_number:设置运行网络时用到的MLU核数。
-input_format:指定运行网络时输入图片的通道顺序。
batch_size 和 core_number 参数只针对多核示例程序,在多核示例执行时添加参数运行。以下小节介绍示例程序使用介绍和参数详解。
离线分类示例
<catch>/examples/offline/build/clas_offline_multicore/clas_offline_multicore 是运行在寒武纪芯片上,执行不同深度学习模型进行分类识别的离线多核示例程序。程序执行分类结果将会显示打印。以下为分类程序运行命令和参数详解:
./clas_offline_multicore -offlinemodel offline.cambricon -images file_list_for_release -dataset_path $IMAGENET_PATH -labels synset_words.txt -simple_compile 1 -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要分类图片的路径。
-dataset_path:数据集的路径。
-labels:imagenet的标记文件。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络SSD示例
ssd_offline_multicore是检测网络SSD的离线多核示例程序。以下为运行命令和参数详解。
../build/ssd/ssd_offline_multicore -offlinemodel offline.cambricon -dataset_path $COCO_PATH_PYTORCH -images file_list_for_release -labels labelmap_voc.prototxt -confidence 0.6 -simple_compile 1 -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络SSD MobileNet v1示例
ssd_mobilenet_v1_offline_multicore是检测网络SSD MobileNet v1的离线多核示例程序。以下为运行命令和参数详解:
../build/ssd_mobilenet_v1/ssd_mobilenet_v1_offline_multicore -offlinemodel ssd_mobilenet_v1.cambricon -dataset_path $COCO_PATH_PYTORCH -images file_list_for_release -labels label_map_coco.txt -confidence 0.3 -simple_compile 1 -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件。
-simple_compile:是否使用简单编译。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络SSD Mobilenet v2示例
ssd_mobilenet_v2_offline_multicore是检测网络SSD Mobilenet v2的示例程序。以下为运行命令和参数详解:
../build/ssd_mobilenet_v2/ssd_mobilenet_v2_offline_multicore -offlinemodel ssd_mobilenet_v2.cambricon -dataset_path $VOC_DEVKIT -images file_list_for_release -labels labelmap_voc.prototxt -confidence 0.02 -simple_compile 1 -input_format 0
本离线模型参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images: 一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件。
-simple_compile:是否使用简单编译,1表示使用简单编译。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络YOLOv2示例
yolov2_offline_multicore为离线多核示例程序。以下为运行命令和参数详解。
../build/yolov2/yolov2_offline_multicore -offlinemodel yolov2.cambricon -images file_list_for_release -dataset_path $VOC_DEVKIT -labels label_map.txt -dump 1 -simple_compile 1 -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-dump:是否保存输出的图片, 1表示保存,0表示不保存。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络YOLOv3示例
yolov3_offline_multicore是检测网络YOLOv3的示例为离线多核示例程序。以下为运行命令和参数详解:
../build/yolov3/yolov3_offline_multicore -offlinemodel yolov3.cambricon -dataset_path $COCO_PATH_PYTORCH/COCO -images file_list_for_release -labels label_map_coco.txt -simple_compile 1 -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络YOLOv4示例
yolov4_offline_multicore是检测网络YOLOv4的示例程序。以下为检测程序运行命令和参数详解:
../build/yolov4/yolov4_offline_multicore -offlinemodel yolov4.cambricon -dataset_path $COCO_PATH_PYTORCH/COCO/val2017/ -images ../../data/coco2017/file_list_for_release -labels label_map_coco.txt -simple_compile 1 -outputdir ${outtxt} -input_format 0
本离线示例的参数详解如下:
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-dataset_path:数据集的路径。
-offlinemodel:离线模型的文件名称。
-labels:检测的分类标记文件。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-outputdir:模型数据输出目录。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络YOLOv5示例
yolov5_offline_multicore是检测网络YoloV5的示例为离线多核示例程序。以下为检测程序运行命令和参数详解:
- ::
../build/yolov5/yolov5_offline_multicore -offlinemodel yolov5.cambricon -dataset_path $COCO_PATH_PYTORCH -images ../../data/coco/val2017/file_list_for_release -labels label_map_coco.txt -simple_compile 1 -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
检测网络MTCNN示例
mtcnn-offline是检测网络MTCNN的示例程序。以下为运行命令和参数详解。
../build/mtcnn/mtcnn-offline -fddb_path $FDDB_PATH_PYTORCH -images file_list_for_release -models model_list_test -threads 8
本离线示例的参数详解如下:
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-fddb_path:数据集的路径。
-models:一个文本文件的名称,该文件中应当包含若干行,每行都是一个离线cambricon文件的名称。
-threads:使能多线程功能并指定网络运行的线程数。
检测网络EAST示例
east_offline_multicore是检测网络EAST的示例程序。以下为运行命令和参数详解:
../build/east/east_offline_multicore -offlinemodel east.cambricon -dataset_path $ICDAR_PATH_PYTORCH/ -images file_list_for_release -simple_compile 1 -outpurdir ${outtxt} -input_format 0
本离线示例的参数详解如下:
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-dataset_path:数据集的路径。
-offlinemodel:离线模型的文件名称。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-outputdir:模型数据输出目录。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道顺序。0表示运行网络时输入图片的通道顺序为RGB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
规模限制
运行EAST网络的离线推理时,core_number和batch_size需设置如下:
MLU270:core_number可设置为1、4或16,batch_size可设置为1、4或16。
MLU220:core_number可设置为1或4,batch_size可设置为1或4。
检测网络Faster-RCNN(fpn)示例
faster_rcnn_fpn_offline_multicore是检测网络Faster-RCNN(fpn)的示例程序。以下为检测网络运行命令和参数详解:
../build/faster-rcnn/faster_rcnn_fpn_offline_multicore -offlinemodel frcnn.cambricon -dataset_path $COCO_PATY_PYTORCH -images file_list_for_release -labels label_map_coco.txt -outputdir ./ -simple_compile 1 -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的文件,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件(指向label_map_coco.txt)。
-outputdir:模型数据输出目录。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道书序。0表示运行网络时输入图片的通道顺序为GRB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
规模限制
运行Faster-RCNN网络的离线推理时,core_number和batch_size需设置如下:
MLU270:core_number可设置为1、4或16,batch_size可设置为1或4。
MLU220:core_number可设置为1或4,batch_size可设置为1。
注意事项
由于该网络中使用的性能优化后的ROI_Align算子只支持batch_size=1的数据规模,在运行网络多batch前向推理的时候使用了如下逻辑:
在前向推理运行到该算子时,将数据按照batch_size(N维)进行拆分;
对每一个batch的数据进行ROI_Align计算;
获得每一个batch的计算结果后,将它们按照N维拼接起来从而获得该层多batch的输出数据。
下列代码是在该算子对多batch数据处理的逻辑:
result = []
for i in range(batch_size):
result.append(torch.ops.torch_mlu.multiscale_roialign(input_feature_map[i],
input_rois[i],
num_channels,
...))
result_multibatch = torch.cat(tuple(result), dim = 0)
return result_multibatch
具体实现方法请参考 <vision>/torchvision/ops/poolers.py 中class MultiScaleRoIAlign的前向函数。
检测网络CenterNet示例
centernet_offline_multicore是检测网络CenterNet的示例程序。以下为检测网络运行命令和参数详解:
../build/centernet/centernet_offline_multicore -offlinemodel centernet.cambricon -images file_list_for_release -labels label_map_coco.txt -outputdir ./ -dump 1 -simple_compile 1 -dataset_path $COCO_PATH_PYTORCH -input_format 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称,该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-labels:检测的分类标记文件。
-outputdir:模型数据输出目录。
-dump:是否保存输出的图片, 1表示保存,0表示不保存。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道书序。0表示运行网络时输入图片的通道顺序为GRB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
自然语言处理网络BERT示例
bert_squad_offline是BERT网络的示例程序。以下为运行命令和参数详解:
../build/bert/bert_squad_offline -offlinemodel bert.cambricon -token_name data/vocab.txt -preprocess_threads 8
本离线示例的参数详解如下:
-token_name:Bert Squad任务的输入词汇表。
-offlinemodel:离线模型的文件名称。
-preprocess_threads:BERT离线模型前后处理多线程数,默认为8。
超分网络FCN8s示例
fcn_offline_multicore 是FCN8s网络的示例程序。以下为运行命令和参数详解:
../build/fcn8s/fcn_offline_multicore -offlinemodel fcn8s.cambricon -dataset_path $VOC_DEVKIT -images ../../data/voc2012/file_list_736 -simple_compile 1 -rgb 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称。该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-rgb:预处理图片格式,0对应BGR格式,1对应RGB格式。
-outputdir:模型数据输出目录。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
超分网络SegNet示例
segnet_offline_multicore 是SegNet网络的示例程序。以下为运行命令和参数详解:
../build/segnet/segnet_offline_multicore -offlinemodel segnet.cambricon -dataset_path $VOC_DEVKIT -images ../../data/voc2012/file_list_1449 -simple_compile 1 -preprocess_method 1 -interpolation 0
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称。该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-preprocess_method:选择预处理方法。
-interpolation:设置Opencv resize图片方式,0对应INTER_LINEAR方式,1对应INTER_AREA方式。
-outputdir:模型数据输出目录。
超分网络VDSR示例
vdsr_offline_multicore 是VDSR网络的示例程序。以下为运行命令和参数详解:
../build/vdsr/vdsr_offline_multicore -offlinemodel vdsr.cambricon -dataset_path $SET5DATA -images ./data_list.txt -simple_compile 1 -input_format 0 -ycbcr 1
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称。该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-input_format:指定运行网络时输入图片的通道顺序,依据该参数对输入图片进行相应的前处理。支持RGB、RGBA和ARGB三种输入图片的通道书序。0表示运行网络时输入图片的通道顺序为GRB;1表示运行网络时输入图片的通道顺序为RGBA;2表示运行网络时输入图片的通道顺序为ARGB。
-ycbcr:预处理图片格式,0对应BGR格式,1对应YCBCR格式。
超分网络FSRCNN示例
fsrcnn_offline_multicore 是FSRCNN网络的示例程序。以下为运行命令和参数详解:
../build/fsrcnn/fsrcnn_offline_multicore -offlinemodel fsrcnn.cambricon -dataset_path $SET5DATA -images ./data_list.txt -simple_compile 1 -dump 1
本离线示例的参数详解如下:
-offlinemodel:离线模型的文件名称。
-dataset_path:数据集的路径。
-images:一个文本文件的名称。该文件中应当包含若干行,每行都是一张需要检测图片的路径。
-simple_compile:使能简单编译功能,CNRT根据离线模型core_number和batch_size参数自动分配最优的软硬件资源。
-dump:是否保存输出的图片, 1表示保存,0表示不保存。
检测网络结果meanAP计算
在检测网络SSD示例中提供VOC数据集计算脚本meanAP_VOC.py,该脚本位于 offline/scripts 中。
计算步骤如下:
切换至检测结果的存放路径下,并设置GroundTruth(正确的数据标记)的全局变量。
export VOC_DEVKIT="your VOC path"
执行如下命令。
python meanAP_VOC.py --voc_root $VOC_DEVKIT --result $RESULT_DIR --labelmap $LABEL_MAP_DIR --images file_list_for_release
使用计算脚本中需要提供所需要的检测结果和数据集。--voc_root 为Ground truth的路径,--result为检测结果存放的路径,--labelmap为类标签存放的路径,--images为检测图片路径文本。
在检测网络YOLOv3示例中提供COCO数据集meanAP计算脚本,计算脚本位于 examples/offline/scripts 中的meanAP_VOC.py,该脚本调用了coco_api的内容,需安装Python的pycocotools库才能使用。
计算步骤如下:
切换至检测结果的存放路径下,并设置GroundTruth的全局变量。
export COCO_PATH_PYTORCH="your path"
执行以下命令:
python meanAP_COCO.py --file_list file_list_for_release --result_dir ./ --ann_dir $COCO_PATH_PYTORCH/COCO/ --data_type val2014
使用计算脚本中需要提供所需要的检测结果和数据集。--filelist为检测图片路径文本。
超分网络结果mIoU计算
在超分网络FCN8s示例中提供VOC数据集计算脚本compute_mIOU.py,该脚本位于 offline/scripts 中。
计算步骤如下:
切换至检测结果的存放路径,并设置GroundTruth(正确的数据标记)的全局变量。
export VOC_DEVKIT="your VOC path"
执行如下命令。
python ${OFFLINE_DIR}/scripts/compute_mIOU.py --pred_dir $RESULT_DIR --gt_dir ${VOC_DEVKIT} --file_list file_list_for_release其中,--gt_dir 为GroundTruth的路径,--pred_dir为检测结果存放的路径,--file_list为检测图片路径文本。
多核示例
编程模型章节简单介绍了寒武纪多核机器学习处理器MLU270,本章节将多核编程模型分为在线编程和离线编程两部分介绍。但需要注意的是,core_num仅有三种数值可选:1、4、16。
在线多核示例
在MLU270上,以 <catch>/examples/online/test_clas_online.py 为例介绍在线分类模型的多核编程。其Python API设置参数如下:
# 设置core_number参数
parser.add_argument("-core_number",
dest="core_number",
help= "Core number of mfus and offline model with simple compilation. ",
default = 1,
type = int)
# 设置batch_size
parser.add_argument("-batch_size",
dest = "batch_size",
help = "batch size for one inferrence.",
default = 1,
type = int)
...
# 在MLU上调用多核
ct.set_core_number(args.core_number)
net.eval().float().to(ct.mlu_device())
多核模型在使用时仅需要添加core_number参数,具体代码可参考test_clas_online.py。
离线多核示例
本节仍以分类网络模型为例。离线分类模型运行程序为 <catch>/examples/offline/clas_offline_multicore/run_all_offline_mc.sh。生成离线模型的方法及参数如下:
# 设置core_number参数
genoff_cmd="python ../genoff/genoff.py -mcore $mcore -model $network -mname $network -batch_size $batch_size -core_number $core_number -half_input 1 -input_format $input_format&>> $CURRENT_DIR/$log_file"
生成离线多核模型只需在运行文件中添加 core_number 参数即可,其它地方无须修改。离线模型生成过程中通过指定 input_format 参数确定输入图片的通道顺序,相应地需要在运行文件中添加 input_format 参数来指定运行模型时输入图片的通道顺序,其它地方不需要进行修改。