From dd3d4578e423d4f804ee2c1787045abfb9004d7c Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Mon, 12 Aug 2024 13:01:58 +0200 Subject: [PATCH 1/8] Pin `0.4.3dev0` version for upcoming release --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3458aa57..605e67b5 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ # We don't declare our dependency on transformers here because we build with # different packages for different variants -VERSION = "0.4.2" +VERSION = "0.4.3.dev0" # Ubuntu packages # libsndfile1-dev: torchaudio requires the development version of the libsndfile package which can be installed via a system package manager. On Ubuntu it can be installed as follows: apt install libsndfile1-dev From ab791301c4fe5443924f7731395472df863a7d12 Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Mon, 12 Aug 2024 16:36:17 +0200 Subject: [PATCH 2/8] Fix `sentence-transformers` unit tests --- .../sentence_transformers_utils.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/huggingface_inference_toolkit/sentence_transformers_utils.py b/src/huggingface_inference_toolkit/sentence_transformers_utils.py index a4df0955..88265999 100644 --- a/src/huggingface_inference_toolkit/sentence_transformers_utils.py +++ b/src/huggingface_inference_toolkit/sentence_transformers_utils.py @@ -16,7 +16,9 @@ def __init__(self, model_dir: str, device: str = None): # needs "cuda" for GPU self.model = SentenceTransformer(model_dir, device=device) def __call__(self, inputs=None): - embeddings1 = self.model.encode(inputs["source_sentence"], convert_to_tensor=True) + embeddings1 = self.model.encode( + inputs["source_sentence"], convert_to_tensor=True + ) embeddings2 = self.model.encode(inputs["sentences"], convert_to_tensor=True) similarities = util.pytorch_cos_sim(embeddings1, embeddings2).tolist()[0] return {"similarities": similarities} @@ -47,12 +49,7 @@ def __call__(self, inputs): } -def get_sentence_transformers_pipeline( - task=None, - model_dir=None, - device=-1, - **kwargs -): +def get_sentence_transformers_pipeline(task=None, model_dir=None, device=-1, **kwargs): device = "cuda" if device == 0 else "cpu" - pipeline = SENTENCE_TRANSFORMERS_TASKS[task](model_dir=model_dir, device=device, **kwargs) + pipeline = SENTENCE_TRANSFORMERS_TASKS[task](model_dir=model_dir, device=device) return pipeline From eb295414707328857d4dfba40d0422944f929529 Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Mon, 12 Aug 2024 16:41:04 +0200 Subject: [PATCH 3/8] Move `peft` out of core dependencies `peft` requires `torch` as a mandatory dependency, so adding `peft` as a core dependency means that `torch` will be installed i.e. even when `pip install -e ".[quality]"` which slows things a bit, since `torch` installation takes time; and in some cases is not needed, so moving `peft` into the `torch` extra makes the most sense for the moment (not final). --- setup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 605e67b5..ab7f4ab4 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,6 @@ install_requires = [ "transformers[sklearn,sentencepiece,audio,vision,sentencepiece]==4.44.0", "huggingface_hub[hf_transfer]==0.24.5", - "peft==0.12.0", # vision "Pillow", "librosa", @@ -34,7 +33,9 @@ extras["st"] = ["sentence_transformers==2.7.0"] extras["diffusers"] = ["diffusers==0.30.0", "accelerate==0.33.0"] -extras["torch"] = ["torch==2.2.2", "torchvision", "torchaudio"] +# Includes `peft` as PEFT requires `torch` so having `peft` as a core dependency +# means that `torch` will be installed even if the `torch` extra is not specified. +extras["torch"] = ["torch==2.2.2", "torchvision", "torchaudio", "peft==0.12.0"] extras["test"] = [ "pytest==7.2.1", "pytest-xdist", From 37ec04d95a69d329471badb7803a141ed5482b13 Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Mon, 12 Aug 2024 16:47:13 +0200 Subject: [PATCH 4/8] Fix `trust_remote_code` propagation for `sentence-transformers` --- .../sentence_transformers_utils.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/huggingface_inference_toolkit/sentence_transformers_utils.py b/src/huggingface_inference_toolkit/sentence_transformers_utils.py index 88265999..c5502373 100644 --- a/src/huggingface_inference_toolkit/sentence_transformers_utils.py +++ b/src/huggingface_inference_toolkit/sentence_transformers_utils.py @@ -51,5 +51,14 @@ def __call__(self, inputs): def get_sentence_transformers_pipeline(task=None, model_dir=None, device=-1, **kwargs): device = "cuda" if device == 0 else "cpu" - pipeline = SENTENCE_TRANSFORMERS_TASKS[task](model_dir=model_dir, device=device) - return pipeline + + kwargs.pop("tokenizer", None) + kwargs.pop("framework", None) + + if task not in SENTENCE_TRANSFORMERS_TASKS: + raise ValueError( + f"Unknown task {task}. Available tasks are: {', '.join(SENTENCE_TRANSFORMERS_TASKS.keys())}" + ) + return SENTENCE_TRANSFORMERS_TASKS[task]( + model_dir=model_dir, device=device, **kwargs + ) From c9ec192eba3e93b8b5cfb7efb155a64e417d7abe Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Mon, 12 Aug 2024 16:54:00 +0200 Subject: [PATCH 5/8] Add missing return type-hint --- src/huggingface_inference_toolkit/vertex_ai_utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/huggingface_inference_toolkit/vertex_ai_utils.py b/src/huggingface_inference_toolkit/vertex_ai_utils.py index 885c2d07..9a569505 100644 --- a/src/huggingface_inference_toolkit/vertex_ai_utils.py +++ b/src/huggingface_inference_toolkit/vertex_ai_utils.py @@ -8,7 +8,9 @@ # copied from https://github.com/googleapis/python-aiplatform/blob/94d838d8cfe1599bc2d706e66080c05108821986/google/cloud/aiplatform/utils/prediction_utils.py#L121 -def _load_repository_from_gcs(artifact_uri: str, target_dir: Union[str, Path] = "/tmp"): +def _load_repository_from_gcs( + artifact_uri: str, target_dir: Union[str, Path] = "/tmp" +) -> str: """ Load files from GCS path to target_dir """ From e8af0f6c663b4f391ce62d3d9225cef4bdfcd065 Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Mon, 12 Aug 2024 16:54:27 +0200 Subject: [PATCH 6/8] Fix `test__load_repository_from_gcs` to rely on `create_anonymous_client` --- tests/unit/test_vertex_ai_utils.py | 38 +++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_vertex_ai_utils.py b/tests/unit/test_vertex_ai_utils.py index eca64f29..8f31d8b2 100644 --- a/tests/unit/test_vertex_ai_utils.py +++ b/tests/unit/test_vertex_ai_utils.py @@ -1,10 +1,10 @@ from pathlib import Path -from huggingface_inference_toolkit.vertex_ai_utils import _load_repository_from_gcs - def test__load_repository_from_gcs(): - """Tests the `_load_repository_from_gcs` function against a public artifact URI. + """Tests the `_load_repository_from_gcs` function against a public artifact URI. But the + function is overriden since the client needs to be anonymous temporarily, as we're testing + against a publicly accessible artifact. References: - https://cloud.google.com/storage/docs/public-datasets/era5 @@ -14,6 +14,38 @@ def test__load_repository_from_gcs(): public_artifact_uri = ( "gs://gcp-public-data-arco-era5/raw/date-variable-static/2021/12/31/soil_type" ) + + def _load_repository_from_gcs(artifact_uri: str, target_dir: Path) -> str: + """Temporarily override of the `_load_repository_from_gcs` function.""" + import re + + from google.cloud import storage + from huggingface_inference_toolkit.vertex_ai_utils import GCS_URI_PREFIX + + if isinstance(target_dir, str): + target_dir = Path(target_dir) + + if artifact_uri.startswith(GCS_URI_PREFIX): + matches = re.match(f"{GCS_URI_PREFIX}(.*?)/(.*)", artifact_uri) + bucket_name, prefix = matches.groups() # type: ignore + + gcs_client = storage.Client.create_anonymous_client() + blobs = gcs_client.list_blobs(bucket_name, prefix=prefix) + for blob in blobs: + name_without_prefix = blob.name[len(prefix) :] + name_without_prefix = ( + name_without_prefix[1:] + if name_without_prefix.startswith("/") + else name_without_prefix + ) + file_split = name_without_prefix.split("/") + directory = target_dir / Path(*file_split[0:-1]) + directory.mkdir(parents=True, exist_ok=True) + if name_without_prefix and not name_without_prefix.endswith("/"): + blob.download_to_filename(target_dir / name_without_prefix) + + return str(target_dir.absolute()) + target_dir = Path.cwd() / "target" target_dir_path = _load_repository_from_gcs( artifact_uri=public_artifact_uri, target_dir=target_dir From 7f02cf596f98510c2f84e1ff613b980d12b6fe79 Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Tue, 13 Aug 2024 08:48:17 +0200 Subject: [PATCH 7/8] Fix `kwargs` propagation for `sentence-transformers` --- .../sentence_transformers_utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/huggingface_inference_toolkit/sentence_transformers_utils.py b/src/huggingface_inference_toolkit/sentence_transformers_utils.py index c5502373..6b55ae76 100644 --- a/src/huggingface_inference_toolkit/sentence_transformers_utils.py +++ b/src/huggingface_inference_toolkit/sentence_transformers_utils.py @@ -12,8 +12,8 @@ def is_sentence_transformers_available(): class SentenceSimilarityPipeline: - def __init__(self, model_dir: str, device: str = None): # needs "cuda" for GPU - self.model = SentenceTransformer(model_dir, device=device) + def __init__(self, model_dir: str, device: str = None, **kwargs): # needs "cuda" for GPU + self.model = SentenceTransformer(model_dir, device=device, **kwargs) def __call__(self, inputs=None): embeddings1 = self.model.encode( @@ -25,8 +25,8 @@ def __call__(self, inputs=None): class SentenceEmbeddingPipeline: - def __init__(self, model_dir: str, device: str = None): # needs "cuda" for GPU - self.model = SentenceTransformer(model_dir, device=device) + def __init__(self, model_dir: str, device: str = None, **kwargs): # needs "cuda" for GPU + self.model = SentenceTransformer(model_dir, device=device, **kwargs) def __call__(self, inputs): embeddings = self.model.encode(inputs).tolist() @@ -34,8 +34,8 @@ def __call__(self, inputs): class RankingPipeline: - def __init__(self, model_dir: str, device: str = None): # needs "cuda" for GPU - self.model = CrossEncoder(model_dir, device=device) + def __init__(self, model_dir: str, device: str = None, **kwargs): # needs "cuda" for GPU + self.model = CrossEncoder(model_dir, device=device, **kwargs) def __call__(self, inputs): scores = self.model.predict(inputs).tolist() From e4a0e0d8534bceebb1dc99a6d51c29eb966dfb67 Mon Sep 17 00:00:00 2001 From: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com> Date: Tue, 13 Aug 2024 09:28:08 +0200 Subject: [PATCH 8/8] Bump version to 0.4.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ab7f4ab4..83847136 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ # We don't declare our dependency on transformers here because we build with # different packages for different variants -VERSION = "0.4.3.dev0" +VERSION = "0.4.3" # Ubuntu packages # libsndfile1-dev: torchaudio requires the development version of the libsndfile package which can be installed via a system package manager. On Ubuntu it can be installed as follows: apt install libsndfile1-dev