fix(embeddings): не терять батч на таймауте Ollama, уменьшить пачку
Ollama обрабатывает тексты в пачке последовательно (один "slot" в llama.cpp, не параллельно) — 64 реальных документа в одном HTTP-запросе регулярно не укладывались в 120с, весь батч падал с ReadTimeout и терялся без ретрая (embed_documents была без bind/max_retries). Теперь: пачка 16, таймаут 300с, задача ретраится до 3 раз при сбое.
This commit is contained in:
@@ -58,7 +58,10 @@ class Settings(BaseSettings):
|
|||||||
EMBED_BACKEND: str = "ollama"
|
EMBED_BACKEND: str = "ollama"
|
||||||
EMBED_MODEL: str = "bge-m3"
|
EMBED_MODEL: str = "bge-m3"
|
||||||
EMBED_DEVICE: str = "cuda" # используется только при EMBED_BACKEND=sentence_transformers
|
EMBED_DEVICE: str = "cuda" # используется только при EMBED_BACKEND=sentence_transformers
|
||||||
EMBED_BATCH_SIZE: int = 64
|
# Ollama обрабатывает тексты в пачке последовательно (один "slot" в llama.cpp,
|
||||||
|
# не параллельно) — 64 реальных документа в один HTTP-запрос регулярно не
|
||||||
|
# укладывались в таймаут. Меньше пачка — короче и надёжнее каждый запрос.
|
||||||
|
EMBED_BATCH_SIZE: int = 16
|
||||||
EMBED_DIM: int = 1024 # bge-m3; было 768 у paraphrase-multilingual-mpnet-base-v2
|
EMBED_DIM: int = 1024 # bge-m3; было 768 у paraphrase-multilingual-mpnet-base-v2
|
||||||
# DeepInfra — OpenAI-совместимый инференс BAAI/bge-m3 в облаке, та же модель,
|
# DeepInfra — OpenAI-совместимый инференс BAAI/bge-m3 в облаке, та же модель,
|
||||||
# что и на VM109, дешёвый пей-пер-токен. Используется при EMBED_BACKEND=cloud.
|
# что и на VM109, дешёвый пей-пер-токен. Используется при EMBED_BACKEND=cloud.
|
||||||
|
|||||||
@@ -91,7 +91,10 @@ class ModelManager:
|
|||||||
response = httpx.post(
|
response = httpx.post(
|
||||||
f"{settings.OLLAMA_URL}/api/embed",
|
f"{settings.OLLAMA_URL}/api/embed",
|
||||||
json={"model": settings.EMBED_MODEL, "input": batch},
|
json={"model": settings.EMBED_MODEL, "input": batch},
|
||||||
timeout=120.0,
|
timeout=300.0, # Ollama обрабатывает тексты в пачке последовательно
|
||||||
|
# (виден один "slot" в логах llama.cpp), не параллельно — на реальных
|
||||||
|
# (не тестовых) текстах 64 шт. в 120с не укладывались, отсюда ReadTimeout
|
||||||
|
# и потеря батча целиком (без ретрая).
|
||||||
)
|
)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
all_vectors.extend(response.json()["embeddings"])
|
all_vectors.extend(response.json()["embeddings"])
|
||||||
|
|||||||
@@ -219,8 +219,13 @@ def check_plagiarism(
|
|||||||
raise self.retry(exc=exc, countdown=120) from exc
|
raise self.retry(exc=exc, countdown=120) from exc
|
||||||
|
|
||||||
|
|
||||||
@celery_app.task(name="gpu.embed_documents")
|
@celery_app.task(
|
||||||
def embed_documents(doc_ids: list[int]) -> dict[str, Any]:
|
name="gpu.embed_documents",
|
||||||
|
bind=True,
|
||||||
|
max_retries=3,
|
||||||
|
default_retry_delay=30,
|
||||||
|
)
|
||||||
|
def embed_documents(self, doc_ids: list[int]) -> dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
Построить эмбеддинги для документов и добавить их в FAISS индекс.
|
Построить эмбеддинги для документов и добавить их в FAISS индекс.
|
||||||
|
|
||||||
@@ -254,7 +259,14 @@ def embed_documents(doc_ids: list[int]) -> dict[str, Any]:
|
|||||||
]
|
]
|
||||||
ids = [d.id for d in docs]
|
ids = [d.id for d in docs]
|
||||||
|
|
||||||
vectors = ModelManager.encode(texts)
|
try:
|
||||||
|
vectors = ModelManager.encode(texts)
|
||||||
|
except Exception as exc:
|
||||||
|
# Таймаут/недоступность бэкенда эмбеддингов — не терять батч молча,
|
||||||
|
# а повторить (раньше падало без ретрая, документы просто выпадали
|
||||||
|
# из переиндексации).
|
||||||
|
logger.warning(f"Не удалось построить эмбеддинги для {ids}: {exc}")
|
||||||
|
raise self.retry(exc=exc) from exc
|
||||||
|
|
||||||
store = get_backend()
|
store = get_backend()
|
||||||
store.add_vectors(vectors, ids)
|
store.add_vectors(vectors, ids)
|
||||||
|
|||||||
Reference in New Issue
Block a user