/PaddlePaddle_Model_zoo

Imagination Technologies model zoo for Paddle Paddle

Primary LanguagePythonApache License 2.0Apache-2.0

简体中文 | English

powervr_paddle_model

Introduction

This is an Imagination NCSDK enabled PaddlePaddle model zoo, which is part of Hardware Ecosystem Co-Creation Program. Take devices that embedded with Imagination computing IPs(such as GPU and NNA) as target, PaddlePaddle inference model is compiled into deployment package utilizing Imagination Neural Compute SDK(NCSDK). This repository includes deployment models and test code on these models.

PaddlePaddle Models

We start from models in PaddleClas, such as EfficientNet. The Tutorial of Deployment and Test on models in PaddleSeg, please click here.

Imagination HW & SW Tools

Hardware Platform

Only ROC1 from Unisoc is considered so far.
HW: Unisoc ROC1

Neural Compute SDK

SW: NCSDK 2.8, NNA DDK 3.4, GPU DDK 1.17

Dependencies

The evaluation code are written in Python, which depend on following packages.

  • pillow
  • PyYAML
  • numpy==1.19.5
  • scipy==1.5.4
  • scikit-learn==0.24.2

Download Server

Deployment models and valset could be downloaded from ftp server. sftp server: transfer.imgtec.com
http client: https://transfer.imgtec.com
user_name: imgchinalab_public
password: public

Test System Overview

The test framework support inference mode or evalution mode. It could run the non-quantized PaddlePaddle model or the quantized PowerVR deployment models to evaluate quantization impacts. It also support distributed evaluation utilizing gRPC.

Host and Target

Host: Powerful workstation used to compile models and has PaddlePaddle installed.
Target: Resource constrained device equipped with Imagination compute IPs.

Inference

Inference runs on one batch. It consist of preprocessing, NN inference, and postprocessing. NN running on Imagination compute IPs is determined at compiling stage.

Evaluation

Evaluation runs on multiple batches from evaluation dataset. It calculate performance metrics from the multiple inference results.

Inference Backend

PaddlePaddle engine and PowerVR compute runtime could be regarded as different inference backend. They share the same preprocessing and postprocessing. PaddlePaddle engine runs non-quantized models, whereas PowerVR runtime runs quantized models.

Standalone vs Distributed

For PowerVR models, it is straight forward to run all stack on target device(Fig.1). However, it's not a good option here because of reasons below:

  1. Test code is written in Python as it is popular and powerful in AI/ML, however, it is not natively support in some platform, such as Android.
  2. Target devices are generally resource constrained.

So we set up a distributed test system(Fig.2).Only NN inference runs on target device with deployment model. Dataloader, preprocess, postprocess, performance metric calcuation run on Host. We recommend run inference/evaluation through distributed system.

Standalone

Fig.1 Standalone system

gRPC
Fig.2 Distributed system

Running evaluation and inference

Preparation

Setup development host and deployment target device according to NCSDK documents. Make sure basic IMGDNN test pass and tutorial example could be deployed successfully.

Development Host

  1. Install PaddlePaddle
  2. Compile PaddlePaddle model into PowerVR deployment packages.
  3. Clone this repository.
  4. Place evaluation dataset in EvalDatasetPath directory.

Target device

  1. Copy python/engine/backend/pvr_grpc/* to GRPCServerPath directory on target devices;
  2. Copy PowerVR deployment package to DeploymentModelPath;
  3. Set base_name field in $GRPCServerPath/pvr_service_config.yml, e.g
field description values
base_name path to vm file $DeploymentModelPath/EfficientNetB0-AX2185-ncsdk-2_8_deploy.ro
  1. Launch the gRPC server
python PVRInferServer.py

Running Test

Config File

Create a config file in Yaml, some fields are described below. Also refer to configs/image_classification/EfficientNetB0.yaml

field description values
Global.mode test mode evaluation,inference
Dataloader.dataset.name dataset class name to be instantialize ImageNetDataset
Dataloader.dataset.image_root root directory of imagenet dataset image string
Dataloader.dataset.label_path path to file to class_id label string
Dataloader.sampler.batch_size set the batch size of inupt integer
Infer.infer_imgs path to test image or directory string
Infer.batch_size batch size of inference interger
Config PaddlePaddle backend

To inference with Paddle backend, fields below need to be set.

field description values
Model.backend backend used to inference paddle
Model.Paddle.path path to Paddle model string
Model.Paddle.base_name base name of model files string
Config PowerVR standalone backend

To run all test code on target device, set the fields below

field description values
Model.backend backend used to inference powervr
Model.PowerVR.base_name path to vm file string
Model.PowerVR.input_name network input name string
Model.PowerVR.output_shape shape of output tensor list
Config PowerVR Distributed backend

To run test code on host and run inference on target device, set the fields below

field description values
Model.backend backend used to inference powervr_grpc
Model.PowerVR_gRPC.pvr_server IP of gRPC server IP address
Model.PowerVR.input_name network input name string
Model.PowerVR.output_shape shape of output tensor list

Running test scripts

python tools/test_egret.py -c ./configs/image_classification/EfficientNetB0.yaml

Some field could be override at command line, e.g. to override the batch_size

python tools/test_egret.py -c ./configs/image_classification/EfficientNetB0.yaml \
-o DataLoader.Eval.sampler.batch_size=1

Performance

Image Classification

Model top-1 top-5 time(ms)
bs=1
time(ms)
bs=4
Download
Address
ResNet50
(d16-w16-b16)
75.4 93.1 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/ResNet50-AX2185-d16w16b16-ncsdk_2_8-aarch64_linux_gnu.zip
ResNet50
(non-quant)
75.4 93.4 null null link
ResNet50
(d8-w8-b16)
74.6 93.2 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/ResNet50-AX2185-d8w8b16-ncsdk_2_8-aarch64_linux_gnu.zip
HRNet_W48_C_ssld
(d16-w16-b16)
81.9 97.0 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/HRNet_W48_C_ssld-AX2185-d16w16b16-ncsdk_2_8-aarch64_linux_gnu.zip
HRNet_W48_C_ssld
(non-quant)
82.2 96.9 null null link
HRNet_W48_C_ssld
(d8-w8-b16)
81.2 96.6 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/HRNet_W48_C_ssld-AX2185-d8w8b16-ncsdk_2_8-aarch64_linux_gnu.zip
VGG16
(d16-w16-b16)
70.9 90.0 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/VGG16-AX2185-d16w16b16-ncsdk_2_8-aarch64_linux_gnu.zip
VGG16
(non-quant)
71.1 90.0 null null link
VGG16
(d8-w8-b16)
70.3 89.6 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/VGG16-AX2185-d8w8b16-ncsdk_2_8-aarch64_linux_gnu.zip
EfficientNetB0
(d16-w16-b16)
75.4 93.2 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/EfficientNetB0-AX2185-d16w16b16-ncsdk_2_8-aarch64_linux_gnu.zip
EfficientNetB0
(non-quant)
75.9 93.7 null null link
MobileNetV3_large_x1_0
(d16-w16-b16)
75.5 93.6 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/MobileNetV3-AX2185-d16w16b16-ncsdk_2_8-aarch64_linux_gnu.zip
MobileNetV3_large_x1_0
(non-quant)
75.4 93.2 null null link
DarkNet53
(d16-w16-b16)
76.8 93.4 null null sftp://transfer.imgtec.com/paddle_models/paddle_classification/DarkNet53-AX2185-d16w16b16-ncsdk_2_8-aarch64_linux_gnu.zip
DarkNet53
(non-quant)
76.6 93.4 null null link

Contribution

Contributions are highly welcomed and we would really appreciate your feedback!!

You are welcome to contribute to project PaddlePaddle Model Zoo based on Imagination NCSDK. In order for us to be able to accept your contributions, we will need explicit confirmation from you that you are able and willing to provide them under these terms, and the mechanism we use to do this is called a Developer's Certificate of Origin or DCO.

To participate under these terms, all that you must do is include a line like the following as the last line of the commit message for each commit in your contribution:

Signed-Off-By: Random J. Developer <random@developer.example.org>

The simplest way to accomplish this is to add -s or --signoff to your git commit command.

You must use your real name (sorry, no pseudonyms, and no anonymous contributions).

Code submission through PR