
Configuration Whisper avec Docker : guide complet pour exécuter OpenAI Whisper dans Docker
Eric King
Author
Introduction
Exécuter OpenAI Whisper dans des conteneurs Docker offre un environnement cohérent et isolé qui simplifie le déploiement et évite les problèmes du type « ça marche sur ma machine ». Docker permet de :
- Déployer partout – le même conteneur sur toute plateforme compatible Docker
- Isoler les dépendances – éviter les conflits avec les paquets système
- Mettre à l’échelle facilement – lancer plusieurs conteneurs pour le traitement parallèle
- Contrôler les versions – figer des versions et configurations Whisper précises
- Simplifier le déploiement – une seule commande pour tout
Ce guide couvre tout ce qu’il faut pour configurer Whisper dans Docker, des conteneurs de base aux configurations prêtes pour la production avec support GPU.
Pourquoi utiliser Docker pour Whisper ?
Avantages de la conteneurisation
1. Cohérence
- le même environnement en développement, staging et production
- pas de conflits de dépendances
- builds reproductibles
2. Portabilité
- exécution sur toute plateforme supportant Docker
- migration facile entre serveurs
- déploiement indépendant du cloud
3. Isolation
- pas d’interférence avec le système hôte
- désinstallation propre (supprimer le conteneur)
- sécurité par isolation
4. Évolutivité
- mise à l’échelle horizontale simple
- répartition de charge entre conteneurs
- limites de ressources par conteneur
5. Intégration DevOps
- compatible avec les pipelines CI/CD
- prêt pour Kubernetes
- adapté au déploiement cloud
Prérequis
Avant de commencer, assurez-vous d’avoir :
- Docker installé (version 20.10+)
- Docker Compose (facultatif, pour plusieurs conteneurs)
- NVIDIA Docker (facultatif, pour le support GPU)
- des notions de base des commandes Docker
Installer Docker
macOS :
# Install Docker Desktop from docker.com
# Or using Homebrew
brew install --cask docker
Ubuntu/Debian :
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
Windows :
Téléchargez Docker Desktop sur docker.com
Vérifier l’installation
docker --version
docker-compose --version
Dockerfile de base pour Whisper
Commençons par un Dockerfile simple pour Whisper :
FROM python:3.10-slim
# Set working directory
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y \
ffmpeg \
git \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies
RUN pip install --no-cache-dir \
openai-whisper \
torch \
torchaudio
# Copy application code (if you have custom scripts)
# COPY . .
# Set default command
CMD ["whisper", "--help"]
Construire l’image
docker build -t whisper:latest .
Exécuter le conteneur de base
docker run --rm whisper:latest whisper --version
Dockerfile avec serveur API
En production, un serveur API est souvent nécessaire. Voici un Dockerfile plus complet :
FROM python:3.10-slim
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y \
ffmpeg \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies
RUN pip install --no-cache-dir \
openai-whisper \
torch \
torchaudio \
fastapi \
uvicorn \
python-multipart
# Create directories for audio and output
RUN mkdir -p /app/audio /app/output
# Copy application code
COPY app.py .
COPY requirements.txt .
# Expose API port
EXPOSE 8000
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
# Run API server
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]
Exemple de serveur API (app.py)
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import whisper
import os
app = FastAPI()
# Load Whisper model (can be configured via env)
model_name = os.getenv("WHISPER_MODEL", "base")
model = whisper.load_model(model_name)
@app.get("/health")
def health():
return {"status": "healthy"}
@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...)):
# Save uploaded file
file_path = f"/app/audio/{file.filename}"
with open(file_path, "wb") as f:
content = await file.read()
f.write(content)
# Transcribe
result = model.transcribe(file_path)
# Clean up
os.remove(file_path)
return JSONResponse(content={
"text": result["text"],
"language": result["language"]
})
requirements.txt
fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
openai-whisper
torch
torchaudio
Configuration Docker Compose
Pour une stack complète avec plusieurs services, utilisez Docker Compose :
docker-compose.yml
version: '3.8'
services:
whisper-api:
build: .
container_name: whisper-api
ports:
- "8000:8000"
volumes:
- ./audio:/app/audio
- ./output:/app/output
environment:
- WHISPER_MODEL=base
- CUDA_VISIBLE_DEVICES=0
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Optional: Redis for queue management
redis:
image: redis:7-alpine
container_name: whisper-redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
restart: unless-stopped
volumes:
redis-data:
Lancer avec Docker Compose
# Start services
docker-compose up -d
# View logs
docker-compose logs -f whisper-api
# Stop services
docker-compose down
Support GPU avec Docker
Pour l’accélération GPU, le runtime NVIDIA Docker est nécessaire :
Installer NVIDIA Docker
Ubuntu/Debian :
# Add NVIDIA Docker repository
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
# Install
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
Dockerfile avec support GPU
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
WORKDIR /app
# Install Python
RUN apt-get update && apt-get install -y \
python3.10 \
python3-pip \
ffmpeg \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies with CUDA support
RUN pip3 install --no-cache-dir \
openai-whisper \
torch \
torchaudio \
--index-url https://download.pytorch.org/whl/cu118
# Install API dependencies
RUN pip3 install --no-cache-dir \
fastapi \
uvicorn \
python-multipart
COPY app.py .
EXPOSE 8000
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]
Exécuter avec GPU
# Using docker run
docker run --gpus all -p 8000:8000 whisper-gpu:latest
# Using docker-compose
docker-compose.yml avec GPU
version: '3.8'
services:
whisper-api:
build: .
container_name: whisper-api-gpu
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
ports:
- "8000:8000"
volumes:
- ./audio:/app/audio
- ./output:/app/output
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
Dockerfile optimisé pour la production
Voici un Dockerfile prêt pour la production avec optimisations :
# Multi-stage build for smaller image
FROM python:3.10-slim as builder
WORKDIR /app
# Install build dependencies
RUN apt-get update && apt-get install -y \
gcc \
g++ \
git \
&& rm -rf /var/lib/apt/lists/*
# Install Python packages
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
# Final stage
FROM python:3.10-slim
WORKDIR /app
# Install runtime dependencies only
RUN apt-get update && apt-get install -y \
ffmpeg \
curl \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Copy Python packages from builder
COPY --from=builder /root/.local /root/.local
# Make sure scripts in .local are usable
ENV PATH=/root/.local/bin:$PATH
# Create non-root user for security
RUN useradd -m -u 1000 whisper && \
mkdir -p /app/audio /app/output && \
chown -R whisper:whisper /app
USER whisper
# Copy application code
COPY --chown=whisper:whisper app.py .
COPY --chown=whisper:whisper requirements.txt .
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]
Avantages du build multi-étapes
- Image plus petite – seules les dépendances d’exécution dans l’image finale
- Builds plus rapides – mise en cache séparée des dépendances de build
- Meilleure sécurité – utilisateur non root, surface d’attaque réduite
Variables d’environnement
Rendez votre configuration Docker paramétrable via des variables d’environnement :
Dockerfile
FROM python:3.10-slim
WORKDIR /app
RUN apt-get update && apt-get install -y \
ffmpeg \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir \
openai-whisper \
torch \
torchaudio \
fastapi \
uvicorn \
python-multipart
COPY app.py .
# Environment variables with defaults
ENV WHISPER_MODEL=base
ENV MAX_FILE_SIZE=100MB
ENV LOG_LEVEL=INFO
EXPOSE 8000
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml avec variables d’environnement
version: '3.8'
services:
whisper-api:
build: .
ports:
- "8000:8000"
volumes:
- ./audio:/app/audio
- ./output:/app/output
environment:
- WHISPER_MODEL=small
- MAX_FILE_SIZE=200MB
- LOG_LEVEL=DEBUG
- CUDA_VISIBLE_DEVICES=0
env_file:
- .env
restart: unless-stopped
Fichier .env
WHISPER_MODEL=small
MAX_FILE_SIZE=200MB
LOG_LEVEL=INFO
CUDA_VISIBLE_DEVICES=0
Gestion des volumes
Une configuration de volumes correcte assure la persistance des données :
docker-compose.yml avec volumes
version: '3.8'
services:
whisper-api:
build: .
ports:
- "8000:8000"
volumes:
# Bind mount for development
- ./audio:/app/audio
- ./output:/app/output
# Named volume for model cache (persists across containers)
- whisper-models:/root/.cache/whisper
# Config volume
- ./config:/app/config:ro
environment:
- WHISPER_MODEL=base
volumes:
whisper-models:
driver: local
Avantages
- Cache des modèles – téléchargement une fois, réutilisation entre conteneurs
- Persistance des données – les fichiers de sortie survivent aux redémarrages
- Configuration – mise à jour des configs sans reconstruire l’image
Health checks et supervision
Dockerfile avec health check
FROM python:3.10-slim
WORKDIR /app
RUN apt-get update && apt-get install -y \
ffmpeg \
curl \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir \
openai-whisper \
fastapi \
uvicorn
COPY app.py .
# Health check endpoint
HEALTHCHECK --interval=30s \
--timeout=10s \
--start-period=40s \
--retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
EXPOSE 8000
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]
Point de terminaison health check
from fastapi import FastAPI
import whisper
app = FastAPI()
model = whisper.load_model("base")
@app.get("/health")
def health():
try:
# Quick test transcription
return {"status": "healthy", "model": "base"}
except Exception as e:
return {"status": "unhealthy", "error": str(e)}, 503
Cas d’usage courants
Cas 1 : environnement de développement
version: '3.8'
services:
whisper-dev:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
- /app/__pycache__
ports:
- "8000:8000"
environment:
- WHISPER_MODEL=tiny
- DEBUG=true
command: uvicorn app.py:app --reload --host 0.0.0.0 --port 8000
Cas 2 : production avec file d’attente
version: '3.8'
services:
whisper-api:
build: .
ports:
- "8000:8000"
environment:
- REDIS_URL=redis://redis:6379
- WHISPER_MODEL=small
depends_on:
- redis
- worker
worker:
build: .
command: python worker.py
environment:
- REDIS_URL=redis://redis:6379
- WHISPER_MODEL=small
volumes:
- ./audio:/app/audio
depends_on:
- redis
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
volumes:
redis-data:
Cas 3 : configuration multi-modèles
version: '3.8'
services:
whisper-fast:
build: .
ports:
- "8001:8000"
environment:
- WHISPER_MODEL=tiny
- PORT=8000
whisper-balanced:
build: .
ports:
- "8002:8000"
environment:
- WHISPER_MODEL=base
- PORT=8000
whisper-accurate:
build: .
ports:
- "8003:8000"
environment:
- WHISPER_MODEL=large
- PORT=8000
Bonnes pratiques
1. Utiliser des images de base spécifiques
Mauvais :
FROM python:latest
Bon :
FROM python:3.10-slim
2. Minimiser les couches
Mauvais :
RUN apt-get update
RUN apt-get install -y ffmpeg
RUN apt-get install -y git
Bon :
RUN apt-get update && apt-get install -y \
ffmpeg \
git \
&& rm -rf /var/lib/apt/lists/*
3. Utiliser .dockerignore
Créez
.dockerignore :__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store
4. Définir des limites de ressources
services:
whisper-api:
build: .
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
5. Utiliser des health checks
Incluez toujours des health checks pour les conteneurs de production :
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1
6. Utilisateur non root
Exécutez les conteneurs sans privilèges root :
RUN useradd -m -u 1000 whisper
USER whisper
7. Mettre en cache les modèles
Utilisez des volumes pour mettre en cache les modèles téléchargés :
volumes:
- whisper-models:/root/.cache/whisper
Dépannage des problèmes courants
Problème 1 : le conteneur s’arrête immédiatement
Problème : le conteneur démarre puis se termine
Solution :
# Check logs
docker logs <container-id>
# Run interactively to debug
docker run -it whisper:latest /bin/bash
Problème 2 : GPU non disponible
Problème : la GPU n’est pas détectée dans le conteneur
Solution :
# Verify NVIDIA Docker
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
# Check runtime
docker info | grep -i runtime
Problème 3 : manque de mémoire
Problème : le conteneur manque de mémoire
Solution :
# Increase memory limit
deploy:
resources:
limits:
memory: 8G
Problème 4 : téléchargement de modèle lent
Problème : les modèles se téléchargent à chaque démarrage
Solution :
# Use volume for model cache
volumes:
- whisper-models:/root/.cache/whisper
Problème 5 : permission refusée
Problème : impossible d’écrire sur les volumes
Solution :
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app
Optimisation des performances
1. Préchargement du modèle
Préchargez les modèles dans le Dockerfile :
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"
2. Utiliser faster-whisper
Pour de meilleures performances, utilisez faster-whisper :
RUN pip install --no-cache-dir faster-whisper
3. Multithreading
Configurez les processus workers :
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
4. Allocation des ressources
Allouez des ressources adaptées :
deploy:
resources:
limits:
cpus: '4'
memory: 8G
Considérations de sécurité
1. Utiliser des images de base officielles
FROM python:3.10-slim # Official Python image
2. Scanner les vulnérabilités
docker scan whisper:latest
3. Mettre à jour les images
Mettez régulièrement à jour les images de base et les dépendances :
FROM python:3.10-slim # Use latest patch version
RUN pip install --upgrade pip
4. Limiter l’accès réseau
services:
whisper-api:
build: .
networks:
- internal
# No external ports if accessed via reverse proxy
Conclusion
Conteneuriser Whisper offre une solution robuste et évolutive pour la transcription parole-texte. Points clés :
- Commencer simplement – avec un Dockerfile de base
- Utiliser Docker Compose – pour simplifier les stacks multi-services
- Activer le GPU – pour les performances en production
- Suivre les bonnes pratiques – sécurité, optimisation, supervision
- Tester en profondeur – avant la mise en production
Avec une bonne configuration Docker, vous pouvez déployer Whisper de façon cohérente dans tout environnement, du développement local à la production cloud.
Prochaines étapes
- Construire votre premier conteneur – commencez par le Dockerfile de base
- Ajouter le support GPU – si vous disposez de GPU NVIDIA
- Configurer Docker Compose – pour la pile applicative complète
- Déployer dans le cloud – services de conteneurs (ECS, GKE, AKS)
Pour d’autres stratégies de déploiement, consultez nos guides Whisper Cloud Deployment et Whisper API vs Local Deployment.
