import importlib.metadata import inspect import re import subprocess import sys from datetime import datetime from importlib import reload from pathlib import Path import gradio as gr import optimum.intel.utils.import_utils as import_utils import pandas as pd 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)) # import test files globally. Importing inside a function with import_module is extremely # slow inside a gradio app import test_decoder import test_diffusion import test_modeling import test_seq2seq def get_supported_models_for_version(version): """ Get supported architectures for a particular transformers version. Uses mocking to set the transformers version to `version`. """ import_utils._transformers_version = version # Patch _transformers version test_seq2seq._transformers_version = version test_modeling._transformers_version = version test_diffusion._transformers_version = version test_decoder._transformers_version = version # Re-import to refresh SUPPORTED_ARCHITECTURES seq2seq = reload(test_seq2seq) decoder = reload(test_decoder) modeling = reload(test_modeling) diffusion = reload(test_diffusion) # Get SUPPORTED_ARCHITECUTRES for all modules 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 return d # sorted(set(all_archs)) def get_min_max_transformers(): """ Get minumum and maximum supported transformers version by currently installed optimum-intel """ 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 generate_model_list(): RESULT_FILE = "supported_models.md" minver, maxver = get_min_max_transformers() # This returns a too large maxver but that is not a problem versions = [minver, "4.53.0", maxver] model_classes_with_models = {} for v in versions: model_classes_with_models_version = get_supported_models_for_version(v) for item in model_classes_with_models_version: model_classes_with_models.setdefault(item, set()) model_classes_with_models[item].update(model_classes_with_models_version[item]) with open(RESULT_FILE, "w") as f: optimum_intel_version = importlib.metadata.version("optimum-intel") f.write(f"Updated at {datetime.now().strftime('%d %B %Y')} using optimum-intel {optimum_intel_version}\n\n") summary = [] all_archs = [] for archs in model_classes_with_models.values(): all_archs += archs for title, supported_models in model_classes_with_models.items(): f.write(f"## {title}\n\n") for item in supported_models: f.write(f" - {item}\n") f.write("\n") summary.append((title, len(supported_models))) md_summary = pd.DataFrame.from_records(summary, columns=["task", "number of architectures"]).to_markdown() f.write("# Summary\n\n") f.write(md_summary) f.write("\n\n") num_total_archs = len(set(all_archs)) f.write(f"Total unique architectures: {num_total_archs}\n\n") f.write(f"Total validated architecture/task combinations: {len(all_archs)}\n\n") return Path(RESULT_FILE).read_text(), RESULT_FILE demo = gr.Interface( fn=generate_model_list, title="List of validated architectures for optimum[openvino]", inputs=[], outputs=[gr.Markdown(), gr.File()], ) demo.launch(server_name="0.0.0.0")