From c401254770afa581f3ada22e81bb7defb513fe83 Mon Sep 17 00:00:00 2001 From: Ella Charlaix <80481427+echarlaix@users.noreply.github.com> Date: Sat, 8 Feb 2025 00:21:09 +0100 Subject: [PATCH] huggingface: Add ipex support to HuggingFaceEmbeddings (#29386) ONNX and OpenVINO models are available by specifying the `backend` argument (the model is loaded using `optimum` https://github.com/huggingface/optimum) ```python from langchain_huggingface import HuggingFaceEmbeddings embedding = HuggingFaceEmbeddings( model_name=model_id, model_kwargs={"backend": "onnx"}, ) ``` With this PR we also enable the IPEX backend ```python from langchain_huggingface import HuggingFaceEmbeddings embedding = HuggingFaceEmbeddings( model_name=model_id, model_kwargs={"backend": "ipex"}, ) ``` --- .../embeddings/huggingface.py | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/libs/partners/huggingface/langchain_huggingface/embeddings/huggingface.py b/libs/partners/huggingface/langchain_huggingface/embeddings/huggingface.py index a6a70db2310..a15cd56fa0d 100644 --- a/libs/partners/huggingface/langchain_huggingface/embeddings/huggingface.py +++ b/libs/partners/huggingface/langchain_huggingface/embeddings/huggingface.py @@ -3,8 +3,17 @@ from typing import Any, Dict, List, Optional from langchain_core.embeddings import Embeddings from pydantic import BaseModel, ConfigDict, Field +from ..utils.import_utils import ( + IMPORT_ERROR, + is_ipex_available, + is_optimum_intel_available, + is_optimum_intel_version, +) + DEFAULT_MODEL_NAME = "sentence-transformers/all-mpnet-base-v2" +_MIN_OPTIMUM_VERSION = "1.22" + class HuggingFaceEmbeddings(BaseModel, Embeddings): """HuggingFace sentence_transformers embedding models. @@ -61,7 +70,28 @@ class HuggingFaceEmbeddings(BaseModel, Embeddings): "Please install it with `pip install sentence-transformers`." ) from exc - self._client = sentence_transformers.SentenceTransformer( + if self.model_kwargs.get("backend", "torch") == "ipex": + if not is_optimum_intel_available() or not is_ipex_available(): + raise ImportError( + f'Backend: ipex {IMPORT_ERROR.format("optimum[ipex]")}' + ) + + if is_optimum_intel_version("<", _MIN_OPTIMUM_VERSION): + raise ImportError( + f"Backend: ipex requires optimum-intel>=" + f"{_MIN_OPTIMUM_VERSION}. You can install it with pip: " + "`pip install --upgrade --upgrade-strategy eager " + "`optimum[ipex]`." + ) + + from optimum.intel import IPEXSentenceTransformer # type: ignore[import] + + model_cls = IPEXSentenceTransformer + + else: + model_cls = sentence_transformers.SentenceTransformer + + self._client = model_cls( self.model_name, cache_folder=self.cache_folder, **self.model_kwargs )