From b530bb75710e55acd761c7b2d0f668e0f5b6b67a Mon Sep 17 00:00:00 2001 From: Allen Day Date: Sat, 12 Apr 2025 11:56:55 +0700 Subject: [PATCH 1/3] Improve ONNX provider selection with CoreML support --- tagger/interrogator/interrogator.py | 38 +++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/tagger/interrogator/interrogator.py b/tagger/interrogator/interrogator.py index 3e968b9..abcc66d 100644 --- a/tagger/interrogator/interrogator.py +++ b/tagger/interrogator/interrogator.py @@ -6,7 +6,7 @@ import pandas as pd from typing import Iterable, Tuple, List, Dict from PIL import Image -from onnxruntime import InferenceSession +from onnxruntime import InferenceSession, get_available_providers tag_escape_pattern = re.compile(r'([\\()])') @@ -66,7 +66,8 @@ class AbsInterrogator: def __init__(self, name: str) -> None: self.name = name - self.providers = ['CUDAExecutionProvider', 'CPUExecutionProvider'] + # Initialize with optimal provider selection + self.providers = self.get_optimal_provider() def load(self): raise NotImplementedError() @@ -85,7 +86,40 @@ class AbsInterrogator: return unloaded def use_cpu(self) -> None: + """Force CPU-only execution.""" self.providers = ['CPUExecutionProvider'] + print(f'Forcing CPU execution for {self.name}', file=sys.stderr) + + def get_available_providers(self) -> List[str]: + """Get list of available execution providers.""" + return get_available_providers() + + def set_providers(self, providers: List[str]) -> None: + """Set specific execution providers.""" + self.providers = providers + print(f'Set custom providers for {self.name}: {providers}', file=sys.stderr) + + def get_optimal_provider(self) -> List[str]: + """Get the optimal provider based on system capabilities. + + Returns a list of providers in order of preference: + - CoreMLExecutionProvider (if on Apple Silicon) + - CUDAExecutionProvider (if NVIDIA GPU available) + - CPUExecutionProvider (always available as fallback) + """ + available = self.get_available_providers() + + # Start with most optimal providers first + optimal_order = [ + 'CoreMLExecutionProvider', # Best for Apple Silicon + 'CUDAExecutionProvider', # Best for NVIDIA GPUs + 'CPUExecutionProvider' # Fallback + ] + + # Return list of available providers in optimal order + selected = [p for p in optimal_order if p in available] + print(f'Selected optimal providers for {self.name}: {selected}', file=sys.stderr) + return selected def interrogate( self, From 13d32c034d494af301b79a7a3ea55e8731991415 Mon Sep 17 00:00:00 2001 From: Allen Day Date: Sat, 12 Apr 2025 13:03:51 +0800 Subject: [PATCH 2/3] silence printf --- tagger/interrogator/interrogator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tagger/interrogator/interrogator.py b/tagger/interrogator/interrogator.py index abcc66d..06753e5 100644 --- a/tagger/interrogator/interrogator.py +++ b/tagger/interrogator/interrogator.py @@ -118,7 +118,7 @@ class AbsInterrogator: # Return list of available providers in optimal order selected = [p for p in optimal_order if p in available] - print(f'Selected optimal providers for {self.name}: {selected}', file=sys.stderr) + #print(f'Selected optimal providers for {self.name}: {selected}', file=sys.stderr) return selected def interrogate( From 707b2b7cf2e9490741c47e2898f5d916302ac54e Mon Sep 17 00:00:00 2001 From: Allen Day Date: Sat, 12 Apr 2025 13:05:44 +0800 Subject: [PATCH 3/3] silence printf --- tagger/interrogator/interrogator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tagger/interrogator/interrogator.py b/tagger/interrogator/interrogator.py index 06753e5..800cfe3 100644 --- a/tagger/interrogator/interrogator.py +++ b/tagger/interrogator/interrogator.py @@ -97,7 +97,7 @@ class AbsInterrogator: def set_providers(self, providers: List[str]) -> None: """Set specific execution providers.""" self.providers = providers - print(f'Set custom providers for {self.name}: {providers}', file=sys.stderr) + #print(f'Set custom providers for {self.name}: {providers}', file=sys.stderr) def get_optimal_provider(self) -> List[str]: """Get the optimal provider based on system capabilities.