bis-compass-backend / src /offline_guard.py
SpaceShark's picture
Upload folder using huggingface_hub
62f3c0d verified
Raw
History Blame Contribute Delete
2.85 kB
"""Single-source-of-truth offline-mode enforcer.
Both inference.py and the analysis scripts import this so the same logic runs
everywhere. If the BAAI bge-m3 + bge-reranker-v2-m3 model directories are
present in the local HuggingFace cache AND each has a usable weights file,
we set HF_HUB_OFFLINE / TRANSFORMERS_OFFLINE so subsequent model loads
NEVER touch the network.
Override with HF_FORCE_NETWORK=1 if you really want to re-pull from the Hub.
"""
from __future__ import annotations
import os
import sys
def _has_usable_weights(model_dir: str) -> bool:
"""Walk a HF cache model directory and confirm at least one usable
weight file is present. The directory existing isn't enough — a
partial download (interrupted by network) leaves directories but no
weights. If we flip offline mode on a partial cache, the actual
model load later fails opaquely with `OSError: no file named ...`.
"""
needles = ("model.safetensors", "pytorch_model.bin")
snapshots_dir = os.path.join(model_dir, "snapshots")
if not os.path.isdir(snapshots_dir):
return False
try:
for entry in os.listdir(snapshots_dir):
snap = os.path.join(snapshots_dir, entry)
if not os.path.isdir(snap):
continue
try:
names = os.listdir(snap)
except OSError:
continue
if any(n in names for n in needles):
return True
except OSError:
return False
return False
def enforce_offline_if_cached(verbose: bool = True) -> bool:
"""Return True iff we just enforced offline mode (or it was already on).
Requires not just the model directories to exist, but also a
usable weights file inside each. Prevents offline-mode flipping on
a partially downloaded cache (which would later crash at model load).
"""
if os.environ.get("HF_FORCE_NETWORK") == "1":
return False
if os.environ.get("HF_HUB_OFFLINE") == "1" and os.environ.get("TRANSFORMERS_OFFLINE") == "1":
return True
hf_home = os.environ.get("HF_HOME") or os.path.join(
os.path.expanduser("~"), ".cache", "huggingface"
)
hub_dir = os.path.join(hf_home, "hub")
if not os.path.isdir(hub_dir):
return False
needed = ("models--BAAI--bge-m3", "models--BAAI--bge-reranker-v2-m3")
for name in needed:
path = os.path.join(hub_dir, name)
if not os.path.isdir(path) or not _has_usable_weights(path):
return False
os.environ["HF_HUB_OFFLINE"] = "1"
os.environ["TRANSFORMERS_OFFLINE"] = "1"
if verbose:
print(
"[offline-guard] HF cache complete (weights verified) — enforcing offline mode "
"(HF_HUB_OFFLINE=1, TRANSFORMERS_OFFLINE=1)",
file=sys.stderr,
)
return True