tuts-rag-service / scripts /bootstrap_faiss.py
Gil Almeida
chore: initial deploy to HF Spaces
15b4b57
Raw
History Blame Contribute Delete
2.89 kB
import os
import sys
import shutil
import urllib.request
import tarfile
import zipfile
from pathlib import Path
# Configuração via variáveis de ambiente (podem ser definidas no docker-compose.prod.yaml)
BOOTSTRAP_URL = os.getenv("BOOTSTRAP_FAISS_URL")
FAISS_DB_DIR = Path(os.getenv("BASE_FAISS_DIR", "/app/faiss_db"))
def _sincronizar_faiss_do_hub() -> None:
"""
Descarrega o faiss_db/ do Hugging Face Dataset repo para o disco local.
Se HF_TOKEN ou HF_DATASET_REPO não estiverem definidos, salta silenciosamente.
Nunca bloqueia o arranque nem lança excepções não tratadas.
"""
hf_token = os.getenv("HF_TOKEN")
hf_repo = os.getenv("HF_DATASET_REPO")
if not hf_token or not hf_repo:
print("[BOOTSTRAP] HF_TOKEN ou HF_DATASET_REPO não configurados — a usar faiss_db local.")
return
faiss_base_dir = os.getenv("FAISS_BASE_DIR", "faiss_db")
try:
from huggingface_hub import snapshot_download
print(f"[BOOTSTRAP] A sincronizar faiss_db/ de {hf_repo}...")
snapshot_download(
repo_id=hf_repo,
repo_type="dataset",
token=hf_token,
local_dir=faiss_base_dir,
local_dir_use_symlinks=False,
ignore_patterns=[".gitattributes", "README.md", ".git*"],
)
print(f"[BOOTSTRAP] faiss_db/ sincronizado com sucesso de {hf_repo}.")
except Exception as exc:
print(f"[BOOTSTRAP] ⚠️ Falha ao sincronizar do HF Hub ({type(exc).__name__}: {exc}). A continuar com faiss_db local...")
def bootstrap():
# Sincronização com HF Hub (best-effort)
_sincronizar_faiss_do_hub()
if not BOOTSTRAP_URL:
print("[BOOTSTRAP] BOOTSTRAP_FAISS_URL não definida. A saltar download.")
return
if any(FAISS_DB_DIR.iterdir()):
print(f"[BOOTSTRAP] Directório {FAISS_DB_DIR} não está vazio. A saltar bootstrap.")
return
print(f"[BOOTSTRAP] A iniciar download de {BOOTSTRAP_URL}...")
temp_file = "/tmp/faiss_bootstrap.archive"
try:
urllib.request.urlretrieve(BOOTSTRAP_URL, temp_file)
print("[BOOTSTRAP] Download concluído. A extrair...")
if tarfile.is_tarfile(temp_file):
with tarfile.open(temp_file) as tar:
tar.extractall(path=FAISS_DB_DIR)
elif zipfile.is_zipfile(temp_file):
with zipfile.open(temp_file) as zip_ref:
zip_ref.extractall(path=FAISS_DB_DIR)
else:
print("[BOOTSTRAP] Erro: Formato de arquivo desconhecido.")
sys.exit(1)
print(f"[BOOTSTRAP] Extração concluída para {FAISS_DB_DIR}")
except Exception as e:
print(f"[BOOTSTRAP] Erro durante o bootstrap: {e}")
# Em produção, podemos decidir se falhamos ou se continuamos vazio
# sys.exit(1)
if __name__ == "__main__":
bootstrap()