pplcv |
A high-performance image processing library of openPPL.
@@ -251,12 +254,14 @@ source ~/.bashrc
```
## Build MMDeploy
+
```bash
cd /the/root/path/of/MMDeploy
export MMDEPLOY_DIR=$(pwd)
```
### Build Options Spec
+
@@ -334,6 +339,7 @@ Currently, The Model Converter supports torchscript, but SDK doesn't.
### Build Model Converter
#### Build Custom Ops
+
If one of inference engines among ONNXRuntime, TensorRT, ncnn and libtorch is selected, you have to build the corresponding custom ops.
- **ONNXRuntime** Custom Ops
@@ -378,17 +384,20 @@ If one of inference engines among ONNXRuntime, TensorRT, ncnn and libtorch is se
cd ${MMDEPLOY_DIR}
pip install -e .
```
+
**Note**
- Some dependencies are optional. Simply running `pip install -e .` will only install the minimum runtime requirements.
To use optional dependencies, install them manually with `pip install -r requirements/optional.txt` or specify desired extras when calling `pip` (e.g. `pip install -e .[optional]`).
Valid keys for the extras field are: `all`, `tests`, `build`, `optional`.
+
### Build SDK
MMDeploy provides two recipes as shown below for building SDK with ONNXRuntime and TensorRT as inference engines respectively.
You can also activate other engines after the model.
- cpu + ONNXRuntime
+
```Bash
cd ${MMDEPLOY_DIR}
mkdir -p build && cd build
@@ -405,6 +414,7 @@ You can also activate other engines after the model.
```
- cuda + TensorRT
+
```Bash
cd ${MMDEPLOY_DIR}
mkdir -p build && cd build
diff --git a/docs/en/01-how-to-build/windows.md b/docs/en/01-how-to-build/windows.md
index 105cb8e4f4..e41cc5a6d0 100644
--- a/docs/en/01-how-to-build/windows.md
+++ b/docs/en/01-how-to-build/windows.md
@@ -16,19 +16,24 @@
- [Build Demo](#build-demo)
- [Note](#note)
----
+______________________________________________________________________
+
Currently, MMDeploy only provides build-from-source method for windows platform. Prebuilt package will be released in the future.
## Build From Source
+
All the commands listed in the following chapters are verified on **Windows 10**.
### Install Toolchains
+
1. Download and install [Visual Studio 2019](https://visualstudio.microsoft.com)
-2. Add the path of `cmake` to the environment variable `PATH`, i.e., "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin"
+2. Add the path of `cmake` to the environment variable `PATH`, i.e., "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\CMake\\CMake\\bin"
3. Install cuda toolkit if NVIDIA gpu is available. You can refer to the official [guide](https://developer.nvidia.com/cuda-downloads).
### Install Dependencies
+
#### Install Dependencies for Model Converter
+
@@ -71,6 +76,7 @@ pip install mmcv-full==1.4.0 -f https://download.openmmlab.com/mmcv/dist/${cu_ve
#### Install Dependencies for SDK
You can skip this chapter if you are only interested in the model converter.
+
@@ -198,6 +204,7 @@ $env:MMDEPLOY_DIR="$pwd"
```
#### Build Options Spec
+
@@ -266,10 +273,10 @@ $env:MMDEPLOY_DIR="$pwd"
-
#### Build Model Converter
##### Build Custom Ops
+
If one of inference engines among ONNXRuntime, TensorRT and ncnn is selected, you have to build the corresponding custom ops.
- **ONNXRuntime** Custom Ops
@@ -363,4 +370,5 @@ $env:path = "$env:MMDEPLOY_DIR/build/install/bin;" + $env:path
```
### Note
- 1. Release / Debug libraries can not be mixed. If MMDeploy is built with Release mode, all its dependent thirdparty libraries have to be built in Release mode too and vice versa.
+
+1. Release / Debug libraries can not be mixed. If MMDeploy is built with Release mode, all its dependent thirdparty libraries have to be built in Release mode too and vice versa.
diff --git a/docs/en/02-how-to-run/how_to_evaluate_a_model.md b/docs/en/02-how-to-run/how_to_evaluate_a_model.md
index 6148acbd6f..afe91c58f6 100644
--- a/docs/en/02-how-to-run/how_to_evaluate_a_model.md
+++ b/docs/en/02-how-to-run/how_to_evaluate_a_model.md
@@ -28,20 +28,20 @@ ${MODEL_CFG} \
## Description of all arguments
-* `deploy_cfg`: The config for deployment.
-* `model_cfg`: The config of the model in OpenMMLab codebases.
-* `--model`: The backend model file. For example, if we convert a model to TensorRT, we need to pass the model file with ".engine" suffix.
-* `--out`: The path to save output results in pickle format. (The results will be saved only if this argument is given)
-* `--format-only`: Whether format the output results without evaluation or not. It is useful when you want to format the result to a specific format and submit it to the test server
-* `--metrics`: The metrics to evaluate the model defined in OpenMMLab codebases. e.g. "segm", "proposal" for COCO in mmdet, "precision", "recall", "f1_score", "support" for single label dataset in mmcls.
-* `--show`: Whether to show the evaluation result on the screen.
-* `--show-dir`: The directory to save the evaluation result. (The results will be saved only if this argument is given)
-* `--show-score-thr`: The threshold determining whether to show detection bounding boxes.
-* `--device`: The device that the model runs on. Note that some backends restrict the device. For example, TensorRT must run on cuda.
-* `--cfg-options`: Extra or overridden settings that will be merged into the current deploy config.
-* `--metric-options`: Custom options for evaluation. The key-value pair in xxx=yyy
-format will be kwargs for dataset.evaluate() function.
-* `--log2file`: log evaluation results (and speed) to file.
+- `deploy_cfg`: The config for deployment.
+- `model_cfg`: The config of the model in OpenMMLab codebases.
+- `--model`: The backend model file. For example, if we convert a model to TensorRT, we need to pass the model file with ".engine" suffix.
+- `--out`: The path to save output results in pickle format. (The results will be saved only if this argument is given)
+- `--format-only`: Whether format the output results without evaluation or not. It is useful when you want to format the result to a specific format and submit it to the test server
+- `--metrics`: The metrics to evaluate the model defined in OpenMMLab codebases. e.g. "segm", "proposal" for COCO in mmdet, "precision", "recall", "f1_score", "support" for single label dataset in mmcls.
+- `--show`: Whether to show the evaluation result on the screen.
+- `--show-dir`: The directory to save the evaluation result. (The results will be saved only if this argument is given)
+- `--show-score-thr`: The threshold determining whether to show detection bounding boxes.
+- `--device`: The device that the model runs on. Note that some backends restrict the device. For example, TensorRT must run on cuda.
+- `--cfg-options`: Extra or overridden settings that will be merged into the current deploy config.
+- `--metric-options`: Custom options for evaluation. The key-value pair in xxx=yyy
+ format will be kwargs for dataset.evaluate() function.
+- `--log2file`: log evaluation results (and speed) to file.
\* Other arguments in `tools/test.py` are used for speed test. They have no concern with evaluation.
@@ -58,4 +58,4 @@ python tools/test.py \
## Note
-* The performance of each model in [OpenMMLab](https://openmmlab.com/) codebases can be found in the document of each codebase.
+- The performance of each model in [OpenMMLab](https://openmmlab.com/) codebases can be found in the document of each codebase.
diff --git a/docs/en/02-how-to-run/how_to_measure_performance_of_models.md b/docs/en/02-how-to-run/how_to_measure_performance_of_models.md
index 8e6a3524c4..5402e9f9f8 100644
--- a/docs/en/02-how-to-run/how_to_measure_performance_of_models.md
+++ b/docs/en/02-how-to-run/how_to_measure_performance_of_models.md
@@ -22,15 +22,13 @@ ${MODEL_CFG} \
## Description of all arguments
-
-
-* `deploy_cfg`: The config for deployment.
-* `model_cfg`: The config of the model in OpenMMLab codebases.
-* `--model`: The backend model files. For example, if we convert a model to ncnn, we need to pass a ".param" file and a ".bin" file. If we convert a model to TensorRT, we need to pass the model file with ".engine" suffix.
-* `--log2file`: log evaluation results and speed to file.
-* `--speed-test`: Whether to activate speed test.
-* `--warmup`: warmup before counting inference elapse, require setting speed-test first.
-* `--log-interval`: The interval between each log, require setting speed-test first.
+- `deploy_cfg`: The config for deployment.
+- `model_cfg`: The config of the model in OpenMMLab codebases.
+- `--model`: The backend model files. For example, if we convert a model to ncnn, we need to pass a ".param" file and a ".bin" file. If we convert a model to TensorRT, we need to pass the model file with ".engine" suffix.
+- `--log2file`: log evaluation results and speed to file.
+- `--speed-test`: Whether to activate speed test.
+- `--warmup`: warmup before counting inference elapse, require setting speed-test first.
+- `--log-interval`: The interval between each log, require setting speed-test first.
\* Other arguments in `tools/test.py` are used for performance test. They have no concern with speed test.
diff --git a/docs/en/03-benchmark/benchmark.md b/docs/en/03-benchmark/benchmark.md
index 704a36df92..14580c8c1c 100644
--- a/docs/en/03-benchmark/benchmark.md
+++ b/docs/en/03-benchmark/benchmark.md
@@ -1,12 +1,15 @@
# Benchmark
## Backends
+
CPU: ncnn, ONNXRuntime, OpenVINO
GPU: ncnn, TensorRT, PPLNN
## Latency benchmark
+
### Platform
+
- Ubuntu 18.04
- ncnn 20211208
- Cuda 11.3
@@ -15,6 +18,7 @@ GPU: ncnn, TensorRT, PPLNN
- NVIDIA tesla T4 tensor core GPU for TensorRT
### Other settings
+
- Static graph
- Batch size 1
- Synchronize devices after each inference.
@@ -22,7 +26,6 @@ GPU: ncnn, TensorRT, PPLNN
- Warm up. For ncnn, we warm up 30 iters for all codebases. As for other backends: for classification, we warm up 1010 iters; for other codebases, we warm up 10 iters.
- Input resolution varies for different datasets of different codebases. All inputs are real images except for `mmediting` because the dataset is not large enough.
-
Users can directly test the speed through [model profiling](../02-how-to-run/how_to_measure_performance_of_models.md). And here is the benchmark in our environment.
@@ -1533,7 +1536,6 @@ Users can directly test the performance through [how_to_evaluate_a_model.md](../
-
@@ -1587,9 +1589,8 @@ Users can directly test the performance through [how_to_evaluate_a_model.md](../
-
-
## Notes
+
- As some datasets contain images with various resolutions in codebase like MMDet. The speed benchmark is gained through static configs in MMDeploy, while the performance benchmark is gained through dynamic ones.
- Some int8 performance benchmarks of TensorRT require Nvidia cards with tensor core, or the performance would drop heavily.
diff --git a/docs/en/03-benchmark/supported_models.md b/docs/en/03-benchmark/supported_models.md
index 12b9e4fb97..93972d5f7c 100644
--- a/docs/en/03-benchmark/supported_models.md
+++ b/docs/en/03-benchmark/supported_models.md
@@ -2,75 +2,75 @@
The table below lists the models that are guaranteed to be exportable to other backends.
-| Model | Codebase | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-| :------------------------ | :--------------- | :---------: | :---------: | :------: | :---: | :---: | :------: | :--------------------------------------------------------------------------------------------: |
-| RetinaNet | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet) |
-| Faster R-CNN | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
-| YOLOv3 | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo) |
-| YOLOX | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox) |
-| FCOS | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos) |
-| FSAF | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf) |
-| Mask R-CNN | MMDetection | Y | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) |
-| SSD[*](#note) | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd) |
-| FoveaBox | MMDetection | Y | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox) |
-| ATSS | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss) |
-| GFL | MMDetection | N | Y | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl) |
-| Cascade R-CNN | MMDetection | N | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
-| Cascade Mask R-CNN | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
-| VFNet | MMDetection | N | N | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/vfnet) |
-| ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnet) |
-| ResNeXt | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnext) |
-| SE-ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/seresnet) |
-| MobileNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2) |
-| ShuffleNetV1 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v1) |
-| ShuffleNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v2) |
-| VisionTransformer | MMClassification | Y | Y | ? | Y | ? | ? | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/vision_transformer) |
-| FCN | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fcn) |
-| PSPNet[*static](#note) | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/pspnet) |
-| DeepLabV3 | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3) |
-| DeepLabV3+ | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3plus) |
-| Fast-SCNN[*static](#note) | MMSegmentation | Y | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastscnn) |
-| UNet | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/unet) |
-| ANN[*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ann) |
-| APCNet | MMSegmentation | ? | Y | Y | Y | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/apcnet) |
-| BiSeNetV1 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv1) |
-| BiSeNetV2 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2) |
-| CGNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/cgnet) |
-| DMNet | MMSegmentation | ? | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dmnet) |
-| DNLNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dnlnet) |
-| EMANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/emanet) |
-| EncNet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/encnet) |
-| ERFNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/erfnet) |
-| FastFCN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastfcn) |
-| GCNet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/gcnet) |
-| ICNet[*](#note) | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/icnet) |
-| ISANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/isanet) |
-| NonLocal Net | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/nonlocal_net) |
-| OCRNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ocrnet) |
-| PointRend | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/point_rend) |
-| Semantic FPN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/sem_fpn) |
-| STDC | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/stdc) |
-| UPerNet[*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/upernet) |
-| DANet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/danet) |
-| SRCNN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srcnn) |
-| ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
-| SRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
-| SRResNet | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
-| Real-ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/real_esrgan) |
-| EDSR | MMEditing | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/edsr) |
-| RDN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/rdn) |
-| DBNet | MMOCR | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/dbnet) |
-| PANet | MMOCR | Y | Y | Y | Y | ? | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/panet) |
-| DBNet | MMOCR | Y | Y | Y | Y | ? | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/psenet) |
-| CRNN | MMOCR | Y | Y | Y | Y | Y | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/crnn) |
-| SAR | MMOCR | N | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/sar) |
-| SATRN | MMOCR | Y | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/satrn) |
-| HRNet | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#hrnet-cvpr-2019) |
-| MSPN | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#mspn-arxiv-2019) |
-| LiteHRNet | MMPose | N | Y | Y | N | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#litehrnet-cvpr-2021) |
-| PointPillars | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/pointpillars) |
-| CenterPoint (pillar) | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/centerpoint) |
-| RotatedRetinaNet | RotatedDetection | N | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/rotated_retinanet/README.md) |
+| Model | Codebase | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
+| :------------------------- | :--------------- | :---------: | :---------: | :------: | :--: | :---: | :------: | :---------------------------------------------------------------------------------------------: |
+| RetinaNet | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet) |
+| Faster R-CNN | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
+| YOLOv3 | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo) |
+| YOLOX | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox) |
+| FCOS | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos) |
+| FSAF | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf) |
+| Mask R-CNN | MMDetection | Y | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) |
+| SSD[\*](#note) | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd) |
+| FoveaBox | MMDetection | Y | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox) |
+| ATSS | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss) |
+| GFL | MMDetection | N | Y | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl) |
+| Cascade R-CNN | MMDetection | N | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
+| Cascade Mask R-CNN | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
+| VFNet | MMDetection | N | N | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/vfnet) |
+| ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnet) |
+| ResNeXt | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnext) |
+| SE-ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/seresnet) |
+| MobileNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2) |
+| ShuffleNetV1 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v1) |
+| ShuffleNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v2) |
+| VisionTransformer | MMClassification | Y | Y | ? | Y | ? | ? | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/vision_transformer) |
+| FCN | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fcn) |
+| PSPNet[\*static](#note) | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/pspnet) |
+| DeepLabV3 | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3) |
+| DeepLabV3+ | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3plus) |
+| Fast-SCNN[\*static](#note) | MMSegmentation | Y | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastscnn) |
+| UNet | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/unet) |
+| ANN[\*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ann) |
+| APCNet | MMSegmentation | ? | Y | Y | Y | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/apcnet) |
+| BiSeNetV1 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv1) |
+| BiSeNetV2 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2) |
+| CGNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/cgnet) |
+| DMNet | MMSegmentation | ? | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dmnet) |
+| DNLNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dnlnet) |
+| EMANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/emanet) |
+| EncNet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/encnet) |
+| ERFNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/erfnet) |
+| FastFCN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastfcn) |
+| GCNet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/gcnet) |
+| ICNet[\*](#note) | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/icnet) |
+| ISANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/isanet) |
+| NonLocal Net | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/nonlocal_net) |
+| OCRNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ocrnet) |
+| PointRend | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/point_rend) |
+| Semantic FPN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/sem_fpn) |
+| STDC | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/stdc) |
+| UPerNet[\*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/upernet) |
+| DANet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/danet) |
+| SRCNN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srcnn) |
+| ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
+| SRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
+| SRResNet | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
+| Real-ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/real_esrgan) |
+| EDSR | MMEditing | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/edsr) |
+| RDN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/rdn) |
+| DBNet | MMOCR | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/dbnet) |
+| PANet | MMOCR | Y | Y | Y | Y | ? | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/panet) |
+| DBNet | MMOCR | Y | Y | Y | Y | ? | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/psenet) |
+| CRNN | MMOCR | Y | Y | Y | Y | Y | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/crnn) |
+| SAR | MMOCR | N | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/sar) |
+| SATRN | MMOCR | Y | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/satrn) |
+| HRNet | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#hrnet-cvpr-2019) |
+| MSPN | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#mspn-arxiv-2019) |
+| LiteHRNet | MMPose | N | Y | Y | N | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#litehrnet-cvpr-2021) |
+| PointPillars | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/pointpillars) |
+| CenterPoint (pillar) | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/centerpoint) |
+| RotatedRetinaNet | RotatedDetection | N | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/rotated_retinanet/README.md) |
### Note
diff --git a/docs/en/04-supported-codebases/mmcls.md b/docs/en/04-supported-codebases/mmcls.md
index 47bd8b56d8..8495b8f54f 100644
--- a/docs/en/04-supported-codebases/mmcls.md
+++ b/docs/en/04-supported-codebases/mmcls.md
@@ -8,11 +8,11 @@ Please refer to [install.md](https://github.com/open-mmlab/mmclassification/blob
## List of MMClassification models supported by MMDeploy
-| Model | ONNX Runtime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-| :----------- | :----------: | :------: | :---: | :---: | :------: | :----------------------------------------------------------------------------------------: |
-| ResNet | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnet) |
-| ResNeXt | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnext) |
-| SE-ResNet | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/seresnet) |
-| MobileNetV2 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2) |
-| ShuffleNetV1 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v1) |
-| ShuffleNetV2 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v2) |
+| Model | ONNX Runtime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
+| :----------- | :----------: | :------: | :--: | :---: | :------: | :----------------------------------------------------------------------------------------: |
+| ResNet | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnet) |
+| ResNeXt | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnext) |
+| SE-ResNet | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/seresnet) |
+| MobileNetV2 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2) |
+| ShuffleNetV1 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v1) |
+| ShuffleNetV2 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v2) |
diff --git a/docs/en/04-supported-codebases/mmdet.md b/docs/en/04-supported-codebases/mmdet.md
index d409bdba18..6b06d4529d 100644
--- a/docs/en/04-supported-codebases/mmdet.md
+++ b/docs/en/04-supported-codebases/mmdet.md
@@ -8,21 +8,21 @@ Please refer to [get_started.md](https://github.com/open-mmlab/mmdetection/blob/
## List of MMDetection models supported by MMDeploy
-| Model | Task | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-| :----------------: | :------------------: | :---------: | :------: | :---: | :---: | :------: | :----------------------------------------------------------------------------------: |
-| ATSS | ObjectDetection | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss) |
-| FCOS | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos) |
-| FoveaBox | ObjectDetection | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox) |
-| FSAF | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf) |
-| RetinaNet | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet) |
-| SSD | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd) |
-| VFNet | ObjectDetection | N | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/vfnet) |
-| YOLOv3 | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo) |
-| YOLOX | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox) |
-| Cascade R-CNN | ObjectDetection | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
-| Faster R-CNN | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
-| Faster R-CNN + DCN | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
-| GFL | ObjectDetection | Y | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl) |
-| RepPoints | ObjectDetection | N | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints) |
-| Cascade Mask R-CNN | InstanceSegmentation | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
-| Mask R-CNN | InstanceSegmentation | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) |
+| Model | Task | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
+| :----------------: | :------------------: | :---------: | :------: | :--: | :---: | :------: | :----------------------------------------------------------------------------------: |
+| ATSS | ObjectDetection | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss) |
+| FCOS | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos) |
+| FoveaBox | ObjectDetection | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox) |
+| FSAF | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf) |
+| RetinaNet | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet) |
+| SSD | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd) |
+| VFNet | ObjectDetection | N | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/vfnet) |
+| YOLOv3 | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo) |
+| YOLOX | ObjectDetection | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox) |
+| Cascade R-CNN | ObjectDetection | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
+| Faster R-CNN | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
+| Faster R-CNN + DCN | ObjectDetection | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
+| GFL | ObjectDetection | Y | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl) |
+| RepPoints | ObjectDetection | N | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints) |
+| Cascade Mask R-CNN | InstanceSegmentation | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
+| Mask R-CNN | InstanceSegmentation | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) |
diff --git a/docs/en/04-supported-codebases/mmdet3d.md b/docs/en/04-supported-codebases/mmdet3d.md
index 3387a3b247..d993875dc1 100644
--- a/docs/en/04-supported-codebases/mmdet3d.md
+++ b/docs/en/04-supported-codebases/mmdet3d.md
@@ -20,11 +20,12 @@ python tools/deploy.py \
--device \
cuda:0
```
+
## List of MMDetection3d models supported by MMDeploy
-| Model | Task | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-| :----------------: | :------------------: | :---------: | :------: | :---: | :---: | :------: | :------------------------------------------------------------------------------------------------------: |
-| PointPillars | VoxelDetection | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/pointpillars) |
+| Model | Task | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
+| :----------: | :------------: | :---------: | :------: | :--: | :---: | :------: | :------------------------------------------------------------------------------------: |
+| PointPillars | VoxelDetection | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/pointpillars) |
## Reminder
diff --git a/docs/en/04-supported-codebases/mmedit.md b/docs/en/04-supported-codebases/mmedit.md
index 63061541e2..2e9e64943b 100644
--- a/docs/en/04-supported-codebases/mmedit.md
+++ b/docs/en/04-supported-codebases/mmedit.md
@@ -8,13 +8,13 @@ Please refer to [official installation guide](https://mmediting.readthedocs.io/e
## MMEditing models support
-| Model | Task | ONNX Runtime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-| :---------- | :--------------- | :----------: | :------: | :---: | :---: | :------: | :--------------------------------------------------------------------------------------------: |
-| SRCNN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srcnn) |
-| ESRGAN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
-| ESRGAN-PSNR | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
-| SRGAN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
-| SRResNet | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
-| Real-ESRGAN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/real_esrgan) |
-| EDSR | super-resolution | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/edsr) |
-| RDN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/rdn) |
+| Model | Task | ONNX Runtime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
+| :---------- | :--------------- | :----------: | :------: | :--: | :---: | :------: | :--------------------------------------------------------------------------------------------: |
+| SRCNN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srcnn) |
+| ESRGAN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
+| ESRGAN-PSNR | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
+| SRGAN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
+| SRResNet | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
+| Real-ESRGAN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/real_esrgan) |
+| EDSR | super-resolution | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/edsr) |
+| RDN | super-resolution | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/rdn) |
diff --git a/docs/en/04-supported-codebases/mmocr.md b/docs/en/04-supported-codebases/mmocr.md
index bc481a93d5..97334baca1 100644
--- a/docs/en/04-supported-codebases/mmocr.md
+++ b/docs/en/04-supported-codebases/mmocr.md
@@ -8,15 +8,14 @@ Please refer to [install.md](https://mmocr.readthedocs.io/en/latest/install.html
## List of MMOCR models supported by MMDeploy
-| Model | Task | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-| :---- | :--------------- | :---------: | :---------: | :------: | :---: | :---: | :------: | :----------------------------------------------------------------------------: |
-| DBNet | text-detection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/dbnet) |
-| PSENet| text-detection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/psenet) |
-| PANet | text-detection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/panet) |
-| CRNN | text-recognition | Y | Y | Y | Y | Y | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/crnn) |
-| SAR | text-recognition | N | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/sar) |
-| SATRN | text-recognition | Y | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/satrn)|
-
+| Model | Task | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
+| :----- | :--------------- | :---------: | :---------: | :------: | :--: | :---: | :------: | :-----------------------------------------------------------------------------: |
+| DBNet | text-detection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/dbnet) |
+| PSENet | text-detection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/psenet) |
+| PANet | text-detection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/panet) |
+| CRNN | text-recognition | Y | Y | Y | Y | Y | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/crnn) |
+| SAR | text-recognition | N | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/sar) |
+| SATRN | text-recognition | Y | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/satrn) |
## Reminder
diff --git a/docs/en/04-supported-codebases/mmpose.md b/docs/en/04-supported-codebases/mmpose.md
index 5e1f5f6561..c77d2bffc7 100644
--- a/docs/en/04-supported-codebases/mmpose.md
+++ b/docs/en/04-supported-codebases/mmpose.md
@@ -9,7 +9,7 @@ Please refer to [official installation guide](https://mmpose.readthedocs.io/en/l
## MMPose models support
| Model | Task | ONNX Runtime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-|:----------|:--------------|:------------:|:--------:|:----:|:-----:|:--------:|:-------------------------------------------------------------------------------------------:|
+| :-------- | :------------ | :----------: | :------: | :--: | :---: | :------: | :-----------------------------------------------------------------------------------------: |
| HRNet | PoseDetection | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#hrnet-cvpr-2019) |
| MSPN | PoseDetection | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#mspn-arxiv-2019) |
| LiteHRNet | PoseDetection | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#litehrnet-cvpr-2021) |
diff --git a/docs/en/04-supported-codebases/mmrotate.md b/docs/en/04-supported-codebases/mmrotate.md
index 5227e21a73..22f15a2938 100644
--- a/docs/en/04-supported-codebases/mmrotate.md
+++ b/docs/en/04-supported-codebases/mmrotate.md
@@ -8,10 +8,10 @@ Please refer to [official installation guide](https://mmrotate.readthedocs.io/en
## MMRotate models support
-| Model | Task | ONNX Runtime | TensorRT | NCNN | PPLNN | OpenVINO | Model config |
-|:----------------------|:--------------|:------------:|:--------:|:----:|:-----:|:--------:|:-------------------------------------------------------------------------------------------:|
-| RotatedRetinaNet | RotatedDetection | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/rotated_retinanet/README.md) |
-| Oriented RCNN | RotatedDetection | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/oriented_rcnn/README.md) |
+| Model | Task | ONNX Runtime | TensorRT | NCNN | PPLNN | OpenVINO | Model config |
+| :--------------- | :--------------- | :----------: | :------: | :--: | :---: | :------: | :--------------------------------------------------------------------------------------------: |
+| RotatedRetinaNet | RotatedDetection | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/rotated_retinanet/README.md) |
+| Oriented RCNN | RotatedDetection | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/oriented_rcnn/README.md) |
### Example
diff --git a/docs/en/04-supported-codebases/mmseg.md b/docs/en/04-supported-codebases/mmseg.md
index 054e52b586..0f4ac32aa4 100644
--- a/docs/en/04-supported-codebases/mmseg.md
+++ b/docs/en/04-supported-codebases/mmseg.md
@@ -8,41 +8,41 @@ Please refer to [get_started.md](https://github.com/open-mmlab/mmsegmentation/bl
## List of MMSegmentation models supported by MMDeploy
-| Model | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVino | Model config |
-|:----------------------------|:-----------:|:--------:|:----:|:-----:|:--------:|:----------------------------------------------------------------------------------------:|
-| FCN | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fcn) |
-| PSPNet[*](#static_shape) | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/pspnet) |
-| DeepLabV3 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3) |
-| DeepLabV3+ | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3plus) |
-| Fast-SCNN[*](#static_shape) | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastscnn) |
-| UNet | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/unet) |
-| ANN[*](#static_shape) | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ann) |
-| APCNet | Y | Y | Y | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/apcnet) |
-| BiSeNetV1 | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv1) |
-| BiSeNetV2 | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2) |
-| CGNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/cgnet) |
-| DMNet | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dmnet) |
-| DNLNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dnlnet) |
-| EMANet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/emanet) |
-| EncNet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/encnet) |
-| ERFNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/erfnet) |
-| FastFCN | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastfcn) |
-| GCNet | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/gcnet) |
-| ICNet[*](#static_shape) | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/icnet) |
-| ISANet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/isanet) |
-| NonLocal Net | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/nonlocal_net) |
-| OCRNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ocrnet) |
-| PointRend | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/point_rend) |
-| Semantic FPN | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/sem_fpn) |
-| STDC | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/stdc) |
-| UPerNet[*](#static_shape) | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/upernet) |
-| DANet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/danet) |
-| Segmenter[*](#static_shape) | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/segmenter) |
-| SegFormer[*](#static_shape) | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/segformer) |
-| SETR | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/setr) |
-| CCNet | N | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ccnet) |
-| PSANet | N | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/psanet) |
-| DPT | N | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dpt) |
+| Model | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVino | Model config |
+| :--------------------------- | :---------: | :------: | :--: | :---: | :------: | :--------------------------------------------------------------------------------------: |
+| FCN | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fcn) |
+| PSPNet[\*](#static_shape) | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/pspnet) |
+| DeepLabV3 | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3) |
+| DeepLabV3+ | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3plus) |
+| Fast-SCNN[\*](#static_shape) | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastscnn) |
+| UNet | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/unet) |
+| ANN[\*](#static_shape) | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ann) |
+| APCNet | Y | Y | Y | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/apcnet) |
+| BiSeNetV1 | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv1) |
+| BiSeNetV2 | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2) |
+| CGNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/cgnet) |
+| DMNet | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dmnet) |
+| DNLNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dnlnet) |
+| EMANet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/emanet) |
+| EncNet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/encnet) |
+| ERFNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/erfnet) |
+| FastFCN | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastfcn) |
+| GCNet | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/gcnet) |
+| ICNet[\*](#static_shape) | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/icnet) |
+| ISANet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/isanet) |
+| NonLocal Net | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/nonlocal_net) |
+| OCRNet | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ocrnet) |
+| PointRend | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/point_rend) |
+| Semantic FPN | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/sem_fpn) |
+| STDC | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/stdc) |
+| UPerNet[\*](#static_shape) | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/upernet) |
+| DANet | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/danet) |
+| Segmenter[\*](#static_shape) | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/segmenter) |
+| SegFormer[\*](#static_shape) | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/segformer) |
+| SETR | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/setr) |
+| CCNet | N | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ccnet) |
+| PSANet | N | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/psanet) |
+| DPT | N | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dpt) |
## Reminder
diff --git a/docs/en/05-supported-backends/ncnn.md b/docs/en/05-supported-backends/ncnn.md
index 4c72884866..789ed3ef1a 100644
--- a/docs/en/05-supported-backends/ncnn.md
+++ b/docs/en/05-supported-backends/ncnn.md
@@ -8,44 +8,48 @@ MMDeploy now supports ncnn version == 1.0.20220216
- Download VulkanTools for the compilation of ncnn.
- ```bash
- wget https://sdk.lunarg.com/sdk/download/1.2.176.1/linux/vulkansdk-linux-x86_64-1.2.176.1.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.2.176.1.tar.gz
- tar -xf vulkansdk-linux-x86_64-1.2.176.1.tar.gz
- export VULKAN_SDK=$(pwd)/1.2.176.1/x86_64
- export LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH
- ```
+ ```bash
+ wget https://sdk.lunarg.com/sdk/download/1.2.176.1/linux/vulkansdk-linux-x86_64-1.2.176.1.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.2.176.1.tar.gz
+ tar -xf vulkansdk-linux-x86_64-1.2.176.1.tar.gz
+ export VULKAN_SDK=$(pwd)/1.2.176.1/x86_64
+ export LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH
+ ```
- Check your gcc version.
-You should ensure your gcc satisfies `gcc >= 6`.
+ You should ensure your gcc satisfies `gcc >= 6`.
- Install Protocol Buffers through:
+
+ ```bash
+ apt-get install libprotobuf-dev protobuf-compiler
+ ```
+
+- Prepare ncnn Framework
+
+ - Download ncnn source code
+
```bash
- apt-get install libprotobuf-dev protobuf-compiler
+ git clone -b 20220216 git@github.com:Tencent/ncnn.git
```
-- Prepare ncnn Framework
+ - Make install ncnn library
- - Download ncnn source code
- ```bash
- git clone -b 20220216 git@github.com:Tencent/ncnn.git
- ```
-
- - Make install ncnn library
- ```bash
- cd ncnn
- export NCNN_DIR=$(pwd)
- git submodule update --init
- mkdir -p build && cd build
- cmake -DNCNN_VULKAN=ON -DNCNN_SYSTEM_GLSLANG=ON -DNCNN_BUILD_EXAMPLES=ON -DNCNN_PYTHON=ON -DNCNN_BUILD_TOOLS=ON -DNCNN_BUILD_BENCHMARK=ON -DNCNN_BUILD_TESTS=ON ..
- make install
- ```
-
- - Install pyncnn module
- ```bash
- cd ${NCNN_DIR} # To ncnn root directory
- cd python
- pip install -e .
- ```
+ ```bash
+ cd ncnn
+ export NCNN_DIR=$(pwd)
+ git submodule update --init
+ mkdir -p build && cd build
+ cmake -DNCNN_VULKAN=ON -DNCNN_SYSTEM_GLSLANG=ON -DNCNN_BUILD_EXAMPLES=ON -DNCNN_PYTHON=ON -DNCNN_BUILD_TOOLS=ON -DNCNN_BUILD_BENCHMARK=ON -DNCNN_BUILD_TESTS=ON ..
+ make install
+ ```
+
+ - Install pyncnn module
+
+ ```bash
+ cd ${NCNN_DIR} # To ncnn root directory
+ cd python
+ pip install -e .
+ ```
### Build custom ops
@@ -78,11 +82,11 @@ If you haven't installed ncnn in the default path, please add `-Dncnn_DIR` flag
1. When running ncnn models for inference with custom ops, it fails and shows the error message like:
- ```bash
- TypeError: register mm custom layers(): incompatible function arguments. The following argument types are supported:
- 1.(ar0: ncnn:Net) -> int
+ ```bash
+ TypeError: register mm custom layers(): incompatible function arguments. The following argument types are supported:
+ 1.(ar0: ncnn:Net) -> int
- Invoked with:
- ```
+ Invoked with:
+ ```
- This is because of the failure to bind ncnn C++ library to pyncnn. You should build pyncnn from C++ ncnn source code, but not by `pip install`
+ This is because of the failure to bind ncnn C++ library to pyncnn. You should build pyncnn from C++ ncnn source code, but not by `pip install`
diff --git a/docs/en/05-supported-backends/onnxruntime.md b/docs/en/05-supported-backends/onnxruntime.md
index f8b67db4ac..4c292c2a6c 100644
--- a/docs/en/05-supported-backends/onnxruntime.md
+++ b/docs/en/05-supported-backends/onnxruntime.md
@@ -33,12 +33,12 @@ Note:
- If you want to save onnxruntime env variables to bashrc, you could run
- ```bash
- echo '# set env for onnxruntime' >> ~/.bashrc
- echo "export ONNXRUNTIME_DIR=${ONNXRUNTIME_DIR}" >> ~/.bashrc
- echo 'export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
- source ~/.bashrc
- ```
+ ```bash
+ echo '# set env for onnxruntime' >> ~/.bashrc
+ echo "export ONNXRUNTIME_DIR=${ONNXRUNTIME_DIR}" >> ~/.bashrc
+ echo 'export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
+ source ~/.bashrc
+ ```
### Build on Linux
diff --git a/docs/en/05-supported-backends/openvino.md b/docs/en/05-supported-backends/openvino.md
index 7893acd293..44034b4e8a 100644
--- a/docs/en/05-supported-backends/openvino.md
+++ b/docs/en/05-supported-backends/openvino.md
@@ -1,14 +1,19 @@
# OpenVINO Support
This tutorial is based on Linux systems like Ubuntu-18.04.
+
## Installation
+
It is recommended to create a virtual environment for the project.
+
1. Install [OpenVINO](https://docs.openvino.ai/2021.4/get_started.html). It is recommended to use the installer or install using pip.
-Installation example using [pip](https://pypi.org/project/openvino-dev/):
+ Installation example using [pip](https://pypi.org/project/openvino-dev/):
+
```bash
pip install openvino-dev
```
-2. *`Optional` If you want to use OpenVINO in SDK, you need install OpenVINO with [install_guides](https://docs.openvino.ai/2021.4/openvino_docs_install_guides_installing_openvino_linux.html#install-openvino).
+
+2. \*`Optional` If you want to use OpenVINO in SDK, you need install OpenVINO with [install_guides](https://docs.openvino.ai/2021.4/openvino_docs_install_guides_installing_openvino_linux.html#install-openvino).
3. Install MMDeploy following the [instructions](../01-how-to-build/build_from_source.md).
@@ -17,6 +22,7 @@ To work with models from [MMDetection](https://github.com/open-mmlab/mmdetection
## Usage
Example:
+
```bash
python tools/deploy.py \
configs/mmdet/detection/detection_openvino_static-300x300.py \
@@ -31,6 +37,7 @@ python tools/deploy.py \
## List of supported models exportable to OpenVINO from MMDetection
The table below lists the models that are guaranteed to be exportable to OpenVINO from MMDetection.
+
| Model name | Config | Dynamic Shape |
| :----------------: | :-----------------------------------------------------------------------: | :-----------: |
| ATSS | `configs/atss/atss_r50_fpn_1x_coco.py` | Y |
@@ -52,7 +59,7 @@ Notes:
- Custom operations from OpenVINO use the domain `org.openvinotoolkit`.
- For faster work in OpenVINO in the Faster-RCNN, Mask-RCNN, Cascade-RCNN, Cascade-Mask-RCNN models
-the RoiAlign operation is replaced with the [ExperimentalDetectronROIFeatureExtractor](https://docs.openvinotoolkit.org/latest/openvino_docs_ops_detection_ExperimentalDetectronROIFeatureExtractor_6.html) operation in the ONNX graph.
+ the RoiAlign operation is replaced with the [ExperimentalDetectronROIFeatureExtractor](https://docs.openvinotoolkit.org/latest/openvino_docs_ops_detection_ExperimentalDetectronROIFeatureExtractor_6.html) operation in the ONNX graph.
- Models "VFNet" and "Faster R-CNN + DCN" use the custom "DeformableConv2D" operation.
## Deployment config
@@ -61,6 +68,7 @@ With the deployment config, you can specify additional options for the Model Opt
To do this, add the necessary parameters to the `backend_config.mo_options` in the fields `args` (for parameters with values) and `flags` (for flags).
Example:
+
```python
backend_config = dict(
mo_options=dict(
@@ -80,7 +88,7 @@ Information about the possible parameters for the Model Optimizer can be found i
- ImportError: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory
- To resolve missing external dependency on Ubuntu*, execute the following command:
+ To resolve missing external dependency on Ubuntu\*, execute the following command:
```bash
sudo apt-get install libpython3.7
diff --git a/docs/en/05-supported-backends/pplnn.md b/docs/en/05-supported-backends/pplnn.md
index a67e6954cc..8c0b32a0e1 100644
--- a/docs/en/05-supported-backends/pplnn.md
+++ b/docs/en/05-supported-backends/pplnn.md
@@ -11,6 +11,7 @@ This tutorial is based on Linux systems like Ubuntu-18.04.
## Usage
Example:
+
```bash
python tools/deploy.py \
configs/mmdet/detection/detection_pplnn_dynamic-800x1344.py \
diff --git a/docs/en/05-supported-backends/tensorrt.md b/docs/en/05-supported-backends/tensorrt.md
index e9c3b3d07b..abc3085214 100644
--- a/docs/en/05-supported-backends/tensorrt.md
+++ b/docs/en/05-supported-backends/tensorrt.md
@@ -9,16 +9,18 @@ Please install TensorRT 8 follow [install-guide](https://docs.nvidia.com/deeplea
**Note**:
- `pip Wheel File Installation` is not supported yet in this repo.
+
- We strongly suggest you install TensorRT through [tar file](https://docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html#installing-tar)
+
- After installation, you'd better add TensorRT environment variables to bashrc by:
- ```bash
- cd ${TENSORRT_DIR} # To TensorRT root directory
- echo '# set env for TensorRT' >> ~/.bashrc
- echo "export TENSORRT_DIR=${TENSORRT_DIR}" >> ~/.bashrc
- echo 'export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$TENSORRT_DIR' >> ~/.bashrc
- source ~/.bashrc
- ```
+ ```bash
+ cd ${TENSORRT_DIR} # To TensorRT root directory
+ echo '# set env for TensorRT' >> ~/.bashrc
+ echo "export TENSORRT_DIR=${TENSORRT_DIR}" >> ~/.bashrc
+ echo 'export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$TENSORRT_DIR' >> ~/.bashrc
+ source ~/.bashrc
+ ```
### Build custom ops
diff --git a/docs/en/05-supported-backends/torchscript.md b/docs/en/05-supported-backends/torchscript.md
index 370cfa5c93..9289c57523 100644
--- a/docs/en/05-supported-backends/torchscript.md
+++ b/docs/en/05-supported-backends/torchscript.md
@@ -27,12 +27,12 @@ Note:
- If you want to save libtorch env variables to bashrc, you could run
- ```bash
- echo '# set env for libtorch' >> ~/.bashrc
- echo "export Torch_DIR=${Torch_DIR}" >> ~/.bashrc
- echo 'export LD_LIBRARY_PATH=$Torch_DIR/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
- source ~/.bashrc
- ```
+ ```bash
+ echo '# set env for libtorch' >> ~/.bashrc
+ echo "export Torch_DIR=${Torch_DIR}" >> ~/.bashrc
+ echo 'export LD_LIBRARY_PATH=$Torch_DIR/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
+ source ~/.bashrc
+ ```
### Build on Linux
diff --git a/docs/en/06-developer-guide/support_new_backend.md b/docs/en/06-developer-guide/support_new_backend.md
index e6f71c4a73..d5ccce4e4f 100644
--- a/docs/en/06-developer-guide/support_new_backend.md
+++ b/docs/en/06-developer-guide/support_new_backend.md
@@ -6,9 +6,9 @@ MMDeploy supports a number of backend engines. We welcome the contribution of ne
Before contributing the codes, there are some requirements for the new backend that need to be checked:
-* The backend must support ONNX as IR.
-* If the backend requires model files or weight files other than a ".onnx" file, a conversion tool that converts the ".onnx" file to model files and weight files is required. The tool can be a Python API, a script, or an executable program.
-* It is highly recommended that the backend provides a Python interface to load the backend files and inference for validation.
+- The backend must support ONNX as IR.
+- If the backend requires model files or weight files other than a ".onnx" file, a conversion tool that converts the ".onnx" file to model files and weight files is required. The tool can be a Python API, a script, or an executable program.
+- It is highly recommended that the backend provides a Python interface to load the backend files and inference for validation.
### Support backend conversion
@@ -16,140 +16,140 @@ The backends in MMDeploy must support the ONNX. The backend loads the ".onnx" fi
1. Add backend constant in `mmdeploy/utils/constants.py` that denotes the name of the backend.
- **Example**:
+ **Example**:
- ```Python
- # mmdeploy/utils/constants.py
+ ```Python
+ # mmdeploy/utils/constants.py
- class Backend(AdvancedEnum):
- # Take TensorRT as an example
- TENSORRT = 'tensorrt'
- ```
+ class Backend(AdvancedEnum):
+ # Take TensorRT as an example
+ TENSORRT = 'tensorrt'
+ ```
2. Add a corresponding package (a folder with `__init__.py`) in `mmdeploy/backend/`. For example, `mmdeploy/backend/tensorrt`. In the `__init__.py`, there must be a function named `is_available` which checks if users have installed the backend library. If the check is passed, then the remaining files of the package will be loaded.
- **Example**:
+ **Example**:
- ```Python
- # mmdeploy/backend/tensorrt/__init__.py
+ ```Python
+ # mmdeploy/backend/tensorrt/__init__.py
- def is_available():
- return importlib.util.find_spec('tensorrt') is not None
+ def is_available():
+ return importlib.util.find_spec('tensorrt') is not None
- if is_available():
- from .utils import from_onnx, load, save
- from .wrapper import TRTWrapper
+ if is_available():
+ from .utils import from_onnx, load, save
+ from .wrapper import TRTWrapper
- __all__ = [
- 'from_onnx', 'save', 'load', 'TRTWrapper'
- ]
- ```
+ __all__ = [
+ 'from_onnx', 'save', 'load', 'TRTWrapper'
+ ]
+ ```
3. Create a config file in `configs/_base_/backends` (e.g., `configs/_base_/backends/tensorrt.py`). If the backend just takes the '.onnx' file as input, the new config can be simple. The config of the backend only consists of one field denoting the name of the backend (which should be same as the name in `mmdeploy/utils/constants.py`).
- **Example**:
+ **Example**:
- ```python
- backend_config = dict(type='onnxruntime')
- ```
+ ```python
+ backend_config = dict(type='onnxruntime')
+ ```
- If the backend requires other files, then the arguments for the conversion from ".onnx" file to backend files should be included in the config file.
+ If the backend requires other files, then the arguments for the conversion from ".onnx" file to backend files should be included in the config file.
- **Example:**
+ **Example:**
- ```Python
+ ```Python
- backend_config = dict(
- type='tensorrt',
- common_config=dict(
- fp16_mode=False, max_workspace_size=0))
- ```
+ backend_config = dict(
+ type='tensorrt',
+ common_config=dict(
+ fp16_mode=False, max_workspace_size=0))
+ ```
- After possessing a base backend config file, you can easily construct a complete deploy config through inheritance. Please refer to our [config tutorial](../02-how-to-run/write_config.md) for more details. Here is an example:
+ After possessing a base backend config file, you can easily construct a complete deploy config through inheritance. Please refer to our [config tutorial](../02-how-to-run/write_config.md) for more details. Here is an example:
- ```Python
- _base_ = ['../_base_/backends/onnxruntime.py']
+ ```Python
+ _base_ = ['../_base_/backends/onnxruntime.py']
- codebase_config = dict(type='mmcls', task='Classification')
- onnx_config = dict(input_shape=None)
- ```
+ codebase_config = dict(type='mmcls', task='Classification')
+ onnx_config = dict(input_shape=None)
+ ```
4. If the backend requires model files or weight files other than a ".onnx" file, create a `onnx2backend.py` file in the corresponding folder (e.g., create `mmdeploy/backend/tensorrt/onnx2tensorrt.py`). Then add a conversion function `onnx2backend` in the file. The function should convert a given ".onnx" file to the required backend files in a given work directory. There are no requirements on other parameters of the function and the implementation details. You can use any tools for conversion. Here are some examples:
- **Use Python script:**
+ **Use Python script:**
- ```Python
- def onnx2openvino(input_info: Dict[str, Union[List[int], torch.Size]],
- output_names: List[str], onnx_path: str, work_dir: str):
+ ```Python
+ def onnx2openvino(input_info: Dict[str, Union[List[int], torch.Size]],
+ output_names: List[str], onnx_path: str, work_dir: str):
- input_names = ','.join(input_info.keys())
- input_shapes = ','.join(str(list(elem)) for elem in input_info.values())
- output = ','.join(output_names)
+ input_names = ','.join(input_info.keys())
+ input_shapes = ','.join(str(list(elem)) for elem in input_info.values())
+ output = ','.join(output_names)
- mo_args = f'--input_model="{onnx_path}" '\
- f'--output_dir="{work_dir}" ' \
- f'--output="{output}" ' \
- f'--input="{input_names}" ' \
- f'--input_shape="{input_shapes}" ' \
- f'--disable_fusing '
- command = f'mo.py {mo_args}'
- mo_output = run(command, stdout=PIPE, stderr=PIPE, shell=True, check=True)
- ```
+ mo_args = f'--input_model="{onnx_path}" '\
+ f'--output_dir="{work_dir}" ' \
+ f'--output="{output}" ' \
+ f'--input="{input_names}" ' \
+ f'--input_shape="{input_shapes}" ' \
+ f'--disable_fusing '
+ command = f'mo.py {mo_args}'
+ mo_output = run(command, stdout=PIPE, stderr=PIPE, shell=True, check=True)
+ ```
- **Use executable program:**
+ **Use executable program:**
- ```Python
- def onnx2ncnn(onnx_path: str, work_dir: str):
- onnx2ncnn_path = get_onnx2ncnn_path()
- save_param, save_bin = get_output_model_file(onnx_path, work_dir)
- call([onnx2ncnn_path, onnx_path, save_param, save_bin])\
- ```
+ ```Python
+ def onnx2ncnn(onnx_path: str, work_dir: str):
+ onnx2ncnn_path = get_onnx2ncnn_path()
+ save_param, save_bin = get_output_model_file(onnx_path, work_dir)
+ call([onnx2ncnn_path, onnx_path, save_param, save_bin])\
+ ```
5. Define APIs in a new package in `mmdeploy/apis`.
- **Example:**
+ **Example:**
- ```Python
- # mmdeploy/apis/ncnn/__init__.py
+ ```Python
+ # mmdeploy/apis/ncnn/__init__.py
- from mmdeploy.backend.ncnn import is_available
+ from mmdeploy.backend.ncnn import is_available
- __all__ = ['is_available']
+ __all__ = ['is_available']
- if is_available():
- from mmdeploy.backend.ncnn.onnx2ncnn import (onnx2ncnn,
- get_output_model_file)
- __all__ += ['onnx2ncnn', 'get_output_model_file']
- ```
+ if is_available():
+ from mmdeploy.backend.ncnn.onnx2ncnn import (onnx2ncnn,
+ get_output_model_file)
+ __all__ += ['onnx2ncnn', 'get_output_model_file']
+ ```
- Then add the codes about conversion to `tools/deploy.py` using these APIs if necessary.
+ Then add the codes about conversion to `tools/deploy.py` using these APIs if necessary.
- **Example:**
+ **Example:**
- ```Python
- # tools/deploy.py
- # ...
- elif backend == Backend.NCNN:
- from mmdeploy.apis.ncnn import is_available as is_available_ncnn
+ ```Python
+ # tools/deploy.py
+ # ...
+ elif backend == Backend.NCNN:
+ from mmdeploy.apis.ncnn import is_available as is_available_ncnn
- if not is_available_ncnn():
- logging.error('ncnn support is not available.')
- exit(-1)
+ if not is_available_ncnn():
+ logging.error('ncnn support is not available.')
+ exit(-1)
- from mmdeploy.apis.ncnn import onnx2ncnn, get_output_model_file
+ from mmdeploy.apis.ncnn import onnx2ncnn, get_output_model_file
- backend_files = []
- for onnx_path in onnx_files:
- create_process(
- f'onnx2ncnn with {onnx_path}',
- target=onnx2ncnn,
- args=(onnx_path, args.work_dir),
- kwargs=dict(),
- ret_value=ret_value)
- backend_files += get_output_model_file(onnx_path, args.work_dir)
- # ...
- ```
+ backend_files = []
+ for onnx_path in onnx_files:
+ create_process(
+ f'onnx2ncnn with {onnx_path}',
+ target=onnx2ncnn,
+ args=(onnx_path, args.work_dir),
+ kwargs=dict(),
+ ret_value=ret_value)
+ backend_files += get_output_model_file(onnx_path, args.work_dir)
+ # ...
+ ```
6. Convert the models of OpenMMLab to backends (if necessary) and inference on backend engine. If you find some incompatible operators when testing, you can try to rewrite the original model for the backend following the [rewriter tutorial](support_new_model.md) or add custom operators.
@@ -161,80 +161,81 @@ Although the backend engines are usually implemented in C/C++, it is convenient
1. Add a file named `wrapper.py` to corresponding folder in `mmdeploy/backend/{backend}`. For example, `mmdeploy/backend/tensorrt/wrapper.py`. This module should implement and register a wrapper class that inherits the base class `BaseWrapper` in `mmdeploy/backend/base/base_wrapper.py`.
- **Example:**
+ **Example:**
- ```Python
- from mmdeploy.utils import Backend
- from ..base import BACKEND_WRAPPER, BaseWrapper
+ ```Python
+ from mmdeploy.utils import Backend
+ from ..base import BACKEND_WRAPPER, BaseWrapper
- @BACKEND_WRAPPER.register_module(Backend.TENSORRT.value)
- class TRTWrapper(BaseWrapper):
- ```
+ @BACKEND_WRAPPER.register_module(Backend.TENSORRT.value)
+ class TRTWrapper(BaseWrapper):
+ ```
2. The wrapper class can initialize the engine in `__init__` function and inference in `forward` function. Note that the `__init__` function must take a parameter `output_names` and pass it to base class to determine the orders of output tensors. The input and output variables of `forward` should be dictionaries denoting the name and value of the tensors.
3. For the convenience of performance testing, the class should define a "execute" function that only calls the inference interface of the backend engine. The `forward` function should call the "execute" function after preprocessing the data.
- **Example:**
+ **Example:**
- ```Python
- from mmdeploy.utils import Backend
- from mmdeploy.utils.timer import TimeCounter
- from ..base import BACKEND_WRAPPER, BaseWrapper
+ ```Python
+ from mmdeploy.utils import Backend
+ from mmdeploy.utils.timer import TimeCounter
+ from ..base import BACKEND_WRAPPER, BaseWrapper
- @BACKEND_WRAPPER.register_module(Backend.ONNXRUNTIME.value)
- class ORTWrapper(BaseWrapper):
+ @BACKEND_WRAPPER.register_module(Backend.ONNXRUNTIME.value)
+ class ORTWrapper(BaseWrapper):
- def __init__(self,
- onnx_file: str,
- device: str,
- output_names: Optional[Sequence[str]] = None):
- # Initialization
- # ...
- super().__init__(output_names)
+ def __init__(self,
+ onnx_file: str,
+ device: str,
+ output_names: Optional[Sequence[str]] = None):
+ # Initialization
+ # ...
+ super().__init__(output_names)
- def forward(self, inputs: Dict[str,
- torch.Tensor]) -> Dict[str, torch.Tensor]:
- # Fetch data
- # ...
+ def forward(self, inputs: Dict[str,
+ torch.Tensor]) -> Dict[str, torch.Tensor]:
+ # Fetch data
+ # ...
- self.__ort_execute(self.io_binding)
+ self.__ort_execute(self.io_binding)
- # Postprocess data
- # ...
+ # Postprocess data
+ # ...
- @TimeCounter.count_time()
- def __ort_execute(self, io_binding: ort.IOBinding):
- # Only do the inference
- self.sess.run_with_iobinding(io_binding)
- ```
+ @TimeCounter.count_time()
+ def __ort_execute(self, io_binding: ort.IOBinding):
+ # Only do the inference
+ self.sess.run_with_iobinding(io_binding)
+ ```
4. Add a default initialization method for the new wrapper in `mmdeploy/codebase/base/backend_model.py`
- **Example:**
-
- ```Python
- @staticmethod
- def _build_wrapper(backend: Backend,
- backend_files: Sequence[str],
- device: str,
- input_names: Optional[Sequence[str]] = None,
- output_names: Optional[Sequence[str]] = None):
- if backend == Backend.ONNXRUNTIME:
- from mmdeploy.backend.onnxruntime import ORTWrapper
- return ORTWrapper(
- onnx_file=backend_files[0],
- device=device,
- output_names=output_names)
- ```
+ **Example:**
+
+ ```Python
+ @staticmethod
+ def _build_wrapper(backend: Backend,
+ backend_files: Sequence[str],
+ device: str,
+ input_names: Optional[Sequence[str]] = None,
+ output_names: Optional[Sequence[str]] = None):
+ if backend == Backend.ONNXRUNTIME:
+ from mmdeploy.backend.onnxruntime import ORTWrapper
+ return ORTWrapper(
+ onnx_file=backend_files[0],
+ device=device,
+ output_names=output_names)
+ ```
5. Add docstring and unit tests for new code :).
-
### Support new backends using MMDeploy as a third party
+
Previous parts show how to add a new backend in MMDeploy, which requires changing its source codes. However, if we treat MMDeploy as a third party, the methods above are no longer efficient. To this end, adding a new backend requires us pre-install another package named `aenum`. We can install it directly through `pip install aenum`.
After installing `aenum` successfully, we can use it to add a new backend through:
+
```python
from mmdeploy.utils.constants import Backend
from aenum import extend_enum
diff --git a/docs/en/06-developer-guide/test_rewritten_models.md b/docs/en/06-developer-guide/test_rewritten_models.md
index 5573a2c993..311e2adbd7 100644
--- a/docs/en/06-developer-guide/test_rewritten_models.md
+++ b/docs/en/06-developer-guide/test_rewritten_models.md
@@ -53,7 +53,7 @@ def test_baseclassfier_forward():
assert backend_output == 'simple_test'
```
- In this test function, we construct a derived class of `BaseClassifier` to test if the rewritten model would work in the rewrite context. We get outputs of the original model by directly calling `model(input)` and get the outputs of the rewritten model by calling `model(input)` in `RewriteContext`. Finally, we can check the outputs by asserting their value.
+In this test function, we construct a derived class of `BaseClassifier` to test if the rewritten model would work in the rewrite context. We get outputs of the original model by directly calling `model(input)` and get the outputs of the rewritten model by calling `model(input)` in `RewriteContext`. Finally, we can check the outputs by asserting their value.
## Test rewritten model with big changes
diff --git a/docs/en/conf.py b/docs/en/conf.py
index ba34088b38..a0a825ff26 100644
--- a/docs/en/conf.py
+++ b/docs/en/conf.py
@@ -80,7 +80,7 @@
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
-language = None
+language = 'en'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
@@ -104,8 +104,7 @@
# documentation.
#
html_theme_options = {
- # TODO: Add log_url
- # 'logo_url': 'https://mmocr.readthedocs.io/en/latest/',
+ 'logo_url': 'https://mmdeploy.readthedocs.io/en/latest/',
'menu': [{
'name': 'GitHub',
'url': 'https://github.com/open-mmlab/mmdeploy'
@@ -119,6 +118,10 @@
html_static_path = ['_static']
html_css_files = ['css/readthedocs.css']
+# Enable ::: for my_st
+myst_enable_extensions = ['colon_fence']
+myst_heading_anchors = 5
+
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
diff --git a/docs/en/faq.md b/docs/en/faq.md
index 14d621ea79..dec0174d3c 100644
--- a/docs/en/faq.md
+++ b/docs/en/faq.md
@@ -6,7 +6,7 @@
Fp16 mode requires a device with full-rate fp16 support.
-- "error: parameter check failed at: engine.cpp::setBindingDimensions::1046, condition: profileMinDims.d[i] <= dimensions.d[i]"
+- "error: parameter check failed at: engine.cpp::setBindingDimensions::1046, condition: profileMinDims.d\[i\] \<= dimensions.d\[i\]"
When building an `ICudaEngine` from an `INetworkDefinition` that has dynamically resizable inputs, users need to specify at least one optimization profile. Which can be set in deploy config:
@@ -25,33 +25,37 @@
The input tensor shape should be limited between `min_shape` and `max_shape`.
-- "error: [TensorRT] INTERNAL ERROR: Assertion failed: cublasStatus == CUBLAS_STATUS_SUCCESS"
+- "error: \[TensorRT\] INTERNAL ERROR: Assertion failed: cublasStatus == CUBLAS_STATUS_SUCCESS"
TRT 7.2.1 switches to use cuBLASLt (previously it was cuBLAS). cuBLASLt is the defaulted choice for SM version >= 7.0. You may need CUDA-10.2 Patch 1 (Released Aug 26, 2020) to resolve some cuBLASLt issues. Another option is to use the new TacticSource API and disable cuBLASLt tactics if you dont want to upgrade.
### Libtorch
+
- Error: `libtorch/share/cmake/Caffe2/Caffe2Config.cmake:96 (message):Your installed Caffe2 version uses cuDNN but I cannot find the cuDNN libraries. Please set the proper cuDNN prefixes and / or install cuDNN.`
May `export CUDNN_ROOT=/root/path/to/cudnn` to resolve the build error.
-
### Windows
+
- Error: similar like this `OSError: [WinError 1455] The paging file is too small for this operation to complete. Error loading "C:\Users\cx\miniconda3\lib\site-packages\torch\lib\cudnn_cnn_infer64_8.dll" or one of its dependencies`
Solution: according to this [post](https://stackoverflow.com/questions/64837376/how-to-efficiently-run-multiple-pytorch-processes-models-at-once-traceback), the issue may be caused by NVidia and will fix in *CUDA release 11.7*. For now one could use the [fixNvPe.py](https://gist.github.com/cobryan05/7d1fe28dd370e110a372c4d268dcb2e5) script to modify the nvidia dlls in the pytorch lib dir.
`python fixNvPe.py --input=C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\torch\lib\*.dll`
- You can find your pytorch installation path with:
- ```python
- import torch
- print(torch.__file__)
- ```
+ You can find your pytorch installation path with:
+
+ ```python
+ import torch
+ print(torch.__file__)
+ ```
### Pip
+
- pip installed package but could not `import` them.
Make sure your are using conda pip.
+
```bash
$ which pip
# /path/to/.local/bin/pip
diff --git a/docs/en/get_started.md b/docs/en/get_started.md
index b4682609d3..a28ec9e20c 100644
--- a/docs/en/get_started.md
+++ b/docs/en/get_started.md
@@ -50,7 +50,7 @@ On GPU platforms:
export TORCHVISION_VERSION=0.9.0
export CUDA_VERSION=11.1
conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cudatoolkit=${CUDA_VERSION} -c pytorch -c conda-forge
- ```
+```
On CPU platforms:
@@ -65,11 +65,12 @@ conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cp
We recommend that users follow our best practices installing MMDeploy.
**Step 0.** Install [MMCV](https://github.com/open-mmlab/mmcv).
+
```shell
export MMCV_VERSION=1.5.0
export CUDA_STRING="${CUDA_VERSION/./""}"
python -m pip install mmcv-full==${MMCV_VERSION} -f https://download.openmmlab.com/mmcv/dist/cu${CUDA_STRING}/torch${PYTORCH_VERSION}/index.html
- ```
+```
**Step 1.** Install MMDeploy.
@@ -78,24 +79,24 @@ You can download them according to your target platform and device.
Take the MMDeploy-TensorRT package on NVIDIA for example:
- ```shell
- export MMDEPLOY_VERSION=0.5.0
- export TENSORRT_VERSION=8.2.3.0
- export PYTHON_VERSION=3.7
- export PYTHON_STRING="${PYTHON_VERSION/./""}"
-
- wget https://github.com/open-mmlab/mmdeploy/releases/download/v${MMDEPLOY_VERSION}/mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
- tar -zxvf mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
- cd mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}
- python -m pip install dist/mmdeploy-*-py${PYTHON_STRING}*.whl
- python -m pip install sdk/python/mmdeploy_python-*-cp${PYTHON_STRING}*.whl
- export LD_LIBRARY_PATH=$(pwd)/sdk/lib:$LD_LIBRARY_PATH
- cd ..
- ```
-
- ```{note}
- If MMDeploy prebuilt package doesn meet your target platforms or devices, please build MMDeploy from its source by following the build documents
- ```
+```shell
+export MMDEPLOY_VERSION=0.5.0
+export TENSORRT_VERSION=8.2.3.0
+export PYTHON_VERSION=3.7
+export PYTHON_STRING="${PYTHON_VERSION/./""}"
+
+wget https://github.com/open-mmlab/mmdeploy/releases/download/v${MMDEPLOY_VERSION}/mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
+tar -zxvf mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
+cd mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}
+python -m pip install dist/mmdeploy-*-py${PYTHON_STRING}*.whl
+python -m pip install sdk/python/mmdeploy_python-*-cp${PYTHON_STRING}*.whl
+export LD_LIBRARY_PATH=$(pwd)/sdk/lib:$LD_LIBRARY_PATH
+cd ..
+```
+
+```{note}
+If MMDeploy prebuilt package doesn meet your target platforms or devices, please build MMDeploy from its source by following the build documents
+```
**step 2.** Install the inference backend
@@ -105,22 +106,22 @@ Based on the above MMDeploy-TensorRT package, we need to download and install [T
The following shows an example of installing TensorRT 8.2.3.0 and cuDNN 8.2:
- ```shell
- export TENSORRT_VERSION=8.2.3.0
- CUDA_MAJOR="${CUDA_VERSION/\.*/""}"
-
- # !!! Download tensorrt package from NVIDIA that matches your CUDA Toolkit version to the current working directory
- tar -zxvf TensorRT-${TENSORRT_VERSION}*cuda-${CUDA_MAJOR}*.tar.gz
- python -m pip install TensorRT-${TENSORRT_VERSION}/python/tensorrt-*-cp${PYTHON_STRING}*.whl
- python -m pip install pycuda
- export TENSORRT_DIR=$(pwd)/TensorRT-${TENSORRT_VERSION}
- export LD_LIBRARY_PATH=${TENSORRT_DIR}/lib:$LD_LIBRARY_PATH
-
- # !!! Download cuDNN package from NVIDIA that matches your CUDA Toolkit and TensorRT version to the current working directory
- tar -zxvf cudnn-${CUDA_MAJOR}.*-linux-x64*.tgz
- export CUDNN_DIR=$(pwd)/cuda
- export LD_LIBRARY_PATH=$CUDNN_DIR/lib64:$LD_LIBRARY_PATH
- ```
+```shell
+export TENSORRT_VERSION=8.2.3.0
+CUDA_MAJOR="${CUDA_VERSION/\.*/""}"
+
+# !!! Download tensorrt package from NVIDIA that matches your CUDA Toolkit version to the current working directory
+tar -zxvf TensorRT-${TENSORRT_VERSION}*cuda-${CUDA_MAJOR}*.tar.gz
+python -m pip install TensorRT-${TENSORRT_VERSION}/python/tensorrt-*-cp${PYTHON_STRING}*.whl
+python -m pip install pycuda
+export TENSORRT_DIR=$(pwd)/TensorRT-${TENSORRT_VERSION}
+export LD_LIBRARY_PATH=${TENSORRT_DIR}/lib:$LD_LIBRARY_PATH
+
+# !!! Download cuDNN package from NVIDIA that matches your CUDA Toolkit and TensorRT version to the current working directory
+tar -zxvf cudnn-${CUDA_MAJOR}.*-linux-x64*.tgz
+export CUDNN_DIR=$(pwd)/cuda
+export LD_LIBRARY_PATH=$CUDNN_DIR/lib64:$LD_LIBRARY_PATH
+```
In the next chapters, we are going to present our 'Hello, world' example based on the above settings.
diff --git a/docs/en/ops/ncnn.md b/docs/en/ops/ncnn.md
index 2b91075685..54a2138e02 100644
--- a/docs/en/ops/ncnn.md
+++ b/docs/en/ops/ncnn.md
@@ -50,6 +50,7 @@ Expand has no parameters.
#### Outputs
+
- outputs[0]: T
- top_blob; The blob of ncnn.Mat which expanded by given shape and broadcast rule of ncnn.
@@ -67,9 +68,9 @@ Given the data and indice blob, gather entries of the axis dimension of data ind
#### Parameters
-| Type | Parameter | Description |
-| ------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
-| `int` | `axis` | Which axis to gather on. Default is 0.
+| Type | Parameter | Description |
+| ----- | --------- | -------------------------------------- |
+| `int` | `axis` | Which axis to gather on. Default is 0. |
#### Inputs
@@ -81,6 +82,7 @@ Given the data and indice blob, gather entries of the axis dimension of data ind
#### Outputs
+
- outputs[0]: T
- top_blob; The blob of ncnn.Mat which gathered by given data and indice blob.
@@ -108,6 +110,7 @@ Shape has no parameters.
#### Outputs
+
- outputs[0]: T
- top_blob; 1-D ncnn.Mat of shape (bottom_blob.dims,), `bottom_blob.dims` is the input blob dimensions.
@@ -126,7 +129,7 @@ Get the indices and value(optional) of largest or smallest k data among the axis
#### Parameters
| Type | Parameter | Description |
-|-------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ----- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `int` | `axis` | The axis of data which topk calculate on. Default is -1, indicates the last dimension. |
| `int` | `largest` | The binary value which indicates the TopK operator selects the largest or smallest K values. Default is 1, the TopK selects the largest K values. |
| `int` | `sorted` | The binary value of whether returning sorted topk value or not. If not, the topk returns topk values in any order. Default is 1, this operator returns sorted topk values. |
@@ -142,6 +145,7 @@ Get the indices and value(optional) of largest or smallest k data among the axis
#### Outputs
+
- outputs[0]: T
- top_blob[0]; If outputs has only 1 blob, outputs[0] is the indice blob of topk, if outputs has 2 blobs, outputs[0] is the value blob of topk. This blob is ncnn.Mat format with the shape of bottom_blob[0] or reduced shape of bottom_blob[0].
diff --git a/docs/en/ops/onnxruntime.md b/docs/en/ops/onnxruntime.md
index 3fd572e4fa..a3d96332d6 100644
--- a/docs/en/ops/onnxruntime.md
+++ b/docs/en/ops/onnxruntime.md
@@ -16,11 +16,11 @@
- [Outputs](#outputs-1)
- [Type Constraints](#type-constraints-1)
- [NMSRotated](#nmsrotated)
- - [Description](#description-2)
- - [Parameters](#parameters-2)
- - [Inputs](#inputs-2)
- - [Outputs](#outputs-2)
- - [Type Constraints](#type-constraints-2)
+ - [Description](#description-2)
+ - [Parameters](#parameters-2)
+ - [Inputs](#inputs-2)
+ - [Outputs](#outputs-2)
+ - [Type Constraints](#type-constraints-2)
- [RoIAlignRotated](#roialignrotated)
- [Description](#description-3)
- [Parameters](#parameters-3)
@@ -114,10 +114,9 @@ Non Max Suppression for rotated bboxes.
#### Parameters
-| Type | Parameter | Description |
-| -------------- | ------------------- | ------------------------------------------------------------------------------------- |
-| `float` | `iou_threshold` | The IoU threshold for NMS. |
-
+| Type | Parameter | Description |
+| ------- | --------------- | -------------------------- |
+| `float` | `iou_threshold` | The IoU threshold for NMS. |
#### Inputs
@@ -139,7 +138,6 @@ Non Max Suppression for rotated bboxes.
- T:tensor(float32, Linear)
-
### RoIAlignRotated
#### Description
@@ -148,14 +146,14 @@ Perform RoIAlignRotated on output feature, used in bbox_head of most two-stage r
#### Parameters
-| Type | Parameter | Description |
-| ------- | ---------------- | ------------------------------------------------------------------------------------------------------------- |
-| `int` | `output_height` | height of output roi |
-| `int` | `output_width` | width of output roi |
-| `float` | `spatial_scale` | used to scale the input boxes |
-| `int` | `sampling_ratio` | number of input samples to take for each output sample. `0` means to take samples densely for current models. |
-| `int` | `aligned` | If `aligned=0`, use the legacy implementation in MMDetection. Else, align the results more perfectly. |
-| `int` | `clockwise` | If True, the angle in each proposal follows a clockwise fashion in image space, otherwise, the angle is counterclockwise. Default: False. |
+| Type | Parameter | Description |
+| ------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
+| `int` | `output_height` | height of output roi |
+| `int` | `output_width` | width of output roi |
+| `float` | `spatial_scale` | used to scale the input boxes |
+| `int` | `sampling_ratio` | number of input samples to take for each output sample. `0` means to take samples densely for current models. |
+| `int` | `aligned` | If `aligned=0`, use the legacy implementation in MMDetection. Else, align the results more perfectly. |
+| `int` | `clockwise` | If True, the angle in each proposal follows a clockwise fashion in image space, otherwise, the angle is counterclockwise. Default: False. |
#### Inputs
diff --git a/docs/en/ops/tensorrt.md b/docs/en/ops/tensorrt.md
index 4263e0edbb..d1feae59cd 100644
--- a/docs/en/ops/tensorrt.md
+++ b/docs/en/ops/tensorrt.md
@@ -83,6 +83,7 @@ Batched NMS with a fixed number of output bounding boxes.
#### Outputs
+
- outputs[0]: T
- dets; 3-D tensor of shape (N, valid_num_boxes, 5), `valid_num_boxes` is the number of boxes after NMS. For each row `dets[i,j,:] = [x0, y0, x1, y1, score]`
@@ -164,7 +165,6 @@ y = scale * (x - mean) / sqrt(variance + epsilon) + B, where mean and variance a
- T:tensor(float32, Linear)
-
### MMCVModulatedDeformConv2d
#### Description
@@ -284,7 +284,7 @@ Perform RoIAlign on output feature, used in bbox_head of most two-stage detector
#### Description
-ScatterND takes three inputs `data` tensor of rank r >= 1, `indices` tensor of rank q >= 1, and `updates` tensor of rank q + r - indices.shape[-1] - 1. The output of the operation is produced by creating a copy of the input `data`, and then updating its value to values specified by updates at specific index positions specified by `indices`. Its output shape is the same as the shape of `data`. Note that `indices` should not have duplicate entries. That is, two or more updates for the same index-location is not supported.
+ScatterND takes three inputs `data` tensor of rank r >= 1, `indices` tensor of rank q >= 1, and `updates` tensor of rank q + r - indices.shape\[-1\] - 1. The output of the operation is produced by creating a copy of the input `data`, and then updating its value to values specified by updates at specific index positions specified by `indices`. Its output shape is the same as the shape of `data`. Note that `indices` should not have duplicate entries. That is, two or more updates for the same index-location is not supported.
The `output` is calculated via the following equation:
@@ -352,6 +352,7 @@ Batched rotated NMS with a fixed number of output bounding boxes.
#### Outputs
+
- outputs[0]: T
- dets; 3-D tensor of shape (N, valid_num_boxes, 6), `valid_num_boxes` is the number of boxes after NMS. For each row `dets[i,j,:] = [x0, y0, width, height, theta, score]`
diff --git a/docs/en/useful_tools.md b/docs/en/useful_tools.md
index a1e05d6525..896a892637 100644
--- a/docs/en/useful_tools.md
+++ b/docs/en/useful_tools.md
@@ -81,7 +81,7 @@ python tools/onnx2pplnn.py \
- `onnx_path`: The path of the `ONNX` model to convert.
- `output_path`: The converted `PPLNN` algorithm path in json format.
- `device`: The device of the model during conversion.
-- `opt-shapes`: Optimal shapes for PPLNN optimization. The shape of each tensor should be wrap with "[]" or "()" and the shapes of tensors should be separated by ",".
+- `opt-shapes`: Optimal shapes for PPLNN optimization. The shape of each tensor should be wrap with "\[\]" or "()" and the shapes of tensors should be separated by ",".
- `--log-level`: To set log level which in `'CRITICAL', 'FATAL', 'ERROR', 'WARN', 'WARNING', 'INFO', 'DEBUG', 'NOTSET'`. If not specified, it will be set to `INFO`.
## onnx2tensorrt
diff --git a/docs/zh_cn/01-how-to-build/android.md b/docs/zh_cn/01-how-to-build/android.md
index 9308750617..1d86e22d8a 100644
--- a/docs/zh_cn/01-how-to-build/android.md
+++ b/docs/zh_cn/01-how-to-build/android.md
@@ -10,7 +10,8 @@
- [编译 SDK](#编译-sdk)
- [编译 Demo](#编译-demo)
----
+______________________________________________________________________
+
MMDeploy 为 android 平台提供交叉编译的构建方式.
MMDeploy converter 部分在 linux 平台上执行,SDK 部分在 android 平台上执行.
@@ -29,30 +30,31 @@ MMDeploy 的交叉编译分为两步:
- cmake
- **保证 cmake的版本 >= 3.14.0**. 如果不是,可以参考以下命令安装 3.20.0 版本. 如要获取其他版本,请参考 [这里](https://cmake.org/install)
+ **保证 cmake的版本 >= 3.14.0**. 如果不是,可以参考以下命令安装 3.20.0 版本. 如要获取其他版本,请参考 [这里](https://cmake.org/install)
- ```bash
- wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.tar.gz
- tar -xzvf cmake-3.20.0-linux-x86_64.tar.gz
- sudo ln -sf $(pwd)/cmake-3.20.0-linux-x86_64/bin/* /usr/bin/
- ```
+ ```bash
+ wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.tar.gz
+ tar -xzvf cmake-3.20.0-linux-x86_64.tar.gz
+ sudo ln -sf $(pwd)/cmake-3.20.0-linux-x86_64/bin/* /usr/bin/
+ ```
- ANDROID NDK 19+
- **保证 android ndk 的版本 >= 19.0**. 如果不是,可以参考以下命令安装 r23b 版本. 如要获取其他版本,请参考 [这里](https://developer.android.com/ndk/downloads)
+ **保证 android ndk 的版本 >= 19.0**. 如果不是,可以参考以下命令安装 r23b 版本. 如要获取其他版本,请参考 [这里](https://developer.android.com/ndk/downloads)
- ```bash
- wget https://dl.google.com/android/repository/android-ndk-r23b-linux.zip
- unzip android-ndk-r23b-linux.zip
- cd android-ndk-r23b
- export NDK_PATH=${PWD}
- ```
+ ```bash
+ wget https://dl.google.com/android/repository/android-ndk-r23b-linux.zip
+ unzip android-ndk-r23b-linux.zip
+ cd android-ndk-r23b
+ export NDK_PATH=${PWD}
+ ```
### 安装依赖包
#### 安装 MMDeploy SDK 依赖
如果您只对模型转换感兴趣,那么可以跳过本章节.
+
@@ -72,7 +74,7 @@ export OPENCV_ANDROID_SDK_DIR=${PWD}/OpenCV-android-sdk
-
+
ncnn |
ncnn 是支持 android 平台的高效神经网络推理计算框架
@@ -93,7 +95,9 @@ make install
|
### 编译 MMDeploy
+
#### 编译选项说明
+
diff --git a/docs/zh_cn/01-how-to-build/build_from_docker.md b/docs/zh_cn/01-how-to-build/build_from_docker.md
index 0b1a444f88..232fc7a236 100644
--- a/docs/zh_cn/01-how-to-build/build_from_docker.md
+++ b/docs/zh_cn/01-how-to-build/build_from_docker.md
@@ -5,23 +5,28 @@
## 构建镜像
对于 CPU 用户,我们可以通过以下方式使用最新的 MMDeploy 构建 docker 镜像:
+
```
cd mmdeploy
docker build docker/CPU/ -t mmdeploy:master-cpu
```
+
对于 GPU 用户,我们可以通过以下方式使用最新的 MMDeploy 构建 docker 镜像:
+
```
cd mmdeploy
docker build docker/GPU/ -t mmdeploy:master-gpu
```
要安装具有特定版本的 MMDeploy,我们可以将 `--build-arg VERSION=${VERSION}` 附加到构建命令中。以 GPU 为例:
+
```
cd mmdeploy
docker build docker/GPU/ -t mmdeploy:0.1.0 --build-arg VERSION=0.1.0
```
要切换成阿里源安装依赖,我们可以将 `--build-arg USE_SRC_INSIDE=${USE_SRC_INSIDE}` 附加到构建命令中。
+
```
# 以 GPU 为例
cd mmdeploy
@@ -35,6 +40,7 @@ docker build docker/CPU/ -t mmdeploy:inside --build-arg USE_SRC_INSIDE=true
## 运行 docker 容器
构建 docker 镜像成功后,我们可以使用 `docker run` 启动 docker 服务。 GPU 镜像为例:
+
```
docker run --gpus all -it -p 8080:8081 mmdeploy:master-gpu
```
@@ -43,15 +49,16 @@ docker run --gpus all -it -p 8080:8081 mmdeploy:master-gpu
1. CUDA error: the provided PTX was compiled with an unsupported toolchain:
- 如 [这里](https://forums.developer.nvidia.com/t/cuda-error-the-provided-ptx-was-compiled-with-an-unsupported-toolchain/185754)所说,更新 GPU 的驱动到您的GPU能使用的最新版本。
+ 如 [这里](https://forums.developer.nvidia.com/t/cuda-error-the-provided-ptx-was-compiled-with-an-unsupported-toolchain/185754)所说,更新 GPU 的驱动到您的GPU能使用的最新版本。
+
+2. docker: Error response from daemon: could not select device driver "" with capabilities: \[\[gpu\]\].
-2. docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
- ```
- # Add the package repositories
- distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
- curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
- curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
+ ```
+ # Add the package repositories
+ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
+ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
+ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
- sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
- sudo systemctl restart docker
- ```
+ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
+ sudo systemctl restart docker
+ ```
diff --git a/docs/zh_cn/01-how-to-build/build_from_source.md b/docs/zh_cn/01-how-to-build/build_from_source.md
index cbbfd1bab5..5e18c9959c 100644
--- a/docs/zh_cn/01-how-to-build/build_from_source.md
+++ b/docs/zh_cn/01-how-to-build/build_from_source.md
@@ -9,19 +9,20 @@ git clone -b master git@github.com:open-mmlab/mmdeploy.git --recursive
```
### FAQ
+
- 如果由于网络等原因导致拉取仓库子模块失败,可以尝试通过如下指令手动再次安装子模块:
- ```bash
- git clone git@github.com:NVIDIA/cub.git third_party/cub
- cd third_party/cub
- git checkout c3cceac115
+ ```bash
+ git clone git@github.com:NVIDIA/cub.git third_party/cub
+ cd third_party/cub
+ git checkout c3cceac115
- # 返回至 third_party 目录, 克隆 pybind11
- cd ..
- git clone git@github.com:pybind/pybind11.git pybind11
- cd pybind11
- git checkout 70a58c5
- ```
+ # 返回至 third_party 目录, 克隆 pybind11
+ cd ..
+ git clone git@github.com:pybind/pybind11.git pybind11
+ cd pybind11
+ git checkout 70a58c5
+ ```
- 如果以 `SSH` 方式 `git clone` 代码失败,您可以尝试使用 `HTTPS` 协议下载代码:
@@ -31,9 +32,12 @@ git clone -b master git@github.com:open-mmlab/mmdeploy.git --recursive
git submodule update --init --recursive
+ ```
+
## 编译
根据您的目标平台,点击如下对应的链接,按照说明编译 MMDeploy
+
- [Linux-x86_64](linux-x86_64.md)
- [Windows](windows.md)
- [Android-aarch64](android.md)
diff --git a/docs/zh_cn/01-how-to-build/jetsons.md b/docs/zh_cn/01-how-to-build/jetsons.md
index 0a2402744d..fb994f68c4 100644
--- a/docs/zh_cn/01-how-to-build/jetsons.md
+++ b/docs/zh_cn/01-how-to-build/jetsons.md
@@ -1,6 +1,7 @@
# 如何在 Jetson 模组上安装 MMDeploy
本教程将介绍如何在 NVIDIA Jetson 平台上安装 MMDeploy。该方法已经在以下 3 种 Jetson 模组上进行了验证:
+
- Jetson Nano
- Jetson TX2
- Jetson AGX Xavier
@@ -17,6 +18,7 @@ JetPack SDK 为构建硬件加速的边缘 AI 应用提供了一个全面的开
其支持所有的 Jetson 模组及开发套件。
主要有两种安装 JetPack SDK 的方式:
+
1. 使用 SD 卡镜像方式,直接将镜像刻录到 SD 卡上
2. 使用 NVIDIA SDK Manager 进行安装
@@ -57,6 +59,7 @@ JetPack SDK 4+ 自带 python 3.6。我们强烈建议使用默认的 python 版
如果必须安装更高版本的 python, 可以选择安装 JetPack 5+,其提供 python 3.8。
```
+
### PyTorch
从[这里](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048)下载 Jetson 的 PyTorch wheel 文件并保存在本地目录 `/opt` 中。
@@ -226,33 +229,34 @@ pip install -v -e .
1. 编译 SDK Libraries
- ```shell
- mkdir -p build && cd build
- cmake .. \
- -DMMDEPLOY_BUILD_SDK=ON \
- -DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \
- -DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
- -DMMDEPLOY_TARGET_BACKENDS="trt" \
- -DMMDEPLOY_CODEBASES=all \
- -Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl
- make -j$(nproc) && make install
- ```
+ ```shell
+ mkdir -p build && cd build
+ cmake .. \
+ -DMMDEPLOY_BUILD_SDK=ON \
+ -DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \
+ -DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
+ -DMMDEPLOY_TARGET_BACKENDS="trt" \
+ -DMMDEPLOY_CODEBASES=all \
+ -Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl
+ make -j$(nproc) && make install
+ ```
2. 编译 SDK demos
- ```shell
- cd ${MMDEPLOY_DIR}/build/install/example
- mkdir -p build && cd build
- cmake .. -DMMDeploy_DIR=${MMDEPLOY_DIR}/build/install/lib/cmake/MMDeploy
- make -j$(nproc)
- ```
+ ```shell
+ cd ${MMDEPLOY_DIR}/build/install/example
+ mkdir -p build && cd build
+ cmake .. -DMMDeploy_DIR=${MMDEPLOY_DIR}/build/install/lib/cmake/MMDeploy
+ make -j$(nproc)
+ ```
3. 运行 demo
- 以目标检测为例:
- ```shell
- ./object_detection cuda ${directory/to/the/converted/models} ${path/to/an/image}
- ```
+ 以目标检测为例:
+
+ ```shell
+ ./object_detection cuda ${directory/to/the/converted/models} ${path/to/an/image}
+ ```
## Troubleshooting
@@ -260,13 +264,14 @@ pip install -v -e .
- `pip install` 报错 `Illegal instruction (core dumped)`
- ```shell
+ ```shell
echo '# set env for pip' >> ~/.bashrc
echo 'export OPENBLAS_CORETYPE=ARMV8' >> ~/.bashrc
source ~/.bashrc
```
如果上述方法仍无法解决问题,检查是否正在使用镜像文件。如果是的,可尝试:
+
```shell
rm .condarc
conda clean -i
diff --git a/docs/zh_cn/01-how-to-build/linux-x86_64.md b/docs/zh_cn/01-how-to-build/linux-x86_64.md
index 0b0202a30f..63bdf2a0e8 100644
--- a/docs/zh_cn/01-how-to-build/linux-x86_64.md
+++ b/docs/zh_cn/01-how-to-build/linux-x86_64.md
@@ -14,7 +14,8 @@
- [安装 Model Converter](#安装-model-converter)
- [编译SDK](#编译sdk)
- [编译 Demo](#编译-demo)
----
+
+______________________________________________________________________
## 源码安装
@@ -22,27 +23,29 @@
- cmake
- **保证 cmake的版本 >= 3.14.0**。如果不是,可以参考以下命令安装 3.20.0 版本。如需获取其他版本,请参考[这里](https://cmake.org/install)。
+ **保证 cmake的版本 >= 3.14.0**。如果不是,可以参考以下命令安装 3.20.0 版本。如需获取其他版本,请参考[这里](https://cmake.org/install)。
- ```bash
- wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.tar.gz
- tar -xzvf cmake-3.20.0-linux-x86_64.tar.gz
- sudo ln -sf $(pwd)/cmake-3.20.0-linux-x86_64/bin/* /usr/bin/
- ```
+ ```bash
+ wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.tar.gz
+ tar -xzvf cmake-3.20.0-linux-x86_64.tar.gz
+ sudo ln -sf $(pwd)/cmake-3.20.0-linux-x86_64/bin/* /usr/bin/
+ ```
- GCC 7+
- MMDeploy SDK 使用了 C++17 特性,因此需要安装gcc 7+以上的版本。
- ```bash
- # 如果 Ubuntu 版本 < 18.04,需要加入仓库
- sudo add-apt-repository ppa:ubuntu-toolchain-r/test
- sudo apt-get update
- sudo apt-get install gcc-7
- sudo apt-get install g++-7
- ```
+ MMDeploy SDK 使用了 C++17 特性,因此需要安装gcc 7+以上的版本。
+
+ ```bash
+ # 如果 Ubuntu 版本 < 18.04,需要加入仓库
+ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
+ sudo apt-get update
+ sudo apt-get install gcc-7
+ sudo apt-get install g++-7
+ ```
### 安装依赖包
-#### 安装 MMDeploy Converter 依赖
+
+#### 安装 MMDeploy Converter 依赖
@@ -85,6 +88,7 @@ pip install mmcv-full==1.4.0 -f https://download.openmmlab.com/mmcv/dist/${cu_ve
#### 安装 MMDeploy SDK 依赖
如果您只对模型转换感兴趣,那么可以跳过本章节。
+
@@ -103,7 +107,7 @@ sudo apt-get install libopencv-dev
在 Ubuntu 16.04 中,需要源码安装 OpenCV。您可以参考此处.
-
+
pplcv |
pplcv 是 openPPL 开发的高性能图像处理库。 此依赖项为可选项,只有在 cuda 平台下,才需安装。而且,目前必须使用 v0.6.2,且需要使用 git clone 的方式下载源码并编译安装
@@ -237,12 +241,14 @@ export LD_LIBRARY_PATH=$Torch_DIR/lib:$LD_LIBRARY_PATH
注意:
如果您想使上述环境变量永久有效,可以把它们加入~/.bashrc 。以 ONNXRuntime 的环境变量为例,
+
```bash
echo '# set env for onnxruntime' >> ~/.bashrc
echo "export ONNXRUNTIME_DIR=${ONNXRUNTIME_DIR}" >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
```
+
### 编译 MMDeploy
```bash
@@ -251,6 +257,7 @@ export MMDEPLOY_DIR=$(pwd)
```
#### 编译选项说明
+
@@ -327,6 +334,7 @@ export MMDEPLOY_DIR=$(pwd)
#### 编译安装 Model Converter
##### 编译自定义算子
+
如果您选择了ONNXRuntime,TensorRT,ncnn 和 torchscript 任一种推理后端,您需要编译对应的自定义算子库。
- **ONNXRuntime** 自定义算子
@@ -371,15 +379,18 @@ export MMDEPLOY_DIR=$(pwd)
cd ${MMDEPLOY_DIR}
pip install -e .
```
+
**注意**
- 有些依赖项是可选的。运行 `pip install -e .` 将进行最小化依赖安装。 如果需安装其他可选依赖项,请执行`pip install -r requirements/optional.txt`,
-或者 `pip install -e .[optional]`。其中,`[optional]`可以替换为:`all`、`tests`、`build` 或 `optional`。
+ 或者 `pip install -e .[optional]`。其中,`[optional]`可以替换为:`all`、`tests`、`build` 或 `optional`。
+
#### 编译SDK
下文展示2个构建SDK的样例,分别用 ONNXRuntime 和 TensorRT 作为推理引擎。您可以参考它们,激活其他的推理引擎。
- cpu + ONNXRuntime
+
```Bash
cd ${MMDEPLOY_DIR}
mkdir -p build && cd build
@@ -396,6 +407,7 @@ pip install -e .
```
- cuda + TensorRT
+
```Bash
cd ${MMDEPLOY_DIR}
mkdir -p build && cd build
diff --git a/docs/zh_cn/01-how-to-build/windows.md b/docs/zh_cn/01-how-to-build/windows.md
index f23174d9b2..a634cdf950 100644
--- a/docs/zh_cn/01-how-to-build/windows.md
+++ b/docs/zh_cn/01-how-to-build/windows.md
@@ -15,19 +15,25 @@
- [编译 SDK](#编译-sdk)
- [编译 Demo](#编译-demo)
- [注意事项](#注意事项)
----
+
+______________________________________________________________________
+
目前,MMDeploy 在 Windows 平台下仅提供源码编译安装方式。未来会提供预编译包方式。
## 源码安装
+
下述安装方式,均是在 **Windows 10** 下进行,使用 **PowerShell Preview** 版本。
### 安装构建和编译工具链
+
1. 下载并安装 [Visual Studio 2019](https://visualstudio.microsoft.com) 。安装时请勾选 "使用C++的桌面开发, "Windows 10 SDK
-2. 把 cmake 路径加入到环境变量 PATH 中, "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin"
+2. 把 cmake 路径加入到环境变量 PATH 中, "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\CMake\\CMake\\bin"
3. 如果系统中配置了 NVIDIA 显卡,根据[官网教程](https://developer.nvidia.com\/cuda-downloads),下载并安装 cuda toolkit。
### 安装依赖包
+
#### 安装 MMDeploy Converter 依赖
+
@@ -65,9 +71,10 @@ pip install mmcv-full==1.4.0 -f https://download.openmmlab.com/mmcv/dist/$env:cu
-
#### 安装 MMDeploy SDK 依赖
+
如果您只对模型转换感兴趣,那么可以跳过本章节。
+
@@ -106,9 +113,11 @@ cd ../..
#### 安装推理引擎
+
MMDeploy 的 Model Converter 和 SDK 共享推理引擎。您可以参考下文,选择自己感兴趣的推理引擎安装。
**目前,在 Windows 平台下,MMDeploy 支持 ONNXRuntime 和 TensorRT 两种推理引擎**。其他推理引擎尚未进行验证,或者验证未通过。后续将陆续予以支持
+
@@ -181,12 +190,14 @@ $env:path = "$env:CUDNN_DIR\bin;" + $env:path
### 编译 MMDeploy
+
```powershell
cd \the\root\path\of\MMDeploy
$env:MMDEPLOY_DIR="$pwd"
```
#### 编译选项说明
+
@@ -254,11 +265,14 @@ $env:MMDEPLOY_DIR="$pwd"
-
#### 编译安装 Model Converter
+
##### 编译自定义算子
+
如果您选择了ONNXRuntime,TensorRT 和 ncnn 任一种推理后端,您需要编译对应的自定义算子库。
+
- **ONNXRuntime** 自定义算子
+
```powershell
mkdir build -ErrorAction SilentlyContinue
cd build
@@ -280,13 +294,17 @@ cmake --build . --config Release -- /m
TODO
##### 安装 Model Converter
+
```powershell
cd $env:MMDEPLOY_DIR
pip install -e .
```
+
**注意**
+
- 有些依赖项是可选的。运行 `pip install -e .` 将进行最小化依赖安装。 如果需安装其他可选依赖项,请执行`pip install -r requirements/optional.txt`,
或者 `pip install -e .[optional]`。其中,`[optional]`可以替换为:`all`、`tests`、`build` 或 `optional`。
+
#### 编译 SDK
下文展示2个构建SDK的样例,分别用 ONNXRuntime 和 TensorRT 作为推理引擎。您可以参考它们,并结合前文 SDK 的编译选项说明,激活其他的推理引擎。
@@ -342,4 +360,5 @@ $env:path = "$env:MMDEPLOY_DIR/build/install/bin;" + $env:path
```
### 注意事项
- 1. Release / Debug 库不能混用。MMDeploy 要是编译 Release 版本,所有第三方依赖都要是 Release 版本。反之亦然。
+
+1. Release / Debug 库不能混用。MMDeploy 要是编译 Release 版本,所有第三方依赖都要是 Release 版本。反之亦然。
diff --git a/docs/zh_cn/02-how-to-run/profile_model.md b/docs/zh_cn/02-how-to-run/profile_model.md
index d79cdce6b8..0a00616172 100644
--- a/docs/zh_cn/02-how-to-run/profile_model.md
+++ b/docs/zh_cn/02-how-to-run/profile_model.md
@@ -31,10 +31,10 @@ ${MODEL_CFG} \
| warm-up | 执行前是否 warm-up |
| log-interval | 日志打印间隔 |
-
## 使用样例
执行模型推理
+
```shell
python tools/test.py \
configs/mmcls/classification_onnxruntime_static.py \
@@ -45,6 +45,7 @@ python tools/test.py \
```
profile 速度测试
+
```shell
python tools/test.py \
configs/mmcls/classification_onnxruntime_static.py \
diff --git a/docs/zh_cn/02-how-to-run/quantize_model.md b/docs/zh_cn/02-how-to-run/quantize_model.md
index 3f49c4bcd9..bd290c700a 100644
--- a/docs/zh_cn/02-how-to-run/quantize_model.md
+++ b/docs/zh_cn/02-how-to-run/quantize_model.md
@@ -4,9 +4,9 @@
相对于 fp32 模型,定点模型有诸多优点:
-* 体积更小,8-bit 模型可降低 75% 文件大小
-* 由于模型变小,Cache 命中率提升,速度更快
-* 芯片往往有对应的定点加速指令,这些指令更快、能耗更低(常见 CPU 上 int8 大约只需要 10% 能量)
+- 体积更小,8-bit 模型可降低 75% 文件大小
+- 由于模型变小,Cache 命中率提升,速度更快
+- 芯片往往有对应的定点加速指令,这些指令更快、能耗更低(常见 CPU 上 int8 大约只需要 10% 能量)
安装包体积、发热都是移动端评价 APP 的关键指标;而在服务端,“加速”意味着可以维持相同 QPS、增大模型换取精度提升。
@@ -51,22 +51,21 @@ python3 tools/deploy.py configs/mmcls/classification_ncnn-int8_static.py ${MOD
```
参数说明
-| 参数 | 含义 |
-|:-:|:-:|
-|--quant|是否开启量化,默认为 False|
-|--quant-image-dir|校准数据集,默认使用 MODEL_CONFIG 中的**验证集**|
+| 参数 | 含义 |
+| :---------------: | :----------------------------------------------: |
+| --quant | 是否开启量化,默认为 False |
+| --quant-image-dir | 校准数据集,默认使用 MODEL_CONFIG 中的**验证集** |
## 自建校准数据集
校准集是用来计算量化层参数的,某些 DFQ(Data Free Quantization)方法甚至不需要校准集
-* 新建文件夹,直接放入图片即可(不需要目录结构、不要负例、没有命名要求)
-* 图片需为真实业务场景中的数据,相差过远会导致精度下降
-* 不能直接拿测试集做量化,否则是过拟合
- |类型|训练集|验证集|测试集|校准集|
- |-|-|-|-|-|
- |用法|QAT|PTQ|测试精度|PTQ|
-
+- 新建文件夹,直接放入图片即可(不需要目录结构、不要负例、没有命名要求)
+- 图片需为真实业务场景中的数据,相差过远会导致精度下降
+- 不能直接拿测试集做量化,否则是过拟合
+ | 类型 | 训练集 | 验证集 | 测试集 | 校准集 |
+ | ---- | ------ | ------ | -------- | ------ |
+ | 用法 | QAT | PTQ | 测试精度 | PTQ |
**强烈建议**量化结束后,[按此文档](./profile_model.md)验证模型精度。[这里](../03-benchmark/quantization.md)是一些量化模型测试结果。
diff --git a/docs/zh_cn/02-how-to-run/write_config.md b/docs/zh_cn/02-how-to-run/write_config.md
index 15a8100059..0aaaf7f511 100644
--- a/docs/zh_cn/02-how-to-run/write_config.md
+++ b/docs/zh_cn/02-how-to-run/write_config.md
@@ -1,6 +1,7 @@
# 如何写模型转换配置
+
这篇教程介绍了如何编写模型转换和部署的配置文件。部署配置文件由`ONNX配置`, `代码库配置`, `推理框架配置`组成。
@@ -32,14 +33,20 @@ ONNX 配置描述了如何将PyTorch模型转换为ONNX模型。
### ONNX配置参数说明
- `type`: 配置类型。 默认为 `onnx`。
+
- `export_params`: 如果指定,将导出模型所有参数。如果您只想导出未训练模型将此项设置为 False。
+
- `keep_initializers_as_inputs`:
-如果为 True,则所有初始化器(通常对应为参数)也将作为输入导出,添加到计算图中。 如果为 False,则初始化器不会作为输入导出,不添加到计算图中,仅将非参数输入添加到计算图中。
+ 如果为 True,则所有初始化器(通常对应为参数)也将作为输入导出,添加到计算图中。 如果为 False,则初始化器不会作为输入导出,不添加到计算图中,仅将非参数输入添加到计算图中。
- `opset_version`: ONNX的算子集版本,默认为11。
+
- `save_file`: 输出ONNX模型文件。
+
- `input_names`: 模型计算图中输入节点的名称。
+
- `output_names`: 模型计算图中输出节点的名称。
+
- `input_shape`: 模型输入张量的高度和宽度。
#### 示例
diff --git a/docs/zh_cn/03-benchmark/benchmark.md b/docs/zh_cn/03-benchmark/benchmark.md
index ad2df83311..f0d2c87681 100644
--- a/docs/zh_cn/03-benchmark/benchmark.md
+++ b/docs/zh_cn/03-benchmark/benchmark.md
@@ -1,12 +1,13 @@
# Benchmark
## Backends
+
CPU: ncnn, ONNXRuntime, OpenVINO
GPU: ncnn, TensorRT, PPLNN
-
## 软硬件环境
+
- Ubuntu 18.04
- ncnn 20211208
- Cuda 11.3
@@ -15,6 +16,7 @@ GPU: ncnn, TensorRT, PPLNN
- NVIDIA tesla T4 tensor core GPU for TensorRT
### 配置
+
- 静态图导出
- batch 大小为 1
- 测试时,计算各个数据集中 100 张图片的平均耗时
@@ -22,6 +24,7 @@ GPU: ncnn, TensorRT, PPLNN
用户可以直接通过[model profiling](../02-how-to-run/profile_model.md)获得想要的速度测试结果。下面是我们环境中的测试结果:
## 速度测试
+
@@ -133,7 +136,7 @@ GPU: ncnn, TensorRT, PPLNN
fp16 |
-
+
YOLOv3 |
320x320 |
14.76 |
@@ -1530,7 +1533,6 @@ GPU: ncnn, TensorRT, PPLNN
-
diff --git a/docs/zh_cn/03-benchmark/quantization.md b/docs/zh_cn/03-benchmark/quantization.md
index d0d01d0b7e..d4d6cd1bf2 100644
--- a/docs/zh_cn/03-benchmark/quantization.md
+++ b/docs/zh_cn/03-benchmark/quantization.md
@@ -6,21 +6,22 @@
### 分类任务
-|model|dataset|fp32 top-1 (%)|int8 top-1 (%)|
-|:-:|:-:|:-:|:-:|
-|[ResNet-18](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet18_8xb16_cifar10.py)|Cifar10|94.82|94.83|
-|[ResNeXt-32x4d-50](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext50-32x4d_8xb32_in1k.py)|ImageNet-1k|77.90|78.20*|
-|[MobileNet V2](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py)|ImageNet-1k|71.86|71.43*|
-|[HRNet-W18*](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py)|ImageNet-1k|76.75|76.25*|
+| model | dataset | fp32 top-1 (%) | int8 top-1 (%) |
+| :--------------------------------------------------------------------------------------------------------------------------: | :---------: | :------------: | :------------: |
+| [ResNet-18](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet18_8xb16_cifar10.py) | Cifar10 | 94.82 | 94.83 |
+| [ResNeXt-32x4d-50](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext50-32x4d_8xb32_in1k.py) | ImageNet-1k | 77.90 | 78.20\* |
+| [MobileNet V2](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py) | ImageNet-1k | 71.86 | 71.43\* |
+| [HRNet-W18\*](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py) | ImageNet-1k | 76.75 | 76.25\* |
备注:
-* 因为 imagenet-1k 数据量很大、ncnn 未正式发布 Vulkan int8 版本,考虑到 CPU 运行时间,仅用部分测试集(4000/50000)
-* 量化后精度会有差异,分类模型涨点 1% 以内是正常情况
+
+- 因为 imagenet-1k 数据量很大、ncnn 未正式发布 Vulkan int8 版本,考虑到 CPU 运行时间,仅用部分测试集(4000/50000)
+- 量化后精度会有差异,分类模型涨点 1% 以内是正常情况
### OCR 检测任务
-|model|dataset|fp32 hmean|int8 hmean|
-|:-:|:-:|:-:|:-:|
-|[PANet](https://github.com/open-mmlab/mmocr/blob/main/configs/textdet/panet/panet_r18_fpem_ffm_600e_icdar2015.py)|ICDAR2015|0.795|0.792 @thr=0.9|
+| model | dataset | fp32 hmean | int8 hmean |
+| :---------------------------------------------------------------------------------------------------------------: | :-------: | :--------: | :------------: |
+| [PANet](https://github.com/open-mmlab/mmocr/blob/main/configs/textdet/panet/panet_r18_fpem_ffm_600e_icdar2015.py) | ICDAR2015 | 0.795 | 0.792 @thr=0.9 |
备注:[mmocr](https://github.com/open-mmlab/mmocr) 使用 `shapely` 计算 IoU,实现方法会导致轻微的精度差异
diff --git a/docs/zh_cn/03-benchmark/supported_models.md b/docs/zh_cn/03-benchmark/supported_models.md
index 1773eda11c..69f5b48caf 100644
--- a/docs/zh_cn/03-benchmark/supported_models.md
+++ b/docs/zh_cn/03-benchmark/supported_models.md
@@ -2,73 +2,73 @@
自测完成的 model-backend 组合:
-| Model | Codebase | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
-| :------------------------ | :--------------- | :---------: | :---------: | :------: | :---: | :---: | :------: | :--------------------------------------------------------------------------------------------: |
-| RetinaNet | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet) |
-| Faster R-CNN | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
-| YOLOv3 | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo) |
-| YOLOX | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox) |
-| FCOS | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos) |
-| FSAF | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf) |
-| Mask R-CNN | MMDetection | Y | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) |
-| SSD[*](#note) | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd) |
-| FoveaBox | MMDetection | Y | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox) |
-| ATSS | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss) |
-| GFL | MMDetection | N | Y | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl) |
-| Cascade R-CNN | MMDetection | N | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
-| Cascade Mask R-CNN | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
-| VFNet | MMDetection | N | N | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/vfnet) |
-| RepPoints | MMDetection | N | N | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints) |
-| ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnet) |
-| ResNeXt | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnext) |
-| SE-ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/seresnet) |
-| MobileNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2) |
-| ShuffleNetV1 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v1) |
-| ShuffleNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v2) |
-| VisionTransformer | MMClassification | Y | Y | ? | Y | ? | ? | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/vision_transformer) |
-| FCN | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fcn) |
-| PSPNet[*static](#note) | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/pspnet) |
-| DeepLabV3 | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3) |
-| DeepLabV3+ | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3plus) |
-| Fast-SCNN[*static](#note) | MMSegmentation | Y | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastscnn) |
-| UNet | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/unet) |
-| ANN[*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ann) |
-| APCNet | MMSegmentation | ? | Y | Y | Y | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/apcnet) |
-| BiSeNetV1 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv1) |
-| BiSeNetV2 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2) |
-| CGNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/cgnet) |
-| DMNet | MMSegmentation | ? | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dmnet) |
-| DNLNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dnlnet) |
-| EMANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/emanet) |
-| EncNet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/encnet) |
-| ERFNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/erfnet) |
-| FastFCN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastfcn) |
-| GCNet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/gcnet) |
-| ICNet[*](#note) | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/icnet) |
-| ISANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/isanet) |
-| NonLocal Net | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/nonlocal_net) |
-| OCRNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ocrnet) |
-| PointRend | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/point_rend) |
-| Semantic FPN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/sem_fpn) |
-| STDC | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/stdc) |
-| UPerNet[*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/upernet) |
-| DANet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/danet) |
-| SRCNN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srcnn) |
-| ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
-| SRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
-| SRResNet | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
-| Real-ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/real_esrgan) |
-| EDSR | MMEditing | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/edsr) |
-| RDN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/rdn) |
-| DBNet | MMOCR | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/dbnet) |
-| CRNN | MMOCR | Y | Y | Y | Y | Y | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/crnn) |
-| SAR | MMOCR | N | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/sar) |
-| HRNet | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#hrnet-cvpr-2019) |
-| MSPN | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#mspn-arxiv-2019) |
-| LiteHRNet | MMPose | N | Y | Y | N | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#litehrnet-cvpr-2021) |
-| PointPillars | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/pointpillars) |
-| CenterPoint (pillar) | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/centerpoint) |
-| RotatedRetinaNet | RotatedDetection | N | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/rotated_retinanet/README.md) |
+| Model | Codebase | TorchScript | OnnxRuntime | TensorRT | ncnn | PPLNN | OpenVINO | Model config |
+| :------------------------- | :--------------- | :---------: | :---------: | :------: | :--: | :---: | :------: | :---------------------------------------------------------------------------------------------: |
+| RetinaNet | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet) |
+| Faster R-CNN | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) |
+| YOLOv3 | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo) |
+| YOLOX | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox) |
+| FCOS | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos) |
+| FSAF | MMDetection | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf) |
+| Mask R-CNN | MMDetection | Y | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) |
+| SSD[\*](#note) | MMDetection | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd) |
+| FoveaBox | MMDetection | Y | Y | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox) |
+| ATSS | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss) |
+| GFL | MMDetection | N | Y | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl) |
+| Cascade R-CNN | MMDetection | N | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
+| Cascade Mask R-CNN | MMDetection | N | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) |
+| VFNet | MMDetection | N | N | N | N | N | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/vfnet) |
+| RepPoints | MMDetection | N | N | Y | N | ? | Y | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints) |
+| ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnet) |
+| ResNeXt | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnext) |
+| SE-ResNet | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/seresnet) |
+| MobileNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2) |
+| ShuffleNetV1 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v1) |
+| ShuffleNetV2 | MMClassification | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v2) |
+| VisionTransformer | MMClassification | Y | Y | ? | Y | ? | ? | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/vision_transformer) |
+| FCN | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fcn) |
+| PSPNet[\*static](#note) | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/pspnet) |
+| DeepLabV3 | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3) |
+| DeepLabV3+ | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/deeplabv3plus) |
+| Fast-SCNN[\*static](#note) | MMSegmentation | Y | Y | Y | N | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastscnn) |
+| UNet | MMSegmentation | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/unet) |
+| ANN[\*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ann) |
+| APCNet | MMSegmentation | ? | Y | Y | Y | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/apcnet) |
+| BiSeNetV1 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv1) |
+| BiSeNetV2 | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2) |
+| CGNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/cgnet) |
+| DMNet | MMSegmentation | ? | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dmnet) |
+| DNLNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/dnlnet) |
+| EMANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/emanet) |
+| EncNet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/encnet) |
+| ERFNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/erfnet) |
+| FastFCN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/fastfcn) |
+| GCNet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/gcnet) |
+| ICNet[\*](#note) | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/icnet) |
+| ISANet | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/isanet) |
+| NonLocal Net | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/nonlocal_net) |
+| OCRNet | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/ocrnet) |
+| PointRend | MMSegmentation | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/point_rend) |
+| Semantic FPN | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/sem_fpn) |
+| STDC | MMSegmentation | ? | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/stdc) |
+| UPerNet[\*](#note) | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/upernet) |
+| DANet | MMSegmentation | ? | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmsegmentation/tree/master/configs/danet) |
+| SRCNN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srcnn) |
+| ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan) |
+| SRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
+| SRResNet | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/srresnet_srgan) |
+| Real-ESRGAN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/real_esrgan) |
+| EDSR | MMEditing | Y | Y | Y | Y | N | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/edsr) |
+| RDN | MMEditing | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/rdn) |
+| DBNet | MMOCR | Y | Y | Y | Y | Y | Y | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textdet/dbnet) |
+| CRNN | MMOCR | Y | Y | Y | Y | Y | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/crnn) |
+| SAR | MMOCR | N | Y | N | N | N | N | [config](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/sar) |
+| HRNet | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#hrnet-cvpr-2019) |
+| MSPN | MMPose | N | Y | Y | Y | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#mspn-arxiv-2019) |
+| LiteHRNet | MMPose | N | Y | Y | N | N | Y | [config](https://mmpose.readthedocs.io/en/latest/papers/backbones.html#litehrnet-cvpr-2021) |
+| PointPillars | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/pointpillars) |
+| CenterPoint (pillar) | MMDetection3d | ? | Y | Y | N | N | Y | [config](https://github.com/open-mmlab/mmdetection3d/blob/master/configs/centerpoint) |
+| RotatedRetinaNet | RotatedDetection | N | Y | Y | N | N | N | [config](https://github.com/open-mmlab/mmrotate/blob/main/configs/rotated_retinanet/README.md) |
## Note
diff --git a/docs/zh_cn/04-developer-guide/do_regression_test.md b/docs/zh_cn/04-developer-guide/do_regression_test.md
index befb9c5276..45cd5d32d8 100644
--- a/docs/zh_cn/04-developer-guide/do_regression_test.md
+++ b/docs/zh_cn/04-developer-guide/do_regression_test.md
@@ -1,6 +1,7 @@
# 如何进行回归测试
+
这篇教程介绍了如何进行回归测试。部署配置文件由`每个codebase的回归配置文件`,`推理框架配置信息`组成。
@@ -25,18 +26,22 @@
-
## 1. 环境搭建
### MMDeploy的安装及配置
+
本章节的内容,需要提前根据[build 文档](../01-how-to-build/build_from_source.md)将 MMDeploy 安装配置好之后,才能进行。
### Python环境依赖
+
需要安装 test 的环境
+
```shell
pip install -r requirements/tests.txt
```
+
如果在使用过程是 numpy 报错,则更新一下 numpy
+
```shell
pip install -U numpy
```
@@ -67,7 +72,9 @@ python ./tools/regression_test.py \
- `-p` 或 `--performance` : 是否测试精度,加上则测试转换+精度,不加上则只测试转换
### 注意事项
+
对于 Windows 用户:
+
1. 要在 shell 命令中使用 `&&` 连接符,需要下载并使用 `PowerShell 7 Preview 5+`。
2. 如果您使用 conda env,可能需要在 regression_test.py 中将 `python3` 更改为 `python`,因为 `%USERPROFILE%\AppData\Local\Microsoft\WindowsApps` 目录中有 `python3.exe`。
@@ -224,26 +231,26 @@ models:
### 模板
-|| Model | Model Config | Task | Checkpoint | Dataset | Backend | Deploy Config | Static or Dynamic | Precision Type | Conversion Result | metric_1 | metric_2 | metric_n | Test Pass |
-|------------|--------------|-----------------|-----------------------|----------|--------------|---------------|-------------------|----------------|-------------------|---|----------|----------|-----------|-----------|
-| 序号 | 模型名称 | model config 路径 | 执行的 task name | `.pth`模型路径 | 数据集名称 | 后端名称 | deploy cfg 路径 | 动态 or 静态 | 测试精度 | 模型转换结果 | 指标 1 数值 | 指标 2 数值 | 指标 n 数值 | 后端测试结果 |
+| | Model | Model Config | Task | Checkpoint | Dataset | Backend | Deploy Config | Static or Dynamic | Precision Type | Conversion Result | metric_1 | metric_2 | metric_n | Test Pass |
+| ---- | -------- | ----------------- | ---------------- | -------------- | ---------- | -------- | --------------- | ----------------- | -------------- | ----------------- | ----------- | ----------- | ----------- | ------------ |
+| 序号 | 模型名称 | model config 路径 | 执行的 task name | `.pth`模型路径 | 数据集名称 | 后端名称 | deploy cfg 路径 | 动态 or 静态 | 测试精度 | 模型转换结果 | 指标 1 数值 | 指标 2 数值 | 指标 n 数值 | 后端测试结果 |
### 示例
这是 MMOCR 生成的报告
-| | Model | Model Config | Task | Checkpoint | Dataset | Backend | Deploy Config | Static or Dynamic | Precision Type | Conversion Result | hmean-iou | word_acc | Test Pass |
-|-----| ---------- | ------------------------------------------------------------ | ---------------- | ------------------------------------------------------------ | --------- | --------------- | ------------------------------------------------------------ | ----------------- | -------------- | ----------------- |------------| ---------- | --------- |
-| 0 | crnn | ../mmocr/configs/textrecog/crnn/crnn_academic_dataset.py | Text Recognition | ../mmdeploy_checkpoints/mmocr/crnn/crnn_academic-a723a1c5.pth | IIIT5K | Pytorch| -| - | - | - | - | 80.5 | -|
-| 1 | crnn | ../mmocr/configs/textrecog/crnn/crnn_academic_dataset.py | Text Recognition | ${WORK_DIR}/mmocr/crnn/onnxruntime/static/crnn_academic-a723a1c5/end2end.onnx | x| onnxruntime | configs/mmocr/text-recognition/text-recognition_onnxruntime_dynamic.py | static | fp32 | True | - | 80.67 | True|
-| 2 | crnn | ../mmocr/configs/textrecog/crnn/crnn_academic_dataset.py | Text Recognition | ${WORK_DIR}/mmocr/crnn/onnxruntime/static/crnn_academic-a723a1c5 | x| SDK-onnxruntime | configs/mmocr/text-recognition/text-recognition_sdk_dynamic.py | static | fp32 | True | - | x | False |
-| 3 | dbnet| ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ../mmdeploy_checkpoints/mmocr/dbnet/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597.pth | ICDAR2015 | Pytorch| -| - | - | - | 0.795 | - | -|
-| 4 | dbnet| ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ../mmdeploy_checkpoints/mmocr/dbnet/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597.pth | ICDAR | onnxruntime | configs/mmocr/text-detection/text-detection_onnxruntime_dynamic.py | dynamic | fp32 | True | - | - | True|
-| 5 | dbnet| ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ${WORK_DIR}/mmocr/dbnet/tensorrt/dynamic/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597/end2end.engine | ICDAR | tensorrt | configs/mmocr/text-detection/text-detection_tensorrt-fp16_dynamic-320x320-2240x2240.py | dynamic | fp16 | True | 0.793302 | - | True|
-| 6 | dbnet| ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ${WORK_DIR}/mmocr/dbnet/tensorrt/dynamic/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597 | ICDAR | SDK-tensorrt | configs/mmocr/text-detection/text-detection_sdk_dynamic.py | dynamic | fp16 | True | 0.795073 | - | True|
-
+| | Model | Model Config | Task | Checkpoint | Dataset | Backend | Deploy Config | Static or Dynamic | Precision Type | Conversion Result | hmean-iou | word_acc | Test Pass |
+| --- | ----- | ---------------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------ | --------- | --------------- | -------------------------------------------------------------------------------------- | ----------------- | -------------- | ----------------- | --------- | -------- | --------- |
+| 0 | crnn | ../mmocr/configs/textrecog/crnn/crnn_academic_dataset.py | Text Recognition | ../mmdeploy_checkpoints/mmocr/crnn/crnn_academic-a723a1c5.pth | IIIT5K | Pytorch | - | - | - | - | - | 80.5 | - |
+| 1 | crnn | ../mmocr/configs/textrecog/crnn/crnn_academic_dataset.py | Text Recognition | ${WORK_DIR}/mmocr/crnn/onnxruntime/static/crnn_academic-a723a1c5/end2end.onnx | x | onnxruntime | configs/mmocr/text-recognition/text-recognition_onnxruntime_dynamic.py | static | fp32 | True | - | 80.67 | True |
+| 2 | crnn | ../mmocr/configs/textrecog/crnn/crnn_academic_dataset.py | Text Recognition | ${WORK_DIR}/mmocr/crnn/onnxruntime/static/crnn_academic-a723a1c5 | x | SDK-onnxruntime | configs/mmocr/text-recognition/text-recognition_sdk_dynamic.py | static | fp32 | True | - | x | False |
+| 3 | dbnet | ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ../mmdeploy_checkpoints/mmocr/dbnet/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597.pth | ICDAR2015 | Pytorch | - | - | - | - | 0.795 | - | - |
+| 4 | dbnet | ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ../mmdeploy_checkpoints/mmocr/dbnet/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597.pth | ICDAR | onnxruntime | configs/mmocr/text-detection/text-detection_onnxruntime_dynamic.py | dynamic | fp32 | True | - | - | True |
+| 5 | dbnet | ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ${WORK_DIR}/mmocr/dbnet/tensorrt/dynamic/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597/end2end.engine | ICDAR | tensorrt | configs/mmocr/text-detection/text-detection_tensorrt-fp16_dynamic-320x320-2240x2240.py | dynamic | fp16 | True | 0.793302 | - | True |
+| 6 | dbnet | ../mmocr/configs/textdet/dbnet/dbnet_r18_fpnc_1200e_icdar2015.py | Text Detection | ${WORK_DIR}/mmocr/dbnet/tensorrt/dynamic/dbnet_r18_fpnc_sbn_1200e_icdar2015_20210329-ba3ab597 | ICDAR | SDK-tensorrt | configs/mmocr/text-detection/text-detection_sdk_dynamic.py | dynamic | fp16 | True | 0.795073 | - | True |
## 5. 支持的后端
+
- [x] ONNX Runtime
- [x] TensorRT
- [x] PPLNN
@@ -254,20 +261,19 @@ models:
## 6. 支持的Codebase及其Metric
-| Codebase | Metric | Support |
-|----------| ---------- |-------------------|
-| mmdet | bbox | :heavy_check_mark: |
-| | segm | :heavy_check_mark: |
-| | PQ | :x: |
-| mmcls | accuracy | :heavy_check_mark: |
-| mmseg | mIoU | :heavy_check_mark: |
-| mmpose | AR | :heavy_check_mark: |
-| | AP | :heavy_check_mark: |
-| mmocr | hmean | :heavy_check_mark: |
-| | acc | :heavy_check_mark: |
-| mmedit | PSNR | :heavy_check_mark: |
-| | SSIM | :heavy_check_mark: |
-
+| Codebase | Metric | Support |
+| -------- | -------- | ------------------ |
+| mmdet | bbox | :heavy_check_mark: |
+| | segm | :heavy_check_mark: |
+| | PQ | :x: |
+| mmcls | accuracy | :heavy_check_mark: |
+| mmseg | mIoU | :heavy_check_mark: |
+| mmpose | AR | :heavy_check_mark: |
+| | AP | :heavy_check_mark: |
+| mmocr | hmean | :heavy_check_mark: |
+| | acc | :heavy_check_mark: |
+| mmedit | PSNR | :heavy_check_mark: |
+| | SSIM | :heavy_check_mark: |
## 7. 注意事项
diff --git a/docs/zh_cn/04-developer-guide/support_new_backend.md b/docs/zh_cn/04-developer-guide/support_new_backend.md
index 7fd2e59e5f..223271ecc5 100644
--- a/docs/zh_cn/04-developer-guide/support_new_backend.md
+++ b/docs/zh_cn/04-developer-guide/support_new_backend.md
@@ -6,9 +6,9 @@ MMDeploy 支持了许多后端推理引擎,但我们依然非常欢迎新后
在对 MMDeploy 添加新的后端引擎之前,需要先检查所要支持的新后端是否符合一些要求:
-* 后端必须能够支持 ONNX 作为 IR。
-* 如果后端需要“.onnx”文件以外的模型文件或权重文件,则需要添加将“.onnx”文件转换为模型文件或权重文件的转换工具,该工具可以是 Python API、脚本或可执行程序。
-* 强烈建议新后端可提供 Python 接口来加载后端文件和推理以进行验证。
+- 后端必须能够支持 ONNX 作为 IR。
+- 如果后端需要“.onnx”文件以外的模型文件或权重文件,则需要添加将“.onnx”文件转换为模型文件或权重文件的转换工具,该工具可以是 Python API、脚本或可执行程序。
+- 强烈建议新后端可提供 Python 接口来加载后端文件和推理以进行验证。
### 支持后端转换
@@ -16,140 +16,140 @@ MMDeploy 中的后端必须支持 ONNX,因此后端能直接加载“.onnx”
1. 在 `mmdeploy/utils/constants.py` 文件中添加新推理后端变量,以表示支持的后端名称。
- **示例**:
+ **示例**:
- ```Python
- # mmdeploy/utils/constants.py
+ ```Python
+ # mmdeploy/utils/constants.py
- class Backend(AdvancedEnum):
- # 以现有的TensorRT为例
- TENSORRT = 'tensorrt'
- ```
+ class Backend(AdvancedEnum):
+ # 以现有的TensorRT为例
+ TENSORRT = 'tensorrt'
+ ```
2. 在 `mmdeploy/backend/` 目录下添加相应的库(一个包括 `__init__.py` 的文件夹),例如, `mmdeploy/backend/tensorrt` 。在 `__init__.py` 中,必须有一个名为 `is_available` 的函数检查用户是否安装了后端库。如果检查通过,则将加载库的剩余文件。
- **例子**:
+ **例子**:
- ```Python
- # mmdeploy/backend/tensorrt/__init__.py
+ ```Python
+ # mmdeploy/backend/tensorrt/__init__.py
- def is_available():
- return importlib.util.find_spec('tensorrt') is not None
+ def is_available():
+ return importlib.util.find_spec('tensorrt') is not None
- if is_available():
- from .utils import from_onnx, load, save
- from .wrapper import TRTWrapper
+ if is_available():
+ from .utils import from_onnx, load, save
+ from .wrapper import TRTWrapper
- __all__ = [
- 'from_onnx', 'save', 'load', 'TRTWrapper'
- ]
- ```
+ __all__ = [
+ 'from_onnx', 'save', 'load', 'TRTWrapper'
+ ]
+ ```
3. 在 `configs/_base_/backends` 目录中创建一个配置文件(例如, `configs/_base_/backends/tensorrt.py` )。如果新后端引擎只是将“.onnx”文件作为输入,那么新的配置可以很简单,对应配置只需包含一个表示后端名称的字段(但也应该与 `mmdeploy/utils/constants.py` 中的名称相同)。
- **例子**
+ **例子**
- ```python
- backend_config = dict(type='tensorrt')
- ```
+ ```python
+ backend_config = dict(type='tensorrt')
+ ```
- 但如果后端需要其他文件,则从“.onnx”文件转换为后端文件所需的参数也应包含在配置文件中。
+ 但如果后端需要其他文件,则从“.onnx”文件转换为后端文件所需的参数也应包含在配置文件中。
- **例子**
+ **例子**
- ```Python
+ ```Python
- backend_config = dict(
- type='tensorrt',
- common_config=dict(
- fp16_mode=False, max_workspace_size=0))
- ```
+ backend_config = dict(
+ type='tensorrt',
+ common_config=dict(
+ fp16_mode=False, max_workspace_size=0))
+ ```
- 在拥有一个基本的后端配置文件后,您已经可以通过继承轻松构建一个完整的部署配置。有关详细信息,请参阅我们的[配置教程](../02-how-to-run/write_config.md)。下面是一个例子:
+ 在拥有一个基本的后端配置文件后,您已经可以通过继承轻松构建一个完整的部署配置。有关详细信息,请参阅我们的[配置教程](../02-how-to-run/write_config.md)。下面是一个例子:
- ```Python
- _base_ = ['../_base_/backends/tensorrt.py']
+ ```Python
+ _base_ = ['../_base_/backends/tensorrt.py']
- codebase_config = dict(type='mmcls', task='Classification')
- onnx_config = dict(input_shape=None)
- ```
+ codebase_config = dict(type='mmcls', task='Classification')
+ onnx_config = dict(input_shape=None)
+ ```
4. 如果新后端需要模型文件或权重文件而不是“.onnx”文件,则需要在相应的文件夹中创建一个 `onnx2backend.py` 文件(例如,创建 `mmdeploy/backend/tensorrt/onnx2tensorrt.py` )。然后在文件中添加一个转换函数`onnx2backend`。该函数应将给定的“.onnx”文件转换为给定工作目录中所需的后端文件。对函数的其他参数和实现细节没有要求,您可以使用任何工具进行转换。下面有些例子:
- **使用python脚本**
+ **使用python脚本**
- ```Python
- def onnx2openvino(input_info: Dict[str, Union[List[int], torch.Size]],
- output_names: List[str], onnx_path: str, work_dir: str):
+ ```Python
+ def onnx2openvino(input_info: Dict[str, Union[List[int], torch.Size]],
+ output_names: List[str], onnx_path: str, work_dir: str):
- input_names = ','.join(input_info.keys())
- input_shapes = ','.join(str(list(elem)) for elem in input_info.values())
- output = ','.join(output_names)
+ input_names = ','.join(input_info.keys())
+ input_shapes = ','.join(str(list(elem)) for elem in input_info.values())
+ output = ','.join(output_names)
- mo_args = f'--input_model="{onnx_path}" '\
- f'--output_dir="{work_dir}" ' \
- f'--output="{output}" ' \
- f'--input="{input_names}" ' \
- f'--input_shape="{input_shapes}" ' \
- f'--disable_fusing '
- command = f'mo.py {mo_args}'
- mo_output = run(command, stdout=PIPE, stderr=PIPE, shell=True, check=True)
- ```
+ mo_args = f'--input_model="{onnx_path}" '\
+ f'--output_dir="{work_dir}" ' \
+ f'--output="{output}" ' \
+ f'--input="{input_names}" ' \
+ f'--input_shape="{input_shapes}" ' \
+ f'--disable_fusing '
+ command = f'mo.py {mo_args}'
+ mo_output = run(command, stdout=PIPE, stderr=PIPE, shell=True, check=True)
+ ```
- **使用可执行文件**
+ **使用可执行文件**
- ```Python
- def onnx2ncnn(onnx_path: str, work_dir: str):
- onnx2ncnn_path = get_onnx2ncnn_path()
- save_param, save_bin = get_output_model_file(onnx_path, work_dir)
- call([onnx2ncnn_path, onnx_path, save_param, save_bin])\
- ```
+ ```Python
+ def onnx2ncnn(onnx_path: str, work_dir: str):
+ onnx2ncnn_path = get_onnx2ncnn_path()
+ save_param, save_bin = get_output_model_file(onnx_path, work_dir)
+ call([onnx2ncnn_path, onnx_path, save_param, save_bin])\
+ ```
5. 在 `mmdeploy/apis` 中创建新后端库并声明对应 APIs
- **例子**
+ **例子**
- ```Python
- # mmdeploy/apis/ncnn/__init__.py
+ ```Python
+ # mmdeploy/apis/ncnn/__init__.py
- from mmdeploy.backend.ncnn import is_available
+ from mmdeploy.backend.ncnn import is_available
- __all__ = ['is_available']
+ __all__ = ['is_available']
- if is_available():
- from mmdeploy.backend.ncnn.onnx2ncnn import (onnx2ncnn,
- get_output_model_file)
- __all__ += ['onnx2ncnn', 'get_output_model_file']
- ```
+ if is_available():
+ from mmdeploy.backend.ncnn.onnx2ncnn import (onnx2ncnn,
+ get_output_model_file)
+ __all__ += ['onnx2ncnn', 'get_output_model_file']
+ ```
- 然后根据需要使用这些 APIs 为 `tools/deploy.py` 添加相关转换代码
+ 然后根据需要使用这些 APIs 为 `tools/deploy.py` 添加相关转换代码
- **例子**
+ **例子**
- ```Python
- # tools/deploy.py
- # ...
- elif backend == Backend.NCNN:
- from mmdeploy.apis.ncnn import is_available as is_available_ncnn
+ ```Python
+ # tools/deploy.py
+ # ...
+ elif backend == Backend.NCNN:
+ from mmdeploy.apis.ncnn import is_available as is_available_ncnn
- if not is_available_ncnn():
- logging.error('ncnn support is not available.')
- exit(-1)
+ if not is_available_ncnn():
+ logging.error('ncnn support is not available.')
+ exit(-1)
- from mmdeploy.apis.ncnn import onnx2ncnn, get_output_model_file
+ from mmdeploy.apis.ncnn import onnx2ncnn, get_output_model_file
- backend_files = []
- for onnx_path in onnx_files:
- create_process(
- f'onnx2ncnn with {onnx_path}',
- target=onnx2ncnn,
- args=(onnx_path, args.work_dir),
- kwargs=dict(),
- ret_value=ret_value)
- backend_files += get_output_model_file(onnx_path, args.work_dir)
- # ...
- ```
+ backend_files = []
+ for onnx_path in onnx_files:
+ create_process(
+ f'onnx2ncnn with {onnx_path}',
+ target=onnx2ncnn,
+ args=(onnx_path, args.work_dir),
+ kwargs=dict(),
+ ret_value=ret_value)
+ backend_files += get_output_model_file(onnx_path, args.work_dir)
+ # ...
+ ```
6. 将 OpenMMLab 的模型转换后(如有必要)并在后端引擎上进行推理。如果在测试时发现一些不兼容的算子,可以尝试按照[重写器教程](../04-developer-guide/support_new_model.md)为后端重写原始模型或添加自定义算子。
@@ -161,80 +161,81 @@ MMDeploy 中的后端必须支持 ONNX,因此后端能直接加载“.onnx”
1. 添加一个名为 `wrapper.py` 的文件到 `mmdeploy/backend/{backend}` 中相应后端文件夹。例如, `mmdeploy/backend/tensorrt/wrapper` 。此模块应实现并注册一个封装类,该类继承 `mmdeploy/backend/base/base_wrapper.py` 中的基类 `BaseWrapper` 。
- **例子**
+ **例子**
- ```Python
- from mmdeploy.utils import Backend
- from ..base import BACKEND_WRAPPER, BaseWrapper
+ ```Python
+ from mmdeploy.utils import Backend
+ from ..base import BACKEND_WRAPPER, BaseWrapper
- @BACKEND_WRAPPER.register_module(Backend.TENSORRT.value)
- class TRTWrapper(BaseWrapper):
- ```
+ @BACKEND_WRAPPER.register_module(Backend.TENSORRT.value)
+ class TRTWrapper(BaseWrapper):
+ ```
2. 封装类可以在函数 `__init__` 中初始化引擎以及在 `forward` 函数中进行推理。请注意,该 `__init__` 函数必须接受一个参数 `output_names` 并将其传递给基类以确定输出张量的顺序。其中 `forward` 输入和输出变量应表示tensors的名称和值的字典。
3. 为了方便性能测试,该类应该定义一个 `execute` 函数,只调用后端引擎的推理接口。该 `forward` 函数应在预处理数据后调用 `execute` 函数。
- **例子**
+ **例子**
- ```Python
- from mmdeploy.utils import Backend
- from mmdeploy.utils.timer import TimeCounter
- from ..base import BACKEND_WRAPPER, BaseWrapper
+ ```Python
+ from mmdeploy.utils import Backend
+ from mmdeploy.utils.timer import TimeCounter
+ from ..base import BACKEND_WRAPPER, BaseWrapper
- @BACKEND_WRAPPER.register_module(Backend.ONNXRUNTIME.value)
- class ORTWrapper(BaseWrapper):
+ @BACKEND_WRAPPER.register_module(Backend.ONNXRUNTIME.value)
+ class ORTWrapper(BaseWrapper):
- def __init__(self,
- onnx_file: str,
- device: str,
- output_names: Optional[Sequence[str]] = None):
- # Initialization
- #
- # ...
- super().__init__(output_names)
+ def __init__(self,
+ onnx_file: str,
+ device: str,
+ output_names: Optional[Sequence[str]] = None):
+ # Initialization
+ #
+ # ...
+ super().__init__(output_names)
- def forward(self, inputs: Dict[str,
- torch.Tensor]) -> Dict[str, torch.Tensor]:
- # Fetch data
- # ...
+ def forward(self, inputs: Dict[str,
+ torch.Tensor]) -> Dict[str, torch.Tensor]:
+ # Fetch data
+ # ...
- self.__ort_execute(self.io_binding)
+ self.__ort_execute(self.io_binding)
- # Postprocess data
- # ...
+ # Postprocess data
+ # ...
- @TimeCounter.count_time()
- def __ort_execute(self, io_binding: ort.IOBinding):
- # Only do the inference
- self.sess.run_with_iobinding(io_binding)
- ```
+ @TimeCounter.count_time()
+ def __ort_execute(self, io_binding: ort.IOBinding):
+ # Only do the inference
+ self.sess.run_with_iobinding(io_binding)
+ ```
4. 为新封装装器添加默认初始化方法 `mmdeploy/codebase/base/backend_model.py`
- **例子**
-
- ```Python
- @staticmethod
- def _build_wrapper(backend: Backend,
- backend_files: Sequence[str],
- device: str,
- output_names: Optional[Sequence[str]] = None):
- if backend == Backend.ONNXRUNTIME:
- from mmdeploy.backend.onnxruntime import ORTWrapper
- return ORTWrapper(
- onnx_file=backend_files[0],
- device=device,
- output_names=output_names)
- ```
+ **例子**
+
+ ```Python
+ @staticmethod
+ def _build_wrapper(backend: Backend,
+ backend_files: Sequence[str],
+ device: str,
+ output_names: Optional[Sequence[str]] = None):
+ if backend == Backend.ONNXRUNTIME:
+ from mmdeploy.backend.onnxruntime import ORTWrapper
+ return ORTWrapper(
+ onnx_file=backend_files[0],
+ device=device,
+ output_names=output_names)
+ ```
5. 为新后端引擎代码添加相关注释和单元测试 :).
-
### 将MMDeploy作为第三方库时添加新后端
+
前面的部分展示了如何在 MMDeploy 中添加新的后端,这需要更改其源代码。但是,如果我们将 MMDeploy 视为第三方,则上述方法不再有效。为此,添加一个新的后端需要我们预先安装另一个名为 `aenum` 的包。我们可以直接通过`pip install aenum`进行安装。
成功安装 `aenum` 后,我们可以通过以下方式使用它来添加新的后端:
+
```python
from mmdeploy.utils.constants import Backend
from aenum import extend_enum
@@ -244,4 +245,5 @@ try:
except Exception:
extend_enum(Backend, 'BACKEND', 'backend_name')
```
+
我们可以在使用 MMDeploy 的重写逻辑之前运行上面的代码,这就完成了新后端的添加。
diff --git a/docs/zh_cn/04-developer-guide/support_new_model.md b/docs/zh_cn/04-developer-guide/support_new_model.md
index 2c10c66e40..3ee4c84206 100644
--- a/docs/zh_cn/04-developer-guide/support_new_model.md
+++ b/docs/zh_cn/04-developer-guide/support_new_model.md
@@ -21,8 +21,8 @@ def repeat_static(ctx, input, *size):
使用函数重写器是十分容易的,只需添加一个带参数的装饰器即可:
- `func_name`是需要被重载的函数,它可以是其他PyTorch 的函数或者是自定义的函数。模块中的方法也可以通过工具进行重载。
-- `backend`是推理引擎。当模型被导入到引擎的时候,函数会被重载。如果没有给出,重载默认的参数就是重载的参数。如果后端的重载的参数不存在,将会按照预设的默认模式进行重载。
-当参数与原始的参数相同时,除了把上下文信息`ctx` 作为第一的参数外,上下文也提供了一些有用的信息,例如:部署的配置`ctx.cfg` 和原始的函数(已经被重载)`ctx.origin_func`。
+- `backend`是推理引擎。当模型被导入到引擎的时候,函数会被重载。如果没有给出,重载默认的参数就是重载的参数。如果后端的重载的参数不存在,将会按照预设的默认模式进行重载。
+ 当参数与原始的参数相同时,除了把上下文信息`ctx` 作为第一的参数外,上下文也提供了一些有用的信息,例如:部署的配置`ctx.cfg` 和原始的函数(已经被重载)`ctx.origin_func`。
可参照[这些样例代码](https://github.com/open-mmlab/mmdeploy/blob/master/mmdeploy/codebase/mmcls/models/backbones/shufflenet_v2.py)。
diff --git a/docs/zh_cn/05-tutorial/01_introduction_to_model_deployment.md b/docs/zh_cn/05-tutorial/01_introduction_to_model_deployment.md
index 999867e01e..d09ff7fb77 100644
--- a/docs/zh_cn/05-tutorial/01_introduction_to_model_deployment.md
+++ b/docs/zh_cn/05-tutorial/01_introduction_to_model_deployment.md
@@ -16,10 +16,12 @@ OpenMMLab 的算法如何部署?这是很多社区用户的困惑。而[模型
在第一篇文章中,我们将部署一个简单的超分辨率模型,认识中间表示、推理引擎等模型部署中的概念。
## 初识模型部署
+
在软件工程中,部署指把开发完毕的软件投入使用的过程,包括环境配置、软件安装等步骤。类似地,对于深度学习模型来说,模型部署指让训练好的模型在特定环境中运行的过程。相比于软件部署,模型部署会面临更多的难题:
+
1. 运行模型所需的环境难以配置。深度学习模型通常是由一些框架编写,比如 PyTorch、TensorFlow。由于框架规模、依赖环境的限制,这些框架不适合在手机、开发板等生产环境中安装。
2. 深度学习模型的结构通常比较庞大,需要大量的算力才能满足实时运行的需求。模型的运行效率需要优化。
-因为这些难题的存在,模型部署不能靠简单的环境配置与安装完成。经过工业界和学术界数年的探索,模型部署有了一条流行的流水线:
+ 因为这些难题的存在,模型部署不能靠简单的环境配置与安装完成。经过工业界和学术界数年的探索,模型部署有了一条流行的流水线:
![pipeline](https://user-images.githubusercontent.com/4560679/156556619-3da7a572-876b-4909-b26f-04e81190c546.png)
@@ -32,8 +34,10 @@ OpenMMLab 的算法如何部署?这是很多社区用户的困惑。而[模型
## 部署第一个模型
### 创建 PyTorch 模型
+
仿照 PyTorch 的官方[部署教程](https://pytorch.org/tutorials/advanced/super_resolution_with_onnxruntime.html),让我们用 PyTorch 实现一个超分辨率模型,并把模型部署到 ONNX Runtime 这个推理引擎上。
首先,我们需要创建一个有 PyTorch 库的 Python 编程环境。如果你的 PyTorch 环境还没有装好,可以参考官方的[入门教程](https://pytorch.org/get-started/locally/)。我们强烈推荐使用 conda 来管理 Python 库。使用 conda 可以靠如下的命令初始化一个 PyTorch 环境:
+
```bash
# 创建预安装 Python 3.7 的名叫 deploy 虚拟环境
conda create -n deploy python=3.7 -y
@@ -44,18 +48,22 @@ conda install pytorch torchvision cpuonly -c pytorch
```
如果你的设备支持 cuda 编程,我们建议你在配置 cuda 环境后使用 gpu 上的 PyTorch。比如将上面安装 PyTorch 的命令改成:
+
```bash
# 安装 cuda 11.3 的 PyTorch
# 如果你用的是其他版本的 cuda,请参考上面 PyTorch 的官方安装教程选择安装命令
conda install pytorch torchvision cudatoolkit=11.3 -c pytorch
```
+
本教程会用到其他一些第三方库。你可以用以下命令来安装这些库:
+
```bash
# 安装 ONNX Runtime, ONNX, OpenCV
pip install onnxruntime onnx opencv-python
```
在一切都配置完毕后,用下面的代码来创建一个超分辨率模型。
+
```python
import os
@@ -128,6 +136,7 @@ torch_output = np.transpose(torch_output, [1, 2, 0]).astype(np.uint8)
# Show image
cv2.imwrite("face_torch.png", torch_output)
```
+
在这份代码中,我们创建了一个经典的超分辨率网络 [SRCNN](https://arxiv.org/abs/1501.00092)。SRCNN 先把图像上采样到对应分辨率,再用 3 个卷积层处理图像。为了方便起见,我们跳过训练网络的步骤,直接下载模型权重(由于 MMEditing 中 SRCNN 的权重结构和我们定义的模型不太一样,我们修改了权重字典的 key 来适配我们定义的模型),同时下载好输入图片。为了让模型输出成正确的图片格式,我们把模型的输出转换成 HWC 格式,并保证每一通道的颜色值都在 0~255 之间。如果脚本正常运行的话,一幅超分辨率的人脸照片会保存在“face_torch.png”中。
在 PyTorch 模型测试正确后,我们来正式开始部署这个模型。我们下一步的任务是把 PyTorch 模型转换成用中间表示 ONNX 描述的模型。
@@ -147,6 +156,7 @@ cv2.imwrite("face_torch.png", torch_output)
ONNX (Open Neural Network Exchange)是 Facebook 和微软在2017年共同发布的,用于标准描述计算图的一种格式。目前,在数家机构的共同维护下,ONNX 已经对接了多种深度学习框架和多种推理引擎。因此,ONNX 被当成了深度学习框架到推理引擎的桥梁,就像编译器的中间语言一样。由于各框架兼容性不一,我们通常只用 ONNX 表示更容易部署的静态图。
让我们用下面的代码来把 PyTorch 的模型转换成 ONNX 格式的模型:
+
```python
x = torch.randn(1, 3, 256, 256)
@@ -165,6 +175,7 @@ with torch.no_grad():
剩下的参数中,opset_version 表示 ONNX 算子集的版本。深度学习的发展会不断诞生新算子,为了支持这些新增的算子,ONNX会经常发布新的算子集,目前已经更新15个版本。 我们令 opset_version = 11,即使用第11个 ONNX 算子集,是因为 SRCNN 中的 bicubic (双三次插值)在 opset11 中才得到支持。剩下的两个参数 input_names, output_names 是输入、输出 tensor 的名称,我们稍后会用到这些名称。
如果上述代码运行成功,目录下会新增一个"srcnn.onnx"的 ONNX 模型文件。我们可以用下面的脚本来验证一下模型文件是否正确。
+
```python
import onnx
@@ -182,7 +193,6 @@ else:
![model](https://user-images.githubusercontent.com/4560679/156558675-df96e7f8-0c90-4b52-81db-f80e21e522a1.png)
-
点击 input 或者 output,可以查看 ONNX 模型的基本信息,包括模型的版本信息,以及模型输入、输出的名称和数据类型。
![model_property](https://user-images.githubusercontent.com/4560679/156558624-0d77bf2c-bd01-40e3-a89c-1b0f69329576.png)
@@ -190,8 +200,8 @@ else:
点击某一个算子节点,可以看到算子的具体信息。比如点击第一个 Conv 可以看到:
![node_property](https://user-images.githubusercontent.com/4560679/156558668-867ea202-9ac2-4a04-b836-91ced4f2e5ea.png)
-
每个算子记录了算子属性、图结构、权重三类信息。
+
- 算子属性信息即图中 attributes 里的信息,对于卷积来说,算子属性包括了卷积核大小(kernel_shape)、卷积步长(strides)等内容。这些算子属性最终会用来生成一个具体的算子。
- 图结构信息指算子节点在计算图中的名称、邻边的信息。对于图中的卷积来说,该算子节点叫做 Conv_2,输入数据叫做 11,输出数据叫做 12。根据每个算子节点的图结构信息,就能完整地复原出网络的计算图。
- 权重信息指的是网络经过训练后,算子存储的权重信息。对于卷积来说,权重信息包括卷积核的权重值和卷积后的偏差值。点击图中 conv1.weight, conv1.bias 后面的加号即可看到权重信息的具体内容。
@@ -199,6 +209,7 @@ else:
现在,我们有了 SRCNN 的 ONNX 模型。让我们看看最后该如何把这个模型运行起来。
### 推理引擎——ONNX Runtime
+
**ONNX Runtime** 是由微软维护的一个跨平台机器学习推理加速器,也就是我们前面提到的”推理引擎“。ONNX Runtime 是直接对接 ONNX 的,即 ONNX Runtime 可以直接读取并运行 .onnx 文件, 而不需要再把 .onnx 格式的文件转换成其他格式的文件。也就是说,对于 PyTorch - ONNX - ONNX Runtime 这条部署流水线,只要在目标设备中得到 .onnx 文件,并在 ONNX Runtime 上运行模型,模型部署就算大功告成了。
通过刚刚的操作,我们把 PyTorch 编写的模型转换成了 ONNX 模型,并通过可视化检查了模型的正确性。最后,让我们用 ONNX Runtime 运行一下模型,完成模型部署的最后一步。
@@ -223,9 +234,11 @@ cv2.imwrite("face_ort.png", ort_output)
如果代码正常运行的话,另一幅超分辨率照片会保存在"face_ort.png"中。这幅图片和刚刚得到的"face_torch.png"是一模一样的。这说明 ONNX Runtime 成功运行了 SRCNN 模型,模型部署完成了!以后有用户想实现超分辨率的操作,我们只需要提供一个 "srcnn.onnx" 文件,并帮助用户配置好 ONNX Runtime 的 Python 环境,用几行代码就可以运行模型了。或者还有更简便的方法,我们可以利用 ONNX Runtime 编译出一个可以直接执行模型的应用程序。我们只需要给用户提供 ONNX 模型文件,并让用户在应用程序选择要执行的 ONNX 模型文件名就可以运行模型了。
## 总结
+
在这篇教程里,我们利用成熟的模型部署工具,轻松部署了一个初始版本的超分辨率模型 SRCNN。但在实际应用场景中,随着模型结构的复杂度不断加深,碰到的困难的也会越来越多。在下一篇教程里,我们将“升级”一下这个超分辨率模型,让它支持动态的输入。
看完这篇教程,是不是感觉知识太多一下消化不过来?没关系,模型部署本身有非常多的东西要学。为了举例的方便,这篇教程包含了许多未来才会讲到的知识点。事实上,读完这篇教程后,记下以下知识点就够了:
+
- 模型部署,指把训练好的模型在特定环境中运行的过程。模型部署要解决模型框架兼容性差和模型运行速度慢这两大问题。
- 模型部署的常见流水线是“深度学习框架-中间表示-推理引擎”。其中比较常用的一个中间表示是 ONNX。
- 深度学习模型实际上就是一个计算图。模型部署时通常把模型转换成静态的计算图,即没有控制流(分支语句、循环语句)的计算图。
diff --git a/docs/zh_cn/05-tutorial/02_challenges.md b/docs/zh_cn/05-tutorial/02_challenges.md
index 705e4b6fd0..cb5fb1111a 100644
--- a/docs/zh_cn/05-tutorial/02_challenges.md
+++ b/docs/zh_cn/05-tutorial/02_challenges.md
@@ -1,11 +1,11 @@
# 第二章:解决模型部署中的难题
-
在[第一章](https://mmdeploy.readthedocs.io/zh_CN/latest/tutorials/chapter_01_introduction_to_model_deployment.html)中,我们部署了一个简单的超分辨率模型,一切都十分顺利。但是,上一个模型还有一些缺陷——图片的放大倍数固定是 4,我们无法让图片放大任意的倍数。现在,我们来尝试部署一个支持动态放大倍数的模型,体验一下在模型部署中可能会碰到的困难。
## 模型部署中常见的难题
在之前的学习中,我们在模型部署上顺风顺水,没有碰到任何问题。这是因为 SRCNN 模型只包含几个简单的算子,而这些卷积、插值算子已经在各个中间表示和推理引擎上得到了完美支持。如果模型的操作稍微复杂一点,我们可能就要为兼容模型而付出大量的功夫了。实际上,模型部署时一般会碰到以下几类困难:
+
- 模型的动态化。出于性能的考虑,各推理框架都默认模型的输入形状、输出形状、结构是静态的。而为了让模型的泛用性更强,部署时需要在尽可能不影响原有逻辑的前提下,让模型的输入输出或是结构动态化。
- 新算子的实现。深度学习技术日新月异,提出新算子的速度往往快于 ONNX 维护者支持的速度。为了部署最新的模型,部署工程师往往需要自己在 ONNX 和推理引擎中支持新算子。
- 中间表示与推理引擎的兼容问题。由于各推理引擎的实现不同,对 ONNX 难以形成统一的支持。为了确保模型在不同的推理引擎中有同样的运行效果,部署工程师往往得为某个推理引擎定制模型代码,这为模型部署引入了许多工作量。
@@ -17,6 +17,7 @@
## 问题:实现动态放大的超分辨率模型
在原来的 SRCNN 中,图片的放大比例是写死在模型里的:
+
```python
class SuperResolutionNet(nn.Module):
def __init__(self, upscale_factor):
@@ -32,6 +33,7 @@ class SuperResolutionNet(nn.Module):
def init_torch_model():
torch_model = SuperResolutionNet(upscale_factor=3)
```
+
我们使用 upscale_factor 来控制模型的放大比例。初始化模型的时候,我们默认令 upscale_factor 为 3,生成了一个放大 3 倍的 PyTorch 模型。这个 PyTorch 模型最终被转换成了 ONNX 格式的模型。如果我们需要一个放大 4 倍的模型,需要重新生成一遍模型,再做一次到 ONNX 的转换。
现在,假设我们要做一个超分辨率的应用。我们的用户希望图片的放大倍数能够自由设置。而我们交给用户的,只有一个 .onnx 文件和运行超分辨率模型的应用程序。我们在不修改 .onnx 文件的前提下改变放大倍数。
@@ -171,7 +173,7 @@ with torch.no_grad():
![image](https://user-images.githubusercontent.com/4560679/157626910-de33365c-b60a-49f4-ada7-157111afa6e2.png)
-其中,展开 scales,可以看到 scales 是一个长度为 4 的一维张量,其内容为 [1, 1, 3, 3], 表示 Resize 操作每一个维度的缩放系数;其类型为 Initializer,表示这个值是根据常量直接初始化出来的。如果我们能够自己生成一个 ONNX 的 Resize 算子,让 scales 成为一个可变量而不是常量,就像它上面的 X 一样,那这个超分辨率模型就能动态缩放了。
+其中,展开 scales,可以看到 scales 是一个长度为 4 的一维张量,其内容为 \[1, 1, 3, 3\], 表示 Resize 操作每一个维度的缩放系数;其类型为 Initializer,表示这个值是根据常量直接初始化出来的。如果我们能够自己生成一个 ONNX 的 Resize 算子,让 scales 成为一个可变量而不是常量,就像它上面的 X 一样,那这个超分辨率模型就能动态缩放了。
现有实现插值的 PyTorch 算子有一套规定好的映射到 ONNX Resize 算子的方法,这些映射出的 Resize 算子的 scales 只能是常量,无法满足我们的需求。我们得自己定义一个实现插值的 PyTorch 算子,然后让它映射到一个我们期望的 ONNX Resize 算子上。
@@ -292,9 +294,9 @@ class NewInterpolate(torch.autograd.Function):
align_corners=False)
```
-在具体介绍这个算子的实现前,让我们先理清一下思路。我们希望新的插值算子有两个输入,一个是被用于操作的图像,一个是图像的放缩比例。前面讲到,为了对接 ONNX 中 Resize 算子的 scales 参数,这个放缩比例是一个 [1, 1, x, x] 的张量,其中 x 为放大倍数。在之前放大3倍的模型中,这个参数被固定成了[1, 1, 3, 3]。因此,在插值算子中,我们希望模型的第二个输入是一个 [1, 1, w, h] 的张量,其中 w 和 h 分别是图片宽和高的放大倍数。
+在具体介绍这个算子的实现前,让我们先理清一下思路。我们希望新的插值算子有两个输入,一个是被用于操作的图像,一个是图像的放缩比例。前面讲到,为了对接 ONNX 中 Resize 算子的 scales 参数,这个放缩比例是一个 \[1, 1, x, x\] 的张量,其中 x 为放大倍数。在之前放大3倍的模型中,这个参数被固定成了\[1, 1, 3, 3\]。因此,在插值算子中,我们希望模型的第二个输入是一个 \[1, 1, w, h\] 的张量,其中 w 和 h 分别是图片宽和高的放大倍数。
-搞清楚了插值算子的输入,再看一看算子的具体实现。算子的推理行为由算子的 forward 方法决定。该方法的第一个参数必须为 ctx,后面的参数为算子的自定义输入,我们设置两个输入,分别为被操作的图像和放缩比例。为保证推理正确,需要把 [1, 1, w, h] 格式的输入对接到原来的 interpolate 函数上。我们的做法是截取输入张量的后两个元素,把这两个元素以 list 的格式传入 interpolate 的 scale_factor 参数。
+搞清楚了插值算子的输入,再看一看算子的具体实现。算子的推理行为由算子的 forward 方法决定。该方法的第一个参数必须为 ctx,后面的参数为算子的自定义输入,我们设置两个输入,分别为被操作的图像和放缩比例。为保证推理正确,需要把 \[1, 1, w, h\] 格式的输入对接到原来的 interpolate 函数上。我们的做法是截取输入张量的后两个元素,把这两个元素以 list 的格式传入 interpolate 的 scale_factor 参数。
接下来,我们要决定新算子映射到 ONNX 算子的方法。映射到 ONNX 的方法由一个算子的 symbolic 方法决定。symbolic 方法第一个参数必须是g,之后的参数是算子的自定义输入,和 forward 函数一样。ONNX 算子的具体定义由 g.op 实现。g.op 的每个参数都可以映射到 ONNX 中的算子属性:
@@ -346,9 +348,9 @@ cv2.imwrite("face_ort_3.png", ort_output)
通过学习前两篇教程,我们走完了整个部署流水线,成功部署了支持动态放大倍数的超分辨率模型。在这个过程中,我们既学会了如何简单地调用各框架的API实现模型部署,又学到了如何分析并尝试解决模型部署时碰到的难题。
同样,让我们总结一下本篇教程的知识点:
+
- 模型部署中常见的几类困难有:模型的动态化;新算子的实现;框架间的兼容。
- PyTorch 转 ONNX,实际上就是把每一个操作转化成 ONNX 定义的某一个算子。比如对于 PyTorch 中的 Upsample 和 interpolate,在转 ONNX 后最终都会成为 ONNX 的 Resize 算子。
- 通过修改继承自 torch.autograd.Function 的算子的 symbolic 方法,可以改变该算子映射到 ONNX 算子的行为。
-
-至此,"部署第一个模型“的教程算是告一段落了。是不是觉得学到的知识还不够多?没关系,在接下来的几篇教程中,我们将结合 MMDeploy ,重点介绍 ONNX 中间表示和 ONNX Runtime/TensorRT 推理引擎的知识,让大家学会如何部署更复杂的模型。
+至此,"部署第一个模型“的教程算是告一段落了。是不是觉得学到的知识还不够多?没关系,在接下来的几篇教程中,我们将结合 MMDeploy ,重点介绍 ONNX 中间表示和 ONNX Runtime/TensorRT 推理引擎的知识,让大家学会如何部署更复杂的模型。敬请期待!
diff --git a/docs/zh_cn/05-tutorial/03_pytorch2onnx.md b/docs/zh_cn/05-tutorial/03_pytorch2onnx.md
index 972e6cc443..f9fff52c78 100644
--- a/docs/zh_cn/05-tutorial/03_pytorch2onnx.md
+++ b/docs/zh_cn/05-tutorial/03_pytorch2onnx.md
@@ -5,8 +5,11 @@ ONNX 是目前模型部署中最重要的中间表示之一。学懂了 ONNX 的
在把 PyTorch 模型转换成 ONNX 模型时,我们往往只需要轻松地调用一句`torch.onnx.export`就行了。这个函数的接口看上去简单,但它在使用上还有着诸多的“潜规则”。在这篇教程中,我们会详细介绍 PyTorch 模型转 ONNX 模型的原理及注意事项。除此之外,我们还会介绍 PyTorch 与 ONNX 的算子对应关系,以教会大家如何处理 PyTorch 模型转换时可能会遇到的算子支持问题。
## `torch.onnx.export` 细解
+
在这一节里,我们将详细介绍 PyTorch 到 ONNX 的转换函数—— torch.onnx.export。我们希望大家能够更加灵活地使用这个模型转换接口,并通过了解它的实现原理来更好地应对该函数的报错(由于模型部署的兼容性问题,部署复杂模型时该函数时常会报错)。
+
### 计算图导出方法
+
[TorchScript](https://pytorch.org/docs/stable/jit.html) 是一种序列化和优化 PyTorch 模型的格式,在优化过程中,一个`torch.nn.Module`模型会被转换成 TorchScript 的`torch.jit.ScriptModule`模型。现在, TorchScript 也被常当成一种中间表示使用。我们在[其他文章](https://zhuanlan.zhihu.com/p/486914187)中对 TorchScript 有详细的介绍,这里介绍 TorchScript 仅用于说明 PyTorch 模型转 ONNX的原理。
`torch.onnx.export`中需要的模型实际上是一个`torch.jit.ScriptModule`。而要把普通 PyTorch 模型转一个这样的 TorchScript 模型,有跟踪(trace)和脚本化(script)两种导出计算图的方法。如果给`torch.onnx.export`传入了一个普通 PyTorch 模型(`torch.nn.Module`),那么这个模型会默认使用跟踪的方法导出。这一过程如下图所示:
@@ -57,10 +60,13 @@ for model, model_name in zip(models, model_names):
而用脚本化的话,最终的 ONNX 模型用 `Loop` 节点来表示循环。这样哪怕对于不同的 `n`,ONNX 模型也有同样的结构。
由于推理引擎对静态图的支持更好,通常我们在模型部署时不需要显式地把 PyTorch 模型转成 TorchScript 模型,直接把 PyTorch 模型用 `torch.onnx.export` 跟踪导出即可。了解这部分的知识主要是为了在模型转换报错时能够更好地定位问题是否发生在 PyTorch 转 TorchScript 阶段。
+
### 参数讲解
+
了解完转换函数的原理后,我们来详细介绍一下该函数的主要参数的作用。我们主要会从应用的角度来介绍每个参数在不同的模型部署场景中应该如何设置,而不会去列出每个参数的所有设置方法。该函数详细的 API 文档可参考 [torch.onnx ‒ PyTorch 1.11.0 documentation](https://pytorch.org/docs/stable/onnx.html#functions)
`torch.onnx.export` 在 `torch.onnx.__init__.py`文件中的定义如下:
+
```python
def export(model, args, f, export_params=True, verbose=False, training=TrainingMode.EVAL,
input_names=None, output_names=None, aten=False, export_raw_ir=False,
@@ -69,20 +75,30 @@ def export(model, args, f, export_params=True, verbose=False, training=TrainingM
dynamic_axes=None, keep_initializers_as_inputs=None, custom_opsets=None,
enable_onnx_checker=True, use_external_data_format=False):
```
+
前三个必选参数为模型、模型输入、导出的 onnx 文件名,我们对这几个参数已经很熟悉了。我们来着重看一下后面的一些常用可选参数。
+
#### export_params
+
模型中是否存储模型权重。一般中间表示包含两大类信息:模型结构和模型权重,这两类信息可以在同一个文件里存储,也可以分文件存储。ONNX 是用同一个文件表示记录模型的结构和权重的。
我们部署时一般都默认这个参数为 True。如果 onnx 文件是用来在不同框架间传递模型(比如 PyTorch 到 Tensorflow)而不是用于部署,则可以令这个参数为 False。
+
#### input_names, output_names
+
设置输入和输出张量的名称。如果不设置的话,会自动分配一些简单的名字(如数字)。
ONNX 模型的每个输入和输出张量都有一个名字。很多推理引擎在运行 ONNX 文件时,都需要以“名称-张量值”的数据对来输入数据,并根据输出张量的名称来获取输出数据。在进行跟张量有关的设置(比如添加动态维度)时,也需要知道张量的名字。
在实际的部署流水线中,我们都需要设置输入和输出张量的名称,并保证 ONNX 和推理引擎中使用同一套名称。
+
#### opset_version
+
转换时参考哪个 ONNX 算子集版本,默认为9。后文会详细介绍 PyTorch 与 ONNX 的算子对应关系。
+
#### dynamic_axes
+
指定输入输出张量的哪些维度是动态的。
为了追求效率,ONNX 默认所有参与运算的张量都是静态的(张量的形状不发生改变)。但在实际应用中,我们又希望模型的输入张量是动态的,尤其是本来就没有形状限制的全卷积模型。因此,我们需要显式地指明输入输出张量的哪几个维度的大小是可变的。
我们来看一个`dynamic_axes`的设置例子:
+
```python
import torch
@@ -118,9 +134,11 @@ input_names=['in'], output_names=['out'], dynamic_axes=dynamic_axes_0)
torch.onnx.export(model, dummy_input, model_names[2],
input_names=['in'], output_names=['out'], dynamic_axes=dynamic_axes_23)
```
+
首先,我们导出3个 ONNX 模型,分别为没有动态维度、第0维动态、第2第3维动态的模型。
在这份代码里,我们是用列表的方式表示动态维度,例如:
-```python
+
+````python
dynamic_axes_0 = {
'in' : [0],
'out' : [0]
@@ -132,10 +150,11 @@ dynamic_axes_0 = {
'in' : {0: 'batch'},
'out' : {0: 'batch'}
}
-```
+````
由于在这份代码里我们没有更多的对动态维度的操作,因此简单地用列表指定动态维度即可。
之后,我们用下面的代码来看一看动态维度的作用:
+
```python
import onnxruntime
import numpy as np
@@ -159,7 +178,9 @@ for model_name in model_names:
else:
print(f'Input[{i}] on model {model_name} succeed.')
```
+
我们在模型导出计算图时用的是一个形状为`(1, 3, 10, 10)`的张量。现在,我们来尝试以形状分别是`(1, 3, 10, 10), (2, 3, 10, 10), (1, 3, 20, 20)`为输入,用ONNX Runtime运行一下这几个模型,看看哪些情况下会报错,并保存对应的报错信息。得到的输出信息应该如下:
+
```python
Input[0] on model model_static.onnx succeed.
Input[1] on model model_static.onnx error.
@@ -171,7 +192,9 @@ Input[0] on model model_dynamic_23.onnx succeed.
Input[1] on model model_dynamic_23.onnx error.
Input[2] on model model_dynamic_23.onnx succeed.
```
+
可以看出,形状相同的`(1, 3, 10, 10)`的输入在所有模型上都没有出错。而对于batch(第0维)或者长宽(第2、3维)不同的输入,只有在设置了对应的动态维度后才不会出错。我们可以错误信息中找出是哪些维度出了问题。比如我们可以用以下代码查看`input[1]`在`model_static.onnx`中的报错信息:
+
```python
print(exceptions[(1, 'model_static.onnx')])
@@ -180,10 +203,15 @@ print(exceptions[(1, 'model_static.onnx')])
```
这段报错告诉我们名字叫`in`的输入的第0维不匹配。本来该维的长度应该为1,但我们的输入是2。实际部署中,如果我们碰到了类似的报错,就可以通过设置动态维度来解决问题。
+
### 使用技巧
+
通过学习之前的知识,我们基本掌握了 `torch.onnx.export` 函数的部分实现原理和参数设置方法,足以完成简单模型的转换了。但在实际应用中,使用该函数还会踩很多坑。这里我们模型部署团队把在实战中积累的一些经验分享给大家。
+
#### 使模型在 ONNX 转换时有不同的行为
+
有些时候,我们希望模型在直接用 PyTorch 推理时有一套逻辑,而在导出的ONNX模型中有另一套逻辑。比如,我们可以把一些后处理的逻辑放在模型里,以简化除运行模型之外的其他代码。`torch.onnx.is_in_onnx_export()`可以实现这一任务,该函数仅在执行 `torch.onnx.export()`时为真。以下是一个例子:
+
```python
import torch
@@ -199,9 +227,12 @@ class Model(torch.nn.Module):
return x
```
-这里,我们仅在模型导出时把输出张量的数值限制在[0, 1]之间。使用 `is_in_onnx_export` 确实能让我们方便地在代码中添加和模型部署相关的逻辑。但是,这些代码对只关心模型训练的开发者和用户来说很不友好,突兀的部署逻辑会降低代码整体的可读性。同时,`is_in_onnx_export` 只能在每个需要添加部署逻辑的地方都“打补丁”,难以进行统一的管理。我们之后会介绍如何使用 MMDeploy 的重写机制来规避这些问题。
+这里,我们仅在模型导出时把输出张量的数值限制在\[0, 1\]之间。使用 `is_in_onnx_export` 确实能让我们方便地在代码中添加和模型部署相关的逻辑。但是,这些代码对只关心模型训练的开发者和用户来说很不友好,突兀的部署逻辑会降低代码整体的可读性。同时,`is_in_onnx_export` 只能在每个需要添加部署逻辑的地方都“打补丁”,难以进行统一的管理。我们之后会介绍如何使用 MMDeploy 的重写机制来规避这些问题。
+
#### 利用中断张量跟踪的操作
+
PyTorch 转 ONNX 的跟踪导出法是不是万能的。如果我们在模型中做了一些很“出格”的操作,跟踪法会把某些取决于输入的中间结果变成常量,从而使导出的ONNX模型和原来的模型有出入。以下是一个会造成这种“跟踪中断”的例子:
+
```python
class Model(torch.nn.Module):
def __init__(self):
@@ -218,17 +249,24 @@ torch.onnx.export(model, dummy_input, 'a.onnx')
如果你尝试去导出这个模型,会得到一大堆 warning,告诉你转换出来的模型可能不正确。这也难怪,我们在这个模型里使用了`.item()`把 torch 中的张量转换成了普通的 Python 变量,还尝试遍历 torch 张量,并用一个列表新建一个 torch 张量。这些涉及张量与普通变量转换的逻辑都会导致最终的 ONNX 模型不太正确。
另一方面,我们也可以利用这个性质,在保证正确性的前提下令模型的中间结果变成常量。这个技巧常常用于模型的静态化上,即令模型中所有的张量形状都变成常量。在未来的教程中,我们会在部署实例中详细介绍这些“高级”操作。
-#### 使用张量为输入(PyTorch版本 < 1.9.0)
-正如我们第一篇教程所展示的,在较旧(< 1.9.0)的 PyTorch 中把 Python 数值作为 `torch.onnx.export()`的模型输入时会报错。出于兼容性的考虑,我们还是推荐以张量为模型转换时的模型输入。
+
+#### 使用张量为输入(PyTorch版本 \< 1.9.0)
+
+正如我们第一篇教程所展示的,在较旧(\< 1.9.0)的 PyTorch 中把 Python 数值作为 `torch.onnx.export()`的模型输入时会报错。出于兼容性的考虑,我们还是推荐以张量为模型转换时的模型输入。
+
## PyTorch 对 ONNX 的算子支持
+
在确保`torch.onnx.export()`的调用方法无误后,PyTorch 转 ONNX 时最容易出现的问题就是算子不兼容了。这里我们会介绍如何判断某个 PyTorch 算子在 ONNX 中是否兼容,以助大家在碰到报错时能更好地把错误归类。而具体添加算子的方法我们会在之后的文章里介绍。
在转换普通的`torch.nn.Module`模型时,PyTorch 一方面会用跟踪法执行前向推理,把遇到的算子整合成计算图;另一方面,PyTorch 还会把遇到的每个算子翻译成 ONNX 中定义的算子。在这个翻译过程中,可能会碰到以下情况:
+
- 该算子可以一对一地翻译成一个 ONNX 算子。
- 该算子在 ONNX 中没有直接对应的算子,会翻译成一至多个 ONNX 算子。
- 该算子没有定义翻译成 ONNX 的规则,报错。
那么,该如何查看 PyTorch 算子与 ONNX 算子的对应情况呢?由于 PyTorch 算子是向 ONNX 对齐的,这里我们先看一下 ONNX 算子的定义情况,再看一下 PyTorch 定义的算子映射关系。
+
### ONNX 算子文档
+
ONNX 算子的定义情况,都可以在官方的[算子文档](https://github.com/onnx/onnx/blob/main/docs/Operators.md)中查看。这份文档十分重要,我们碰到任何和 ONNX 算子有关的问题都得来”请教“这份文档。
![image](https://user-images.githubusercontent.com/47652064/163531682-306991b9-1ffe-49fe-8aee-be27b618b096.png)
@@ -238,7 +276,9 @@ ONNX 算子的定义情况,都可以在官方的[算子文档](https://github.
![image](https://user-images.githubusercontent.com/47652064/163531690-2d70e6d2-728b-4f7f-8f5a-efaaf620ff02.png)
通过点击表格中的链接,我们可以查看某个算子的输入、输出参数规定及使用示例。比如上图是Relu在 ONNX 中的定义规则,这份定义表明 Relu 应该有一个输入和一个输入,输入输出的类型相同,均为 tensor。
+
### PyTorch 对 ONNX 算子的映射
+
在 PyTorch 中,和 ONNX 有关的定义全部放在 [torch.onnx 目录](https://github.com/pytorch/pytorch/tree/master/torch/onnx)中,如下图所示:
![image](https://user-images.githubusercontent.com/47652064/163531700-ddf994e5-6989-483c-a1a3-f1b50dfd84f0.png)
@@ -249,6 +289,7 @@ ONNX 算子的定义情况,都可以在官方的[算子文档](https://github.
![image](https://user-images.githubusercontent.com/47652064/163531714-7cf9b784-5b7f-4438-ba01-8cff4c7c9ddc.png)
之后,我们按照代码的调用逻辑,逐步跳转直到最底层的 ONNX 映射函数:
+
```python
upsample_bicubic2d = _interpolate("upsample_bicubic2d", 4, "cubic")
@@ -265,7 +306,9 @@ def _interpolate_helper(name, dim, interpolate_mode):
return symbolic_fn
```
+
最后,在`symbolic_fn`中,我们可以看到插值算子是怎么样被映射成多个 ONNX 算子的。其中,每一个`g.op`就是一个 ONNX 的定义。比如其中的 `Resize` 算子就是这样写的:
+
```python
return g.op("Resize",
input,
@@ -277,21 +320,27 @@ def _interpolate_helper(name, dim, interpolate_mode):
mode_s=interpolate_mode, # nearest, linear, or cubic
nearest_mode_s="floor") # only valid when mode="nearest"
```
+
通过在前面提到的 ONNX 算子文档中查找 [Resize 算子的定义](https://github.com/onnx/onnx/blob/main/docs/Operators.md#resize),我们就可以知道这每一个参数的含义了。用类似的方法,我们可以去查询其他 ONNX 算子的参数含义,进而知道 PyTorch 中的参数是怎样一步一步传入到每个 ONNX 算子中的。
掌握了如何查询 PyTorch 映射到 ONNX 的关系后,我们在实际应用时就可以在 `torch.onnx.export()`的`opset_version`中先预设一个版本号,碰到了问题就去对应的 PyTorch 符号表文件里去查。如果某算子确实不存在,或者算子的映射关系不满足我们的要求,我们就可能得用其他的算子绕过去,或者自定义算子了。
+
## 总结
+
在这篇教程中,我们系统地介绍了 PyTorch 转 ONNX 的原理。我们先是着重讲解了使用最频繁的 `torch.onnx.export`函数,又给出了查询 PyTorch 对 ONNX 算子支持情况的方法。通过本文,我们希望大家能够成功转换出大部分不需要添加新算子的 ONNX 模型,并在碰到算子问题时能够有效定位问题原因。具体而言,大家读完本文后应该了解以下的知识:
+
- 跟踪法和脚本化在导出带控制语句的计算图时有什么区别。
-- `torch.onnx.export()`中该如何设置 `input_names, output_names, dynamic_axes`。
+- `torch.onnx.export()`中该如何设置 i`nput_names, output_names, dynamic_axes`。
- 使用 `torch.onnx.is_in_onnx_export()`来使模型在转换到 ONNX 时有不同的行为。
- 如何查询 [ONNX 算子文档](https://github.com/onnx/onnx/blob/main/docs/Operators.md)。
- 如何查询 PyTorch 对某个 ONNX 版本的新特性支持情况。
- 如何判断 PyTorch 对某个 ONNX 算子是否支持,支持的方法是怎样的。
-这期介绍的知识比较抽象,大家会不会觉得有点“水”?没关系,下一篇教程中,我们将以给出代码实例的形式,介绍多种为 PyTorch 转 ONNX 添加算子支持的方法,为大家在 PyTorch 转 ONNX 这条路上扫除更多的障碍。
+这期介绍的知识比较抽象,大家会不会觉得有点“水”?没关系,下一期教程中,我们将以给出代码实例的形式,介绍多种为 PyTorch 转 ONNX 添加算子支持的方法,为大家在 PyTorch 转 ONNX 这条路上扫除更多的障碍。敬请期待哦!
+
## 练习
+
1. Asinh 算子出现于第 9 个 ONNX 算子集。PyTorch 在 9 号版本的符号表文件中是怎样支持这个算子的?
2. BitShift 算子出现于第11个 ONNX 算子集。PyTorch 在 11 号版本的符号表文件中是怎样支持这个算子的?
-3. 在[第一篇教程](./chapter_01_introduction_to_model_deployment.md)中,我们讲过 PyTorch (截至第 11 号算子集)不支持在插值中设置动态的放缩系数。这个系数对应 `torch.onnx.symbolic_helper._interpolate_helper`的symbolic_fn的Resize算子映射关系中的哪个参数?我们是如何修改这一参数的?
+3. 在\[第一篇教程\](./chapter_01_introduction_to_model_deployment.md)中,我们讲过 PyTorch (截至第 11 号算子集)不支持在插值中设置动态的放缩系数。这个系数对应 `torch.onnx.symbolic_helper._interpolate_helper`的symbolic_fn的Resize算子映射关系中的哪个参数?我们是如何修改这一参数的?
练习的答案会在下期教程中揭晓。
diff --git a/docs/zh_cn/05-tutorial/04_onnx_custom_op.md b/docs/zh_cn/05-tutorial/04_onnx_custom_op.md
index 213f339637..a3f515f363 100644
--- a/docs/zh_cn/05-tutorial/04_onnx_custom_op.md
+++ b/docs/zh_cn/05-tutorial/04_onnx_custom_op.md
@@ -4,27 +4,28 @@
而要使 PyTorch 算子顺利转换到 ONNX ,我们需要保证以下三个环节都不出错:
-* 算子在 PyTorch 中有实现
-* 有把该 PyTorch 算子映射成一个或多个 ONNX 算子的方法
-* ONNX 有相应的算子
+- 算子在 PyTorch 中有实现
+- 有把该 PyTorch 算子映射成一个或多个 ONNX 算子的方法
+- ONNX 有相应的算子
可在实际部署中,这三部分的内容都可能有所缺失。其中最坏的情况是:我们定义了一个全新的算子,它不仅缺少 PyTorch 实现,还缺少 PyTorch 到 ONNX 的映射关系。但所谓车到山前必有路,对于这三个环节,我们也分别都有以下的添加支持的方法:
-* PyTorch 算子
- * 组合现有算子
- * 添加 TorchScript 算子
- * 添加普通 C++ 拓展算子
-* 映射方法
- * 为 ATen 算子添加符号函数
- * 为 TorchScript 算子添加符号函数
- * 封装成 torch.autograd.Function 并添加符号函数
-* ONNX 算子
- * 使用现有 ONNX 算子
- * 定义新 ONNX 算子
+- PyTorch 算子
+ - 组合现有算子
+ - 添加 TorchScript 算子
+ - 添加普通 C++ 拓展算子
+- 映射方法
+ - 为 ATen 算子添加符号函数
+ - 为 TorchScript 算子添加符号函数
+ - 封装成 torch.autograd.Function 并添加符号函数
+- ONNX 算子
+ - 使用现有 ONNX 算子
+ - 定义新 ONNX 算子
那么,面对不同的情况时,就需要我们灵活地选用和组合这些方法。听起来是不是很复杂?别担心,本篇文章中,我们将围绕着三种算子映射方法,学习三个添加算子支持的实例,来理清如何为 PyTorch 算子转 ONNX 算子的三个环节添加支持。
## 支持 ATen 算子
+
实际的部署过程中,我们都有可能会碰到一个最简单的算子缺失问题: 算子在 ATen 中已经实现了,ONNX 中也有相关算子的定义,但是相关算子映射成 ONNX 的规则没有写。在这种情况下,我们只需要**为 ATen 算子补充描述映射规则的符号函数**就行了。
> [ATen](https://pytorch.org/cppdocs/#aten) 是 PyTorch 内置的 C++ 张量计算库,PyTorch 算子在底层绝大多数计算都是用 ATen 实现的。
@@ -32,6 +33,7 @@
上期习题中,我们曾经提到了 ONNX 的 `Asinh` 算子。这个算子在 ATen 中有实现,却缺少了映射到 ONNX 算子的符号函数。在这里,我们来尝试为它补充符号函数,并导出一个包含这个算子的 ONNX 模型。
### 获取 ATen 中算子接口定义
+
为了编写符号函数,我们需要获得 `asinh` 推理接口的输入参数定义。这时,我们要去 `torch/_C/_VariableFunctions.pyi` 和 `torch/nn/functional.pyi` 这两个文件中搜索我们刚刚得到的这个算子名。这两个文件是编译 PyTorch 时本地自动生成的文件,里面包含了 ATen 算子的 PyTorch 调用接口。通过搜索,我们可以知道 `asinh` 在文件 `torch/_C/_VariableFunctions.pyi` 中,其接口定义为:
```python
@@ -41,6 +43,7 @@ def asinh(input: Tensor, *, out: Optional[Tensor]=None) -> Tensor: ...
经过这些步骤,我们确认了缺失的算子名为 `asinh`,它是一个有实现的 ATen 算子。我们还记下了 `asinh` 的调用接口。接下来,我们要为它补充符号函数,使它在转换成 ONNX 模型时不再报错。
### 添加符号函数
+
到目前为止,我们已经多次接触了定义 PyTorch 到 ONNX 映射规则的符号函数了。现在,我们向大家正式介绍一下符号函数。
符号函数,可以看成是 PyTorch 算子类的一个静态方法。在把 PyTorch 模型转换成 ONNX 模型时,各个 PyTorch 算子的符号函数会被依次调用,以完成 PyTorch 算子到 ONNX 算子的转换。符号函数的定义一般如下:
@@ -119,6 +122,7 @@ torch.onnx.export(model, input, 'asinh.onnx')
![](https://user-images.githubusercontent.com/47652064/169744691-f14e4fd4-c777-4562-aaa5-a5bf888f21f8.png)
### 测试算子
+
在完成了一份自定义算子后,我们一定要测试一下算子的正确性。一般我们要用 PyTorch 运行一遍原算子,再用推理引擎(比如 ONNX Runtime)运行一下 ONNX 算子,最后比对两次的运行结果。对于我们刚刚得到的 `asinh.onnx`,可以用如下代码来验证:
```python
@@ -146,6 +150,7 @@ assert np.allclose(torch_output, ort_output)
在这份代码里,我们用 PyTorch 做了一遍推理,并把结果转成了 numpy 格式。之后,我们又用 ONNX Runtime 对 onnx 文件做了一次推理。最后,我们使用 `np.allclose` 来保证两个结果张量的误差在一个可以允许的范围内。一切正常的话,运行这段代码后,`assert` 所在行不会报错,程序应该没有任何输出。
## 支持 TorchScript 算子
+
对于一些比较复杂的运算,仅使用 PyTorch 原生算子是无法实现的。这个时候,就要考虑自定义一个 PyTorch 算子,再把它转换到 ONNX 中了。新增 PyTorch 算子的方法有很多,PyTorch 官方比较推荐的一种做法是[添加 TorchScript 算子](https://pytorch.org/tutorials/advanced/torch_script_custom_ops.html) 。
由于添加算子的方法较繁琐,我们今天跳过新增 TorchScript 算子的内容,以可变形卷积(Deformable Convolution)算子为例,介绍为现有 TorchScript 算子添加 ONNX 支持的方法。
@@ -161,6 +166,7 @@ assert np.allclose(torch_output, ort_output)
在为可变形卷积添加符号函数时,我们也可以尝试走一遍这个流程。
### 使用 TorchScript 算子
+
和之前一样,我们首先定义一个包含了算子的模型,为之后转换 ONNX 模型做准备。
```python
@@ -193,6 +199,7 @@ m.def(TORCH_SELECTIVE_SCHEMA(
那么接下来,根据之前的经验,我们就是要去 ONNX 官方文档中查找算子的定义了。
### 自定义 ONNX 算子
+
很遗憾的是,如果我们去 ONNX 的官方算子页面搜索 "deform",将搜不出任何内容。目前,ONNX 还没有提供可变形卷积的算子,我们要自己定义一个 ONNX 算子了。
我们在前面讲过,`g.op()` 是用来定义 ONNX 算子的函数。对于 ONNX 官方定义的算子,`g.op()` 的第一个参数就是该算子的名称。而对于一个自定义算子,`g.op()` 的第一个参数是一个带命名空间的算子名,比如:
@@ -278,17 +285,18 @@ torch.onnx.export(model, input, 'dcn.onnx')
代码成功运行的话,我们应该能得到如下的 ONNX 模型:
-
![](https://user-images.githubusercontent.com/47652064/169744720-51ea91bc-b67b-4911-9e43-0adc1b64d2c1.jpg)
可以看到,我们自定义的 ONNX 算子 `deform_conv2d` 包含了两个输入,一个输出,和我们预想得一样。
## 使用 torch.autograd.Function
+
最后,我们来学习一种简单的为 PyTorch 添加 C++ 算子实现的方法,来代替较为复杂的新增 TorchScript 算子。同时,我们会用 torch.autograd.Function 封装这个新算子。torch.autograd.Function 能完成算子实现和算子调用的隔离。不管算子是怎么实现的,它封装后的使用体验以及 ONNX 导出方法会和原生的 PyTorch 算子一样。这是我们比较推荐的为算子添加 ONNX 支持的方法。
为了应对更复杂的情况,我们来自定义一个奇怪的 `my_add` 算子。这个算子的输入张量 a, b ,输出 `2a + b` 的值。我们会先把它在 PyTorch 中实现,再把它导出到 ONNX 中。
### 为 PyTorch 添加 C++ 拓展
+
为 PyTorch 添加简单的 C++ 拓展还是很方便的。对于我们定义的 my_add 算子,可以用以下的 C++ 源文件来实现。我们把该文件命名为 "my_add.cpp":
```C++
@@ -382,6 +390,7 @@ class MyAdd(torch.nn.Module):
有了访问新算子的接口后,我们可以进一步把算子封装成一个神经网络中的计算层。我们定义一个叫做的 `MyAdd` 的 `torch.nn.Module`,它封装了`my_add`,就和封装了`conv2d` 的 `torch.nn.Conv2d` 一样。
### 测试算子
+
费了好大的功夫来“包装”我们的新算子后,我们终于可以来使用它了。和之前的测试流程一样,让我们用下面的代码来导出一个包含新算子的 ONNX 模型,并验证一下它是否正确。
```python
@@ -447,13 +456,13 @@ assert np.allclose(torch_output, ort_output)
在这篇教程中,我们围绕“为 ATen 算子添加符号函数”、“为 TorchScript 算子添加符号函数”、“封装成 `torch.autograd.Function` 并添加符号函数”这三种添加映射关系的方法,讲解了 3 个为 PyTorch 和 ONNX 添加支持的实例。在这个过程中,我们学到了很多零散的知识,来总结一下吧。
-* ATen 是 PyTorch 的 C++ 张量运算库。通过查询 torch/_C/_VariableFunctions.pyi 和 torch/nn/functional.pyi,我们可以知道 ATen 算子的 Python 接口定义。
-* 用 register_op 可以为 ATen 算子补充注册符号函数
-* 用 register_custom_op_symbolic 可以为 TorchScript 算子补充注册符号函数
-* 如何在 PyTorch 里添加 C++ 拓展
-* 如何用 torch.autograd.Function 封装一个自定义 PyTorch 算子
-* 如何编写符号函数 symbolic(g, ...)。
-* 如何用 g.op() 把一个 PyTorch 算子映射成一个或多个 ONNX 算子,或者是自定义的 ONNX 算子。
+- ATen 是 PyTorch 的 C++ 张量运算库。通过查询 torch/\_C/\_VariableFunctions.pyi 和 torch/nn/functional.pyi,我们可以知道 ATen 算子的 Python 接口定义。
+- 用 register_op 可以为 ATen 算子补充注册符号函数
+- 用 register_custom_op_symbolic 可以为 TorchScript 算子补充注册符号函数
+- 如何在 PyTorch 里添加 C++ 拓展
+- 如何用 torch.autograd.Function 封装一个自定义 PyTorch 算子
+- 如何编写符号函数 symbolic(g, ...)。
+- 如何用 g.op() 把一个 PyTorch 算子映射成一个或多个 ONNX 算子,或者是自定义的 ONNX 算子。
这篇教程涉及的代码比较多。如果大家在阅读时碰到了问题,最好去跑一跑代码,改一改代码里的内容,实际感受一下每行代码的意义。
diff --git a/docs/zh_cn/05-tutorial/05_onnx_model_editing.md b/docs/zh_cn/05-tutorial/05_onnx_model_editing.md
index b390703df0..27ce9cc468 100644
--- a/docs/zh_cn/05-tutorial/05_onnx_model_editing.md
+++ b/docs/zh_cn/05-tutorial/05_onnx_model_editing.md
@@ -7,7 +7,9 @@
在这期教程里,我们将围绕 ONNX 这一套神经网络定义标准本身,探究 ONNX 模型的构造、读取、子模型提取、调试。首先,我们会学习 ONNX 的底层表示方式。之后,我们会用 ONNX API 构造和读取模型。最后,我们会利用 ONNX 提供的子模型提取功能,学习如何调试 ONNX 模型。
## ONNX 的底层实现
+
### ONNX 的存储格式
+
ONNX 在底层是用 **Protobuf** 定义的。Protobuf,全称 Protocol Buffer,是 Google 提出的一套表示和序列化数据的机制。使用 Protobuf 时,用户需要先写一份数据定义文件,再根据这份定义文件把数据存储进一份二进制文件。可以说,数据定义文件就是数据类,二进制文件就是数据类的实例。
这里给出一个 Protobuf 数据定义文件的例子:
@@ -23,7 +25,6 @@ message Person {
而对于 ONNX ,它的 Protobuf 数据定义文件在其[开源库](https://github.com/onnx/onnx/tree/main/onnx)中,这些文件定义了神经网络中模型、节点、张量的数据类型规范;而数据定义文件对应的二进制文件就是我们熟悉的“.onnx"文件,每一个 ".onnx" 文件按照数据定义规范,存储了一个神经网络的所有相关数据。直接用 Protobuf 生成 ONNX 模型还是比较麻烦的。幸运的是,ONNX 提供了很多实用 API,我们可以在完全不了解 Protobuf 的前提下,构造和读取 ONNX 模型。
-
### ONNX 的结构定义
在用 API 对 ONNX 模型进行操作之前,我们还需要先了解一下 ONNX 的结构定义规则,学习一下 ONNX 在 Protobuf 定义文件里是怎样描述一个神经网络的。
@@ -111,10 +112,10 @@ opset_import {version: 15}
在上一小节中,我们知道了 ONNX 模型是按以下的结构组织起来的:
-* ModelProto
- * GraphProto
- * NodeProto
- * ValueInfoProto
+- ModelProto
+ - GraphProto
+ - NodeProto
+ - ValueInfoProto
现在,让我们抛开 PyTorch,尝试完全用 ONNX 的 Python API 构造一个描述线性函数 `output=a*x+b` 的 ONNX 模型。我们将根据上面的结构,自底向上地构造这个模型。
@@ -223,8 +224,8 @@ assert np.allclose(output, a * x + b)
一切顺利的话,这段代码不会有任何报错信息。这说明我们的模型等价于执行 a * x + b 这个计算。
-
### 读取并修改 ONNX 模型
+
通过用 API 构造 ONNX 模型,我们已经彻底搞懂了 ONNX 由哪些模块组成。现在,让我们看看该如何读取现有的".onnx"文件并从中提取模型信息。
首先,我们可以用下面的代码读取一个 ONNX 模型:
@@ -307,10 +308,12 @@ onnx.save(model, 'linear_func_2.onnx')
在读入之前的 `linear_func.onnx` 模型后,我们可以直接修改第二个节点的类型 `node[1].op_type`,把加法变成减法。这样,我们的模型描述的是 `a * x - b` 这个线性函数。大家感兴趣的话,可以用 ONNX Runtime 运行新模型 `linear_func_2.onnx`,来验证一下它和 `a * x - b` 是否等价。
## 调试 ONNX 模型
+
在实际部署中,如果用深度学习框架导出的 ONNX 模型出了问题,一般要通过修改框架的代码来解决,而不会从 ONNX 入手,我们把 ONNX 模型当成一个不可修改的黑盒看待。
现在,我们已经深入学习了 ONNX 的原理,可以尝试对 ONNX 模型本身进行调试了。在这一节里,让我们看看该如何巧妙利用 ONNX 提供的子模型提取功能,对 ONNX 模型进行调试。
### 子模型提取
+
ONNX 官方为开发者提供了子模型提取(extract)的功能。子模型提取,顾名思义,就是从一个给定的 ONNX 模型中,拿出一个子模型。这个子模型的节点集、边集都是原模型中对应集合的子集。让我们来用 PyTorch 导出一个复杂一点的 ONNX 模型,并在它的基础上执行提取操作:
```python
@@ -348,7 +351,6 @@ torch.onnx.export(model, input, 'whole_model.onnx')
![](https://user-images.githubusercontent.com/47652064/170644578-bcaaa2aa-bdd4-4cb3-856b-c6d621273357.png)
-
> 在前面的章节中,我们学过,ONNX 的边用同名张量表示的。也就是说,这里的边序号,实际上是前一个节点的输出张量序号和后一个节点的输入张量序号。由于这个模型是用 PyTorch 导出的,这些张量序号都是 PyTorch 自动生成的。
接着,我们可以下面的代码提取出一个子模型:
@@ -438,7 +440,7 @@ onnx.utils.extract_model('whole_model.onnx', 'debug_model_4.onnx', ['25', '27'],
![](https://user-images.githubusercontent.com/47652064/170020865-e4d59a4f-7c57-4a12-b300-b7f5da0e1b80.png)
----
+______________________________________________________________________
子模型提取固然是一个便利的 ONNX 调试工具。但是,在实际的情况中,我们一般是用 PyTorch 等框架导出 ONNX 模型。这里有两个问题:
@@ -451,12 +453,12 @@ MMDeploy 为 PyTorch 模型添加了模型分块功能。使用这个功能,
在这篇教程中,我们抛开了 PyTorch,学习了 ONNX 模型本身的知识。老规矩,我们来总结一下这篇教程的知识点:
-* ONNX 使用 Protobuf 定义规范和序列化模型。
-* 一个 ONNX 模型主要由 `ModelProto`,`GraphProto`,`NodeProto`,`ValueInfoProto` 这几个数据类的对象组成。
-* 使用 `onnx.helper.make_xxx`,我们可以构造 ONNX 模型的数据对象。
-* `onnx.save()` 可以保存模型,`onnx.load()` 可以读取模型,`onnx.checker.check_model()` 可以检查模型是否符合规范。
-* `onnx.utils.extract_model()` 可以从原模型中取出部分节点,和新定义的输入、输出边构成一个新的子模型。
-* 利用子模型提取功能,我们可以输出原 ONNX 模型的中间结果,实现对 ONNX 模型的调试。
+- ONNX 使用 Protobuf 定义规范和序列化模型。
+- 一个 ONNX 模型主要由 `ModelProto`,`GraphProto`,`NodeProto`,`ValueInfoProto` 这几个数据类的对象组成。
+- 使用 `onnx.helper.make_xxx`,我们可以构造 ONNX 模型的数据对象。
+- `onnx.save()` 可以保存模型,`onnx.load()` 可以读取模型,`onnx.checker.check_model()` 可以检查模型是否符合规范。
+- `onnx.utils.extract_model()` 可以从原模型中取出部分节点,和新定义的输入、输出边构成一个新的子模型。
+- 利用子模型提取功能,我们可以输出原 ONNX 模型的中间结果,实现对 ONNX 模型的调试。
至此,我们对 ONNX 相关知识的学习就告一段落了。回顾一下,我们先学习了 PyTorch 转 ONNX 有关 API 的用法;接着,我们学习了如何用自定义算子解决 PyTorch 和 ONNX 表达能力不足的问题;最后我们单独学习了 ONNX 模型的调试方法。通过对 ONNX 由浅入深的学习,我们基本可以应对模型部署中和 ONNX 有关的绝大多数问题了。
diff --git a/docs/zh_cn/conf.py b/docs/zh_cn/conf.py
index 08495b5aa1..de962265f2 100644
--- a/docs/zh_cn/conf.py
+++ b/docs/zh_cn/conf.py
@@ -119,6 +119,10 @@
html_static_path = ['_static']
html_css_files = ['css/readthedocs.css']
+# Enable ::: for my_st
+myst_enable_extensions = ['colon_fence']
+myst_heading_anchors = 5
+
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
diff --git a/docs/zh_cn/faq.md b/docs/zh_cn/faq.md
index e5547fb033..8b227cc9fc 100644
--- a/docs/zh_cn/faq.md
+++ b/docs/zh_cn/faq.md
@@ -1,13 +1,12 @@
# FAQ
-
### TensorRT
- "WARNING: Half2 support requested on hardware without native FP16 support, performance will be negatively affected."
Fp16 mode requires a device with full-rate fp16 support.
-- "error: parameter check failed at: engine.cpp::setBindingDimensions::1046, condition: profileMinDims.d[i] <= dimensions.d[i]"
+- "error: parameter check failed at: engine.cpp::setBindingDimensions::1046, condition: profileMinDims.d\[i\] \<= dimensions.d\[i\]"
When building an `ICudaEngine` from an `INetworkDefinition` that has dynamically resizable inputs, users need to specify at least one optimization profile. Which can be set in deploy config:
@@ -26,33 +25,37 @@
The input tensor shape should be limited between `min_shape` and `max_shape`.
-- "error: [TensorRT] INTERNAL ERROR: Assertion failed: cublasStatus == CUBLAS_STATUS_SUCCESS"
+- "error: \[TensorRT\] INTERNAL ERROR: Assertion failed: cublasStatus == CUBLAS_STATUS_SUCCESS"
TRT 7.2.1 switches to use cuBLASLt (previously it was cuBLAS). cuBLASLt is the defaulted choice for SM version >= 7.0. You may need CUDA-10.2 Patch 1 (Released Aug 26, 2020) to resolve some cuBLASLt issues. Another option is to use the new TacticSource API and disable cuBLASLt tactics if you dont want to upgrade.
### Libtorch
+
- Error: `libtorch/share/cmake/Caffe2/Caffe2Config.cmake:96 (message):Your installed Caffe2 version uses cuDNN but I cannot find the cuDNN libraries. Please set the proper cuDNN prefixes and / or install cuDNN.`
May `export CUDNN_ROOT=/root/path/to/cudnn` to resolve the build error.
-
### Windows
+
- Error: similar like this `OSError: [WinError 1455] The paging file is too small for this operation to complete. Error loading "C:\Users\cx\miniconda3\lib\site-packages\torch\lib\cudnn_cnn_infer64_8.dll" or one of its dependencies`
Solution: according to this [post](https://stackoverflow.com/questions/64837376/how-to-efficiently-run-multiple-pytorch-processes-models-at-once-traceback), the issue may be caused by NVidia and will fix in *CUDA release 11.7*. For now one could use the [fixNvPe.py](https://gist.github.com/cobryan05/7d1fe28dd370e110a372c4d268dcb2e5) script to modify the nvidia dlls in the pytorch lib dir.
`python fixNvPe.py --input=C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\torch\lib\*.dll`
- You can find your pytorch installation path with:
- ```python
- import torch
- print(torch.__file__)
- ```
+ You can find your pytorch installation path with:
+
+ ```python
+ import torch
+ print(torch.__file__)
+ ```
### Pip
+
- pip installed package but could not `import` them.
Make sure your are using conda pip.
+
```bash
$ which pip
# /path/to/.local/bin/pip
diff --git a/docs/zh_cn/get_started.md b/docs/zh_cn/get_started.md
index 4abca8c014..b698dd6b96 100644
--- a/docs/zh_cn/get_started.md
+++ b/docs/zh_cn/get_started.md
@@ -32,11 +32,12 @@ MMDeploy 定义的模型部署流程,如下图所示:
**第一步**:从[官网](https://docs.conda.io/en/latest/miniconda.html)下载并安装 Miniconda
**第二步**:创建并激活 conda 环境
- ```shell
- export PYTHON_VERSION=3.7
- conda create --name mmdeploy python=${PYTHON_VERSION} -y
- conda activate mmdeploy
- ```
+
+```shell
+export PYTHON_VERSION=3.7
+conda create --name mmdeploy python=${PYTHON_VERSION} -y
+conda activate mmdeploy
+```
**第三步**: 参考[官方文档](https://pytorch.org/get-started/locally/)并安装 PyTorch
@@ -44,17 +45,17 @@ Model Converter 的 torch2onnx 功能依赖它。
在 GPU 环境下(这里我们以 Ubuntu 18.04 CUDA 11.1 为基础),您可以使用如下方式安装 PyTorch 1.8:
- ```shell
- export PYTHON_VERSION=3.7
- export PYTORCH_VERSION=1.8.0
- export TORCHVISION_VERSION=0.9.0
- export CUDA_VERSION=11.1
+```shell
+export PYTHON_VERSION=3.7
+export PYTORCH_VERSION=1.8.0
+export TORCHVISION_VERSION=0.9.0
+export CUDA_VERSION=11.1
- conda create -n mmdeploy python=${PYTHON_VERSION} -y
- conda activate mmdeploy
+conda create -n mmdeploy python=${PYTHON_VERSION} -y
+conda activate mmdeploy
- conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cudatoolkit=${CUDA_VERSION} -c pytorch -c conda-forge
- ```
+conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cudatoolkit=${CUDA_VERSION} -c pytorch -c conda-forge
+```
在 CPU 环境下,您可以执行:
@@ -66,15 +67,14 @@ conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cp
## 安装 MMDeploy
-
**第一步**: 安装 mmcv-full
- ```shell
- export MMCV_VERSION=1.5.0
- export CUDA_STRING="${CUDA_VERSION/./""}"
+```shell
+export MMCV_VERSION=1.5.0
+export CUDA_STRING="${CUDA_VERSION/./""}"
- python -m pip install mmcv-full==${MMCV_VERSION} -f https://download.openmmlab.com/mmcv/dist/cu${CUDA_STRING}/torch${PYTORCH_VERSION}/index.html
- ```
+python -m pip install mmcv-full==${MMCV_VERSION} -f https://download.openmmlab.com/mmcv/dist/cu${CUDA_STRING}/torch${PYTORCH_VERSION}/index.html
+```
**第二步**: 安装 MMDeploy
@@ -82,24 +82,24 @@ conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cp
在 NVIDIA 设备上,我们推荐使用 MMDeploy-TensoRT 预编译包:
- ```shell
- export MMDEPLOY_VERSION=0.5.0
- export TENSORRT_VERSION=8.2.3.0
- export PYTHON_VERSION=3.7
- export PYTHON_STRING="${PYTHON_VERSION/./""}"
-
- wget https://github.com/open-mmlab/mmdeploy/releases/download/v${MMDEPLOY_VERSION}/mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
- tar -zxvf mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
- cd mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}
- python -m pip install dist/mmdeploy-*-py${PYTHON_STRING}*.whl
- python -m pip install sdk/python/mmdeploy_python-*-cp${PYTHON_STRING}*.whl
- export LD_LIBRARY_PATH=$(pwd)/sdk/lib:$LD_LIBRARY_PATH
- cd ..
- ```
-
- ```{note}
- 如果 MMDeploy 没有您所需要的目标软硬件平台的预编译包,请参考源码安装文档,正确安装和配置
- ```
+```shell
+export MMDEPLOY_VERSION=0.5.0
+export TENSORRT_VERSION=8.2.3.0
+export PYTHON_VERSION=3.7
+export PYTHON_STRING="${PYTHON_VERSION/./""}"
+
+wget https://github.com/open-mmlab/mmdeploy/releases/download/v${MMDEPLOY_VERSION}/mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
+tar -zxvf mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}.tar.gz
+cd mmdeploy-${MMDEPLOY_VERSION}-linux-x86_64-cuda${CUDA_VERSION}-tensorrt${TENSORRT_VERSION}
+python -m pip install dist/mmdeploy-*-py${PYTHON_STRING}*.whl
+python -m pip install sdk/python/mmdeploy_python-*-cp${PYTHON_STRING}*.whl
+export LD_LIBRARY_PATH=$(pwd)/sdk/lib:$LD_LIBRARY_PATH
+cd ..
+```
+
+```{note}
+如果 MMDeploy 没有您所需要的目标软硬件平台的预编译包,请参考源码安装文档,正确安装和配置
+```
**第三步**: 安装预编译包要求的推理后端
@@ -107,23 +107,23 @@ conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cp
下载完毕后,您可以参考如下方法安装。这里,我们以 TensorRT 8.2.3.0、cuDNN 8.2 为例:
- ```shell
- export TENSORRT_VERSION=8.2.3.0
- CUDA_MAJOR="${CUDA_VERSION/\.*/""}"
+```shell
+export TENSORRT_VERSION=8.2.3.0
+CUDA_MAJOR="${CUDA_VERSION/\.*/""}"
- # !!! 从 NVIDIA 官网下载 与 cuda toolkit 匹配的 tensorrt 到当前的工作目录
- tar -zxvf TensorRT-${TENSORRT_VERSION}*cuda-${CUDA_MAJOR}*.tar.gz
- python -m pip install TensorRT-${TENSORRT_VERSION}/python/tensorrt-*-cp${PYTHON_STRING}*.whl
- python -m pip install pycuda
- export TENSORRT_DIR=$(pwd)/TensorRT-${TENSORRT_VERSION}
- export LD_LIBRARY_PATH=${TENSORRT_DIR}/lib:$LD_LIBRARY_PATH
+# !!! 从 NVIDIA 官网下载 与 cuda toolkit 匹配的 tensorrt 到当前的工作目录
+tar -zxvf TensorRT-${TENSORRT_VERSION}*cuda-${CUDA_MAJOR}*.tar.gz
+python -m pip install TensorRT-${TENSORRT_VERSION}/python/tensorrt-*-cp${PYTHON_STRING}*.whl
+python -m pip install pycuda
+export TENSORRT_DIR=$(pwd)/TensorRT-${TENSORRT_VERSION}
+export LD_LIBRARY_PATH=${TENSORRT_DIR}/lib:$LD_LIBRARY_PATH
- # !!! 从 NVIDIA 官网下载与 cuda toolkit,tensorrt 匹配的 cudnn 到当前的工作目录
- tar -zxvf cudnn-${CUDA_MAJOR}.*-linux-x64*.tgz
- export CUDNN_DIR=$(pwd)/cuda
- export LD_LIBRARY_PATH=$CUDNN_DIR/lib64:$LD_LIBRARY_PATH
- ```
+# !!! 从 NVIDIA 官网下载与 cuda toolkit,tensorrt 匹配的 cudnn 到当前的工作目录
+tar -zxvf cudnn-${CUDA_MAJOR}.*-linux-x64*.tgz
+export CUDNN_DIR=$(pwd)/cuda
+export LD_LIBRARY_PATH=$CUDNN_DIR/lib64:$LD_LIBRARY_PATH
+```
在接下来的章节中,我们均以此环境为基础,演示 MMDeploy 的功能。
diff --git a/mmdeploy/apis/inference.py b/mmdeploy/apis/inference.py
index f3babb3638..47bd204322 100644
--- a/mmdeploy/apis/inference.py
+++ b/mmdeploy/apis/inference.py
@@ -16,15 +16,15 @@ def inference_model(model_cfg: Union[str, mmcv.Config],
Examples:
>>> from mmdeploy.apis import inference_model
- >>> model_cfg = ('mmdetection/configs/fcos/'
- 'fcos_r50_caffe_fpn_gn-head_1x_coco.py')
- >>> deploy_cfg = ('configs/mmdet/detection/'
- 'detection_onnxruntime_dynamic.py')
+ >>> model_cfg = 'mmdetection/configs/fcos/' \
+ 'fcos_r50_caffe_fpn_gn-head_1x_coco.py'
+ >>> deploy_cfg = 'configs/mmdet/detection/' \
+ 'detection_onnxruntime_dynamic.py'
>>> backend_files = ['work_dir/fcos.onnx']
>>> img = 'demo.jpg'
>>> device = 'cpu'
- >>> model_output = inference_model(model_cfg, deploy_cfg,
- backend_files, img, device)
+ >>> model_output = inference_model(model_cfg, deploy_cfg, \
+ backend_files, img, device)
Args:
model_cfg (str | mmcv.Config): Model config file or Config object.
diff --git a/mmdeploy/apis/pytorch2onnx.py b/mmdeploy/apis/pytorch2onnx.py
index 59647e89ae..5d8d9c91ae 100644
--- a/mmdeploy/apis/pytorch2onnx.py
+++ b/mmdeploy/apis/pytorch2onnx.py
@@ -27,12 +27,12 @@ def torch2onnx(img: Any,
>>> img = 'demo.jpg'
>>> work_dir = 'work_dir'
>>> save_file = 'fcos.onnx'
- >>> deploy_cfg = ('configs/mmdet/detection/'
- 'detection_onnxruntime_dynamic.py')
- >>> model_cfg = ('mmdetection/configs/fcos/'
- 'fcos_r50_caffe_fpn_gn-head_1x_coco.py')
- >>> model_checkpoint = ('checkpoints/'
- 'fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth')
+ >>> deploy_cfg = 'configs/mmdet/detection/' \
+ 'detection_onnxruntime_dynamic.py'
+ >>> model_cfg = 'mmdetection/configs/fcos/' \
+ 'fcos_r50_caffe_fpn_gn-head_1x_coco.py'
+ >>> model_checkpoint = 'checkpoints/' \
+ 'fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth'
>>> device = 'cpu'
>>> torch2onnx(img, work_dir, save_file, deploy_cfg, \
model_cfg, model_checkpoint, device)
diff --git a/mmdeploy/apis/visualize.py b/mmdeploy/apis/visualize.py
index 251880ed3e..ade0a21fe8 100644
--- a/mmdeploy/apis/visualize.py
+++ b/mmdeploy/apis/visualize.py
@@ -21,10 +21,10 @@ def visualize_model(model_cfg: Union[str, mmcv.Config],
Examples:
>>> from mmdeploy.apis import visualize_model
- >>> model_cfg = ('mmdetection/configs/fcos/'
- 'fcos_r50_caffe_fpn_gn-head_1x_coco.py')
- >>> deploy_cfg = ('configs/mmdet/detection/'
- 'detection_onnxruntime_dynamic.py')
+ >>> model_cfg = 'mmdetection/configs/fcos/' \
+ 'fcos_r50_caffe_fpn_gn-head_1x_coco.py'
+ >>> deploy_cfg = 'configs/mmdet/detection/' \
+ 'detection_onnxruntime_dynamic.py'
>>> model = 'work_dir/fcos.onnx'
>>> img = 'demo.jpg'
>>> device = 'cpu'
diff --git a/mmdeploy/backend/tensorrt/onnx2tensorrt.py b/mmdeploy/backend/tensorrt/onnx2tensorrt.py
index 9cc2ffbde7..8e38f100b4 100644
--- a/mmdeploy/backend/tensorrt/onnx2tensorrt.py
+++ b/mmdeploy/backend/tensorrt/onnx2tensorrt.py
@@ -26,10 +26,10 @@ def onnx2tensorrt(work_dir: str,
>>> work_dir = 'work_dir'
>>> save_file = 'end2end.engine'
>>> model_id = 0
- >>> deploy_cfg = ('configs/mmdet/detection/'
- 'detection_tensorrt_dynamic-320x320-1344x1344.py')
+ >>> deploy_cfg = 'configs/mmdet/detection/' \
+ 'detection_tensorrt_dynamic-320x320-1344x1344.py'
>>> onnx_model = 'work_dir/end2end.onnx'
- >>> onnx2tensorrt(work_dir, save_file, model_id, deploy_cfg,
+ >>> onnx2tensorrt(work_dir, save_file, model_id, deploy_cfg, \
onnx_model, 'cuda:0')
Args:
diff --git a/mmdeploy/codebase/mmdet/core/post_processing/bbox_nms.py b/mmdeploy/codebase/mmdet/core/post_processing/bbox_nms.py
index c177bf9dfa..50d6c7caea 100644
--- a/mmdeploy/codebase/mmdet/core/post_processing/bbox_nms.py
+++ b/mmdeploy/codebase/mmdet/core/post_processing/bbox_nms.py
@@ -201,7 +201,7 @@ def multiclass_nms__default(ctx,
"""
deploy_cfg = ctx.cfg
batch_size = boxes.size(0)
- if not is_dynamic_batch(deploy_cfg) and batch_size == 1:
+ if not is_dynamic_batch(deploy_cfg) and batch_size != 1:
return _multiclass_nms_single(
boxes,
scores,
diff --git a/mmdeploy/core/optimizers/function_marker.py b/mmdeploy/core/optimizers/function_marker.py
index 57ab7ff19c..5ad0501593 100644
--- a/mmdeploy/core/optimizers/function_marker.py
+++ b/mmdeploy/core/optimizers/function_marker.py
@@ -154,7 +154,7 @@ def impl(ys, prefix, level):
if ys not in visit:
visit.add(ys)
root = ctx.names[ctx.index]
- name = '.'.join(str(x) for x in (root, *prefix))
+ name = '/'.join(str(x) for x in (root, *prefix))
ys_shape = tuple(int(s) for s in ys.shape)
ret = Mark.apply(ys, ys.dtype, ys_shape, func, func_id,
io_type, name, index, attrs)
| |