From 705f8a371886828dcd2a380d10ba3a6549a60b9b Mon Sep 17 00:00:00 2001 From: Yifan Li <109183385+yf711@users.noreply.github.com> Date: Fri, 15 Sep 2023 15:16:11 -0700 Subject: [PATCH] [TensorRT EP] Fallback to CUDA EP if it's explicitly assigned (#17535) ### Description * TensorRT EP can fall back to CUDA EP if it's explicitly assigned * MIGraphX can fall back to ROCM if it's explicitly assigned Test cases: | When user specifies providers= | self._fallback_providers= | | ------------------------------------------------------------ | ------------------------------------------------- | | ["TensorrtExecutionProvider", "CUDAExecutionProvider"] | ["CUDAExecutionProvider", "CPUExecutionProvider"] | | ["TensorrtExecutionProvider",("CUDAExecutionProvider", cuda_options)] | ["CUDAExecutionProvider", "CPUExecutionProvider"] | | ["TensorrtExecutionProvider"] | ["CPUExecutionProvider"] | | [("TensorrtExecutionProvider", trt_options)] | ["CPUExecutionProvider"] | | [("TensorrtExecutionProvider", trt_options), ("CUDAExecutionProvider", cuda_options)] | ["CUDAExecutionProvider", "CPUExecutionProvider"] | | ["TensorrtExecutionProvider", "CPUExecutionProvider"] | ["CPUExecutionProvider"] | ### Motivation and Context Apply comments of https://github.com/microsoft/onnxruntime/issues/17394 and unify the logic to [MIGraphX, ROCM] --- .../onnxruntime_inference_collection.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/onnxruntime/python/onnxruntime_inference_collection.py b/onnxruntime/python/onnxruntime_inference_collection.py index b73fcbbff5..4124822ade 100644 --- a/onnxruntime/python/onnxruntime_inference_collection.py +++ b/onnxruntime/python/onnxruntime_inference_collection.py @@ -420,8 +420,10 @@ class InferenceSession(Session): except (ValueError, RuntimeError) as e: if self._enable_fallback: try: + print("*************** EP Error ***************") print(f"EP Error {e} when using {providers}") print(f"Falling back to {self._fallback_providers} and retrying.") + print("****************************************") self._create_inference_session(self._fallback_providers, None) # Fallback only once. self.disable_fallback() @@ -434,11 +436,26 @@ class InferenceSession(Session): def _create_inference_session(self, providers, provider_options, disabled_optimizers=None): available_providers = C.get_available_providers() - # Tensorrt can fall back to CUDA. All others fall back to CPU. + # Tensorrt can fall back to CUDA if it's explicitly assigned. All others fall back to CPU. if "TensorrtExecutionProvider" in available_providers: - self._fallback_providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + if any( + provider == "CUDAExecutionProvider" + or (isinstance(provider, tuple) and provider[0] == "CUDAExecutionProvider") + for provider in providers + ): + self._fallback_providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + else: + self._fallback_providers = ["CPUExecutionProvider"] + # MIGraphX can fall back to ROCM if it's explicitly assigned. All others fall back to CPU. elif "MIGraphXExecutionProvider" in available_providers: - self._fallback_providers = ["ROCMExecutionProvider", "CPUExecutionProvider"] + if any( + provider == "ROCMExecutionProvider" + or (isinstance(provider, tuple) and provider[0] == "ROCMExecutionProvider") + for provider in providers + ): + self._fallback_providers = ["ROCMExecutionProvider", "CPUExecutionProvider"] + else: + self._fallback_providers = ["CPUExecutionProvider"] else: self._fallback_providers = ["CPUExecutionProvider"]