105 lines
3.0 KiB
Markdown
105 lines
3.0 KiB
Markdown
|
# Build for RISC-V
|
||
|
|
||
|
MMDeploy chooses ncnn as the inference backend on RISC-V platform. The deployment process consists of two steps:
|
||
|
|
||
|
Model conversion: Convert the PyTorch model to the ncnn model on the host side, and then upload the converted model to the device.
|
||
|
|
||
|
Model deployment: Compile ncnn and MMDeploy in cross-compilation mode on the host side, and then upload the executable for inference.
|
||
|
|
||
|
## 1. Model conversion
|
||
|
|
||
|
a) Install MMDeploy
|
||
|
|
||
|
You can refer to [Build document](./linux-x86_64.md) to install ncnn inference engine and MMDeploy
|
||
|
|
||
|
b) Convert model
|
||
|
|
||
|
```bash
|
||
|
export MODEL_CONFIG=/path/to/mmclassification/configs/resnet/resnet18_8xb32_in1k.py
|
||
|
export MODEL_PATH=https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_8xb32_in1k_20210831-fbbb1da6.pth
|
||
|
|
||
|
# Convert the model
|
||
|
cd /path/to/mmdeploy
|
||
|
python tools/deploy.py \
|
||
|
configs/mmcls/classification_ncnn_static.py \
|
||
|
$MODEL_CONFIG \
|
||
|
$MODEL_PATH \
|
||
|
tests/data/tiger.jpeg \
|
||
|
--work-dir resnet18 \
|
||
|
--device cpu \
|
||
|
--dump-info
|
||
|
```
|
||
|
|
||
|
## 2. Model deployment
|
||
|
|
||
|
a) Download the compiler toolchain and set environment
|
||
|
|
||
|
```bash
|
||
|
# download Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6-20220516.tar.gz
|
||
|
# https://occ.t-head.cn/community/download?id=4046947553902661632
|
||
|
tar xf Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6-20220516.tar.gz
|
||
|
export RISCV_ROOT_PATH=`realpath Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6`
|
||
|
```
|
||
|
|
||
|
b) Compile ncnn & opencv
|
||
|
|
||
|
```bash
|
||
|
# ncnn
|
||
|
# refer to https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-allwinner-d1
|
||
|
|
||
|
# opencv
|
||
|
git clone https://github.com/opencv/opencv.git
|
||
|
mkdir build_riscv && cd build_riscv
|
||
|
cmake .. \
|
||
|
-DCMAKE_TOOLCHAIN_FILE=/path/to/mmdeploy/cmake/toolchains/riscv64-unknown-linux-gnu.cmake \
|
||
|
-DCMAKE_INSTALL_PREFIX=install \
|
||
|
-DBUILD_PERF_TESTS=OFF \
|
||
|
-DBUILD_SHARED_LIBS=OFF \
|
||
|
-DBUILD_TESTS=OFF \
|
||
|
-DCMAKE_BUILD_TYPE=Release
|
||
|
make -j$(nproc) && make install
|
||
|
```
|
||
|
|
||
|
c) Compile mmdeploy SDK & demo
|
||
|
|
||
|
```bash
|
||
|
cd /path/to/mmdeploy
|
||
|
mkdir build_riscv && cd build_riscv
|
||
|
cmake .. \
|
||
|
-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/riscv64-unknown-linux-gnu.cmake \
|
||
|
-DMMDEPLOY_BUILD_SDK=ON \
|
||
|
-DMMDEPLOY_SHARED_LIBS=OFF \
|
||
|
-DMMDEPLOY_BUILD_EXAMPLES=ON \
|
||
|
-DMMDEPLOY_TARGET_DEVICES="cpu" \
|
||
|
-DMMDEPLOY_TARGET_BACKENDS="ncnn" \
|
||
|
-Dncnn_DIR=${ncnn_DIR}/build-c906/install/lib/cmake/ncnn/ \
|
||
|
-DMMDEPLOY_CODEBASES=all \
|
||
|
-DOpenCV_DIR=${OpenCV_DIR}/build_riscv/install/lib/cmake/opencv4
|
||
|
|
||
|
make -j$(nproc) && make install
|
||
|
```
|
||
|
|
||
|
After `make install`, the examples will locate in `install\bin`
|
||
|
|
||
|
```
|
||
|
tree -L 1 install/bin/
|
||
|
.
|
||
|
├── image_classification
|
||
|
├── image_restorer
|
||
|
├── image_segmentation
|
||
|
├── object_detection
|
||
|
├── ocr
|
||
|
├── pose_detection
|
||
|
└── rotated_object_detection
|
||
|
```
|
||
|
|
||
|
### 4) Run the demo
|
||
|
|
||
|
First make sure that `--dump-info` is used during convert model, so that the `resnet18` directory has the files required by the SDK such as `pipeline.json`.
|
||
|
|
||
|
Copy the model folder(resnet18), executable(image_classification) file and test image(tests/data/tiger.jpeg) to the device.
|
||
|
|
||
|
```bash
|
||
|
./image_classification cpu ./resnet18 tiger.jpeg
|
||
|
```
|