| |
| """ |
| 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() |
|
|