|
|
|
""" |
|
Startup script for Hugging Face Spaces deployment. |
|
Handles model preloading and graceful fallbacks for containerized environments. |
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
import subprocess |
|
import sys |
|
import logging |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logging.basicConfig( |
|
level=logging.INFO, |
|
format='%(asctime)s - %(levelname)s - %(message)s' |
|
) |
|
logger = logging.getLogger(__name__) |
|
|
|
def create_directories(): |
|
"""Create necessary directories with proper permissions.""" |
|
dirs = [ |
|
'uploads', 'outputs', 'model_cache', 'temp_files', |
|
'demo_results', '/tmp/matplotlib', '/tmp/fontconfig' |
|
] |
|
|
|
for d in dirs: |
|
try: |
|
os.makedirs(d, mode=0o777, exist_ok=True) |
|
logger.info(f'β
Created directory: {d}') |
|
except Exception as e: |
|
logger.warning(f'β οΈ Failed to create directory {d}: {e}') |
|
|
|
def check_dependencies(): |
|
"""Check if critical dependencies are available.""" |
|
critical_deps = ['fastapi', 'uvicorn', 'torch', 'transformers'] |
|
missing_deps = [] |
|
|
|
for dep in critical_deps: |
|
try: |
|
__import__(dep) |
|
logger.info(f'β
{dep} available') |
|
except ImportError: |
|
missing_deps.append(dep) |
|
logger.warning(f'β οΈ {dep} not available') |
|
|
|
if missing_deps: |
|
logger.error(f'β Missing critical dependencies: {missing_deps}') |
|
return False |
|
|
|
return True |
|
|
|
def preload_models(): |
|
"""Attempt to preload models with graceful fallback.""" |
|
logger.info('π Attempting model preloading...') |
|
|
|
try: |
|
|
|
import model_preloader |
|
logger.info('β
Model preloader module found') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result = subprocess.run( |
|
['python', 'model_preloader.py'], |
|
capture_output=True, |
|
text=True, |
|
timeout=300 |
|
|
|
) |
|
|
|
if result.returncode == 0: |
|
logger.info('β
Models loaded successfully') |
|
if result.stdout: |
|
logger.info(f'Preloader output: {result.stdout[:500]}...') |
|
return True |
|
else: |
|
logger.warning(f'β οΈ Model preloading failed with return code {result.returncode}') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return False |
|
|
|
except subprocess.TimeoutExpired: |
|
logger.warning('β οΈ Model preloading timed out, continuing...') |
|
return False |
|
except Exception as e: |
|
if 'executable stack' not in str(e).lower(): |
|
logger.warning(f'β οΈ Model preloading failed: {e}') |
|
return False |
|
|
|
def start_web_app(): |
|
"""Start the web application.""" |
|
logger.info('π Starting web application...') |
|
|
|
try: |
|
import uvicorn |
|
logger.info('β
Uvicorn imported successfully') |
|
|
|
|
|
uvicorn.run( |
|
'web_app:app', |
|
host='0.0.0.0', |
|
port=7860, |
|
workers=1, |
|
log_level='info', |
|
access_log=True |
|
) |
|
except ImportError as e: |
|
logger.error(f'β Failed to import uvicorn: {e}') |
|
sys.exit(1) |
|
except Exception as e: |
|
logger.error(f'β Failed to start web application: {e}') |
|
sys.exit(1) |
|
|
|
def main(): |
|
"""Main startup function.""" |
|
logger.info('π Starting Multilingual Audio Intelligence System...') |
|
|
|
|
|
if not check_dependencies(): |
|
logger.error('β Critical dependencies missing, exiting...') |
|
sys.exit(1) |
|
|
|
|
|
create_directories() |
|
|
|
|
|
preload_models() |
|
|
|
|
|
start_web_app() |
|
|
|
if __name__ == '__main__': |
|
main() |
|
|