fix: resolve OpenVINO DLL loading on Windows for OpenVINOExecutionProvider

- Add add_openvino_libs_to_path() call in run.py before any ONNX
  InferenceSession creation to register openvino.dll directory
- Detect and advertise OpenVINOExecutionProvider in platform_info
  banner and accelerator label
- Prioritize openvino over dml in suggest_default_execution_provider
- Configure OpenVINO EP with GPU + FP16 device options for optimal
  performance (~13 FPS on Intel GPU vs ~1 FPS CPU fallback)
- Set thread hint to 1 when OpenVINO EP is active
This commit is contained in:
dunegym
2026-06-28 21:46:55 +08:00
parent 834092c891
commit 897dc21da4
5 changed files with 31 additions and 2 deletions
+4 -2
View File
@@ -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))
+3
View File
@@ -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"
@@ -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
+5
View File
@@ -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(
+11
View File
@@ -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