From 289f7dbcdd70c201e6fd4fe0aa184b82c04945e9 Mon Sep 17 00:00:00 2001 From: George Wu Date: Fri, 3 Mar 2023 07:26:53 -0800 Subject: [PATCH] enable pybind for qnn ep (#14897) enable python bindings for QNN EP. tested on Windows Dev Kit 2023 (ARM64) with python 3.11 (ARM64) from https://www.python.org/ftp/python/3.11.1/python-3.11.1-arm64.exe --- cmake/onnxruntime_python.cmake | 1 + onnxruntime/core/providers/get_execution_providers.cc | 8 ++++++++ onnxruntime/python/onnxruntime_pybind_state.cc | 6 ++++++ setup.py | 2 ++ tools/ci_build/build.py | 4 ++++ 5 files changed, 21 insertions(+) diff --git a/cmake/onnxruntime_python.cmake b/cmake/onnxruntime_python.cmake index c24b6b9be5..2788d326b9 100644 --- a/cmake/onnxruntime_python.cmake +++ b/cmake/onnxruntime_python.cmake @@ -212,6 +212,7 @@ target_link_libraries(onnxruntime_pybind11_state PRIVATE ${PROVIDERS_ARMNN} ${PROVIDERS_XNNPACK} ${PROVIDERS_AZURE} + ${PROVIDERS_QNN} onnxruntime_optimizer onnxruntime_providers onnxruntime_util diff --git a/onnxruntime/core/providers/get_execution_providers.cc b/onnxruntime/core/providers/get_execution_providers.cc index be29c32f68..8a44bd4d8c 100644 --- a/onnxruntime/core/providers/get_execution_providers.cc +++ b/onnxruntime/core/providers/get_execution_providers.cc @@ -82,6 +82,14 @@ constexpr ProviderInfo kProvidersInPriorityOrder[] = true, #else false, +#endif + }, + { + kQnnExecutionProvider, +#ifdef USE_QNN + true, +#else + false, #endif }, { diff --git a/onnxruntime/python/onnxruntime_pybind_state.cc b/onnxruntime/python/onnxruntime_pybind_state.cc index 8c1ebf9cf2..2055d1d707 100644 --- a/onnxruntime/python/onnxruntime_pybind_state.cc +++ b/onnxruntime/python/onnxruntime_pybind_state.cc @@ -758,6 +758,12 @@ std::unique_ptr CreateExecutionProviderInstance( } else if (type == kAzureExecutionProvider) { #ifdef USE_AZURE return onnxruntime::AzureProviderFactoryCreator::Create({})->CreateProvider(); +#endif + } else if (type == kQnnExecutionProvider) { +#ifdef USE_QNN + auto cit = provider_options_map.find(type); + return onnxruntime::QNNProviderFactoryCreator::Create( + cit == provider_options_map.end() ? ProviderOptions{} : cit->second)->CreateProvider(); #endif } else { // check whether it is a dynamic load EP: diff --git a/setup.py b/setup.py index 294b975a56..8a90b95e1f 100644 --- a/setup.py +++ b/setup.py @@ -82,6 +82,8 @@ elif parse_arg_remove_boolean(sys.argv, "--use_cann"): package_name = "onnxruntime-cann" elif parse_arg_remove_boolean(sys.argv, "--use_azure"): package_name = "onnxruntime-azure" +elif parse_arg_remove_boolean(sys.argv, "--use_qnn"): + package_name = "onnxruntime-qnn" # PEP 513 defined manylinux1_x86_64 and manylinux1_i686 # PEP 571 defined manylinux2010_x86_64 and manylinux2010_i686 diff --git a/tools/ci_build/build.py b/tools/ci_build/build.py index aa8d2c300b..7617a8afad 100644 --- a/tools/ci_build/build.py +++ b/tools/ci_build/build.py @@ -1950,6 +1950,7 @@ def build_python_wheel( use_dml, use_cann, use_azure, + use_qnn, wheel_name_suffix, enable_training, nightly_build=False, @@ -2010,6 +2011,8 @@ def build_python_wheel( args.append("--use_cann") elif use_azure: args.append("--use_azure") + elif use_qnn: + args.append("--use_qnn") run_subprocess(args, cwd=cwd) @@ -2705,6 +2708,7 @@ def main(): args.use_dml, args.use_cann, args.use_azure, + args.use_qnn, args.wheel_name_suffix, args.enable_training, nightly_build=nightly_build,