diff --git a/modules/core.py b/modules/core.py index dfd1081..560adfb 100644 --- a/modules/core.py +++ b/modules/core.py @@ -132,9 +132,9 @@ def suggest_max_memory() -> int: def suggest_default_execution_provider() -> str: - """Pick the best available provider: cuda > rocm > coreml > dml > cpu.""" + """Pick the best available provider: cuda > rocm > coreml > openvino > dml > cpu.""" available = encode_execution_providers(onnxruntime.get_available_providers()) - for pref in ('cuda', 'rocm', 'coreml', 'dml'): + for pref in ('cuda', 'rocm', 'coreml', 'openvino', 'dml'): if pref in available: return pref return 'cpu' @@ -157,6 +157,8 @@ def suggest_execution_threads() -> int: return 1 if 'CUDAExecutionProvider' in modules.globals.execution_providers: return 2 + if 'OpenVINOExecutionProvider' in modules.globals.execution_providers: + return 1 # For CPU execution, use most cores but leave some for system return max(4, min(cpu_count - 2, 16)) diff --git a/modules/platform_info.py b/modules/platform_info.py index 212db05..32f45a6 100644 --- a/modules/platform_info.py +++ b/modules/platform_info.py @@ -40,6 +40,7 @@ ONNX_PROVIDERS: List[str] = _detect_onnx_providers() HAS_CUDA_PROVIDER: bool = "CUDAExecutionProvider" in ONNX_PROVIDERS HAS_COREML_PROVIDER: bool = "CoreMLExecutionProvider" in ONNX_PROVIDERS HAS_DML_PROVIDER: bool = "DmlExecutionProvider" in ONNX_PROVIDERS +HAS_OPENVINO_PROVIDER: bool = "OpenVINOExecutionProvider" in ONNX_PROVIDERS def camera_backends() -> List[Tuple[int, int]]: @@ -65,6 +66,8 @@ def accelerator_label() -> str: return "CoreML (Apple Neural Engine)" if HAS_COREML_PROVIDER: return "CoreML" + if HAS_OPENVINO_PROVIDER: + return "OpenVINO (Intel)" if HAS_DML_PROVIDER: return "DirectML" return "CPU" diff --git a/modules/processors/frame/_onnx_enhancer.py b/modules/processors/frame/_onnx_enhancer.py index 4eeee98..47780b8 100644 --- a/modules/processors/frame/_onnx_enhancer.py +++ b/modules/processors/frame/_onnx_enhancer.py @@ -50,6 +50,14 @@ def build_provider_config(providers=None): "AllowLowPrecisionAccumulationOnGPU": 1, }, )) + elif p == "OpenVINOExecutionProvider": + # Prefer Intel GPU with FP16 precision when available. + # NB: GPU_FP16 is deprecated since OpenVINO 2025.4 — use + # device_type="GPU" + precision="FP16" instead. + config.append(( + "OpenVINOExecutionProvider", + {"device_type": "GPU", "precision": "FP16"}, + )) else: config.append(p) return config diff --git a/modules/processors/frame/face_swapper.py b/modules/processors/frame/face_swapper.py index 7559af6..e283733 100644 --- a/modules/processors/frame/face_swapper.py +++ b/modules/processors/frame/face_swapper.py @@ -270,6 +270,11 @@ def get_face_swapper() -> Any: # Use bare provider — ONNX Runtime defaults are # fastest on modern GPUs (Blackwell/sm_120). providers_config.append(p) + elif p == "OpenVINOExecutionProvider": + providers_config.append(( + "OpenVINOExecutionProvider", + {"device_type": "GPU", "precision": "FP16"}, + )) else: providers_config.append(p) FACE_SWAPPER = insightface.model_zoo.get_model( diff --git a/run.py b/run.py index 6fa4d85..7b9c48d 100644 --- a/run.py +++ b/run.py @@ -31,6 +31,17 @@ if sys.platform == "win32": except (OSError, AttributeError): pass + # On Windows, register OpenVINO DLL directories so onnxruntime's + # OpenVINOExecutionProvider can find openvino.dll. This must happen + # before any ONNX InferenceSession is created. + try: + from onnxruntime.tools.add_openvino_win_libs import ( # type: ignore[import-untyped] # noqa: E501 + add_openvino_libs_to_path, + ) + add_openvino_libs_to_path() + except (ImportError, FileNotFoundError): + pass # OpenVINO not installed — no-op + # On Linux, pre-load NVIDIA shared libraries (cuDNN, cuBLAS, nvrtc...) shipped # inside the venv via pip wheels (nvidia-cudnn-cu12, etc.). LD_LIBRARY_PATH # cannot be set after Python starts, so we use ctypes.CDLL with RTLD_GLOBAL