Téléverser les fichiers vers "/"

fichiers en +
This commit is contained in:
2026-02-23 13:26:43 +00:00
parent f45829c95a
commit 2c225b436a
2 changed files with 507 additions and 0 deletions

View File

@ -0,0 +1,286 @@
# 🎙️ Template Vast.ai — Studio IA Design Sonore
> Configuration complète pour RTX 5060 Ti (16 Go VRAM) / 130 Go de stockage
---
## 📋 Paramètres du Template
| Champ | Valeur |
|---|---|
| **Template Name** | `Studio IA - Design Sonore & Composition` |
| **Template Description** | Studio de génération audio IA pour novices. Interface web ChatGPT-like alimentée par AudioCraft (MusicGen + AudioGen). Accès navigateur uniquement, aucune compétence technique requise. |
| **Image Path:Tag** | `nvidia/cuda:12.1.1-devel-ubuntu22.04` |
| **Launch Mode** | `Jupyter + SSH` |
| **Disk Space** | `130 Go` |
| **Visibility** | `Privé` |
---
## 🔌 Ports à déclarer
| Port interne | Protocole | Usage |
|---|---|---|
| `3000` | TCP | Open WebUI (interface utilisateur) |
| `7860` | TCP | AudioCraft / Gradio API |
| `22` | TCP | SSH (auto-ajouté en mode Jupyter+SSH) |
| `8080` | TCP | Jupyter (auto-ajouté en mode Jupyter+SSH) |
---
## 🌐 Variables d'environnement
| Variable | Valeur |
|---|---|
| `PROVISIONING_SCRIPT` | https://git.syoul.fr/nicoboy/VASTAI-STUDIO-AUDIO/raw/branch/main/provisioning_script.sh?token=980621d1d7f71f71a403b6c31078bf8f3734441c |
| `PORTAL_CONFIG` | localhost:3000:3000:/:OpenWebUI|localhost:7860:7860:/:AudioCraft|localhost:1111:11111:/:Portal |
| `CUDA_VISIBLE_DEVICES` | `0` |
| `PYTORCH_CUDA_ALLOC_CONF` | `max_split_size_mb:512` |
> ⚠️ Ne jamais mettre de clés API ou mots de passe ici si le template est public.
---
## ⚙️ On-start Script
```bash
#!/bin/bash
# Persister les variables d'environnement
env >> /etc/environment
```
> Le gros du travail est dans le PROVISIONING_SCRIPT ci-dessous.
---
## 📜 PROVISIONING_SCRIPT (contenu complet)
Héberger ce script sur GitHub/Gist et pointer `PROVISIONING_SCRIPT` vers l'URL raw.
```bash
#!/bin/bash
# =============================================================
# Studio IA - Design Sonore & Composition
# Provisioning Script pour RTX 5060 Ti / CUDA 12.1
# =============================================================
set -eo pipefail
echo "🎙️ Démarrage du provisioning Studio Audio IA..."
# --- 1. MISE À JOUR SYSTÈME & DÉPENDANCES ---
apt-get update -y && apt-get install -y \
python3.10 python3.10-venv python3-pip \
ffmpeg libsndfile1 sox \
ca-certificates curl gnupg lsb-release \
git wget nano screen
# --- 2. INSTALLATION DOCKER (si non présent) ---
if ! command -v docker &> /dev/null; then
echo "📦 Installation de Docker..."
curl -fsSL https://get.docker.com | bash
fi
# --- 3. LANCEMENT OPEN WEBUI ---
echo "🖥️ Lancement d'Open WebUI sur le port 3000..."
docker pull ghcr.io/open-webui/open-webui:main
docker run -d \
--name open-webui \
--restart always \
--gpus all \
-p 3000:8080 \
-v open-webui:/app/backend/data \
-e WEBUI_SECRET_KEY="vastai-studio-secret-$(date +%s)" \
-e DEFAULT_MODELS="" \
-e ENABLE_SIGNUP=true \
ghcr.io/open-webui/open-webui:main
echo "✅ Open WebUI lancé sur le port 3000"
# --- 4. ENVIRONNEMENT PYTHON POUR AUDIOCRAFT ---
echo "🐍 Création de l'environnement Python AudioCraft..."
python3.10 -m venv /workspace/venv-audiocraft
source /workspace/venv-audiocraft/bin/activate
pip install --upgrade pip
# PyTorch compatible CUDA 12.1
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# AudioCraft (MusicGen + AudioGen)
pip install git+https://github.com/facebookresearch/audiocraft.git
# Serveur API Gradio
pip install gradio fastapi uvicorn pydantic scipy soundfile
echo "✅ AudioCraft installé"
# --- 5. API AUDIOCRAFT (script serveur) ---
echo "🎵 Création du serveur API AudioCraft..."
mkdir -p /workspace/audiocraft-api
cat > /workspace/audiocraft-api/server.py << 'PYEOF'
import gradio as gr
import torch
import scipy.io.wavfile
import numpy as np
import tempfile, os
from audiocraft.models import MusicGen, AudioGen
# Chargement des modèles (une seule fois)
print("🔄 Chargement de MusicGen...")
music_model = MusicGen.get_pretrained("facebook/musicgen-small")
music_model.set_generation_params(duration=10)
print("🔄 Chargement d'AudioGen...")
audio_model = AudioGen.get_pretrained("facebook/audiogen-medium")
audio_model.set_generation_params(duration=5)
def generate_music(prompt: str, duration: int = 10):
"""Génère de la musique à partir d'un prompt textuel."""
music_model.set_generation_params(duration=duration)
wav = music_model.generate([prompt])
wav_np = wav[0, 0].cpu().numpy()
sr = music_model.sample_rate
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
scipy.io.wavfile.write(f.name, sr, (wav_np * 32767).astype(np.int16))
return f.name
def generate_sound(prompt: str, duration: int = 5):
"""Génère des bruitages et ambiances sonores."""
audio_model.set_generation_params(duration=duration)
wav = audio_model.generate([prompt])
wav_np = wav[0, 0].cpu().numpy()
sr = audio_model.sample_rate
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
scipy.io.wavfile.write(f.name, sr, (wav_np * 32767).astype(np.int16))
return f.name
# Interface Gradio
with gr.Blocks(title="🎙️ Studio Audio IA") as demo:
gr.Markdown("## 🎙️ Studio Audio IA — AudioCraft API")
with gr.Tab("🎵 Musique (MusicGen)"):
music_prompt = gr.Textbox(label="Prompt", placeholder="Calm piano music with soft strings, 120bpm...")
music_duration = gr.Slider(5, 30, value=10, step=5, label="Durée (secondes)")
music_btn = gr.Button("🎵 Générer la musique")
music_output = gr.Audio(label="Résultat")
music_btn.click(generate_music, inputs=[music_prompt, music_duration], outputs=music_output)
with gr.Tab("🔊 Bruitages (AudioGen)"):
sound_prompt = gr.Textbox(label="Prompt", placeholder="Wood cracking, cathedral reverb, horror atmosphere...")
sound_duration = gr.Slider(2, 15, value=5, step=1, label="Durée (secondes)")
sound_btn = gr.Button("🔊 Générer le son")
sound_output = gr.Audio(label="Résultat")
sound_btn.click(generate_sound, inputs=[sound_prompt, sound_duration], outputs=sound_output)
demo.launch(server_name="0.0.0.0", server_port=7860, share=False)
PYEOF
echo "✅ Serveur API AudioCraft créé"
# --- 6. LANCEMENT DU SERVEUR AUDIOCRAFT EN ARRIÈRE-PLAN ---
echo "🚀 Démarrage du serveur AudioCraft..."
source /workspace/venv-audiocraft/bin/activate
cd /workspace/audiocraft-api
# Lancement dans un écran screen pour persistance
screen -dmS audiocraft bash -c "
source /workspace/venv-audiocraft/bin/activate
cd /workspace/audiocraft-api
python server.py 2>&1 | tee /workspace/audiocraft.log
"
echo "✅ AudioCraft lancé sur le port 7860 (écran: 'audiocraft')"
# --- 7. PERSISTANCE DES VARIABLES ---
env >> /etc/environment
echo ""
echo "🎉 ============================================="
echo " Studio IA - Design Sonore prêt !"
echo " Open WebUI → port 3000"
echo " AudioCraft → port 7860"
echo " Logs → /workspace/audiocraft.log"
echo "============================================="
```
---
## 🤖 System Prompt Open WebUI (à importer manuellement)
Après connexion à Open WebUI (port 3000), créer un nouveau modèle/assistant avec ce prompt :
```
Tu es un Ingénieur du Son expert et pédagogue. Ton rôle est d'aider des novices complets à créer des sons et de la musique grâce à l'IA.
RÈGLES FONDAMENTALES :
1. Utilise un langage simple, jamais de jargon technique sans explication.
2. Si l'utilisateur est vague (ex: "un son de forêt"), pose des questions précises :
- Veut-il de la pluie ? Des oiseaux ? Une ambiance nocturne ?
- Quel usage ? (jeu vidéo, film, méditation, musique...)
- Quelle durée ? (quelques secondes, une boucle de 30s...)
3. Traduis les envies en descriptions techniques claires pour AudioCraft.
4. Propose toujours 2-3 variations du prompt pour offrir des choix.
5. Explique ce que tu vas générer AVANT de le faire.
EXEMPLES DE TRADUCTION :
- "Un son qui fait peur" → "Deep drone with low rumble, distant whispers, reverb, horror cinematic atmosphere"
- "Musique joyeuse pour enfants" → "Playful xylophone melody, cheerful, bright, 120bpm, children cartoon style"
- "Ambiance de forêt" → "Dense forest ambience, birds chirping, wind through leaves, morning atmosphere, gentle stream"
FORMAT DE RÉPONSE :
1. Reformule ce que l'utilisateur veut (pour valider)
2. Propose le prompt technique que tu vas utiliser
3. Demande confirmation avant de lancer la génération
4. Après génération : propose des ajustements (plus d'écho, plus grave, etc.)
Tu es patient, encourageant, et passionné par le design sonore. Chaque création est une collaboration artistique.
```
---
## 🔁 PORTAL_CONFIG — Accès simplifié
```
localhost:3000:3000:/:Open WebUI|localhost:7860:7860:/:AudioCraft API|localhost:1111:11111:/:Instance Portal|localhost:8080:18080:/:Jupyter
```
---
## ✅ Checklist de déploiement
- [ ] Héberger le provisioning script sur GitHub/Gist et copier l'URL raw
- [ ] Coller l'URL dans la variable `PROVISIONING_SCRIPT`
- [ ] Vérifier que les ports 3000 et 7860 sont bien ajoutés
- [ ] Sauvegarder avec **Create & Use**
- [ ] Attendre ~10-15 min (téléchargement des modèles AudioCraft ~8 Go)
- [ ] Accéder à l'interface via le port mappé 3000
- [ ] Créer un compte admin dans Open WebUI
- [ ] Importer le System Prompt ci-dessus
- [ ] Tester une génération audio
---
## ⚡ Commande CLI équivalente
```bash
vastai create instance \
--image "nvidia/cuda:12.1.1-devel-ubuntu22.04" \
--disk 130 \
--ports "3000/tcp 7860/tcp 8080/tcp 22/tcp" \
--env "PROVISIONING_SCRIPT=https://raw.githubusercontent.com/VOTRE_REPO/main/studio-audio-provisioning.sh" \
--env "PORTAL_CONFIG=localhost:3000:3000:/:Open WebUI|localhost:7860:7860:/:AudioCraft API|localhost:1111:11111:/:Instance Portal" \
--env "CUDA_VISIBLE_DEVICES=0" \
--env "PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512"
```
---
## 📝 Notes RTX 5060 Ti
- **16 Go VRAM** : suffisant pour faire tourner MusicGen-small + AudioGen-medium simultanément.
- Si manque de VRAM : passer à `musicgen-melody` et charger les modèles à la demande (unload entre générations).
- Les modèles AudioCraft totalisent ~6-8 Go sur disque — les 130 Go sont confortables.
- Temps de génération estimé : 5-15 secondes pour 10s de musique sur RTX 5060 Ti.

221
vastai-templates-context.md Normal file
View File

@ -0,0 +1,221 @@
# Vast.ai — Guide de création de templates
> Référence condensée pour créer et configurer ses propres templates sur Vast.ai.
---
## 1. Identification
| Champ | Description |
|---|---|
| **Template Name** | Nom affiché sur la carte du template. |
| **Template Description** | Description optionnelle, utile si le template est partagé/public. |
---
## 2. Image Docker (`Image Path:Tag`)
Format obligatoire : `repository/image_name:tag`
Exemples d'images compatibles :
- Images publiques DockerHub : `nginx:latest`, `postgres:14`, `python:3.11`
- Images Vast.ai : `vastai/base-image`, `vastai/pytorch`
- Registres alternatifs (chemin complet requis) : `nvcr.io/nvidia/pytorch:25.04-py3`, `ghcr.io/…`, `gcr.io/…`
**Tag spécial `[Automatic]`** : sélectionne automatiquement l'image compatible avec la version CUDA de la machine (nécessite que le tag contienne la version CUDA, ex: `my-image-cuda-12.8`).
---
## 3. Ports
- Ajouter les ports TCP/UDP nécessaires à l'accès externe.
- Un port externe aléatoire est assigné et mappé vers le port interne du container.
- Alternative via tunnel SSH :
```bash
ssh -p [SSH_PORT] [USER]@[REMOTE_HOST] -L [LOCAL_PORT]:localhost:[REMOTE_PORT]
```
---
## 4. Variables d'environnement
- Ajouter les variables requises par l'image Docker.
- **Ne jamais mettre de secrets dans un template public** → utiliser les variables d'environnement du compte (`cloud.vast.ai/account/`) qui sont injectées dans toutes les instances.
### Variables spéciales
| Variable | Rôle |
|---|---|
| `PROVISIONING_SCRIPT` | URL d'un script shell exécuté au démarrage de l'instance |
| `PORTAL_CONFIG` | Configure l'accès aux applications via l'Instance Portal |
---
## 5. Modes de lancement
| Mode | Description |
|---|---|
| **Jupyter + SSH** | Installe Jupyter (port `8080`) et SSH (port `22`) au runtime. Entrypoint Docker ignoré. |
| **SSH uniquement** | Comme ci-dessus, sans Jupyter. Entrypoint Docker ignoré. |
| **docker ENTRYPOINT** | Le container s'exécute exactement comme prévu. Aucun outil supplémentaire ajouté. |
> ⚠️ En mode Jupyter ou SSH, l'entrypoint Docker original **n'est pas exécuté**. Utiliser le **On-start Script** pour démarrer les services.
---
## 6. On-start Script (Jupyter/SSH uniquement)
Script Bash exécuté au démarrage. Exemples :
```bash
# Exécuter un script existant dans l'image
chmod +x /usr/local/bin/start.sh
bash /usr/local/bin/start.sh
# Modifier un fichier de configuration
sed -i 's/-sslOnly//g' /dockerstartup/vnc_startup.sh
# Créer un répertoire
sudo -i -u kasm-user mkdir -p /home/kasm-user/Desktop
# Persister les variables d'environnement
env >> /etc/environment
```
> Toujours appeler la commande ENTRYPOINT/CMD originale à la fin du script.
---
## 7. PROVISIONING_SCRIPT — Personnalisation au runtime
**Méthode la plus simple** pour personnaliser un template sans rebuilder une image Docker.
### Configuration
1. Éditer un template (ex: `vastai/base-image` ou `vastai/pytorch`)
2. Ajouter la variable d'environnement `PROVISIONING_SCRIPT` avec une URL vers un script shell (GitHub, Gist, etc.)
### Exemple de script
```bash
#!/bin/bash
cd /workspace/
set -eo pipefail
# Activer l'environnement virtuel
. /venv/main/bin/activate
# Installer des packages
pip install your-packages
# Télécharger des fichiers
wget -P "${WORKSPACE}/" https://example.org/my-application.tar.gz
tar xvf ${WORKSPACE}/my-application.tar.gz
# Configurer un service Supervisor
echo "my-supervisor-config" > /etc/supervisor/conf.d/my-application.conf
echo "my-supervisor-wrapper" > /opt/supervisor-scripts/my-application.sh
chmod +x /opt/supervisor-scripts/my-application.sh
# Reconfigurer le portail
export PORTAL_CONFIG="localhost:1111:11111:/:Instance Portal|localhost:1234:11234:/:My Application"
# Recharger Supervisor
supervisorctl reload
```
> Toutes les installations doivent aller dans `/workspace/` pour la persistance.
---
## 8. PORTAL_CONFIG — Accès aux applications
Structure :
```
hostname:external_port:local_port:url_path:Application Name|...
```
- Séparateur entre applications : `|`
- Séparateur entre paramètres : `:`
- `hostname` = toujours `localhost` dans les containers Docker
- Si `external_port ≠ local_port` → Caddy agit en reverse proxy
- Si `external_port = local_port` → Caddy ne proxifie pas (utile pour Jupyter)
Exemple complet :
```bash
"localhost:8002:18002:/hello:MyApp|localhost:1111:11111:/:Instance Portal|localhost:8080:18080:/:Jupyter|localhost:8384:18384:/:Syncthing"
```
---
## 9. Images Docker personnalisées (build custom)
### Option A : FROM une image Vast.ai (recommandé)
```dockerfile
FROM vastai/base-image:cuda-12.6.3-cudnn-devel-ubuntu22.04-py313
# ou
FROM vastai/pytorch:2.6.0-cuda-12.6.3-py312
WORKDIR /opt/workspace-internal/
RUN . /venv/main/bin/activate && your-installation-commands
```
### Option B : FROM n'importe quelle image de base
Compatible avec toute image publique ou privée.
**Étapes** :
1. Écrire le Dockerfile
2. `docker build` + `docker push` vers un registre
3. Créer un template avec le chemin de l'image personnalisée
---
## 10. Authentification Docker (images privées)
Renseigner les credentials dans la section **Docker Repository Authentication**.
| Registre | Server Name |
|---|---|
| Docker Hub | *(laisser vide)* |
| GitHub Container Registry | `ghcr.io` |
| Google Container Registry | `gcr.io` |
---
## 11. Paramètres supplémentaires
| Paramètre | Description |
|---|---|
| **Disk Space** | Espace disque minimum pour les instances créées depuis ce template |
| **Extra Filters** | Restreindre les machines affichées (ex: CPU architecture AMD64/ARM64) |
| **Visibility** | Public (visible dans la recherche) ou Privé (accessible via URL uniquement) |
> ⚠️ Ne jamais mettre de secrets dans un template public.
---
## 12. Sauvegarde et lancement
| Bouton | Action |
|---|---|
| **Create** | Sauvegarde dans "My Templates" |
| **Create & Use** | Sauvegarde et ouvre la page des offres |
Le template génère aussi une **commande CLI** équivalente (section lecture seule).
---
## Cas d'usage courants
**Lancer une application existante (ex: nginx)**
1. Trouver l'image officielle sur DockerHub
2. Créer un template avec l'image + ports requis
3. Sauvegarder et lancer
**Personnaliser un template Vast recommandé**
1. Éditer un template recommandé
2. Ajouter `PROVISIONING_SCRIPT` pointant vers votre script
3. Voir section 7 ci-dessus
**Construire sa propre image Docker**
1. Créer un Dockerfile (optionnellement FROM une image Vast)
2. Build + push vers un registre
3. Créer un template avec le chemin de l'image custom