mirror of
https://github.com/openai/whisper.git
synced 2025-11-23 22:15:58 +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
|
Farsi Transcriber Backend API
|
||||||
|
|
||||||
Flask API for handling audio/video file transcription using Whisper model.
|
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
|
import os
|
||||||
@ -10,10 +10,12 @@ import sys
|
|||||||
import tempfile
|
import tempfile
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
import whisper
|
|
||||||
from flask import Flask, request, jsonify
|
from flask import Flask, request, jsonify
|
||||||
from flask_cors import CORS
|
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
|
# Add parent directory to path for imports
|
||||||
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
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['MAX_CONTENT_LENGTH'] = MAX_FILE_SIZE
|
||||||
app.config['ENV'] = os.getenv('FLASK_ENV', 'production')
|
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
|
model = None
|
||||||
|
|
||||||
def load_model():
|
def load_model():
|
||||||
"""Lazy load Whisper model on first use"""
|
"""Lazy load Whisper model on first use (not during build)"""
|
||||||
global model
|
global model
|
||||||
if model is None:
|
if model is None:
|
||||||
try:
|
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')
|
model = whisper.load_model('medium')
|
||||||
print("✓ Whisper model loaded successfully")
|
print("✓ Whisper model loaded successfully")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@ -2,8 +2,9 @@ Flask==2.3.3
|
|||||||
Flask-CORS==4.0.0
|
Flask-CORS==4.0.0
|
||||||
python-dotenv==1.0.0
|
python-dotenv==1.0.0
|
||||||
openai-whisper>=20230314
|
openai-whisper>=20230314
|
||||||
torch>=1.10.1
|
torch>=1.10.1,<2.0
|
||||||
numpy>=1.21.0
|
numpy>=1.21.0
|
||||||
python-multipart==0.0.6
|
python-multipart==0.0.6
|
||||||
gunicorn==21.2.0
|
gunicorn==21.2.0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user