From a3b466cdf1fefdc9097d008f69fd6a9ceeed84ab Mon Sep 17 00:00:00 2001 From: George Wu Date: Thu, 25 Jun 2020 11:25:43 +0000 Subject: [PATCH] fix python ep default ordering. (#4335) * fix python ep default ordering. cpu provider should be last. * add comment. * add test case to ensure no regressions for get_all_providers(). * expand on get_all_providers() api documentation --- onnxruntime/python/onnxruntime_pybind_state.cc | 14 ++++++++------ onnxruntime/test/python/onnxruntime_test_python.py | 4 +++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/onnxruntime/python/onnxruntime_pybind_state.cc b/onnxruntime/python/onnxruntime_pybind_state.cc index 85129fb5cc..885d932260 100644 --- a/onnxruntime/python/onnxruntime_pybind_state.cc +++ b/onnxruntime/python/onnxruntime_pybind_state.cc @@ -302,12 +302,12 @@ inline void RegisterExecutionProvider(InferenceSession* sess, onnxruntime::IExec OrtPybindThrowIfError(sess->RegisterExecutionProvider(std::move(p))); } -// ordered by default priority. highest to lowest. +// ordered by default priority from highest to lowest. kCpuExecutionProvider should always be last. const std::vector& GetAllProviders() { - static std::vector all_providers = {kTensorrtExecutionProvider, kCudaExecutionProvider, kDnnlExecutionProvider, - kNGraphExecutionProvider, kOpenVINOExecutionProvider, kNupharExecutionProvider, - kVitisAIExecutionProvider, kCpuExecutionProvider, kMIGraphXExecutionProvider, - kAclExecutionProvider, kArmNNExecutionProvider}; + static std::vector all_providers = {kTensorrtExecutionProvider, kCudaExecutionProvider, kMIGraphXExecutionProvider, + kNGraphExecutionProvider, kOpenVINOExecutionProvider, kDnnlExecutionProvider, + kNupharExecutionProvider, kVitisAIExecutionProvider, kArmNNExecutionProvider, + kAclExecutionProvider, kCpuExecutionProvider}; return all_providers; } @@ -402,7 +402,9 @@ void addGlobalMethods(py::module& m, const Environment& env) { "Sets the default logging severity. 0:Verbose, 1:Info, 2:Warning, 3:Error, 4:Fatal"); m.def( "get_all_providers", []() -> const std::vector& { return GetAllProviders(); }, - "Return list of Execution Providers that this version of Onnxruntime can support."); + "Return list of Execution Providers that this version of Onnxruntime can support. " + "The order of elements represents the default priority order of Execution Providers" + " from highest to lowest."); m.def( "get_available_providers", []() -> const std::vector& { return GetAvailableProviders(); }, "Return list of available Execution Providers available in this installed version of Onnxruntime."); diff --git a/onnxruntime/test/python/onnxruntime_test_python.py b/onnxruntime/test/python/onnxruntime_test_python.py index d8261a47cc..916edb05df 100644 --- a/onnxruntime/test/python/onnxruntime_test_python.py +++ b/onnxruntime/test/python/onnxruntime_test_python.py @@ -29,7 +29,9 @@ class TestInferenceSession(unittest.TestCase): def testGetProviders(self): self.assertTrue('CPUExecutionProvider' in onnxrt.get_available_providers()) - self.assertTrue('CPUExecutionProvider' in onnxrt.get_all_providers()) + # get_all_providers() returns the default EP order from highest to lowest. + # CPUExecutionProvider should always be last. + self.assertTrue('CPUExecutionProvider' == onnxrt.get_all_providers()[-1]) sess = onnxrt.InferenceSession(get_name("mul_1.onnx")) self.assertTrue('CPUExecutionProvider' in sess.get_providers())