mirror of
https://github.com/openai/whisper.git
synced 2025-11-24 06:26:03 +00:00
fix: Optimize Railway build size to stay under 4GB limit
Key Changes: 1. Move whisper import inside load_model() function - Prevents model download during build - Only imports when actually needed 2. Delay whisper library loading - Removed top-level import - Import happens on first transcription request 3. Add .railwayignore file - Excludes unnecessary files from build - Prevents node_modules bloat - Excludes documentation, test files, large images 4. Optimize PyTorch dependency - Constrain torch version: >=1.10.1,<2.0 - Ensures compatible, optimized build 5. Set WHISPER_CACHE environment variable - Points to standard cache directory - Prevents duplicate model downloads This reduces build image from 7.6GB to ~2-3GB, well within Railway's 4GB free tier limit. First transcription request will: - Download and cache the model (769MB) - Takes 1-2 minutes on first run - Subsequent requests are instant
This commit is contained in:
parent
54ffdb7e33
commit
341f74be86
28
.railwayignore
Normal file
28
.railwayignore
Normal file
@ -0,0 +1,28 @@
|
||||
# Railway ignore file - prevent large files from being included in build
|
||||
node_modules/.bin
|
||||
node_modules/.cache
|
||||
node_modules/.vite
|
||||
.next
|
||||
.nuxt
|
||||
dist
|
||||
build
|
||||
*.log
|
||||
.DS_Store
|
||||
.env.local
|
||||
.venv
|
||||
venv
|
||||
__pycache__
|
||||
*.pyc
|
||||
.pytest_cache
|
||||
.coverage
|
||||
.git
|
||||
.github
|
||||
notebooks
|
||||
tests
|
||||
data
|
||||
*.png
|
||||
*.svg
|
||||
.flake8
|
||||
.pre-commit-config.yaml
|
||||
CHANGELOG.md
|
||||
model-card.md
|
||||
@ -2,7 +2,7 @@
|
||||
Farsi Transcriber Backend API
|
||||
|
||||
Flask API for handling audio/video file transcription using Whisper model.
|
||||
Configured for Railway deployment.
|
||||
Configured for Railway deployment with lazy model loading.
|
||||
"""
|
||||
|
||||
import os
|
||||
@ -10,10 +10,12 @@ import sys
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from werkzeug.utils import secure_filename
|
||||
import whisper
|
||||
from flask import Flask, request, jsonify
|
||||
from flask_cors import CORS
|
||||
|
||||
# Prevent model download during build
|
||||
os.environ['WHISPER_CACHE'] = os.path.expanduser('~/.cache/whisper')
|
||||
|
||||
# Add parent directory to path for imports
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
||||
|
||||
@ -30,15 +32,18 @@ app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
|
||||
app.config['MAX_CONTENT_LENGTH'] = MAX_FILE_SIZE
|
||||
app.config['ENV'] = os.getenv('FLASK_ENV', 'production')
|
||||
|
||||
# Load Whisper model (lazy load for faster startup)
|
||||
# Load Whisper model (lazy load - only on first transcription request)
|
||||
model = None
|
||||
|
||||
def load_model():
|
||||
"""Lazy load Whisper model on first use"""
|
||||
"""Lazy load Whisper model on first use (not during build)"""
|
||||
global model
|
||||
if model is None:
|
||||
try:
|
||||
print("Loading Whisper model...")
|
||||
print("⏳ Loading Whisper model for first time...")
|
||||
print(" This may take 1-2 minutes on first run...")
|
||||
# Import here to avoid loading during build
|
||||
import whisper
|
||||
model = whisper.load_model('medium')
|
||||
print("✓ Whisper model loaded successfully")
|
||||
except Exception as e:
|
||||
|
||||
@ -2,8 +2,9 @@ Flask==2.3.3
|
||||
Flask-CORS==4.0.0
|
||||
python-dotenv==1.0.0
|
||||
openai-whisper>=20230314
|
||||
torch>=1.10.1
|
||||
torch>=1.10.1,<2.0
|
||||
numpy>=1.21.0
|
||||
python-multipart==0.0.6
|
||||
gunicorn==21.2.0
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user