Почему серверная часть процессора Qualcomm QNN x86_64 в 88 раз медленнее, чем onnxruntime?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему серверная часть процессора Qualcomm QNN x86_64 в 88 раз медленнее, чем onnxruntime?

Сообщение Anonymous »

Я новичок в SDK Qualcomm AI Engine Direct (QNN). Прежде чем перейти непосредственно к развертыванию моделей искусственного интеллекта на устройстве Qualcomm, я хотел бы взглянуть на серверную часть QNN x86_64, которая также имеет отношение к процедуре квантования QNN.
Однако я обнаружил, что Бэкэнд процессора 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

Мы видим, что Backend (GRAPH_EXECUTE): 1803294 us. Однако запустите тот же onnx от поставщика ЦП ONNXRuntime

Код: Выделить всё

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
Итак, мне интересно, почему серверная часть процессора QNN x86_64 значительно медленнее, чем onnxruntime (1803,294 мс против 21,91 мс)?
Любая помощь оценен.
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
Это медленное время выполнения соответствует приведенному выше для QNN.
  • Я также проверил это при компиляции сгенерированного файл модели cpp в файл .so, -O3 добавляется в CXX_FLAGS в Makefile.linux-x86_64 во временной папке, созданной qnn-model-lib-generator.


Подробнее здесь: https://stackoverflow.com/questions/790 ... nnxruntime
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему серверная часть процессора Qualcomm QNN x86_64 в 88 раз медленнее, чем onnxruntime?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Почему серверная часть процессора Qualcomm QNN x86_64 в 88 раз медленнее, чем onnxruntime?
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Почему серверная часть процессора Qualcomm QNN x86_64 в 88 раз медленнее, чем onnxruntime?
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Onnxruntime::qnn::QnnModel::ParseGraphInputOrOutput Динамическая форма пока не поддерживается, для вывода: /model.12/Con
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Chromadb onnxruntime — Onnxruntime не найден
    Anonymous » » в форуме Python
    0 Ответы
    44 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»