Раньше эмбеддинг-модель (уровень 3) гоняла на CPU внутри worker-gpu —
GPU CT108 использовался только под LLM-парафраз (уровень 4). Теперь
эмбеддинги идут через Ollama /api/embed на отдельной VM с RX 580
(Vulkan-бэкенд, без возни с ROCm/HIP для этой карты). EMBED_BACKEND
переключаемый ("ollama" | "sentence_transformers"), дефолт — ollama.
Модель сменилась на bge-m3 (1024-мерный вектор вместо 768 у
paraphrase-multilingual-mpnet-base-v2) — несовместимо с уже посчитанным
FAISS-индексом, нужна полная переиндексация корпуса после деплоя.
Заодно докстринг delete_task в tasks.py — снятое раньше ограничение
"нельзя удалить processing" оставляло враньё в докстринге.
75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
"""Конфигурация GPU воркера."""
|
||
|
||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||
|
||
|
||
class Settings(BaseSettings):
|
||
"""Настройки GPU воркера."""
|
||
|
||
model_config = SettingsConfigDict(
|
||
env_file=".env",
|
||
env_file_encoding="utf-8",
|
||
case_sensitive=False,
|
||
extra="ignore", # игнорировать поля общего .env, не относящиеся к воркеру
|
||
)
|
||
|
||
# PostgreSQL
|
||
POSTGRES_HOST: str = "postgres"
|
||
POSTGRES_PORT: int = 5432
|
||
POSTGRES_DB: str = "antiplagiator"
|
||
POSTGRES_USER: str = "antiplagiator"
|
||
POSTGRES_PASSWORD: str = "changeme"
|
||
|
||
# Redis
|
||
REDIS_URL: str = "redis://redis:6379/0"
|
||
|
||
# RabbitMQ
|
||
RABBITMQ_URL: str = "amqp://guest:guest@rabbitmq:5672/"
|
||
|
||
# MinIO
|
||
MINIO_ENDPOINT: str = "minio:9000"
|
||
MINIO_ACCESS_KEY: str = "minioadmin"
|
||
MINIO_SECRET_KEY: str = "changeme"
|
||
MINIO_BUCKET_DOCS: str = "documents"
|
||
|
||
# Elasticsearch
|
||
ELASTICSEARCH_URL: str = "http://elasticsearch:9200"
|
||
|
||
# Ollama
|
||
OLLAMA_URL: str = "http://ollama:11434"
|
||
|
||
# FAISS / ML
|
||
FAISS_INDEX_PATH: str = "/data/index/faiss.index"
|
||
FAISS_ID_MAP_PATH: str = "/data/index/faiss_id_map.json"
|
||
# EMBED_BACKEND: "ollama" (GGUF-модель через Vulkan, для AMD GPU без ROCm/atomics)
|
||
# или "sentence_transformers" (локальная загрузка, CUDA/CPU)
|
||
EMBED_BACKEND: str = "ollama"
|
||
EMBED_MODEL: str = "bge-m3"
|
||
EMBED_DEVICE: str = "cuda" # используется только при EMBED_BACKEND=sentence_transformers
|
||
EMBED_BATCH_SIZE: int = 64
|
||
EMBED_DIM: int = 1024 # bge-m3; было 768 у paraphrase-multilingual-mpnet-base-v2
|
||
FAISS_NLIST: int = 1024 # Количество кластеров для IVFFlat
|
||
FAISS_NPROBE: int = 64 # Количество кластеров для поиска
|
||
|
||
# Векторный бэкенд: "faiss" (файловый синглтон, дефолт) или "qdrant" (сервис,
|
||
# снимает SPOF и конкурентную запись). Переключается без изменения кода.
|
||
VECTOR_BACKEND: str = "faiss"
|
||
QDRANT_URL: str = "http://qdrant:6333"
|
||
QDRANT_COLLECTION: str = "documents"
|
||
|
||
# App
|
||
APP_URL: str = "https://academic.jze9.ru"
|
||
ENVIRONMENT: str = "development"
|
||
DEBUG: bool = False
|
||
|
||
@property
|
||
def database_url_sync(self) -> str:
|
||
"""Синхронный URL для SQLAlchemy (psycopg2)."""
|
||
return (
|
||
f"postgresql+psycopg2://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}"
|
||
f"@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}"
|
||
)
|
||
|
||
|
||
settings = Settings()
|