diff --git a/docs/source/openvino/models.mdx b/docs/source/openvino/models.mdx index d2da5d356c..4fef66276f 100644 --- a/docs/source/openvino/models.mdx +++ b/docs/source/openvino/models.mdx @@ -54,6 +54,7 @@ Here is the list of the supported architectures : - Encoder Decoder - ESM - Exaone +- Exaone4 - Falcon - Falcon-Mamba - Flaubert diff --git a/optimum/exporters/openvino/model_configs.py b/optimum/exporters/openvino/model_configs.py index dea24d26a9..2f25dc3b74 100644 --- a/optimum/exporters/openvino/model_configs.py +++ b/optimum/exporters/openvino/model_configs.py @@ -604,6 +604,18 @@ class ExaoneOpenVINOConfig(LlamaOpenVINOConfig): pass +@register_in_tasks_manager( + "exaone4", + *[ + "text-generation", + "text-generation-with-past", + ], + library_name="transformers", +) +class Exaone4OpenVINOConfig(LlamaOpenVINOConfig): + MIN_TRANSFORMERS_VERSION = "4.54.0" + + @register_in_tasks_manager( "arcee", *[ diff --git a/tests/openvino/test_decoder.py b/tests/openvino/test_decoder.py index d2cc95284d..1562b39ff6 100644 --- a/tests/openvino/test_decoder.py +++ b/tests/openvino/test_decoder.py @@ -125,6 +125,7 @@ class OVModelForCausalLMIntegrationTest(unittest.TestCase): if is_transformers_version(">=", "4.54.0"): # remote code models differs after transformers v4.54 + SUPPORTED_ARCHITECTURES += ("exaone4",) SUPPORTED_ARCHITECTURES = tuple(set(SUPPORTED_ARCHITECTURES) - {"minicpm", "minicpm3", "arctic", "deepseek"}) if is_transformers_version(">=", "4.55.0"): @@ -148,6 +149,7 @@ class OVModelForCausalLMIntegrationTest(unittest.TestCase): "arctic", "chatglm4", "exaone", + "exaone4", "decilm", "minicpm3", "deepseek", @@ -202,6 +204,7 @@ class OVModelForCausalLMIntegrationTest(unittest.TestCase): "phi3": 2, "gemma2": 4, "exaone": 8, + "exaone4": 1, "granite": 6, "granite-moe": 6, "glm": 28, diff --git a/tests/openvino/test_export.py b/tests/openvino/test_export.py index 98599ac31b..7767ddfd6c 100644 --- a/tests/openvino/test_export.py +++ b/tests/openvino/test_export.py @@ -90,6 +90,9 @@ class ExportModelTest(unittest.TestCase): if is_transformers_version(">=", "4.49"): SUPPORTED_ARCHITECTURES.update({"zamba2": OVModelForCausalLM}) + if is_transformers_version(">=", "4.54"): + SUPPORTED_ARCHITECTURES.update({"exaone4": OVModelForCausalLM}) + EXPECTED_DIFFUSERS_SCALE_FACTORS = { "stable-diffusion-xl": {"vae_encoder": "128.0", "vae_decoder": "128.0"}, "stable-diffusion-3": {"text_encoder_3": "8.0"}, diff --git a/tests/openvino/test_exporters_cli.py b/tests/openvino/test_exporters_cli.py index 6e95adfe6a..6f07df8e5e 100644 --- a/tests/openvino/test_exporters_cli.py +++ b/tests/openvino/test_exporters_cli.py @@ -112,6 +112,12 @@ class OVCLIExportTestCase(unittest.TestCase): ] ) + if is_transformers_version(">=", "4.54"): + SUPPORTED_ARCHITECTURES.extend( + [ + ("text-generation-with-past", "exaone4"), + ] + ) if is_transformers_version(">=", "4.52.1") and is_openvino_version(">=", "2025.4.0"): SUPPORTED_ARCHITECTURES.extend( [ @@ -144,6 +150,7 @@ class OVCLIExportTestCase(unittest.TestCase): "falcon-mamba": 2, "qwen3": 2, "zamba2": 2, + "exaone4": 2, "bitnet": 2, } diff --git a/tests/openvino/test_quantization.py b/tests/openvino/test_quantization.py index 57330272a9..265323447f 100644 --- a/tests/openvino/test_quantization.py +++ b/tests/openvino/test_quantization.py @@ -938,6 +938,13 @@ class OVWeightCompressionTest(unittest.TestCase): "resampler_model": {"int8": 6}, }, ), + ( + OVModelForCausalLM, + "exaone4", + True, + dict(bits=4, sym=False, group_size=32, ratio=1.0), + {"model": {"int8": 2, "int4": 14}}, + ), ] # filter models type depending on min max transformers version @@ -972,6 +979,9 @@ class OVWeightCompressionTest(unittest.TestCase): if is_transformers_version("<", "4.52.0"): SUPPORTED_ARCHITECTURES_WITH_AUTO_COMPRESSION.append((OVModelForVisualCausalLM, "minicpmo", True)) + if is_transformers_version(">=", "4.54.0"): + SUPPORTED_ARCHITECTURES_WITH_AUTO_COMPRESSION.append((OVModelForCausalLM, "exaone4", True)) + SUPPORTED_ARCHITECTURES_WITH_HYBRID_QUANTIZATION = [ (OVStableDiffusionPipeline, "stable-diffusion", 72, 195), (OVStableDiffusionXLPipeline, "stable-diffusion-xl", 84, 331), @@ -986,14 +996,15 @@ class OVWeightCompressionTest(unittest.TestCase): DEFAULT_INT4_CONFIG = {"bits": 4, "sym": True, "group_size": 64, "all_layers": True} def test_filtered_architectures(cls): + expected = set() if is_transformers_version("<", "4.49"): - expected = {"llama4", "qwen2_5_vl"} - elif is_transformers_version("<", "4.51"): - expected = {"llama4"} - elif is_transformers_version("<", "4.52"): - expected = set() - else: - expected = {"llava-qwen2", "phi3_v", "minicpmo"} + expected.add("qwen2_5_vl") + if is_transformers_version("<", "4.51"): + expected.add("llama4") + if is_transformers_version("<", "4.54"): + expected.add("exaone4") + if is_transformers_version(">=", "4.54"): + expected.update({"llava-qwen2", "phi3_v", "minicpmo"}) all_model_type = {config[1] for config in cls.TRANSFORMERS_4BIT_CONFIGURATIONS} filtered_model_type = {config[1] for config in cls.LOAD_IN_4_BITS_SCOPE} diff --git a/tests/openvino/utils_tests.py b/tests/openvino/utils_tests.py index dacb7c1362..22ae6c1a79 100644 --- a/tests/openvino/utils_tests.py +++ b/tests/openvino/utils_tests.py @@ -78,6 +78,7 @@ "electra": "optimum-intel-internal-testing/tiny-random-electra", "esm": "optimum-intel-internal-testing/tiny-random-EsmModel", "exaone": "optimum-intel-internal-testing/tiny-random-exaone", + "exaone4": "optimum-intel-internal-testing/tiny-random-exaone4", "gemma": "optimum-intel-internal-testing/tiny-random-GemmaForCausalLM", "gemma2": "optimum-intel-internal-testing/tiny-random-gemma2", "got_ocr2": "optimum-intel-internal-testing/tiny-random-got-ocr2-hf", @@ -339,6 +340,7 @@ "resampler_model": 6, }, "zamba2": {"model": 44}, + "exaone4": {"model": 16}, } TEST_IMAGE_URL = "http://images.cocodataset.org/val2017/000000039769.jpg"