Open11

Float32 ONNX のダイナミックレンジINT8量子化コードスニペット

PINTOPINTO
quantization_test_qint8.py
import onnx
from onnxruntime.quantization import quantize_dynamic, QuantType

model_fp32 = 'iat_llie_360x640.onnx'
model_quant = 'iat_llie_360x640_int8.onnx'
quantized_model = quantize_dynamic(
    model_fp32,
    model_quant,
    weight_type=QuantType.QInt8,
)

PINTOPINTO
sit4onnx --input_onnx_file_path iat_llie_360x640_int8.onnx
Traceback (most recent call last):
  File "/usr/local/bin/sit4onnx", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.8/dist-packages/sit4onnx/onnx_inference_test.py", line 467, in main
    final_results = inference(
  File "/usr/local/lib/python3.8/dist-packages/sit4onnx/onnx_inference_test.py", line 227, in inference
    onnx_session = onnxruntime.InferenceSession(
  File "/usr/local/lib/python3.8/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 344, in __init__
    self._create_inference_session(providers, provider_options, disabled_optimizers)
  File "/usr/local/lib/python3.8/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 392, in _create_inference_session
    sess.initialize_session(providers, provider_options, disabled_optimizers)
onnxruntime.capi.onnxruntime_pybind11_state.NotImplemented: [ONNXRuntimeError] : 9 : NOT_IMPLEMENTED : Could not find an implementation for ConvInteger(10) node with name 'Conv_531_quant'
Segmentation fault (core dumped)

https://github.com/microsoft/onnxruntime/issues/3130

PINTOPINTO
quantization_test_quint8.py
import onnx
from onnxruntime.quantization import quantize_dynamic, QuantType

model_fp32 = 'iat_llie_360x640.onnx'
model_quant = 'iat_llie_360x640_uint8.onnx'
quantized_model = quantize_dynamic(
    model_fp32,
    model_quant,
    weight_type=QuantType.QUInt8,
)

PINTOPINTO
sit4onnx --input_onnx_file_path iat_llie_360x640_uint8.onnx
INFO: file: iat_llie_360x640_uint8.onnx
INFO: providers: ['TensorrtExecutionProvider', 'CPUExecutionProvider']
INFO: input_name.1: input shape: [1, 3, 360, 640] dtype: float32
INFO: test_loop_count: 10
INFO: total elapsed time:  3142.5652503967285 ms
INFO: avg elapsed time per pred:  314.25652503967285 ms
INFO: output_name.1: output shape: [1, 3, 360, 640] dtype: float32
PINTOPINTO
sit4onnx --input_onnx_file_path iat_llie_360x640.onnx
INFO: file: iat_llie_360x640.onnx
INFO: providers: ['TensorrtExecutionProvider', 'CPUExecutionProvider']
INFO: input_name.1: input shape: [1, 3, 360, 640] dtype: float32
INFO: test_loop_count: 10
INFO: total elapsed time:  78.59992980957031 ms
INFO: avg elapsed time per pred:  7.85999298095703 ms
INFO: output_name.1: output shape: [1, 3, 360, 640] dtype: float32
PINTOPINTO
sit4onnx --input_onnx_file_path iat_llie_360x640.onnx --onnx_execution_provider cpu
INFO: file: iat_llie_360x640.onnx
INFO: providers: ['CPUExecutionProvider']
INFO: input_name.1: input shape: [1, 3, 360, 640] dtype: float32
INFO: test_loop_count: 10
INFO: total elapsed time:  16099.872827529907 ms
INFO: avg elapsed time per pred:  1609.9872827529907 ms
INFO: output_name.1: output shape: [1, 3, 360, 640] dtype: float32
sit4onnx --input_onnx_file_path iat_llie_360x640_uint8.onnx --onnx_execution_provider cpu
INFO: file: iat_llie_360x640_uint8.onnx
INFO: providers: ['CPUExecutionProvider']
INFO: input_name.1: input shape: [1, 3, 360, 640] dtype: float32
INFO: test_loop_count: 10
INFO: total elapsed time:  11141.325950622559 ms
INFO: avg elapsed time per pred:  1114.1325950622559 ms
INFO: output_name.1: output shape: [1, 3, 360, 640] dtype: float32
4848

Windows上でGen.11 CPUおよびZen3では高速化の効果が確認できませんでした。
onnx-1.13.1, onnxruntime-1.14.1
TensorRTを使う場合はTensorRTに量子化をさせないと駄目ですね。

PINTOPINTO

すでにこのスクラップを書いてから半年以上経過していますので情報が陳腐化している部分があります。
onnxruntime-1.14.1 を使用して試されているのであれば、

sit4onnx \
--if xxxx.onnx \
--oep cpu \
--intra_op_num_threads {物理コア数 x 2 - 1 の値}

を試してみると面白いかもしれません。私の Intel Gen.10 CPU では 30% 高速化しました。--intra_op_num_threads オプションは CPU のみに対応しています。あと、onnxruntime 自体がそもそも Ryzen に最適化されているのかを知りません。コメントの内容からではどこまでを試されているのかが分かりませんが、私はいつも自分の環境に onnxruntime 自体を最適化するために onnxruntime 自体をビルドしています。ちなみに、TensorRT Execution Provider を使用する場合にバックエンドでコールされる量子化ツールは trtexec で、onnxruntimeから実行する場合も TensorRT でダイレクトに実行する場合も同じだったような気がしています。(詳細に見ていませんがなんとなくの想定コメントです)

https://onnxruntime.ai/docs/build/eps.html

https://onnxruntime.ai/docs/build/custom.html