From 6190c4b49c8e37cf34443fc0d80a3e1e4911f343 Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Wed, 23 Jul 2025 12:15:23 +0800 Subject: [PATCH 1/9] feat: add embedding model bge-vl-mllm-s1 --- docs/en/supported_models.md | 3 +++ src/emd/models/embeddings/bge_vl.py | 30 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/docs/en/supported_models.md b/docs/en/supported_models.md index ed78a163..0b38796a 100644 --- a/docs/en/supported_models.md +++ b/docs/en/supported_models.md @@ -78,3 +78,6 @@ | bge-reranker-v2-m3 | bge | rerank | g4dn.2xlarge,g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | sagemaker_realtime,ecs | ✅ | | bge-reranker-large | bge | rerank | g4dn.2xlarge,g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | sagemaker_realtime,ecs | ✅ | | jina-reranker-v2-base-multilingual | jina | rerank | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | sagemaker_realtime,ecs | ✅ | +| bge-vl-base | bge | embedding | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | sagemaker_realtime,ecs | ✅ | +| bge-vl-large | bge | embedding | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | ecs | ✅ | +| bge-vl-mllm-s1 | bge | embedding | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | ecs | ✅ | \ No newline at end of file diff --git a/src/emd/models/embeddings/bge_vl.py b/src/emd/models/embeddings/bge_vl.py index c639e4ed..24a45fe4 100644 --- a/src/emd/models/embeddings/bge_vl.py +++ b/src/emd/models/embeddings/bge_vl.py @@ -50,6 +50,7 @@ model_id="bge-vl-large", supported_engines=[huggingface_embedding_engine449], supported_instances=[ + g5dxlarge_instance, g5d2xlarge_instance, g5d4xlarge_instance, g5d8xlarge_instance, @@ -72,3 +73,32 @@ description="BGE-VL-large is a larger multimodal embedding model that supports text, image, and text-image pair inputs for high-performance multimodal representation learning and cross-modal retrieval tasks." ) ) + +Model.register( + dict( + model_id="bge-vl-mllm-s1", + supported_engines=[huggingface_embedding_engine449], + supported_instances=[ + g5dxlarge_instance, + g5d2xlarge_instance, + g5d4xlarge_instance, + g5d8xlarge_instance, + g5d16xlarge_instance, + local_instance, + ], + supported_services=[ + ecs_service + ], + supported_frameworks=[ + fastapi_framework + ], + allow_china_region=True, + huggingface_model_id="BAAI/BGE-VL-MLLM-S1", + modelscope_model_id="BAAI/BGE-VL-MLLM-S1", + require_huggingface_token=False, + application_scenario="Multimodal RAG, composed image retrieval, visual search", + model_type=ModelType.EMBEDDING, + model_series=BGE_SERIES, + description="BGE-VL-MLLM-S1 is a larger multimodal embedding model that supports text, image, and text-image pair inputs for high-performance multimodal representation learning and cross-modal retrieval tasks." + ) +) From da5f92c5b0d20da6d042caac6a303b7b3de8ebf1 Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Wed, 23 Jul 2025 12:20:00 +0800 Subject: [PATCH 2/9] fix: lint issue for new empty line --- docs/en/supported_models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/supported_models.md b/docs/en/supported_models.md index 0b38796a..79b56171 100644 --- a/docs/en/supported_models.md +++ b/docs/en/supported_models.md @@ -80,4 +80,4 @@ | jina-reranker-v2-base-multilingual | jina | rerank | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | sagemaker_realtime,ecs | ✅ | | bge-vl-base | bge | embedding | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | sagemaker_realtime,ecs | ✅ | | bge-vl-large | bge | embedding | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | ecs | ✅ | -| bge-vl-mllm-s1 | bge | embedding | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | ecs | ✅ | \ No newline at end of file +| bge-vl-mllm-s1 | bge | embedding | g5.xlarge,g5.2xlarge,g5.4xlarge,g5.8xlarge,g5.16xlarge | ecs | ✅ | From d2287cfc5c1c8a25b4cf564d155f0bb91d2be13e Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Wed, 23 Jul 2025 16:09:05 +0800 Subject: [PATCH 3/9] feat: add generate_bge_vl_mllm_embeddings mothod --- .../transformers_embedding_backend.py | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py index 559c090f..7a49d8ec 100644 --- a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py +++ b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py @@ -36,6 +36,7 @@ def __init__(self,*args,**kwargs): self.model = None self.pretrained_model_init_kwargs = self.execute_model.executable_config.current_engine.pretrained_model_init_kwargs or {} self.is_bge_vl = "bge-vl" in self.model_id.lower() + self.is_bge_vl_mllm = "bge-vl-mllm" in self.model_id.lower() def start(self): @@ -165,6 +166,62 @@ def _parse_multimodal_inputs(self, inputs): return text_inputs, image_inputs, multimodal_inputs + def _generate_bge_vl_mllm_embeddings(self, inputs): + """Generate embeddings using BGE-VL-MLLM model""" + text_inputs, image_inputs, multimodal_inputs = self._parse_multimodal_inputs(inputs) + all_embeddings = [] + + # Process text-only inputs + if text_inputs: + try: + for text in text_inputs: + candidate_inputs = self.model.data_process( + text=text, + q_or_c="c" + ) + with torch.no_grad(): + text_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] + text_emb = torch.nn.functional.normalize(text_emb, dim=-1) + all_embeddings.append(text_emb.cpu().tolist()[0]) + except Exception as e: + logger.error(f"Failed to encode text inputs with MLLM: {e}") + raise ValueError(f"BGE-VL-MLLM text encoding failed: {e}") + + # Process image-only inputs + if image_inputs: + try: + for bytesio_image in image_inputs: + candidate_inputs = self.model.data_process( + images=bytesio_image, + q_or_c="c" + ) + with torch.no_grad(): + image_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] + image_emb = torch.nn.functional.normalize(image_emb, dim=-1) + all_embeddings.append(image_emb.cpu().tolist()[0]) + except Exception as e: + logger.error(f"Failed to encode image inputs with MLLM: {e}") + raise ValueError(f"BGE-VL-MLLM image encoding failed: {e}") + + # Process multimodal inputs (text + image) + if multimodal_inputs: + for text, bytesio_image in multimodal_inputs: + try: + candidate_inputs = self.model.data_process( + text=text, + images=bytesio_image, + q_or_c="c" + ) + with torch.no_grad(): + multimodal_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] + multimodal_emb = torch.nn.functional.normalize(multimodal_emb, dim=-1) + all_embeddings.append(multimodal_emb.cpu().tolist()[0]) + except Exception as e: + logger.error(f"Failed to encode multimodal input with MLLM: {e}") + raise ValueError(f"BGE-VL-MLLM multimodal encoding failed: {e}") + + return all_embeddings + def _generate_bge_vl_embeddings(self, inputs): """Generate embeddings using BGE-VL model""" text_inputs, image_inputs, multimodal_inputs = self._parse_multimodal_inputs(inputs) @@ -220,7 +277,10 @@ def invoke(self, request:dict): logger.info(f'request: {request}') t0 = time.time() - if self.is_bge_vl: + if self.is_bge_vl_mllm: + # Use BGE-VL-MLLM multimodal processing + embeddings_list = self._generate_bge_vl_mllm_embeddings(inputs) + elif self.is_bge_vl: # Use BGE-VL multimodal processing embeddings_list = self._generate_bge_vl_embeddings(inputs) else: From a4b990ffbe8b38f9612c8b41c5f6323c23f17004 Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Wed, 23 Jul 2025 16:43:54 +0800 Subject: [PATCH 4/9] fix: encode image issue --- .../embedding/transformers_embedding_backend.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py index 7a49d8ec..7fb8003b 100644 --- a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py +++ b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py @@ -191,8 +191,10 @@ def _generate_bge_vl_mllm_embeddings(self, inputs): if image_inputs: try: for bytesio_image in image_inputs: + # Convert BytesIO back to PIL Image for MLLM model + pil_image = Image.open(bytesio_image) candidate_inputs = self.model.data_process( - images=bytesio_image, + images=[pil_image], q_or_c="c" ) with torch.no_grad(): @@ -207,9 +209,11 @@ def _generate_bge_vl_mllm_embeddings(self, inputs): if multimodal_inputs: for text, bytesio_image in multimodal_inputs: try: + # Convert BytesIO back to PIL Image for MLLM model + pil_image = Image.open(bytesio_image) candidate_inputs = self.model.data_process( text=text, - images=bytesio_image, + images=[pil_image], q_or_c="c" ) with torch.no_grad(): From 3f6a863c206f4c160d1d674239a9bb1cc178b4f3 Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Wed, 23 Jul 2025 17:42:20 +0800 Subject: [PATCH 5/9] feat: test image_inputs --- .../transformers_embedding_backend.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py index 7fb8003b..d8751cb2 100644 --- a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py +++ b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py @@ -190,17 +190,16 @@ def _generate_bge_vl_mllm_embeddings(self, inputs): # Process image-only inputs if image_inputs: try: - for bytesio_image in image_inputs: - # Convert BytesIO back to PIL Image for MLLM model - pil_image = Image.open(bytesio_image) - candidate_inputs = self.model.data_process( - images=[pil_image], - q_or_c="c" - ) - with torch.no_grad(): - image_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] - image_emb = torch.nn.functional.normalize(image_emb, dim=-1) - all_embeddings.append(image_emb.cpu().tolist()[0]) + candidate_inputs = self.model.data_process( + images=image_inputs, + q_or_c="c" + ) + image_embeddings = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] + image_embeddings = torch.nn.functional.normalize(image_embeddings, dim=-1) + if hasattr(image_embeddings, 'tolist'): + all_embeddings.extend(image_embeddings.tolist()) + else: + all_embeddings.extend(image_embeddings) except Exception as e: logger.error(f"Failed to encode image inputs with MLLM: {e}") raise ValueError(f"BGE-VL-MLLM image encoding failed: {e}") From 9f7ebc25c62d8f6a0236a80b5457524cc4e22cd7 Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Thu, 24 Jul 2025 09:34:52 +0800 Subject: [PATCH 6/9] feat: change to engine447, add torch.no_grad and eval mode --- src/emd/models/embeddings/bge_vl.py | 4 +-- src/emd/models/engines.py | 11 ++++++ .../transformers_embedding_backend.py | 34 +++++++++++-------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/emd/models/embeddings/bge_vl.py b/src/emd/models/embeddings/bge_vl.py index 24a45fe4..b9d53f76 100644 --- a/src/emd/models/embeddings/bge_vl.py +++ b/src/emd/models/embeddings/bge_vl.py @@ -1,5 +1,5 @@ from .. import Model -from ..engines import huggingface_embedding_engine449 +from ..engines import huggingface_embedding_engine449, huggingface_embedding_engine447 from ..services import sagemaker_service, local_service, ecs_service from ..frameworks import fastapi_framework from ..instances import ( @@ -77,7 +77,7 @@ Model.register( dict( model_id="bge-vl-mllm-s1", - supported_engines=[huggingface_embedding_engine449], + supported_engines=[huggingface_embedding_engine447], supported_instances=[ g5dxlarge_instance, g5d2xlarge_instance, diff --git a/src/emd/models/engines.py b/src/emd/models/engines.py index f2812746..6a0f2a9f 100644 --- a/src/emd/models/engines.py +++ b/src/emd/models/engines.py @@ -507,6 +507,17 @@ class KtransformersEngine(OpenAICompitableEngine): "pretrained_tokenizer_init_kwargs":{"trust_remote_code":True} }) +huggingface_embedding_engine447 = HuggingFaceLLMEngine(**{ + "engine_type":EngineType.HUGGINGFACE, + "engine_cls":"huggingface.embedding.transformers_embedding_backend.TransformerEmbeddingBackend", + "python_name":"python3", + "base_image_host":"public.ecr.aws", + "use_public_ecr":True, + "docker_login_region":"us-east-1", + "engine_dockerfile_config": {"VERSION":"4.47.0"}, + "pretrained_model_init_kwargs":{"trust_remote_code":True,"torch_dtype":"float16"}, +}) + huggingface_embedding_engine449 = HuggingFaceLLMEngine(**{ "engine_type":EngineType.HUGGINGFACE, "engine_cls":"huggingface.embedding.transformers_embedding_backend.TransformerEmbeddingBackend", diff --git a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py index d8751cb2..9bad3f0b 100644 --- a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py +++ b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py @@ -37,6 +37,7 @@ def __init__(self,*args,**kwargs): self.pretrained_model_init_kwargs = self.execute_model.executable_config.current_engine.pretrained_model_init_kwargs or {} self.is_bge_vl = "bge-vl" in self.model_id.lower() self.is_bge_vl_mllm = "bge-vl-mllm" in self.model_id.lower() + self.model_abs_path = None def start(self): @@ -49,7 +50,7 @@ def start(self): s3_key = model_dir, model_files_s3_path=self.model_files_s3_path ) - model_abs_path = os.path.abspath(model_dir) + self.model_abs_path = os.path.abspath(model_dir) # TODO add model init args from model's definition torch_dtype = self.pretrained_model_init_kwargs.get("torch_dtype") @@ -62,15 +63,18 @@ def start(self): }[torch_dtype] self.model = AutoModel.from_pretrained( - model_abs_path, + self.model_abs_path, device_map="cuda", **self.pretrained_model_init_kwargs ) + + if self.is_bge_vl_mllm: + self.model.eval() # BGE-VL specific initialization - if self.is_bge_vl: + if self.is_bge_vl and not self.is_bge_vl_mllm: try: - self.model.set_processor(model_abs_path) + self.model.set_processor(self.model_abs_path) logger.info(f"BGE-VL processor set successfully for model: {self.model_id}") except Exception as e: logger.warning(f"Failed to set BGE-VL processor: {e}") @@ -190,16 +194,18 @@ def _generate_bge_vl_mllm_embeddings(self, inputs): # Process image-only inputs if image_inputs: try: - candidate_inputs = self.model.data_process( - images=image_inputs, - q_or_c="c" - ) - image_embeddings = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] - image_embeddings = torch.nn.functional.normalize(image_embeddings, dim=-1) - if hasattr(image_embeddings, 'tolist'): - all_embeddings.extend(image_embeddings.tolist()) - else: - all_embeddings.extend(image_embeddings) + with torch.no_grad(): + self.model.set_processor(self.model_abs_path) + candidate_inputs = self.model.data_process( + images=image_inputs, + q_or_c="c" + ) + image_embeddings = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] + image_embeddings = torch.nn.functional.normalize(image_embeddings, dim=-1) + if hasattr(image_embeddings, 'tolist'): + all_embeddings.extend(image_embeddings.tolist()) + else: + all_embeddings.extend(image_embeddings) except Exception as e: logger.error(f"Failed to encode image inputs with MLLM: {e}") raise ValueError(f"BGE-VL-MLLM image encoding failed: {e}") From 5bf09228dc1496f2d6ae469ab353fcf4a99cd6de Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Thu, 24 Jul 2025 09:41:57 +0800 Subject: [PATCH 7/9] fix: trailing-whitespace issue --- .../huggingface/embedding/transformers_embedding_backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py index 9bad3f0b..f55dfa44 100644 --- a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py +++ b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py @@ -67,7 +67,7 @@ def start(self): device_map="cuda", **self.pretrained_model_init_kwargs ) - + if self.is_bge_vl_mllm: self.model.eval() From aa095b79609049d0d779e2ed3265e382e5e257da Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Thu, 24 Jul 2025 14:51:35 +0800 Subject: [PATCH 8/9] feat: add huggingface_embedding_engine_447, fix text and multimodal input --- .gitignore | 1 + src/emd/models/embeddings/bge_vl.py | 4 +- src/emd/models/engines.py | 2 +- .../transformers_embedding_backend.py | 51 +++++++++++-------- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 83cb7854..a22b1976 100644 --- a/.gitignore +++ b/.gitignore @@ -134,3 +134,4 @@ emd_models/ **artifacts src/pipeline/emd *.log +.venv-vl/* \ No newline at end of file diff --git a/src/emd/models/embeddings/bge_vl.py b/src/emd/models/embeddings/bge_vl.py index b9d53f76..72738f54 100644 --- a/src/emd/models/embeddings/bge_vl.py +++ b/src/emd/models/embeddings/bge_vl.py @@ -1,5 +1,5 @@ from .. import Model -from ..engines import huggingface_embedding_engine449, huggingface_embedding_engine447 +from ..engines import huggingface_embedding_engine449, huggingface_embedding_engine_447 from ..services import sagemaker_service, local_service, ecs_service from ..frameworks import fastapi_framework from ..instances import ( @@ -77,7 +77,7 @@ Model.register( dict( model_id="bge-vl-mllm-s1", - supported_engines=[huggingface_embedding_engine447], + supported_engines=[huggingface_embedding_engine_447], supported_instances=[ g5dxlarge_instance, g5d2xlarge_instance, diff --git a/src/emd/models/engines.py b/src/emd/models/engines.py index 6a0f2a9f..782d4122 100644 --- a/src/emd/models/engines.py +++ b/src/emd/models/engines.py @@ -507,7 +507,7 @@ class KtransformersEngine(OpenAICompitableEngine): "pretrained_tokenizer_init_kwargs":{"trust_remote_code":True} }) -huggingface_embedding_engine447 = HuggingFaceLLMEngine(**{ +huggingface_embedding_engine_447 = HuggingFaceLLMEngine(**{ "engine_type":EngineType.HUGGINGFACE, "engine_cls":"huggingface.embedding.transformers_embedding_backend.TransformerEmbeddingBackend", "python_name":"python3", diff --git a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py index f55dfa44..6177fb6e 100644 --- a/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py +++ b/src/pipeline/backend/huggingface/embedding/transformers_embedding_backend.py @@ -178,15 +178,18 @@ def _generate_bge_vl_mllm_embeddings(self, inputs): # Process text-only inputs if text_inputs: try: - for text in text_inputs: + with torch.no_grad(): + self.model.set_processor(self.model_abs_path) candidate_inputs = self.model.data_process( - text=text, + text=text_inputs, q_or_c="c" ) - with torch.no_grad(): - text_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] - text_emb = torch.nn.functional.normalize(text_emb, dim=-1) - all_embeddings.append(text_emb.cpu().tolist()[0]) + text_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] + text_emb = torch.nn.functional.normalize(text_emb, dim=-1) + if hasattr(text_emb, 'tolist'): + all_embeddings.extend(text_emb.tolist()) + else: + all_embeddings.extend(text_emb) except Exception as e: logger.error(f"Failed to encode text inputs with MLLM: {e}") raise ValueError(f"BGE-VL-MLLM text encoding failed: {e}") @@ -212,22 +215,26 @@ def _generate_bge_vl_mllm_embeddings(self, inputs): # Process multimodal inputs (text + image) if multimodal_inputs: - for text, bytesio_image in multimodal_inputs: - try: - # Convert BytesIO back to PIL Image for MLLM model - pil_image = Image.open(bytesio_image) - candidate_inputs = self.model.data_process( - text=text, - images=[pil_image], - q_or_c="c" - ) - with torch.no_grad(): - multimodal_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] - multimodal_emb = torch.nn.functional.normalize(multimodal_emb, dim=-1) - all_embeddings.append(multimodal_emb.cpu().tolist()[0]) - except Exception as e: - logger.error(f"Failed to encode multimodal input with MLLM: {e}") - raise ValueError(f"BGE-VL-MLLM multimodal encoding failed: {e}") + with torch.no_grad(): + self.model.set_processor(self.model_abs_path) + for text, bytesio_image in multimodal_inputs: + try: + # Convert BytesIO back to PIL Image for MLLM model + candidate_inputs = self.model.data_process( + text=[text], + images=[bytesio_image], + q_or_c="c" + ) + with torch.no_grad(): + multimodal_emb = self.model(**candidate_inputs, output_hidden_states=True)[:, -1, :] + multimodal_emb = torch.nn.functional.normalize(multimodal_emb, dim=-1) + if hasattr(multimodal_emb, 'tolist'): + all_embeddings.extend(multimodal_emb.tolist()) + else: + all_embeddings.extend(multimodal_emb) + except Exception as e: + logger.error(f"Failed to encode multimodal input with MLLM: {e}") + raise ValueError(f"BGE-VL-MLLM multimodal encoding failed: {e}") return all_embeddings From fc5ac35dd000e149f8a3a21bc4ab2d9901698af5 Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Thu, 24 Jul 2025 14:54:28 +0800 Subject: [PATCH 9/9] feat: fix lint issue --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a22b1976..99126390 100644 --- a/.gitignore +++ b/.gitignore @@ -134,4 +134,4 @@ emd_models/ **artifacts src/pipeline/emd *.log -.venv-vl/* \ No newline at end of file +.venv-vl/*