426 lines
12 KiB
Markdown
426 lines
12 KiB
Markdown
# 🎙️ Studio IA Multimodal — Architecture & Spécifications
|
||
## Version 3 — VM Vast.ai + Docker Compose
|
||
|
||
---
|
||
|
||
## 1. Principe général
|
||
|
||
Sur Vast.ai, utiliser le mode **VM** (Virtual Machine) au lieu du mode Container.
|
||
Cela donne un accès root complet à une vraie machine, avec Docker Engine installé nativement.
|
||
Chaque modèle IA tourne dans son propre container Docker, orchestré par Docker Compose.
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────┐
|
||
│ VM Vast.ai (RTX A4000 16Go / 130Go SSD) │
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ open-webui │ │ ollama │ │
|
||
│ │ :3000 │ │ :11434 │ │
|
||
│ └──────┬──────┘ └─────────────┘ │
|
||
│ │ Tools API │
|
||
│ ┌──────┴──────────────────────────────┐ │
|
||
│ │ Docker Network │ │
|
||
│ └──────┬──────┬──────┬──────┬─────────┘ │
|
||
│ ┌──────┴─┐ ┌──┴───┐ ┌┴─────┐ ┌──────┐ ┌─────┐ │
|
||
│ │ace-step│ │heart │ │zonos │ │index │ │huny │ │
|
||
│ │ :7860 │ │:7861 │ │:7862 │ │:7863 │ │:7864│ │
|
||
│ └────────┘ └──────┘ └──────┘ └──────┘ └─────┘ │
|
||
│ ┌──────────────────┐ │
|
||
│ │ comfyui │ │
|
||
│ │ :8188 │ │
|
||
│ └──────────────────┘ │
|
||
└─────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Template Vast.ai — Mode VM
|
||
|
||
| Paramètre | Valeur |
|
||
|---|---|
|
||
| **Type** | VM (Virtual Machine) |
|
||
| **GPU** | RTX A4000 16 Go |
|
||
| **Disk** | 130 Go minimum (200 Go recommandé) |
|
||
| **Launch mode** | VM |
|
||
| **OS** | Ubuntu 22.04 |
|
||
| **PROVISIONING_SCRIPT** | URL Gitea → installe Docker + lance compose |
|
||
|
||
---
|
||
|
||
## 3. Structure du dépôt Gitea
|
||
|
||
```
|
||
VASTAI-STUDIO-AUDIO/
|
||
├── docker-compose.yml ← Orchestration principale
|
||
├── provisioning_script.sh ← Installation Docker + lancement
|
||
├── .env ← Variables (ports, tokens...)
|
||
│
|
||
├── services/
|
||
│ ├── open-webui/
|
||
│ │ └── Dockerfile
|
||
│ ├── ace-step/
|
||
│ │ ├── Dockerfile
|
||
│ │ └── server.py
|
||
│ ├── heart-mula/
|
||
│ │ ├── Dockerfile
|
||
│ │ └── server.py
|
||
│ ├── zonos/
|
||
│ │ ├── Dockerfile
|
||
│ │ └── server.py
|
||
│ ├── indextts/
|
||
│ │ ├── Dockerfile
|
||
│ │ └── server.py
|
||
│ ├── hunyuan-foley/
|
||
│ │ ├── Dockerfile
|
||
│ │ └── server.py
|
||
│ └── comfyui/
|
||
│ └── Dockerfile
|
||
│
|
||
└── models/ ← Scripts de téléchargement
|
||
├── download_audio.sh
|
||
├── download_tts.sh
|
||
└── download_image.sh
|
||
```
|
||
|
||
---
|
||
|
||
## 4. docker-compose.yml
|
||
|
||
```yaml
|
||
version: '3.8'
|
||
|
||
networks:
|
||
studio-network:
|
||
driver: bridge
|
||
|
||
volumes:
|
||
ollama-data:
|
||
openwebui-data:
|
||
models-audio:
|
||
models-image:
|
||
models-tts:
|
||
outputs:
|
||
|
||
services:
|
||
|
||
# ─── INTERFACE & LLM ───────────────────────────
|
||
|
||
ollama:
|
||
image: ollama/ollama:latest
|
||
container_name: ollama
|
||
runtime: nvidia
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
volumes:
|
||
- ollama-data:/root/.ollama
|
||
ports:
|
||
- "11434:11434"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
|
||
open-webui:
|
||
image: ghcr.io/open-webui/open-webui:main
|
||
container_name: open-webui
|
||
depends_on:
|
||
- ollama
|
||
environment:
|
||
- OLLAMA_BASE_URL=http://ollama:11434
|
||
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
|
||
- ENABLE_SIGNUP=true
|
||
volumes:
|
||
- openwebui-data:/app/backend/data
|
||
ports:
|
||
- "3000:8080"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
|
||
# ─── GÉNÉRATION MUSICALE ───────────────────────
|
||
|
||
ace-step:
|
||
build: ./services/ace-step
|
||
container_name: ace-step
|
||
runtime: nvidia
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
volumes:
|
||
- models-audio:/models
|
||
- outputs:/outputs
|
||
ports:
|
||
- "7860:7860"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
|
||
heart-mula:
|
||
build: ./services/heart-mula
|
||
container_name: heart-mula
|
||
runtime: nvidia
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
volumes:
|
||
- models-audio:/models
|
||
- outputs:/outputs
|
||
ports:
|
||
- "7861:7861"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
|
||
# ─── VOIX OFF ──────────────────────────────────
|
||
|
||
zonos:
|
||
build: ./services/zonos
|
||
container_name: zonos
|
||
runtime: nvidia
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
volumes:
|
||
- models-tts:/models
|
||
- outputs:/outputs
|
||
ports:
|
||
- "7862:7862"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
|
||
indextts:
|
||
build: ./services/indextts
|
||
container_name: indextts
|
||
runtime: nvidia
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
volumes:
|
||
- models-tts:/models
|
||
- outputs:/outputs
|
||
ports:
|
||
- "7863:7863"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
|
||
# ─── FOLEY ─────────────────────────────────────
|
||
|
||
hunyuan-foley:
|
||
build: ./services/hunyuan-foley
|
||
container_name: hunyuan-foley
|
||
runtime: nvidia
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
volumes:
|
||
- models-audio:/models
|
||
- outputs:/outputs
|
||
ports:
|
||
- "7864:7864"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
|
||
# ─── GÉNÉRATION IMAGE ──────────────────────────
|
||
|
||
comfyui:
|
||
build: ./services/comfyui
|
||
container_name: comfyui
|
||
runtime: nvidia
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
volumes:
|
||
- models-image:/root/ComfyUI/models
|
||
- outputs:/outputs
|
||
ports:
|
||
- "8188:8188"
|
||
networks:
|
||
- studio-network
|
||
restart: unless-stopped
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Dockerfile type par service
|
||
|
||
Chaque service a son propre Dockerfile avec ses dépendances exactes.
|
||
Exemple pour ACE-Step :
|
||
|
||
```dockerfile
|
||
# services/ace-step/Dockerfile
|
||
FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04
|
||
|
||
ENV DEBIAN_FRONTEND=noninteractive
|
||
|
||
RUN apt-get update && apt-get install -y \
|
||
python3.11 python3.11-pip python3.11-venv \
|
||
ffmpeg libsndfile1 git wget
|
||
|
||
RUN python3.11 -m pip install --upgrade pip
|
||
|
||
# Dépendances spécifiques ACE-Step
|
||
RUN python3.11 -m pip install \
|
||
torch==2.2.0 torchaudio==2.2.0 \
|
||
--index-url https://download.pytorch.org/whl/cu121
|
||
|
||
RUN python3.11 -m pip install ace-step gradio fastapi uvicorn
|
||
|
||
COPY server.py /app/server.py
|
||
WORKDIR /app
|
||
|
||
EXPOSE 7860
|
||
CMD ["python3.11", "server.py"]
|
||
```
|
||
|
||
Même structure pour chaque service, avec les versions exactes requises par chaque modèle.
|
||
|
||
---
|
||
|
||
## 6. Provisioning Script VM
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# =============================================================
|
||
# Studio IA — Provisioning Script VM Vast.ai
|
||
# =============================================================
|
||
set -eo pipefail
|
||
|
||
echo "🚀 Installation de Docker..."
|
||
curl -fsSL https://get.docker.com | bash
|
||
systemctl enable docker
|
||
systemctl start docker
|
||
|
||
echo "🎮 Installation NVIDIA Container Toolkit..."
|
||
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
|
||
gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
|
||
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
|
||
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
|
||
tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
|
||
apt-get update && apt-get install -y nvidia-container-toolkit
|
||
nvidia-ctk runtime configure --runtime=docker
|
||
systemctl restart docker
|
||
|
||
echo "📦 Clonage du dépôt Studio IA..."
|
||
git clone https://git.syoul.fr/nicoboy/VASTAI-STUDIO-AUDIO.git /root/studio-ai
|
||
cd /root/studio-ai
|
||
|
||
echo "📥 Téléchargement des modèles..."
|
||
bash models/download_audio.sh
|
||
bash models/download_tts.sh
|
||
bash models/download_image.sh
|
||
|
||
echo "🏗️ Build et lancement des containers..."
|
||
docker compose up -d --build
|
||
|
||
echo ""
|
||
echo "✅ Studio IA prêt !"
|
||
echo " Open WebUI → http://[IP]:3000"
|
||
echo " ComfyUI → http://[IP]:8188"
|
||
echo " ACE-Step → http://[IP]:7860"
|
||
```
|
||
|
||
---
|
||
|
||
## 7. Modèles — État de l'art 2026
|
||
|
||
### 🎵 Musique
|
||
| Modèle | VRAM | Qualité | Vitesse |
|
||
|---|---|---|---|
|
||
| **ACE-Step 1.5** | 8-12 Go | ⭐⭐⭐⭐ | Très rapide |
|
||
| **Heart Mula** | 12-16 Go | ⭐⭐⭐⭐⭐ | Lente |
|
||
|
||
### 🎤 Voix Off
|
||
| Modèle | VRAM | Spécialité |
|
||
|---|---|---|
|
||
| **Zonos-v0.1** | 8-12 Go | Émotion, clone voix 10s, 44kHz |
|
||
| **IndexTTS-2** | 8 Go | Sync animation, contrôle durée ms |
|
||
|
||
### 🔊 Foley
|
||
| Modèle | VRAM | Spécialité |
|
||
|---|---|---|
|
||
| **HunyuanVideo-Foley** | 12-16 Go | Analyse vidéo → son synchronisé |
|
||
|
||
### 🖼️ Image
|
||
| Modèle | VRAM | Qualité |
|
||
|---|---|---|
|
||
| **Flux.1** | 12-16 Go | ⭐⭐⭐⭐⭐ |
|
||
| **SDXL** | 8-12 Go | ⭐⭐⭐⭐ |
|
||
|
||
---
|
||
|
||
## 8. Estimation disque
|
||
|
||
| Élément | Taille |
|
||
|---|---|
|
||
| Images Docker (tous services) | ~20 Go |
|
||
| Modèles LLM (Mistral + CodeLlama) | ~12 Go |
|
||
| Modèles Audio (ACE-Step, Heart Mula) | ~10 Go |
|
||
| Modèles TTS (Zonos, IndexTTS-2) | ~8 Go |
|
||
| HunyuanVideo-Foley | ~8 Go |
|
||
| ComfyUI + Flux.1 + SDXL | ~20 Go |
|
||
| Outputs utilisateurs | ~10 Go |
|
||
| **Total** | **~88 Go** |
|
||
|
||
> ✅ **130 Go = juste suffisant**
|
||
> ⭐ **200 Go = recommandé pour être à l'aise**
|
||
|
||
---
|
||
|
||
## 9. Configuration Open WebUI (à faire avec Claude)
|
||
|
||
### 9.1 Connexions à configurer
|
||
- Ollama : `http://ollama:11434`
|
||
- ACE-Step : `http://ace-step:7860`
|
||
- Heart Mula : `http://heart-mula:7861`
|
||
- Zonos : `http://zonos:7862`
|
||
- IndexTTS : `http://indextts:7863`
|
||
- HunyuanVideo : `http://hunyuan-foley:7864`
|
||
- ComfyUI : `http://comfyui:8188`
|
||
|
||
> Sur le réseau Docker interne, les services se parlent par nom de container.
|
||
|
||
### 9.2 Tools à créer (Functions Open WebUI)
|
||
- `generate_music(prompt, duration, model)`
|
||
- `generate_voice(text, emotion, speaker_sample)`
|
||
- `generate_foley(video_path, prompt)`
|
||
- `generate_image(prompt, width, height, model)`
|
||
- `generate_code(prompt, language)`
|
||
|
||
### 9.3 System Prompt
|
||
```
|
||
Tu es un assistant créatif expert en production multimédia.
|
||
Tu disposes des outils suivants :
|
||
- generate_music : composition musicale (ACE-Step ou Heart Mula)
|
||
- generate_voice : voix off avec contrôle émotionnel (Zonos ou IndexTTS)
|
||
- generate_foley : bruitage synchronisé vidéo (HunyuanVideo-Foley)
|
||
- generate_image : génération d'images (Flux.1 ou SDXL)
|
||
- generate_code : écriture de code (CodeLlama)
|
||
|
||
Avant chaque génération, tu clarifies la demande.
|
||
Après chaque génération, tu proposes des ajustements.
|
||
```
|
||
|
||
---
|
||
|
||
## 10. Checklist projet
|
||
|
||
- [x] Architecture définie (VM + Docker Compose)
|
||
- [x] État de l'art 2026 intégré
|
||
- [ ] **Dockerfiles × 7 → Gemini**
|
||
- [ ] **docker-compose.yml final → Gemini**
|
||
- [ ] Build + push DockerHub (image par service)
|
||
- [ ] Test VM Vast.ai + Docker Compose
|
||
- [ ] Scripts téléchargement modèles
|
||
- [ ] **Configuration Open WebUI → Claude**
|
||
- [ ] **Tools API (Functions) → Claude**
|
||
- [ ] **System Prompts → Claude**
|
||
- [ ] Tests utilisateur finaux
|
||
|
||
---
|
||
|
||
## 11. Avantages de cette architecture
|
||
|
||
| Critère | Venv unique | VM + Docker Compose |
|
||
|---|---|---|
|
||
| Isolation dépendances | ⚠️ Partielle | ✅ Totale |
|
||
| Conflits de versions | ❌ Fréquents | ✅ Impossibles |
|
||
| Mise à jour d'un modèle | ❌ Risqué | ✅ Indépendante |
|
||
| Un service plante | ❌ Tout plante | ✅ Les autres continuent |
|
||
| Maintenabilité | ❌ Difficile | ✅ Simple |
|
||
| Coût Vast.ai | ✅ Une instance | ✅ Une VM | |