本章介绍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

注意

- Ubuntu 18.04环境下,inception_v3的依赖库scipy需低于1.0.0版本,例如0.17.0。
- MTCNN网络只支持Python 2.7.12和Python 3.5.2。
- SSD MobileNet v2、efficientnet、Faster-RCNN(fpn)网络要求使用Python 3。
- Debian 9.8或Debian 10.2环境下,建议Python版本不低于3.5.4,否则在程序结束时可能会产生None Type相关的错误信息。
- BERT网络的(batch_size, seq_len)有规模限制,支持(1-2, 128-512)、(1-8, 128)、(1-4, 192-256)。其中seq_len必须是64的整数倍。
- CenterNet网络目前支持float32 + int16模式和Python 3环境,暂不支持float16 + int8模式。

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。运行分类网络步骤如下:

  1. 设置数据集路径和网络权重路径。

    # set pretrained model path
     export TORCH_HOME = "YOUR TORCH HOME PATH"
     export IMAGENET_PATH = "YOUT IMAGENET_PATH"
    
  2. 执行以下脚本运行分类网络。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_sizecore_numberinput_format 参数,CNRT会在推理时自动分配最优的软硬件资源。要编译示例程序,请执行 ./scripts/build_offline.sh

在多核离线示例程序运行中可设置以下参数:

  • -batch_size:指定batch size。此处的batch_size表示每次分发给MLU的样本数量,MLU会自动分配到所使用的每个核上。

  • -core_number:设置运行网络时用到的MLU核数。

  • -input_format:指定运行网络时输入图片的通道顺序。

batch_sizecore_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 中。

计算步骤如下:

  1. 切换至检测结果的存放路径下,并设置GroundTruth(正确的数据标记)的全局变量。

    export VOC_DEVKIT="your VOC path"
    
  2. 执行如下命令。

    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库才能使用。

计算步骤如下:

  1. 切换至检测结果的存放路径下,并设置GroundTruth的全局变量。

    export COCO_PATH_PYTORCH="your path"
    
  2. 执行以下命令:

    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 中。

计算步骤如下:

  1. 切换至检测结果的存放路径,并设置GroundTruth(正确的数据标记)的全局变量。

    export VOC_DEVKIT="your VOC path"
    
  2. 执行如下命令。

    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 参数来指定运行模型时输入图片的通道顺序,其它地方不需要进行修改。