MultiModal_RAG / models.py
Aayan873's picture
Update models.py
8750f58 verified
Raw History Blame Contribute Delete
3.74 kB
# Model loading utilities - Deployment Optimized
import streamlit as st
import whisper
import easyocr
import os
from sentence_transformers import SentenceTransformer
from transformers import CLIPProcessor, CLIPModel
from gpt4all import GPT4All
from config import MODELS_CONFIG, DEPLOYMENT_MODE
from device_setup import setup_device
@st.cache_resource
def load_models():
try:
# Writable caches first (prevent /.cache writes)
import pathlib
cache_root = os.environ.get("HF_HOME", "/tmp/hf")
pathlib.Path(cache_root).mkdir(parents=True, exist_ok=True)
# Make sure all relevant env vars point to the same place
os.environ.setdefault("HF_HOME", cache_root)
os.environ.setdefault("TRANSFORMERS_CACHE", cache_root)
os.environ.setdefault("HUGGINGFACE_HUB_CACHE", cache_root)
os.environ.setdefault("HF_DATASETS_CACHE", cache_root)
os.environ.setdefault("SENTENCE_TRANSFORMERS_HOME", cache_root)
os.environ.setdefault("XDG_CACHE_HOME", "/tmp")
# Setup device
device, has_gpu = setup_device()
device_str = "cuda" if has_gpu else "cpu"
progress = st.progress(0, text="Initializing models...")
# Text embeddings (explicit cache folder)
progress.progress(0.1, text="Loading text encoder...")
st.write("πŸ“ Loading text encoder...")
text_encoder = SentenceTransformer(
MODELS_CONFIG["text_encoder"],
device=device,
cache_folder=cache_root
)
# CLIP (route Hugging Face cache explicitly)
progress.progress(0.3, text="Loading CLIP model...")
st.write("πŸ–ΌοΈ Loading CLIP model...")
clip_model_name = MODELS_CONFIG["clip_model"]
clip_model = CLIPModel.from_pretrained(clip_model_name, cache_dir=cache_root).to(device)
clip_processor = CLIPProcessor.from_pretrained(clip_model_name, cache_dir=cache_root)
# Whisper (force CPU on free tier unless GPU present)
progress.progress(0.5, text="Loading Whisper...")
st.write("🎀 Loading Whisper model...")
whisper_size = MODELS_CONFIG["whisper_base"]
whisper_model = whisper.load_model(whisper_size, device=device_str)
# EasyOCR (avoid CUDA probing on CPU Spaces)
progress.progress(0.7, text="Loading OCR...")
st.write("πŸ” Loading OCR reader...")
ocr_reader = easyocr.Reader(['en'], gpu=False if not has_gpu else True)
# Local LLM
progress.progress(0.9, text="Loading LLM...")
st.write("🧠 Loading local LLM...")
try:
llm = GPT4All(MODELS_CONFIG["llm_model"], allow_download=True)
st.write("βœ… LLM loaded successfully!")
except Exception as llm_error:
st.warning(f"⚠️ LLM loading failed: {llm_error}")
st.info("πŸ’‘ The system will work without local LLM for document search")
llm = None
progress.progress(1.0, text="All models loaded!")
st.success("πŸŽ‰ All models loaded successfully!")
return text_encoder, clip_model, clip_processor, whisper_model, ocr_reader, llm, device, has_gpu
except Exception as e:
st.error(f"❌ Error loading models: {e}")
st.info("πŸ’‘ Try refreshing the page or check your internet connection")
return None, None, None, None, None, None, None, False
def get_model_info():
'''Get information about loaded models'''
return {
"text_encoder": MODELS_CONFIG["text_encoder"],
"clip_model": MODELS_CONFIG["clip_model"],
"whisper_model": MODELS_CONFIG["whisper_base"],
"llm_model": MODELS_CONFIG["llm_model"],
"deployment_mode": DEPLOYMENT_MODE
}