Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions docs/adding_a_model.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,17 @@ model = ModelMeta(
...
)
```

##### Adding model dependencies in pyproject.toml
If your are adding a model that requires additional dependencies, you can add them to the `pyproject.toml` file and instead of checking whether dependencies are installed or not make use of `requires_package` from [requires_package.py](../mteb/requires_packages.py). For example:

In the [voyage_models.py](../mteb/models/voyage_models.py) file, we have added the following code:
```python
requires_package(self, "voyageai", model_name, "pip install 'mteb[voyageai]'")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add import

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is minor. Feel free to ignore or add in a second pr

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool, Will add next time in other PR. Thanks for reviewing.

```
and also updated [pyproject.toml]((../pyproject.toml)) file with the following code:
```python
voyageai = ["voyageai>=1.0.0,<2.0.0"]
```
so that it will check whether voyageai is installed or not. If not, then it will give an error message to install voyageai. This has done so as to give clear installation warnings.
If you want to give suggestion instead of warning, you can use `suggest_package` from [requires_package.py](../mteb/requires_packages.py).
16 changes: 8 additions & 8 deletions mteb/models/blip2_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@

from mteb.encoder_interface import PromptType
from mteb.model_meta import ModelMeta
from mteb.requires_package import requires_package


def blip2_loader(**kwargs):
try: # a temporal fix for the dependency issues.
from lavis.models.blip2_models.blip2_image_text_matching import (
Blip2ITM,
)
except ImportError:
raise ImportError(
"Please install `pip install mteb[blip2]` to use BLIP-2 models."
)
model_name = kwargs.get("model_name", "BLIP-2")
requires_package(
blip2_loader, "salesforce-lavis", model_name, "pip install 'mteb[blip2]'"
)
from lavis.models.blip2_models.blip2_image_text_matching import (
Blip2ITM,
)

class BLIP2ModelWrapper:
def __init__(
Expand Down
12 changes: 5 additions & 7 deletions mteb/models/bm25.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,16 @@
from mteb.evaluation.evaluators.RetrievalEvaluator import DRESModel
from mteb.model_meta import ModelMeta
from mteb.models.wrapper import Wrapper
from mteb.requires_package import requires_package

logger = logging.getLogger(__name__)


def bm25_loader(**kwargs):
try:
import bm25s
import Stemmer
except ImportError:
raise ImportError(
"bm25s or PyStemmer is not installed. Please install it with `pip install mteb[bm25s]`."
)
model_name = kwargs.get("model_name", "BM25")
requires_package(bm25_loader, "bm25s", model_name, "pip install mteb[bm25s]")
import bm25s
import Stemmer

class BM25Search(DRESModel, Wrapper):
"""BM25 search"""
Expand Down
11 changes: 6 additions & 5 deletions mteb/models/cohere_v.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@

from mteb.encoder_interface import PromptType
from mteb.model_meta import ModelMeta
from mteb.requires_package import requires_image_dependencies
from mteb.requires_package import requires_image_dependencies, requires_package


def cohere_v_loader(**kwargs):
try:
import cohere
except ImportError:
raise ImportError("To use cohere models, please run `pip install cohere`.")
model_name = kwargs.get("model_name", "Cohere")
requires_package(
cohere_v_loader, "cohere", model_name, "pip install 'mteb[cohere]'"
)
import cohere

class CohereMultiModalModelWrapper:
def __init__(
Expand Down
9 changes: 3 additions & 6 deletions mteb/models/colbert_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from mteb.encoder_interface import PromptType
from mteb.model_meta import ModelMeta
from mteb.models.wrapper import Wrapper
from mteb.requires_package import requires_package

logger = logging.getLogger(__name__)

Expand All @@ -34,12 +35,8 @@ def __init__(
and finally to the specific prompt type.
**kwargs: Additional arguments to pass to the model.
"""
try:
from pylate import models as colbert_model
except ModuleNotFoundError as e:
raise ModuleNotFoundError(
"To use the ColBERT models `pylate` is required. Please install it with `pip install mteb[pylate]`."
) from e
requires_package(self, "pylate", model_name, "pip install mteb[pylate]")
from pylate import models as colbert_model

self.model_name = model_name
self.model = colbert_model.ColBERT(self.model_name, revision=revision, **kwargs)
Expand Down
12 changes: 6 additions & 6 deletions mteb/models/google_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from mteb.encoder_interface import Encoder, PromptType
from mteb.model_meta import ModelMeta
from mteb.models.wrapper import Wrapper
from mteb.requires_package import requires_package

MULTILINGUAL_EVALUATED_LANGUAGES = [
"arb_Arab",
Expand Down Expand Up @@ -74,12 +75,11 @@ def _embed(
"""Embeds texts with a pre-trained, foundational model.
From https://cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-text-embeddings#generative-ai-get-text-embedding-python_vertex_ai_sdk
"""
try:
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel
except ImportError:
raise ImportError(
"The `vertexai` package is required to run the google API, please install it using `pip install vertexai`"
)
requires_package(
self, "vertexai", self.model_name, "pip install 'mteb[vertexai]'"
)
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

model = TextEmbeddingModel.from_pretrained(self.model_name)
if titles:
# Allow title-only embeddings by replacing text with a space
Expand Down
11 changes: 5 additions & 6 deletions mteb/models/instruct_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

from mteb.encoder_interface import PromptType
from mteb.models.wrapper import Wrapper
from mteb.requires_package import requires_package

logger = logging.getLogger(__name__)

Expand All @@ -20,12 +21,10 @@ def instruct_wrapper(
instruction_template: str | Callable[[str], str] | None = None,
**kwargs,
):
try:
from gritlm import GritLM
except ImportError:
raise ImportError(
f"Please install `pip install mteb[gritlm]` to use {model_name_or_path}."
)
requires_package(
instruct_wrapper, "gritlm", model_name_or_path, "pip install 'mteb[gritlm]'"
)
from gritlm import GritLM

class InstructWrapper(GritLM, Wrapper):
def __init__(
Expand Down
22 changes: 9 additions & 13 deletions mteb/models/jina_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from mteb.encoder_interface import PromptType
from mteb.model_meta import ModelMeta
from mteb.models.sentence_transformer_wrapper import SentenceTransformerWrapper
from mteb.requires_package import requires_package

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -140,19 +141,14 @@ def __init__(
raise RuntimeError(
f"sentence_transformers version {st_version} is lower than the required version 3.1.0"
)
try:
import einops # noqa: F401
except ImportError:
raise ImportError(
"To use the jina-embeddings-v3 models `einops` is required. Please install it with `pip install mteb[jina]`."
)
try:
import flash_attn # noqa: F401
except ImportError:
logger.warning(
"Using flash_attn for jina-embeddings-v3 models is recommended. Please install it with `pip install mteb[flash_attention]`."
"Fallback to native implementation."
)
requires_package(self, "jina", model, "pip install 'mteb[jina]'")
import einops # noqa: F401

requires_package(
self, "flash_attention", model, "pip install 'mteb[flash_attention]'"
)
import flash_attn # noqa: F401

super().__init__(model, revision, model_prompts, **kwargs)

def encode(
Expand Down
14 changes: 6 additions & 8 deletions mteb/models/llm2clip_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

from mteb.encoder_interface import PromptType
from mteb.model_meta import ModelMeta
from mteb.requires_package import requires_image_dependencies
from mteb.requires_package import requires_image_dependencies, requires_package

MODEL2PROCESSOR = {
"microsoft/LLM2CLIP-Openai-L-14-336": "openai/clip-vit-large-patch14-336",
Expand All @@ -22,13 +22,11 @@


def llm2clip_loader(**kwargs):
try:
from llm2vec import LLM2Vec
except ImportError:
# https://github.com/baaivision/EVA/tree/master/EVA-CLIP#setup
raise ImportError(
"To use the LLM2CLIP models `llm2vec` is required. Please install it with `pip install llm2vec`."
)
model_name = kwargs.get("model_name", "LLM2CLIP")
requires_package(
llm2clip_loader, "llm2vec", model_name, "pip install 'mteb[llm2vec]'"
)
from llm2vec import LLM2Vec

class LLM2CLIPWrapper:
def __init__(
Expand Down
25 changes: 13 additions & 12 deletions mteb/models/llm2vec_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from mteb.encoder_interface import Encoder, PromptType
from mteb.model_meta import ModelMeta
from mteb.models.wrapper import Wrapper
from mteb.requires_package import requires_package, suggest_package

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -56,21 +57,21 @@ def __init__(
*args,
**kwargs,
):
try:
from llm2vec import LLM2Vec
except ImportError:
raise ImportError(
"To use the LLM2Vec models `llm2vec` is required. Please install it with `pip install llm2vec`."
)
model_name = kwargs.get("model_name", "LLM2Vec")
requires_package(self, "llm2vec", model_name, "pip install 'mteb[llm2vec]'")
from llm2vec import LLM2Vec

extra_kwargs = {}
try:
import flash_attn # noqa
if suggest_package(
self,
"flash_attn",
model_name,
"pip install flash-attn --no-build-isolation",
):
import flash_attn # noqa: F401

extra_kwargs["attn_implementation"] = "flash_attention_2"
except ImportError:
logger.warning(
"LLM2Vec models were trained with flash attention enabled. For optimal performance, please install the `flash_attn` package with `pip install flash-attn --no-build-isolation`."
)

self.model_prompts = (
self.validate_task_to_prompt_name(model_prompts) if model_prompts else None
)
Expand Down
9 changes: 4 additions & 5 deletions mteb/models/moco_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,13 @@

from mteb.encoder_interface import PromptType
from mteb.model_meta import ModelMeta
from mteb.requires_package import requires_image_dependencies
from mteb.requires_package import requires_image_dependencies, requires_package


def mocov3_loader(**kwargs):
try:
import timm
except ImportError:
raise ImportError("Please install `pip install timm` to use MOCOv3 models.")
model_name = kwargs.get("model_name", "MOCOv3")
requires_package(mocov3_loader, "timm", model_name, "pip install 'mteb[timm]'")
import timm

class MOCOv3Wrapper:
"""A wrapper class for MOCOv3 models that supports image encoding.
Expand Down
9 changes: 3 additions & 6 deletions mteb/models/model2vec_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from mteb.model_meta import ModelMeta
from mteb.models.bge_models import bge_training_data
from mteb.models.wrapper import Wrapper
from mteb.requires_package import requires_package

logger = logging.getLogger(__name__)

Expand All @@ -26,12 +27,8 @@ def __init__(
model_name: The Model2Vec model to load from HuggingFace Hub.
**kwargs: Additional arguments to pass to the wrapper.
"""
try:
from model2vec import StaticModel # type: ignore
except ModuleNotFoundError as e:
raise ModuleNotFoundError(
"To use the Model2Vec models `model2vec` is required. Please install it with `pip install mteb[model2vec]`."
) from e
requires_package(self, "model2vec", model_name, "pip install 'mteb[model2vec]'")
from model2vec import StaticModel # type: ignore

self.model_name = model_name
self.static_model = StaticModel.from_pretrained(self.model_name)
Expand Down
8 changes: 4 additions & 4 deletions mteb/models/openai_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,16 @@ def __init__(
requires_package(
self,
"openai",
"Openai text embedding",
install_instruction="pip install mteb[openai]",
model_name,
install_instruction="pip install 'mteb[openai]'",
)
from openai import OpenAI

requires_package(
self,
"tiktoken",
"Tiktoken package",
install_instruction="pip install mteb[openai]",
model_name,
install_instruction="pip install 'mteb[openai]'",
)
import tiktoken

Expand Down
14 changes: 9 additions & 5 deletions mteb/models/openclip_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,18 @@

from mteb.encoder_interface import PromptType
from mteb.model_meta import ModelMeta
from mteb.requires_package import requires_image_dependencies
from mteb.requires_package import requires_image_dependencies, requires_package


def openclip_loader(**kwargs):
try:
import open_clip
except ImportError:
raise ImportError("Please run `pip install open_clip_torch`.")
model_name = kwargs.get("model_name", "CLIP-ViT")
requires_package(
openclip_loader,
"open_clip_torch",
model_name,
"pip install 'mteb[open_clip_torch]'",
)
import open_clip

class OpenCLIPWrapper:
def __init__(
Expand Down
11 changes: 5 additions & 6 deletions mteb/models/repllama_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from mteb.encoder_interface import Encoder, PromptType
from mteb.model_meta import ModelMeta
from mteb.models.wrapper import Wrapper
from mteb.requires_package import requires_package

logger = logging.getLogger(__name__)

Expand All @@ -26,12 +27,10 @@ def __init__(
model_prompts: dict[str, str] | None = None,
**kwargs,
):
try:
from peft import PeftModel
except ImportError:
raise ImportError(
"To use the RepLLaMA based models `peft` is required. Please install it with `pip install 'mteb[peft]'`."
)
requires_package(
self, "peft", peft_model_name_or_path, "pip install 'mteb[peft]'"
)
from peft import PeftModel

self.base_model = AutoModel.from_pretrained(
base_model_name_or_path,
Expand Down
Loading