Однако я обнаружил, что Бэкэнд процессора Qualcomm QNN x86_64 88x работает медленнее, чем onnxruntime для inception_v3.
Вот шаги, которые помогут воспроизвести проблему:
- Настройте QNN SDK по инструкции Qualcomm.
- Загрузите модель и конвертируйте в ONNX< /p>
Код: Выделить всё
import torch
# Source of model: https://pytorch.org/hub/pytorch_vision_inception_v3/
model = torch.hub.load("pytorch/vision:v0.10.0", "inception_v3", pretrained=True)
model.eval()
x = torch.rand(1, 3, 299, 299)
torch.onnx.export(model, x, "inception_v3.onnx", opset_version=17)
- Преобразуйте модель в файл QNN cpp
Код: Выделить всё
${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-onnx-converter \
--input_network inception_v3.onnx \
--input_dim 'x.1' 1,3,299,299 \
--out_node '914' \
--output_path inception_v3.cpp
- Компилировать
Код: Выделить всё
mkdir -p model_libs
${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-model-lib-generator \
-c inception_v3.cpp \
-b inception_v3.bin \
-t x86_64-linux-clang \
-o model_libs
- Сгенерируйте входные данные модели
Код: Выделить всё
import numpy as np
np.random.rand(3, 299, 299).astype(np.float32).tofile("input.raw")
# see rest in Ref: https://github.com/quic/ai-hub-models/issues/17
Код: Выделить всё
echo input.raw > input.txt
- Запустите модель с профилированием
Код: Выделить всё
${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-net-run \
--backend ${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnCpu.so \
--model model_libs/x86_64-linux-clang/libinception_v3.so \
--input_list input.txt \
--profiling_level=basic \
--keep_num_outputs=0 \
--num_inferences=10
Код: Выделить всё
${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-profile-viewer --input_log output/qnn-profiling-data_0.log
Код: Выделить всё
Input Log File Location: output/qnn-profiling-data_0.log
Log File Created: Thu Sep 26 08:49:41 2024
Time Scale: 1e-06
Epoch Timestamp: 1727340581547093 Steady Clock Timestamp: 1380276319731
Generated using:
qnn-profile-viewer v2.26.0.240827110523_99241
qnn-net-run v2.26.0.240827110523_99241
Backend v2.26.0.240827110523_99241
Qnn Init/Prepare/Finalize/De-Init/Execute/Lib-Load Statistics:
------------------------------------------------------------
Init Stats:
-----------
NetRun: 171679 us
Compose Graphs Stats:
--------------
NetRun: 95902 us
Finalize Stats:
---------------
Graph 0 (inception_v3):
NetRun: 75775 us
Backend (GRAPH_FINALIZE): 75769 us
De-Init Stats:
--------------
NetRun: 20778 us
Backend (null): 0 us
Execute Stats (Overall):
------------------------
NetRun IPS (includes IO and misc. time): 0.5542 inf/sec
Execute Stats (Average):
------------------------
Total Inference Time:
---------------------
Graph 0 (inception_v3):
NetRun: 1803480 us
Backend (GRAPH_EXECUTE): 1803294 us
Execute Stats (Min):
------------------------
Total Inference Time:
---------------------
Graph 0 (inception_v3):
NetRun: 1754020 us
Backend (GRAPH_EXECUTE): 1753902 us
Execute Stats (Max):
------------------------
Total Inference Time:
---------------------
Graph 0 (inception_v3):
NetRun: 1895948 us
Backend (GRAPH_EXECUTE): 1895815 us
Код: Выделить всё
import numpy as np
import onnxruntime
x = np.random.rand(1, 3, 299, 299).astype(np.float32)
session = onnxruntime.InferenceSession(
"inception_v3.onnx", providers=["CPUExecutionProvider"]
)
outputs = session.run(["914"], input_feed={"x.1": x})
import time
N = 100
t1 = time.time()
for _ in range(N):
outputs = session.run(["914"], input_feed={"x.1": x})
t2 = time.time()
print(f"average inference time = {(t2 - t1)/N*1000} miliseconds")
Код: Выделить всё
average inference time = 21.910243034362793 miliseconds
Любая помощь оценен.
PS
- Версия QNN: 2.26.0.240828
- Хост: x86_64 Ubuntu 22.04
- Я проверил сеть inception_v3, преобразованную из тензорного потока, как в руководстве Qualcomm QNN. Результат тот же.
- Также заметил лог квантования модели:
Код: Выделить всё
62.1ms [ INFO ] [QNN_CPU] QnnGraph execute start
2086.4ms [ INFO ] [QNN_CPU] QnnGraph execute end
- Я также проверил это при компиляции сгенерированного файла модели cpp в файл .so, -O3 добавляется в CXX_FLAGS в Makefile.linux-x86_64 во временной папке, созданной qnn-model-lib-generator.
Подробнее здесь: https://stackoverflow.com/questions/790 ... nnxruntime