From a31070662c0415233768b4094b4c9772af8312c8 Mon Sep 17 00:00:00 2001 From: Ella Charlaix Date: Mon, 20 Jan 2025 16:35:55 +0100 Subject: [PATCH 1/6] Add langchain test --- tests/openvino/test_modeling.py | 48 ++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/tests/openvino/test_modeling.py b/tests/openvino/test_modeling.py index 9da0069706..57fff6c362 100644 --- a/tests/openvino/test_modeling.py +++ b/tests/openvino/test_modeling.py @@ -14,13 +14,14 @@ import copy import gc +import importlib import os import platform import tempfile import time import unittest from pathlib import Path -from typing import Dict +from typing import Dict, Generator import numpy as np import open_clip @@ -32,6 +33,7 @@ from datasets import load_dataset from evaluate import evaluator from huggingface_hub import HfApi +from packaging import version from parameterized import parameterized from PIL import Image from sentence_transformers import SentenceTransformer @@ -130,6 +132,15 @@ F32_CONFIG = {"INFERENCE_PRECISION_HINT": "f32"} +_langchain_available = importlib.util.find_spec("langchain") is not None +_langchain_version = "N/A" +if _langchain_available: + try: + _langchain_version = importlib.metadata.version("langchain") + except importlib.metadata.PackageNotFoundError: + _langchain_available = False + + class Timer(object): def __enter__(self): self.elapsed = time.perf_counter() @@ -2796,3 +2807,38 @@ def test_sentence_transformers_save_and_infer(self, model_arch): sentences = ["This is an example sentence", "Each sentence is converted"] model.encode(sentences) gc.collect() + + +class OVLangchainTest(unittest.TestCase): + SUPPORTED_ARCHITECTURES = ("gpt2",) + + @unittest.skipIf( + not _langchain_available or version.parse(_langchain_version) <= version.parse("0.3.30"), + reason="Unsupported langchain", + ) + @parameterized.expand(SUPPORTED_ARCHITECTURES) + def test_huggingface_pipeline_streaming(self, model_arch): + from langchain_huggingface import HuggingFacePipeline + + model_id = MODEL_NAMES[model_arch] + + hf_pipe = HuggingFacePipeline.from_model_id( + model_id=model_id, + task="text-generation", + pipeline_kwargs={"max_new_tokens": 10}, + backend="openvino", + ) + + generator = hf_pipe.stream("Q: How do you say 'hello' in German? A:'", stop=["."]) + + self.assertIsInstance(generator, Generator) + + stream_results_string = "" + for chunk in generator: + self.assertIsInstance(chunk, str) + stream_results_string = chunk + + self.assertTrue(len(stream_results_string.strip()) > 1) + + del hf_pipe + gc.collect() From ab9c8dab3699688f2d77298fe05ec41ed1e50b14 Mon Sep 17 00:00:00 2001 From: Ella Charlaix Date: Mon, 20 Jan 2025 16:40:33 +0100 Subject: [PATCH 2/6] add ipex tests --- optimum/intel/utils/import_utils.py | 9 +++++++ tests/ipex/test_modeling.py | 41 ++++++++++++++++++++++++++++- tests/openvino/test_modeling.py | 17 +++++------- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/optimum/intel/utils/import_utils.py b/optimum/intel/utils/import_utils.py index 519c59addb..2c39282ca9 100644 --- a/optimum/intel/utils/import_utils.py +++ b/optimum/intel/utils/import_utils.py @@ -184,6 +184,15 @@ _sentence_transformers_available = False +_langchain_available = importlib.util.find_spec("langchain") is not None +_langchain_version = "N/A" +if _langchain_available: + try: + _langchain_version = importlib.metadata.version("langchain") + except importlib.metadata.PackageNotFoundError: + _langchain_available = False + + def is_transformers_available(): return _transformers_available diff --git a/tests/ipex/test_modeling.py b/tests/ipex/test_modeling.py index 419e1bb42a..10ae141169 100644 --- a/tests/ipex/test_modeling.py +++ b/tests/ipex/test_modeling.py @@ -21,6 +21,7 @@ import numpy as np import requests import torch +from typing import Generator from parameterized import parameterized from PIL import Image from transformers import ( @@ -34,6 +35,7 @@ pipeline, set_seed, ) +from packaging import version from optimum.intel import ( IPEXModel, IPEXModelForAudioClassification, @@ -47,7 +49,12 @@ IPEXSentenceTransformer, ) from optimum.utils.testing_utils import grid_parameters, require_sentence_transformers -from optimum.intel.utils.import_utils import is_sentence_transformers_available, is_torch_version +from optimum.intel.utils.import_utils import ( + is_sentence_transformers_available, + is_torch_version, + _langchain_available, + _langchain_version, +) if is_sentence_transformers_available(): from sentence_transformers import SentenceTransformer @@ -707,3 +714,35 @@ def test_sentence_transformers_save_and_infer(self, model_arch): model = IPEXSentenceTransformer(tmpdirname, model_kwargs={"subfolder": "ipex"}) sentences = ["This is an example sentence", "Each sentence is converted"] model.encode(sentences) + + +class IPEXLangchainTest(unittest.TestCase): + SUPPORTED_ARCHITECTURES = ("gpt2",) + + @unittest.skipIf( + not _langchain_available or version.parse(_langchain_version) <= version.parse("0.3.30"), + reason="Unsupported langchain", + ) + @parameterized.expand(SUPPORTED_ARCHITECTURES) + def test_huggingface_pipeline_streaming(self, model_arch): + from langchain_huggingface import HuggingFacePipeline + + model_id = MODEL_NAMES[model_arch] + + hf_pipe = HuggingFacePipeline.from_model_id( + model_id=model_id, + task="text-generation", + pipeline_kwargs={"max_new_tokens": 10}, + backend="ipex", + ) + + generator = hf_pipe.stream("Q: How do you say 'hello' in German? A:'", stop=["."]) + + self.assertIsInstance(generator, Generator) + + stream_results_string = "" + for chunk in generator: + self.assertIsInstance(chunk, str) + stream_results_string = chunk + + self.assertTrue(len(stream_results_string.strip()) > 1) diff --git a/tests/openvino/test_modeling.py b/tests/openvino/test_modeling.py index 57fff6c362..1e7e8bba44 100644 --- a/tests/openvino/test_modeling.py +++ b/tests/openvino/test_modeling.py @@ -14,7 +14,6 @@ import copy import gc -import importlib import os import platform import tempfile @@ -109,7 +108,12 @@ _print_compiled_model_properties, ) from optimum.intel.pipelines import pipeline as optimum_pipeline -from optimum.intel.utils.import_utils import is_openvino_version, is_transformers_version +from optimum.intel.utils.import_utils import ( + _langchain_available, + _langchain_version, + is_openvino_version, + is_transformers_version, +) from optimum.intel.utils.modeling_utils import _find_files_matching_pattern from optimum.utils import ( DIFFUSION_MODEL_TEXT_ENCODER_2_SUBFOLDER, @@ -132,15 +136,6 @@ F32_CONFIG = {"INFERENCE_PRECISION_HINT": "f32"} -_langchain_available = importlib.util.find_spec("langchain") is not None -_langchain_version = "N/A" -if _langchain_available: - try: - _langchain_version = importlib.metadata.version("langchain") - except importlib.metadata.PackageNotFoundError: - _langchain_available = False - - class Timer(object): def __enter__(self): self.elapsed = time.perf_counter() From ebc2296ed8d3ee6f0269792cabecac2b71fcb093 Mon Sep 17 00:00:00 2001 From: Ella Charlaix Date: Mon, 20 Jan 2025 17:11:32 +0100 Subject: [PATCH 3/6] fix --- optimum/intel/utils/import_utils.py | 10 +++++----- setup.py | 1 + tests/ipex/test_modeling.py | 10 +++++----- tests/openvino/test_modeling.py | 10 +++++----- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/optimum/intel/utils/import_utils.py b/optimum/intel/utils/import_utils.py index 2c39282ca9..46a89fc1ef 100644 --- a/optimum/intel/utils/import_utils.py +++ b/optimum/intel/utils/import_utils.py @@ -184,13 +184,13 @@ _sentence_transformers_available = False -_langchain_available = importlib.util.find_spec("langchain") is not None -_langchain_version = "N/A" -if _langchain_available: +_langchain_hf_available = importlib.util.find_spec("langchain_huggingface") is not None +_langchain_hf_version = "N/A" +if _langchain_hf_available: try: - _langchain_version = importlib.metadata.version("langchain") + _langchain_hf_version = importlib.metadata.version("langchain_huggingface") except importlib.metadata.PackageNotFoundError: - _langchain_available = False + _langchain_hf_available = False def is_transformers_available(): diff --git a/setup.py b/setup.py index 0f02ef15cf..aebe64b341 100644 --- a/setup.py +++ b/setup.py @@ -58,6 +58,7 @@ "peft", "datasets[audio]>=1.4.0", "tbb", + "langchain-huggingface", ] QUALITY_REQUIRE = ["black~=23.1", "ruff==0.4.4"] diff --git a/tests/ipex/test_modeling.py b/tests/ipex/test_modeling.py index 10ae141169..b50874f08b 100644 --- a/tests/ipex/test_modeling.py +++ b/tests/ipex/test_modeling.py @@ -52,8 +52,8 @@ from optimum.intel.utils.import_utils import ( is_sentence_transformers_available, is_torch_version, - _langchain_available, - _langchain_version, + _langchain_hf_available, + _langchain_hf_version, ) if is_sentence_transformers_available(): @@ -719,11 +719,11 @@ def test_sentence_transformers_save_and_infer(self, model_arch): class IPEXLangchainTest(unittest.TestCase): SUPPORTED_ARCHITECTURES = ("gpt2",) + @parameterized.expand(SUPPORTED_ARCHITECTURES) @unittest.skipIf( - not _langchain_available or version.parse(_langchain_version) <= version.parse("0.3.30"), - reason="Unsupported langchain", + not _langchain_hf_available or version.parse(_langchain_hf_version) <= version.parse("0.1.2"), + reason="Unsupported langchain version", ) - @parameterized.expand(SUPPORTED_ARCHITECTURES) def test_huggingface_pipeline_streaming(self, model_arch): from langchain_huggingface import HuggingFacePipeline diff --git a/tests/openvino/test_modeling.py b/tests/openvino/test_modeling.py index 1e7e8bba44..975490223e 100644 --- a/tests/openvino/test_modeling.py +++ b/tests/openvino/test_modeling.py @@ -109,8 +109,8 @@ ) from optimum.intel.pipelines import pipeline as optimum_pipeline from optimum.intel.utils.import_utils import ( - _langchain_available, - _langchain_version, + _langchain_hf_available, + _langchain_hf_version, is_openvino_version, is_transformers_version, ) @@ -2807,11 +2807,11 @@ def test_sentence_transformers_save_and_infer(self, model_arch): class OVLangchainTest(unittest.TestCase): SUPPORTED_ARCHITECTURES = ("gpt2",) + @parameterized.expand(SUPPORTED_ARCHITECTURES) @unittest.skipIf( - not _langchain_available or version.parse(_langchain_version) <= version.parse("0.3.30"), - reason="Unsupported langchain", + not _langchain_hf_available or version.parse(_langchain_hf_version) < version.parse("0.1.2"), + reason="Unsupported langchain version", ) - @parameterized.expand(SUPPORTED_ARCHITECTURES) def test_huggingface_pipeline_streaming(self, model_arch): from langchain_huggingface import HuggingFacePipeline From dd5cdce51ff5b27edd35d440674810cd2f48b0ff Mon Sep 17 00:00:00 2001 From: Ella Charlaix Date: Mon, 20 Jan 2025 17:30:50 +0100 Subject: [PATCH 4/6] add embeddings --- tests/ipex/test_modeling.py | 19 +++++++++++++++++++ tests/openvino/test_modeling.py | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/tests/ipex/test_modeling.py b/tests/ipex/test_modeling.py index b50874f08b..7bff39147e 100644 --- a/tests/ipex/test_modeling.py +++ b/tests/ipex/test_modeling.py @@ -715,6 +715,25 @@ def test_sentence_transformers_save_and_infer(self, model_arch): sentences = ["This is an example sentence", "Each sentence is converted"] model.encode(sentences) + @parameterized.expand(SUPPORTED_ARCHITECTURES) + @require_sentence_transformers + @unittest.skipIf( + not _langchain_hf_available or version.parse(_langchain_hf_version) <= version.parse("0.1.2"), + reason="Unsupported langchain version", + ) + def test_langchain(self, model_arch): + from langchain_huggingface import HuggingFaceEmbeddings + + model_id = MODEL_NAMES[model_arch] + model_kwargs = {"device": "cpu", "backend": "ipex"} + + embedding = HuggingFaceEmbeddings( + model_name=model_id, + model_kwargs=model_kwargs, + ) + output = embedding.embed_query("foo bar") + self.assertTrue(len(output) > 0) + class IPEXLangchainTest(unittest.TestCase): SUPPORTED_ARCHITECTURES = ("gpt2",) diff --git a/tests/openvino/test_modeling.py b/tests/openvino/test_modeling.py index 975490223e..bfd1314140 100644 --- a/tests/openvino/test_modeling.py +++ b/tests/openvino/test_modeling.py @@ -2803,6 +2803,24 @@ def test_sentence_transformers_save_and_infer(self, model_arch): model.encode(sentences) gc.collect() + @parameterized.expand(SUPPORTED_ARCHITECTURES) + @unittest.skipIf( + not _langchain_hf_available or version.parse(_langchain_hf_version) < version.parse("0.1.2"), + reason="Unsupported langchain version", + ) + def test_langchain(self, model_arch): + from langchain_huggingface import HuggingFaceEmbeddings + + model_id = MODEL_NAMES[model_arch] + model_kwargs = {"device": "cpu", "backend": "openvino"} + + embedding = HuggingFaceEmbeddings( + model_name=model_id, + model_kwargs=model_kwargs, + ) + output = embedding.embed_query("foo bar") + self.assertTrue(len(output) > 0) + class OVLangchainTest(unittest.TestCase): SUPPORTED_ARCHITECTURES = ("gpt2",) From 16e5fc5b077237db676b9a18e91671ddb223418c Mon Sep 17 00:00:00 2001 From: Ella Charlaix Date: Thu, 23 Jan 2025 17:16:47 +0100 Subject: [PATCH 5/6] remove langchain version restriction for ov tests --- tests/openvino/test_modeling.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tests/openvino/test_modeling.py b/tests/openvino/test_modeling.py index bfd1314140..6555c6350e 100644 --- a/tests/openvino/test_modeling.py +++ b/tests/openvino/test_modeling.py @@ -2804,10 +2804,7 @@ def test_sentence_transformers_save_and_infer(self, model_arch): gc.collect() @parameterized.expand(SUPPORTED_ARCHITECTURES) - @unittest.skipIf( - not _langchain_hf_available or version.parse(_langchain_hf_version) < version.parse("0.1.2"), - reason="Unsupported langchain version", - ) + @unittest.skipIf(not _langchain_hf_available, reason="langchain not installed") def test_langchain(self, model_arch): from langchain_huggingface import HuggingFaceEmbeddings @@ -2826,10 +2823,7 @@ class OVLangchainTest(unittest.TestCase): SUPPORTED_ARCHITECTURES = ("gpt2",) @parameterized.expand(SUPPORTED_ARCHITECTURES) - @unittest.skipIf( - not _langchain_hf_available or version.parse(_langchain_hf_version) < version.parse("0.1.2"), - reason="Unsupported langchain version", - ) + @unittest.skipIf(not _langchain_hf_available, reason="langchain not installed") def test_huggingface_pipeline_streaming(self, model_arch): from langchain_huggingface import HuggingFacePipeline From 3d42e760a730d2d11f287f9d7a5154fd92ff1598 Mon Sep 17 00:00:00 2001 From: Ella Charlaix Date: Thu, 23 Jan 2025 17:58:04 +0100 Subject: [PATCH 6/6] fix style --- tests/openvino/test_modeling.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/openvino/test_modeling.py b/tests/openvino/test_modeling.py index 6555c6350e..57d4b64764 100644 --- a/tests/openvino/test_modeling.py +++ b/tests/openvino/test_modeling.py @@ -32,7 +32,6 @@ from datasets import load_dataset from evaluate import evaluator from huggingface_hub import HfApi -from packaging import version from parameterized import parameterized from PIL import Image from sentence_transformers import SentenceTransformer @@ -110,7 +109,6 @@ from optimum.intel.pipelines import pipeline as optimum_pipeline from optimum.intel.utils.import_utils import ( _langchain_hf_available, - _langchain_hf_version, is_openvino_version, is_transformers_version, )