From 34d9188e1316ef73905b0e11344b2b9a26656bae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Boschi?= Date: Wed, 4 Feb 2026 13:12:30 +0100 Subject: [PATCH] fix: hide hf logging (#295) --- docker/standalone/Dockerfile | 8 ++++++ .../hindsight_api/engine/cross_encoder.py | 28 +++++++++++++++---- .../hindsight_api/engine/embeddings.py | 28 +++++++++++++++---- 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/docker/standalone/Dockerfile b/docker/standalone/Dockerfile index 939ed36b..4df87588 100644 --- a/docker/standalone/Dockerfile +++ b/docker/standalone/Dockerfile @@ -208,6 +208,10 @@ ENV HINDSIGHT_API_LOG_LEVEL=info ENV HINDSIGHT_ENABLE_API=true ENV HINDSIGHT_ENABLE_CP=false ENV PYTHONUNBUFFERED=1 +# Suppress verbose transformers/HuggingFace model loading warnings +ENV TRANSFORMERS_VERBOSITY=error +ENV HF_HUB_VERBOSITY=error +ENV TOKENIZERS_PARALLELISM=false CMD ["/app/start-all.sh"] @@ -336,6 +340,10 @@ ENV HINDSIGHT_CP_DATAPLANE_API_URL=http://localhost:8888 ENV HINDSIGHT_ENABLE_API=true ENV HINDSIGHT_ENABLE_CP=true ENV PYTHONUNBUFFERED=1 +# Suppress verbose transformers/HuggingFace model loading warnings +ENV TRANSFORMERS_VERBOSITY=error +ENV HF_HUB_VERBOSITY=error +ENV TOKENIZERS_PARALLELISM=false CMD ["/app/start-all.sh"] diff --git a/hindsight-api/hindsight_api/engine/cross_encoder.py b/hindsight-api/hindsight_api/engine/cross_encoder.py index 23e1ffa6..c7691045 100644 --- a/hindsight-api/hindsight_api/engine/cross_encoder.py +++ b/hindsight-api/hindsight_api/engine/cross_encoder.py @@ -9,6 +9,7 @@ Configuration via environment variables - see hindsight_api.config for all env v import asyncio import logging import os +import warnings from abc import ABC, abstractmethod from concurrent.futures import ThreadPoolExecutor @@ -162,11 +163,28 @@ class LocalSTCrossEncoder(CrossEncoderModel): except Exception as e: logger.warning(f"Failed to detect GPU/MPS, falling back to CPU: {e}") - self._model = CrossEncoder( - self.model_name, - device=device, - model_kwargs={"low_cpu_mem_usage": False}, - ) + # Suppress verbose transformers warnings during model loading + # This suppresses the "UNEXPECTED" warnings from CrossEncoder which are harmless + # but look alarming to users (e.g., "embeddings.position_ids | UNEXPECTED") + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=UserWarning) + warnings.filterwarnings("ignore", message=".*was not found in model state dict.*") + warnings.filterwarnings("ignore", message=".*UNEXPECTED.*") + + # Also suppress transformers library logging temporarily + transformers_logger = logging.getLogger("transformers") + original_level = transformers_logger.level + transformers_logger.setLevel(logging.ERROR) + + try: + self._model = CrossEncoder( + self.model_name, + device=device, + model_kwargs={"low_cpu_mem_usage": False}, + ) + finally: + # Restore original logging level + transformers_logger.setLevel(original_level) # Initialize shared executor (limited workers naturally limits concurrency) if LocalSTCrossEncoder._executor is None: diff --git a/hindsight-api/hindsight_api/engine/embeddings.py b/hindsight-api/hindsight_api/engine/embeddings.py index 2480cb90..5c2eec53 100644 --- a/hindsight-api/hindsight_api/engine/embeddings.py +++ b/hindsight-api/hindsight_api/engine/embeddings.py @@ -11,6 +11,7 @@ Configuration via environment variables - see hindsight_api.config for all env v import logging import os +import warnings from abc import ABC, abstractmethod import httpx @@ -157,11 +158,28 @@ class LocalSTEmbeddings(Embeddings): except Exception as e: logger.warning(f"Failed to detect GPU/MPS, falling back to CPU: {e}") - self._model = SentenceTransformer( - self.model_name, - device=device, - model_kwargs={"low_cpu_mem_usage": False}, - ) + # Suppress verbose transformers warnings during model loading + # This suppresses the "UNEXPECTED" warnings from BertModel which are harmless + # but look alarming to users (e.g., "embeddings.position_ids | UNEXPECTED") + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=UserWarning) + warnings.filterwarnings("ignore", message=".*was not found in model state dict.*") + warnings.filterwarnings("ignore", message=".*UNEXPECTED.*") + + # Also suppress transformers library logging temporarily + transformers_logger = logging.getLogger("transformers") + original_level = transformers_logger.level + transformers_logger.setLevel(logging.ERROR) + + try: + self._model = SentenceTransformer( + self.model_name, + device=device, + model_kwargs={"low_cpu_mem_usage": False}, + ) + finally: + # Restore original logging level + transformers_logger.setLevel(original_level) self._dimension = self._model.get_sentence_embedding_dimension() logger.info(f"Embeddings: local provider initialized (dim: {self._dimension})")