Skip to content

Commit 35aed5a

Browse files
committed
add convert cmd test
1 parent 1d72f6c commit 35aed5a

6 files changed

Lines changed: 110 additions & 12 deletions

File tree

.github/workflows/ci.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,15 @@ jobs:
5151
- uses: actions/checkout@v2
5252
- name: test tflite
5353
run: ./ci/pytest_tflite.sh
54+
55+
test-convert-cmd:
56+
runs-on: ubuntu-latest
57+
container:
58+
image: enginesh233/mgeconvert_ci:v1.1
59+
defaults:
60+
run:
61+
shell: bash
62+
steps:
63+
- uses: actions/checkout@v2
64+
- name: test convert cmd
65+
run: ./ci/test_convert_cmd.sh

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ python3 -m pip install git+https://github.com/MegEngine/mgeconvert.git@v0.4.2 --
7575
> :warning: 如果需要转换``TracedModule``模型,请安装0.5.0以上版本
7676
7777

78-
- ``--targets`` 的可选值有 ``caffe````onnx````tflite``,可选值支持组合传入,比如 ``--targets=caffe,tflite``
78+
- ``--targets`` 的可选值有 ``caffe````onnx````tflite```all`
79+
80+
`all` 代表安装全部转换器。可选值支持组合传入,比如 ``--targets=caffe,tflite``
7981

8082
- ``tflite`` 转换器的schema默认使用r2.3版本,支持使用参数 ``tfversion`` 选择tflite schema的版本, 例如:
8183

@@ -190,10 +192,10 @@ convert tracedmodule_to_tflite -i tracedmodule.tm -o out.tflite --quantize_file_
190192
convert tracedmodule_to_tflite -i tracedmodule.tm -o out.tflite --quantize_file_path quant_params.json --param_fake_quant
191193
```
192194

193-
- 如果QAT模型中没有QuantStub对输入数据进行量化处理,可以在转换时指定输入数据的量化类型、scale和zero_point量化参数
195+
- 如果QAT模型中没有QuantStub对输入数据进行量化处理,可以在转换时指定输入数据的量化类型、scale和zero_point量化参数,如果有多个scale、zero point用逗号隔开
194196

195197
```bash
196-
convert tracedmodule_to_tflite -i tracedmodule.tm -o out.tflite --input_data_type quint8 --input_scales 0.125 --input_zero_points 128 --require_quantize
198+
convert tracedmodule_to_tflite -i tracedmodule.tm -o out.tflite --input_data_type quint8 --input_scales 0.125,0.125 --input_zero_points 128,128 --require_quantize
197199
```
198200

199201
#### onnx模型转换
@@ -212,7 +214,7 @@ convert tracedmodule_to_onnx -i tracedmodule.tm -o out.onnx
212214

213215
### 2. python接口使用
214216

215-
可参考wiki中的例子
217+
可参考[wiki](https://github.com/MegEngine/mgeconvert/wiki/Mgeconvert-Python-Api-Doc)中的例子
216218

217219
## 常见问题说明
218220

bin/convert

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,11 @@ def init(subparsers):
196196
)
197197

198198
p.add_argument(
199-
"--input_scales", default=None, nargs="+", type=float,
199+
"--input_scales", default=None, nargs="+", type=str,
200200
)
201201

202202
p.add_argument(
203-
"--input_zero_points", default=None, nargs="+", type=int,
203+
"--input_zero_points", default=None, nargs="+", type=str,
204204
)
205205

206206
p.add_argument(
@@ -313,11 +313,11 @@ def init(subparsers):
313313
)
314314

315315
p.add_argument(
316-
"--input_scales", default=None, nargs="+", type=float,
316+
"--input_scales", default=None, nargs="+", type=str,
317317
)
318318

319319
p.add_argument(
320-
"--input_zero_points", default=None, nargs="+", type=int,
320+
"--input_zero_points", default=None, nargs="+", type=str,
321321
)
322322

323323
p.add_argument(
@@ -347,7 +347,7 @@ def init(subparsers):
347347
def to_tflite(args):
348348
if "tracedmodule" in target:
349349
mgeconvert.tracedmodule_to_tflite(
350-
mge_fpath=args.input,
350+
args.input,
351351
output=args.output,
352352
input_data_type=args.input_data_type,
353353
input_scales=args.input_scales,
@@ -361,7 +361,7 @@ def init(subparsers):
361361
)
362362
else:
363363
mgeconvert.mge_to_tflite(
364-
mge_fpath=args.input,
364+
args.input,
365365
output=args.output,
366366
graph_name=args.graph_name,
367367
mtk=args.mtk,
@@ -395,13 +395,13 @@ def init(subparsers):
395395
p.add_argument(
396396
"--input_scales",
397397
default=None,
398-
type=Union[float, List[float]],
398+
type=str,
399399
help="the scale of input data used for quantize model input",
400400
)
401401
p.add_argument(
402402
"--input_zero_points",
403403
default=None,
404-
type=Union[int, List[int]],
404+
type=str,
405405
help="the zero point of input data used for quantize model input",
406406
)
407407
p.add_argument(

ci/test_convert_cmd.sh

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/bin/bash -e
2+
3+
set -e
4+
5+
python3 -m pip install -q -r ci/requires-test.txt
6+
7+
apt install -y protobuf-compiler
8+
9+
pip3 install . --user --install-option="--targets=all"
10+
11+
export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH:
12+
13+
sudo python3 -m pip uninstall flatbuffers -y
14+
sudo python3 -m pip install tensorflow==2.5.0
15+
sudo -H python3 -m pip install -q megengine==1.6.0 -f https://megengine.org.cn/whl/mge.html
16+
pip3 install scikit-image==0.17.2
17+
18+
19+
python3 test/gen_models.py
20+
21+
python3 bin/convert tracedmodule_to_tflite -i float_model.tm -o out.tflite
22+
python3 bin/convert mge_to_tflite -i float_model.mge -o out.tflite
23+
24+
python3 bin/convert tracedmodule_to_tflite -i qat_model.tm -o out.tflite --require_quantize
25+
python3 bin/convert tracedmodule_to_tflite -i qat_model.tm -o out.tflite --quantize_file_path quant_params.json
26+
python3 bin/convert tracedmodule_to_tflite -i qat_model.tm -o out.tflite --quantize_file_path quant_params.json --param_fake_quant
27+
python3 bin/convert tracedmodule_to_tflite -i qat_model.tm -o out.tflite --input_data_type quint8 --input_scales 0.125 --input_zero_points 128 --require_quantize
28+
29+
30+
export USE_CAFFE_PROTO=1
31+
python3 bin/convert tracedmodule_to_caffe -i float_model.tm -c out.prototxt -b out.caffemodel
32+
python3 bin/convert mge_to_caffe -i float_model.mge -c out.prototxt -b out.caffemodel
33+
34+
python3 bin/convert tracedmodule_to_caffe -i qat_model.tm -c out.prototxt -b out.caffemodel --quantize_file_path quant_params.json
35+
python3 bin/convert tracedmodule_to_caffe -i qat_model.tm -c out.prototxt -b out.caffemodel --quantize_file_path quant_params.json --param_fake_quant
36+
python3 bin/convert tracedmodule_to_caffe -i qat_model.tm -c out.prototxt -b out.caffemodel --quantize_file_path quant_params.json --input_data_type quint8 --input_scales 0.125 --input_zero_points 128
37+
38+
39+
python3 bin/convert tracedmodule_to_onnx -i float_model.tm -o out.onnx
40+
python3 bin/convert mge_to_onnx -i float_model.mge -o out.onnx

mgeconvert/frontend/tm_to_ir/tm_utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,32 @@ def _update_inputs_qparams(
101101
)
102102
traced_module.graph.inputs[i + 1].qparams.dtype_meta = q_dtype_meta
103103
if input_scales is not None:
104+
if isinstance(input_scales, str):
105+
str_scales = input_scales.split(",")
106+
input_scales = []
107+
try:
108+
for s in str_scales:
109+
input_scales.append(float(s))
110+
except:
111+
raise ValueError(
112+
"input scales({}) do not in correct format.".format(str_scales)
113+
)
104114
if not isinstance(input_scales, Sequence):
105115
input_scales = (input_scales,)
106116
for i in range(len(traced_module.graph.inputs[1:])):
107117
scale = input_scales[i] if i < len(input_scales) else input_scales[-1]
108118
traced_module.graph.inputs[i + 1].qparams.scale = Tensor(float(scale))
109119
if input_zero_points is not None:
120+
if isinstance(input_zero_points, str):
121+
str_zp = input_zero_points.split(",")
122+
input_zero_points = []
123+
try:
124+
for zp in str_zp:
125+
input_zero_points.append(float(zp))
126+
except:
127+
raise ValueError(
128+
"input zero points({}) do not in correct format.".format(str_zp)
129+
)
110130
if not isinstance(input_zero_points, Sequence):
111131
input_zero_points = (input_zero_points,)
112132
for i in range(len(traced_module.graph.inputs[1:])):

test/gen_models.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from test.utils import ConvOpr, dump_mge_model
2+
3+
import megengine as mge
4+
import numpy as np
5+
from megengine.core.tensor import dtype
6+
from megengine.quantization.quantize import quantize_qat
7+
from megengine.traced_module import trace_module
8+
9+
if __name__ == "__main__":
10+
net = ConvOpr("normal")
11+
traced_module = trace_module(net, mge.tensor(net.data))
12+
mge.save(traced_module, "float_model.tm")
13+
dump_mge_model(net, net.data, "float_model")
14+
15+
qat_net = quantize_qat(net)
16+
inp_dtype = dtype.qint8(16.0 / 128)
17+
data = mge.tensor(np.random.random((1, 3, 224, 224))) * 16
18+
data = data.astype(inp_dtype)
19+
inp = mge.tensor(dtype.convert_from_qint8(data.numpy()))
20+
inp.qparams.scale = mge.tensor(dtype.get_scale(inp_dtype))
21+
inp.qparams.dtype_meta = dtype._builtin_quant_dtypes["qint8"]
22+
23+
qat_module = trace_module(qat_net, inp)
24+
mge.save(qat_module, "qat_model.tm")

0 commit comments

Comments
 (0)