Skip to content

Commit d04c8dc

Browse files
tpoisonooogrimoire
andauthored
refactor(onnx2ncnn): add test case and simplify code (open-mmlab#436)
* refactor(onnx2ncnn.cpp): split it to shape_inference, pass and utils * refactor(onnx2ncnn.cpp): split it to shape_inference, pass and utils * refactor(onnx2ncnn.cpp): split code * refactor(net_module.cpp): fix build error * ci(test_onnx2ncnn.py): add generate model adn run * ci(onnx2ncnn): add ncnn backend * ci(test_onnx2ncnn): add converted onnx model` * ci(onnx2ncnn): fix ncnn tar * ci(backed-ncnn): simplify dependency install * ci(onnx2ncnn): fix apt install * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * Update backend-ncnn.yml * fix(ci): add include algorithm * Update build.yml * parent aa85760 author q.yao <[email protected]> 1651287879 +0800 committer tpoisonooo <[email protected]> 1652169959 +0800 [Fix] Fix ci (open-mmlab#426) * fix ci * add nvidia key * remote torch * recover pytorch refactor(onnx2ncnn.cpp): split it to shape_inference, pass and utils * fix(onnx2ncnn): review * fix(onnx2ncnn): build error Co-authored-by: q.yao <[email protected]>
1 parent 6eb83a9 commit d04c8dc

File tree

11 files changed

+3257
-2931
lines changed

11 files changed

+3257
-2931
lines changed

.github/scripts/test_onnx2ncnn.py

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# Copyright (c) OpenMMLab. All rights reserved.
2+
3+
import argparse
4+
import os
5+
import subprocess
6+
7+
# list of tuple: config, pretrained model, onnx filename
8+
CONFIGS = [
9+
(
10+
'mmclassification/configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py', # noqa: E501
11+
'https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p32_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-9cea8599.pth', # noqa: E501
12+
'vit.onnx'),
13+
(
14+
'mmclassification/configs/resnet/resnet50_8xb32_in1k.py',
15+
'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth', # noqa: E501
16+
'resnet50.onnx',
17+
),
18+
(
19+
'mmclassification/configs/resnet/resnet18_8xb32_in1k.py',
20+
'https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_8xb32_in1k_20210831-fbbb1da6.pth', # noqa: E501
21+
'resnet18.onnx',
22+
'https://media.githubusercontent.com/media/tpoisonooo/mmdeploy-onnx2ncnn-testdata/main/resnet18.onnx', # noqa: E501
23+
),
24+
(
25+
'mmclassification/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py',
26+
'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth', # noqa: E501
27+
'mobilenet-v2.onnx',
28+
'https://media.githubusercontent.com/media/tpoisonooo/mmdeploy-onnx2ncnn-testdata/main/mobilenet-v2.onnx', # noqa: E501
29+
)
30+
]
31+
32+
33+
def parse_args():
34+
parser = argparse.ArgumentParser(
35+
description='MMDeploy onnx2ncnn test tool.')
36+
parser.add_argument('--run', type=bool, help='Execute onnx2ncnn bin.')
37+
parser.add_argument(
38+
'--repo-dir', type=str, default='~/', help='mmcls directory.')
39+
parser.add_argument(
40+
'--out',
41+
type=str,
42+
default='onnx_output',
43+
help='onnx model output directory.')
44+
parser.add_argument(
45+
'--generate-onnx', type=bool, help='Generate onnx model.')
46+
args = parser.parse_args()
47+
return args
48+
49+
50+
def generate_onnx(args):
51+
import mmcv
52+
mmcv.mkdir_or_exist(args.out)
53+
for conf in CONFIGS:
54+
config = os.path.join(args.repo_dir, conf[0])
55+
model = conf[1]
56+
convert_cmd = [
57+
'python3', 'tools/deploy.py',
58+
'configs/mmcls/classification_ncnn_static.py', config, model,
59+
'cat-dog.png', '--work-dir', 'work_dir', '--device', 'cpu'
60+
]
61+
print(subprocess.call(convert_cmd))
62+
63+
move_cmd = [
64+
'mv', 'work_dir/end2end.onnx',
65+
os.path.join(args.out, conf[2])
66+
]
67+
print(subprocess.call(move_cmd))
68+
69+
70+
def run(args):
71+
for conf in CONFIGS:
72+
if len(conf) < 4:
73+
continue
74+
download_url = conf[3]
75+
filename = conf[2]
76+
download_cmd = ['wget', download_url]
77+
# show processbar
78+
os.system(' '.join(download_cmd))
79+
80+
convert_cmd = ['./onnx2ncnn', filename, 'onnx.param', 'onnx.bin']
81+
subprocess.run(convert_cmd, capture_output=True, check=True)
82+
83+
84+
def main():
85+
"""test `onnx2ncnn.cpp`
86+
87+
First generate onnx model then convert it with `onnx2ncnn`.
88+
"""
89+
args = parse_args()
90+
if args.generate_onnx:
91+
generate_onnx(args)
92+
if args.run:
93+
run(args)
94+
95+
96+
if __name__ == '__main__':
97+
main()

.github/workflows/backend-ncnn.yml

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
name: backend
2+
3+
on:
4+
push:
5+
paths-ignore:
6+
- "demo/**"
7+
- "tools/**"
8+
9+
pull_request:
10+
paths-ignore:
11+
- "demo/**"
12+
- "tools/**"
13+
- "docs/**"
14+
15+
concurrency:
16+
group: ${{ github.workflow }}-${{ github.ref }}
17+
cancel-in-progress: true
18+
19+
jobs:
20+
test_onnx2ncnn:
21+
runs-on: ubuntu-18.04
22+
strategy:
23+
matrix:
24+
python-version: [3.7]
25+
torch: [1.9.0]
26+
mmcv: [1.4.2]
27+
include:
28+
- torch: 1.9.0
29+
torch_version: torch1.9
30+
torchvision: 0.10.0
31+
steps:
32+
- name: Checkout repository
33+
uses: actions/checkout@v3
34+
with:
35+
submodules: 'recursive'
36+
- name: Set up Python ${{ matrix.python-version }}
37+
uses: actions/setup-python@v2
38+
with:
39+
python-version: ${{ matrix.python-version }}
40+
- name: Install unittest dependencies
41+
run: |
42+
pip install cmake onnx
43+
- name: update
44+
run: sudo apt update
45+
- name: gcc-multilib
46+
run: sudo apt install gcc-multilib g++-multilib wget libprotobuf-dev protobuf-compiler
47+
- name: Install ncnn
48+
run: |
49+
wget https://github.com/Tencent/ncnn/archive/refs/tags/20220420.tar.gz
50+
tar xf 20220420.tar.gz
51+
pushd ncnn-20220420
52+
mkdir build && pushd build
53+
cmake -DCMAKE_INSTALL_PREFIX=$(pwd)/../install -DNCNN_BUILD_TESTS=OFF -DNCNN_BUILD_TOOLS=OFF -DNCNN_BUILD_EXAMPLES=OFF ..
54+
cmake --build . -j2
55+
make install
56+
popd && popd
57+
- name: Install mmdeploy with ncnn backend
58+
run: |
59+
mkdir -p build && pushd build
60+
export LD_LIBRARY_PATH=/home/runner/work/mmdeploy/mmdeploy/ncnn-20220420/install/lib/:$LD_LIBRARY_PATH
61+
cmake -DMMDEPLOY_TARGET_BACKENDS=ncnn -Dncnn_DIR=/home/runner/work/mmdeploy/mmdeploy/ncnn-20220420/install/lib/cmake/ncnn/ ..
62+
make onnx2ncnn -j2
63+
popd
64+
- name: Test onnx2ncnn
65+
run: |
66+
echo $(pwd)
67+
ln -s build/bin/onnx2ncnn ./
68+
python3 .github/scripts/test_onnx2ncnn.py --run 1

.github/workflows/build.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,4 @@ jobs:
152152
env_vars: OS,PYTHON
153153
name: codecov-umbrella
154154
fail_ci_if_error: false
155-
gcov_ignore : [".github/scripts/doc_link_checker.py"]
155+
gcov_ignore : [".github/scripts/*"]

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ endif ()
55
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
66

77
cmake_minimum_required(VERSION 3.14)
8-
project(MMDeploy VERSION 0.1.0)
8+
project(MMDeploy VERSION 0.5.0)
99

1010
set(CMAKE_CXX_STANDARD 17)
1111

csrc/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ find_package(Protobuf)
77
if (PROTOBUF_FOUND)
88
protobuf_generate_cpp(ONNX_PROTO_SRCS ONNX_PROTO_HDRS
99
${CMAKE_CURRENT_SOURCE_DIR}/onnx.proto)
10-
add_executable(onnx2ncnn onnx2ncnn.cpp ${ONNX_PROTO_SRCS} ${ONNX_PROTO_HDRS})
10+
add_executable(onnx2ncnn onnx2ncnn.cpp fuse_pass.cpp shape_inference.cpp ${ONNX_PROTO_SRCS} ${ONNX_PROTO_HDRS})
1111
target_include_directories(onnx2ncnn PRIVATE ${PROTOBUF_INCLUDE_DIR}
1212
${CMAKE_CURRENT_BINARY_DIR})
1313
target_link_libraries(onnx2ncnn PRIVATE ${PROTOBUF_LIBRARIES})

0 commit comments

Comments
 (0)