Spaces:
Build error
Build error
import subprocess | |
import xml.etree.ElementTree as ElementTree | |
from functools import lru_cache | |
from typing import Any, List | |
from onnxruntime import get_available_providers, set_default_logger_severity | |
from facefusion.choices import execution_provider_set | |
from facefusion.typing import ExecutionDevice, ExecutionProviderKey, ExecutionProviderSet, ExecutionProviderValue, ValueAndUnit | |
set_default_logger_severity(3) | |
def get_execution_provider_choices() -> List[ExecutionProviderKey]: | |
return list(get_available_execution_provider_set().keys()) | |
def has_execution_provider(execution_provider_key : ExecutionProviderKey) -> bool: | |
return execution_provider_key in get_execution_provider_choices() | |
def get_available_execution_provider_set() -> ExecutionProviderSet: | |
available_execution_providers = get_available_providers() | |
available_execution_provider_set : ExecutionProviderSet = {} | |
for execution_provider_key, execution_provider_value in execution_provider_set.items(): | |
if execution_provider_value in available_execution_providers: | |
available_execution_provider_set[execution_provider_key] = execution_provider_value | |
return available_execution_provider_set | |
def extract_execution_providers(execution_provider_keys : List[ExecutionProviderKey]) -> List[ExecutionProviderValue]: | |
return [ execution_provider_set[execution_provider_key] for execution_provider_key in execution_provider_keys if execution_provider_key in execution_provider_set ] | |
def create_execution_providers(execution_device_id : str, execution_provider_keys : List[ExecutionProviderKey]) -> List[Any]: | |
execution_providers = extract_execution_providers(execution_provider_keys) | |
execution_providers_with_options : List[Any] = [] | |
for execution_provider in execution_providers: | |
if execution_provider == 'CUDAExecutionProvider': | |
execution_providers_with_options.append((execution_provider, | |
{ | |
'device_id': execution_device_id, | |
'cudnn_conv_algo_search': 'EXHAUSTIVE' if use_exhaustive() else 'DEFAULT' | |
})) | |
elif execution_provider == 'TensorrtExecutionProvider': | |
execution_providers_with_options.append((execution_provider, | |
{ | |
'device_id': execution_device_id, | |
'trt_engine_cache_enable': True, | |
'trt_engine_cache_path': '.caches', | |
'trt_timing_cache_enable': True, | |
'trt_timing_cache_path': '.caches' | |
})) | |
elif execution_provider == 'OpenVINOExecutionProvider': | |
execution_providers_with_options.append((execution_provider, | |
{ | |
'device_type': 'GPU.' + execution_device_id, | |
'precision': 'FP32' | |
})) | |
elif execution_provider in [ 'DmlExecutionProvider', 'ROCMExecutionProvider' ]: | |
execution_providers_with_options.append((execution_provider, | |
{ | |
'device_id': execution_device_id | |
})) | |
elif execution_provider == 'CoreMLExecutionProvider': | |
execution_providers_with_options.append(execution_provider) | |
if 'CPUExecutionProvider' in execution_providers: | |
execution_providers_with_options.append('CPUExecutionProvider') | |
return execution_providers_with_options | |
def use_exhaustive() -> bool: | |
execution_devices = detect_static_execution_devices() | |
product_names = ('GeForce GTX 1630', 'GeForce GTX 1650', 'GeForce GTX 1660') | |
return any(execution_device.get('product').get('name').startswith(product_names) for execution_device in execution_devices) | |
def run_nvidia_smi() -> subprocess.Popen[bytes]: | |
commands = [ 'nvidia-smi', '--query', '--xml-format' ] | |
return subprocess.Popen(commands, stdout = subprocess.PIPE) | |
def detect_static_execution_devices() -> List[ExecutionDevice]: | |
return detect_execution_devices() | |
def detect_execution_devices() -> List[ExecutionDevice]: | |
execution_devices : List[ExecutionDevice] = [] | |
try: | |
output, _ = run_nvidia_smi().communicate() | |
root_element = ElementTree.fromstring(output) | |
except Exception: | |
root_element = ElementTree.Element('xml') | |
for gpu_element in root_element.findall('gpu'): | |
execution_devices.append( | |
{ | |
'driver_version': root_element.find('driver_version').text, | |
'framework': | |
{ | |
'name': 'CUDA', | |
'version': root_element.find('cuda_version').text | |
}, | |
'product': | |
{ | |
'vendor': 'NVIDIA', | |
'name': gpu_element.find('product_name').text.replace('NVIDIA ', '') | |
}, | |
'video_memory': | |
{ | |
'total': create_value_and_unit(gpu_element.find('fb_memory_usage/total').text), | |
'free': create_value_and_unit(gpu_element.find('fb_memory_usage/free').text) | |
}, | |
'utilization': | |
{ | |
'gpu': create_value_and_unit(gpu_element.find('utilization/gpu_util').text), | |
'memory': create_value_and_unit(gpu_element.find('utilization/memory_util').text) | |
} | |
}) | |
return execution_devices | |
def create_value_and_unit(text : str) -> ValueAndUnit: | |
value, unit = text.split() | |
value_and_unit : ValueAndUnit =\ | |
{ | |
'value': int(value), | |
'unit': str(unit) | |
} | |
return value_and_unit | |