check-optimum-intel-support / optimum_support.py
helenai's picture
Initial commit
cc9720d
import importlib.metadata
import inspect
import re
import subprocess
import sys
from importlib import reload
from pathlib import Path
import optimum.intel.utils.import_utils as import_utils
from huggingface_hub import HfApi
from huggingface_hub.errors import RepositoryNotFoundError
from packaging.requirements import Requirement
if Path("optimum-intel").is_dir():
subprocess.run(["git", "pull"], cwd="optimum-intel")
else:
subprocess.run(["git", "clone", "https://github.com/huggingface/optimum-intel.git"])
test_path = Path(__file__).parent / "optimum-intel" / "tests" / "openvino"
sys.path.append(str(test_path))
# Stable Diffusion does not have a model_type in the config
# Get supported diffusion classes from SUPPORTED_OV_PIPELINES, which lists all OV pipeline wrappers
import optimum.intel.openvino.modeling_diffusion as _modeling_diffusion
# Import the test modules from the cloned repository. This must be imported globally to avoid issues with reloading in Gradio
import test_decoder
import test_diffusion
import test_modeling
import test_seq2seq
SUPPORTED_DIFFUSION_CLASSES = [
cls.auto_model_class.__name__
for cls in _modeling_diffusion.SUPPORTED_OV_PIPELINES
if hasattr(cls, "auto_model_class") and cls.auto_model_class is not None
]
def get_supported_models_for_version(version):
import_utils._transformers_version = version
test_seq2seq._transformers_version = version
test_modeling._transformers_version = version
test_diffusion._transformers_version = version
test_decoder._transformers_version = version
seq2seq = reload(test_seq2seq)
decoder = reload(test_decoder)
modeling = reload(test_modeling)
diffusion = reload(test_diffusion)
d = {}
modules = [seq2seq, decoder, modeling, diffusion]
for mod in modules:
for name, obj in inspect.getmembers(mod):
if inspect.isclass(obj):
if re.match(r"(OVModelFor.*IntegrationTest)", name) or re.match(r"(OVPipelineFor.*Test)", name):
task = name.replace("IntegrationTest", "").replace("Test", "")
if "CustomTasks" not in task:
d[task] = obj.SUPPORTED_ARCHITECTURES
all_archs = []
for archs in d.values():
all_archs += archs
return sorted(set(all_archs))
def get_min_max_transformers():
meta = importlib.metadata.metadata("optimum-intel")
requires = meta.get_all("Requires-Dist") or []
transformers_versions = [item for item in requires if "transformers" in item and "extra" not in item][0]
req = Requirement(transformers_versions)
maxver, minver = [ver.version for ver in list(req.specifier)]
return (minver, maxver)
def show_is_supported(model_id):
print(f"Checking {model_id}...")
minver, maxver = get_min_max_transformers()
versions = [minver, "4.53.0", maxver]
all_supported_models = set()
for v in versions:
archs = get_supported_models_for_version(v)
all_supported_models.update(archs)
try:
model_info = HfApi().model_info(model_id)
except RepositoryNotFoundError:
message = f"Model {model_id} was not found on the Hugging Face hub. Make sure you entered the correct model_id. If the model requires authentication, use `hf auth login` or a token to authenticate."
else:
if (model_info.config is not None) and model_info.config != {}:
model_type = model_info.config.get("model_type")
if model_type is None: # Check for diffusion class if model_type is not available
class_name = model_info.config.get("diffusers", {}).get("_class_name")
if class_name in SUPPORTED_DIFFUSION_CLASSES:
message = (
f"`{model_id}` with diffusion class `{class_name}` is **supported** by optimum-intel[openvino]."
)
else:
message = f"`{model_id}` is not in the list of supported architectures by optimum-intel[openvino]. It is **likely not supported**, but it is wise to doublecheck"
elif model_type in all_supported_models:
message = f"`{model_id}` with model type `{model_type}` is **supported** by optimum-intel[openvino]."
else:
message = f"`{model_id}` with model type `{model_type}` is not in the list of supported architectures by optimum-intel[openvino]. It is **likely not supported**, but it is wise to doublecheck"
else:
message = f"`{model_id}` is **not supported** by optimum-intel[openvino]."
print(f"Using transformers: {versions}. Total number of supported architectures: {len(all_supported_models)}")
print(message)
return message
if __name__ == "__main__":
show_is_supported(sys.argv[1])