In English Accueil
Le 11 janvier , 2026 :
Entraîner une LoRA SDXL avec SD-SCRIPTS (KOHYA)sur RunPod ou Vastai – Retour d’expérience réel, et la tester
INTRODUCTION
Comment entrainer une LoRA avec stable-diffusion-xl-base-1.0 et SD-SCRIPTS (KOHYA) et un dataset sur Runpod
Il ne s'agit pas vraiment d'un tutoriel mais du fruit de mon experience
Une compliation des réponses de mon IA qui ont fonctionné
J'ai mis de nombreux jours à faire fonctionner le training
C'est un environnement fragile qui se mérite
J'ai d'abord essayé d'entrainer ma LoRA sur Google Colab
Le T4 a une mémoire de 15GO insuffisante qui a entrainé toute une série de crash silencieux
De plus le stokage n'est pas persistant et il y a de nombreuses déconnections intempestives
Louez donc un POD sur Runpod il ne vous en coutera que quelqes centimes par heures à la demande,uniquement lors de l'utilisation du GPU.
L'entrainement de la LoRA selon l'ampleur du dataset met entre 1h et 2h 30
CARACTERISTIQUES RTX A6000
Beaucoup de cœurs CUDA + Tensor → capacité très élevée de calcul parallèle, idéale pour des architectures larges comme SDXL et l’entraînement LoRA.
💾 Mémoire et bande passante
Mémoire GPU : 48 Go GDDR6 avec ECC
Bus mémoire : 384-bit
Bande passante : ~768 GB/s
👉 Conséquence pratique :
48 Go de VRAM permet d’entraîner SDXL dans des résolutions élevées (1024×1024), avec bucket/latent caching, et d’éviter les Out-Of-Memory (OOM).
La haute bande passante favorise l’accès rapide aux données, crucial pour les modèles de diffusion.
⚡ Performances
Performance FP32 (simple précision) : ~38.7 TFLOPS
Tensor Performance : ~309.7 TFLOPS (Tensor Cores)
TDP (consommation max) : 300 W
Interface : PCI Express 4.0 × 16
👉 Conséquence pratique :
Très haute performance de calcul, ce qui se traduit par :
itérations plus rapides (≈ 1.4-1.6 s/it en SDXL LoRA)
meilleure efficacité tensorielle (fp16)
support de gros batchs si besoin
LE DATASET (répertoire d'images et fichiers txt)
Je passe vite sur certains détails
Ouvrer un terminal dans Jupiterlab sur votre pod c'est là ou vous allez travailler
Créer les répertoires ( arboresence plus loin) soit avec la commande mkdir sois avec l'éditeur vous devez etre dans workspace
Pour lancer le script de training vous devez être dans sd-scripts
Le dataset doit etre dans train
sd_xl_base_1.0.safetensors le model dans models
sd-scripts dans sd-scripts(KOHYA)
rapide rappel sur le dataset
Il se compose d'images et de fichiers texte pourtant le même nom
1_image.jpg -> 1_image.txt etc
Chaque fichier txt ou captions contient un tag genre mon_style_de_lora en tête de fichier qui
sera le nom de votre style pour l'utiliser lors d'un prompt texte
c'est aussi le nom du répertoire dans train avec un nombre devant 10_mon_style_de_lora
Chaque caption contient une description de l'image en style industriel
Des phrases clés comme pour le SEO sans phrases littéraires et ponctuations,peu differente, faite varier les termes pour l'ambiance, studio, plein air etc pour chaque image
Des bibliothéques ou des IA le font trés bien automatiquement
Dans notre cas chaque image doit être en 1024px X 1024px
Un script batch Python peut redimenssioner automatiquement en local
Pour télécharger votre dataset dans le répertoire train/10_mon_style_de_lora utiliser l'éditeur
Téléverser uniquement les images et les captions
Chaque image doit avoir sa caption avec son tag sinon le script de training plantera
Pareil pour une caption vide ou une image corrompue
Les formats d'images acceptées sont jpg et png
Que JPG testé
I
---
# 📘 TUTORIEL COMPLET — ENTRAÎNER UNE LoRA SDXL SUR RUNPOD (RTX A6000)
> Image utilisée :
> **`runpod/pytorch:2.4.0-py3.11-cuda12.4.1-devel-ubuntu22.04`**
> 👉 PyTorch + CUDA **déjà installés et fonctionnels**
---
## 🔰 INTRODUCTION — PRINCIPES FONDAMENTAUX
### ✅ Ce que garantit l’image RunPod
* PyTorch **2.4.x**
* CUDA **12.4**
* Drivers NVIDIA compatibles
* Support RTX A6000 / 4090
* Compilation CUDA correcte
### ❌ Ce qu’il ne faut JAMAIS faire
* ❌ Réinstaller `torch`
* ❌ Réinstaller CUDA
* ❌ Utiliser un `venv`
* ❌ Downgrader/upgrade numpy au hasard
* ❌ Laisser pip “résoudre tout seul”
👉 **Tous les bugs rencontrés auparavant venaient d’un environnement Python cassé, PAS du GPU.**
---
## 📁 STRUCTURE GÉNÉRALE DU PROJET (OBLIGATOIRE)
```
/workspace
├── models/
│ └── sd_xl_base_1.0.safetensors
├── train/
│ └── 10_sensual_lingerie_look/
│ ├── image1.jpg
│ ├── image1.txt
│ ├── image2.jpg
│ ├── image2.txt
│ └── ...
├── output/
├── sd-scripts/
└── logs/ (optionnel)
```
---
## 🚀 ÉTAPE 0 — CONFIGURATION DU POD RUNPOD (IMPORTANT)
* GPU : **RTX A6000**
* VRAM : **48 Go**
* vCPU : ≥ 8
* RAM : ≥ 64 Go
* Container disk : **≥ 100 Go**
* CUDA visible :
```bash
nvidia-smi
```
* ❌ Pas de venv
* ✅ Python système
---
## 🟢 ÉTAPE 1 — VÉRIFICATION PYTORCH / CUDA (UNE SEULE FOIS)
```bash
python - <<'PY'
import torch
print("Torch:", torch.__version__)
print("CUDA available:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0))
x = torch.randn(1, device="cuda")
print("CUDA OK")
PY
```
👉 Si ça passe : **NE PLUS TOUCHER À TORCH / CUDA**
---
Vérifications des dépendances installées !
surtout si vous avez tester une LoRA sur votre Pod
pip désinstalle les versions installées et les réinstalle avec des versions différentes ce qui
créé des conflits
python3 - <<'EOF'
packages = [
"accelerate",
"transformers",
"diffusers",
"safetensors",
"einops",
"albumentations",
"albucore",
"imagesize",
"toml",
"voluptuous",
"bitsandbytes",
"timm",
"scipy",
"tensorboard",
]
for pkg in packages:
try:
module = __import__(pkg)
version = getattr(module, "__version__", "unknown")
print(f"[OK] {pkg:<15} → {version}")
except Exception as e:
print(f"[MISSING] {pkg:<15} → {e}")
EOF
## 🟢 ÉTAPE 2 — INSTALLATION(SELON CELLES PAS PRESENTES) DES DÉPENDANCES MANQUANTES (SANS TORCH)
```bash
pip install \
accelerate \
transformers \
diffusers \
safetensors \
einops \
albumentations \
albucore \
imagesize \
toml \
voluptuous \
bitsandbytes \
timm \
scipy \
tensorboard
```
⚠️ **NE PAS installer torch**
⚠️ **NE PAS installer numpy ici**
---
## 🛑 ÉTAPE CRITIQUE — FIXER NUMPY & OPENCV (OBLIGATOIRE)
### ❌ Problème connu
* numpy **2.x** ❌
* opencv **≥ 4.9** ❌
👉 Ces versions **cassent silencieusement SDXL / LoRA**
---
### 🛠️ Correction immédiate
```bash
pip uninstall -y numpy opencv-python opencv-python-headless
```
```bash
pip install numpy==1.26.4 opencv-python-headless==4.8.1.78
```
❌ **NE PAS installer `opencv-python`**
✅ **headless uniquement**
---
### 🔍 Vérification OBLIGATOIRE
```bash
python - <<'PY'
import albumentations as A
import albucore
import cv2
import numpy
import torch
print("albumentations:", A.__version__)
print("albucore:", albucore.__version__)
print("opencv:", cv2.__version__)
print("numpy:", numpy.__version__)
print("cuda:", torch.cuda.is_available())
x = torch.randn(1, device="cuda")
print("CUDA OK")
PY
```
### ✅ Résultat attendu
```
albumentations: 1.4.8
albucore: 0.0.16
opencv: 4.8.1
numpy: 1.26.4
cuda: True
CUDA OK
```
---
## 🟢 ÉTAPE 3 — CONFIGURATION D’ACCELERATE (UNE SEULE FOIS)
> ⚠️ **Indispensable**, même si le script “utilise accelerate”
```bash
accelerate config
```
Réponses exactes :
```
Compute environment: LOCAL_MACHINE
Machine type: NO
Use CPU only: NO
Mixed precision: fp16
Num processes: 1
Use Torch Dynamo: NO
```
📌 Le fichier généré est lu automatiquement par `accelerate launch`.
---
## 🟢 ÉTAPE 4 — INSTALLATION DE SD-SCRIPTS (KOHYA)
```bash
cd /workspace
git clone https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts
pip install -r requirements.txt
```
---
## 🟢 ÉTAPE 5 — TÉLÉCHARGEMENT DU MODÈLE SDXL
```bash
cd /workspace/models
wget https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors
```
Vérifier :
```bash
ls -lh /workspace/models
```
---
## 🟢 ÉTAPE 6 — DATASET (FORMAT STRICT)
```
/workspace/train/10_sensual_lingerie_look/
├── glamour_01.jpg
├── glamour_01.txt
├── glamour_02.jpg
├── glamour_02.txt
└── ...
```
* même nom image / caption
* `.txt` obligatoire
* pas de sous-dossiers
* images propres (jpg/png)
---
## 🟢 ÉTAPE 7 — COMMANDE DE TRAINING SDXL LoRA (SAFE)
```bash
cd /workspace/sd-scripts
accelerate launch sdxl_train_network.py \
--pretrained_model_name_or_path=/workspace/models/sd_xl_base_1.0.safetensors \
--train_data_dir=/workspace/train \
--output_dir=/workspace/output \
--resolution=1024,1024 \
--enable_bucket \
--min_bucket_reso=512 \
--max_bucket_reso=1024 \
--bucket_reso_steps=64 \
--network_module=networks.lora \
--network_dim=32 \
--network_alpha=32 \
--network_train_unet_only \
--learning_rate=1e-4 \
--optimizer_type=AdamW \
--lr_scheduler=cosine \
--train_batch_size=1 \
--max_train_epochs=15 \
--caption_extension=.txt \
--gradient_checkpointing \
--save_every_n_epochs=5 \
--save_model_as=safetensors \
--output_name=sensual_lingerie_look_sdxl_lora
```
---
## 📦 SORTIE ATTENDUE
```
/workspace/output/
├── sensual_lingerie_look_sdxl_lora-000005.safetensors
├── sensual_lingerie_look_sdxl_lora-000010.safetensors
├── sensual_lingerie_look_sdxl_lora-000015.safetensors
```
👉 Garde **le dernier** ou compare-les en test.
---
## 🧠 POINTS CLÉS À RETENIR (CRITIQUES)
* ❌ GPU jamais en cause
* ❌ Colab instable pour SDXL LoRA
* ✅ RunPod = environnement pro
* ✅ numpy **1.26.4**
* ✅ opencv **4.8.1**
* ❌ numpy 2.x = roulette russe
* ❌ opencv ≥ 4.9 = crash silencieux
* ✅ accelerate configuré = CUDA stable
---
II FONCTIONS DES DEPENDANCES
---
# 🧠 DÉPENDANCES SDXL / LoRA — EXPLICATION COMPLÈTE
---
## 🧩 1. `torch` (déjà fourni par l’image RunPod)
> ⚠️ **NE PAS réinstaller avec ton image RunPod**
### Rôle
* Cœur du deep learning
* Gère :
* les tenseurs
* le GPU
* l’autograd
* le backward
* la VRAM
### Utilisé pour
* Entraînement UNet
* Calcul des gradients LoRA
* Backpropagation
* Mixed precision (fp16)
### Pourquoi critique
* 100 % du training repose dessus
### Problèmes fréquents
* torch sans CUDA → `CUDA available: False`
* torch compilé avec mauvaise version CUDA → erreurs fantômes
---
## 🧩 2. `accelerate`
### Rôle
* Orchestrateur de l’entraînement
* Abstraction du hardware (GPU / CPU / multi-GPU)
### Utilisé pour
* `accelerate launch`
* Gestion :
* fp16
* gradient checkpointing
* device placement
* DDP (si multi-GPU)
### Pourquoi indispensable
* `sd-scripts` **ne lance pas directement PyTorch**
* Il passe **TOUJOURS** par accelerate
### Sans `accelerate config`
* crash silencieux
* erreurs CUDA “device busy”
* mauvais device sélectionné
---
## 🧩 3. `transformers`
### Rôle
* Implémentation des **Text Encoders CLIP**
### Utilisé pour
* CLIP ViT-L / ViT-G (SDXL a **2 text encoders**)
* Tokenisation des captions
* Encodage texte → embeddings
### Sans lui
* Erreur :
```
ModuleNotFoundError: No module named 'transformers'
```
### Impact sur la LoRA
* Si tu entraînes le text encoder → dépendance **critique**
* Même UNet-only → nécessaire pour l’inférence texte
---
## 🧩 4. `diffusers`
### Rôle
* Implémentation officielle des pipelines Stable Diffusion
### Utilisé pour
* UNet SDXL
* VAE
* Schedulers
* Noise prediction
* Forward diffusion
### Pourquoi vital
* SDXL = architecture Diffusers
* VAE encode/décode les images
* Sans lui → aucun training possible
---
## 🧩 5. `safetensors`
### Rôle
* Format sécurisé de poids (sans pickle)
### Utilisé pour
* Charger le modèle SDXL
* Sauvegarder la LoRA
### Pourquoi obligatoire
* SDXL Base est en `.safetensors`
* kohya **refuse** certains formats non safe
---
## 🧩 6. `einops`
### Rôle
* Manipulation propre des dimensions de tenseurs
### Utilisé pour
* Réarrangements :
* batch
* channels
* spatial dims
### Exemple
```python
rearrange(x, 'b c h w -> b (h w) c')
```
### Pourquoi nécessaire
* SDXL manipule énormément les shapes
* Remplace des `view()` dangereux
---
## 🧩 7. `albumentations`
### Rôle
* Augmentation d’images
### Utilisé pour
* Resize
* Crop
* Flip
* Color augmentations
### Même si désactivé
* Importé au chargement du dataset
### Version critique
* ❌ ≥ 2.0 casse la compatibilité
* ✅ **1.4.8** = stable
---
## 🧩 8. `albucore`
### Rôle
* Backend bas niveau d’albumentations
### Utilisé pour
* Transformations rapides
* Normalisation
* Gestion numpy / cv2
### Pourquoi sensible
* Très dépendant de numpy / opencv
* Mauvaise version = crash data loader
---
## 🧩 9. `opencv-python-headless`
### Rôle
* Lecture / traitement d’images
### Utilisé pour
* Charger les `.jpg / .png`
* Resize
* Conversion couleur
### Pourquoi **headless**
* Pas d’interface graphique
* Plus léger
* Plus stable sur serveur
### Version critique
* ❌ ≥ 4.9 → casse SDXL
* ✅ **4.8.1.78**
---
## 🧩 10. `numpy`
### Rôle
* Base mathématique de tout le pipeline image
### Utilisé pour
* Datasets
* Augmentations
* Normalisation
* Conversion image → tensor
### Version **EXTRÊMEMENT critique**
* ❌ numpy 2.x = **INCOMPATIBLE**
* ✅ **1.26.4**
### Symptômes si mauvais numpy
* crash aléatoire
* freeze après quelques steps
* erreurs CUDA incompréhensibles
---
## 🧩 11. `bitsandbytes`
### Rôle
* Optimisations mémoire
### Utilisé pour
* Optimiseurs 8-bit
* Chargement plus léger
### Même si tu n’utilises pas 8-bit
* Importé par kohya
* Doit être présent
---
## 🧩 12. `timm`
### Rôle
* Collection de modèles vision
### Utilisé pour
* Certaines architectures
* Compatibilité CLIP / vision backends
---
## 🧩 13. `imagesize`
### Rôle
* Lire dimensions image **sans charger l’image**
### Utilisé pour
* Bucket resolution
* Vérification dataset
### Avantage
* Rapide
* Pas de RAM gaspillée
---
## 🧩 14. `toml`
### Rôle
* Parser les fichiers de config
### Utilisé pour
* Config dataset
* Config accelerate
* Config entraînement avancée
---
## 🧩 15. `voluptuous`
### Rôle
* Validation de schéma
### Utilisé pour
* Vérifier :
* arguments CLI
* dataset config
* valeurs incohérentes
### Sans lui
* crash au démarrage du script
---
## 🧩 16. `scipy`
### Rôle
* Fonctions math avancées
### Utilisé pour
* Schedulers
* Calculs numériques secondaires
---
## 🧩 17. `tensorboard` (optionnel mais utile)
### Rôle
* Visualisation de la loss
### Utilisé pour
* Suivre l’entraînement
* Déboguer overfit / underfit
---
# 🧠 SYNTHÈSE ULTRA-CLAIRE
| Dépendance | Sert à |
| --------------- | ---------------------- |
| torch | calcul GPU |
| accelerate | orchestration training |
| transformers | texte / CLIP |
| diffusers | SDXL core |
| safetensors | poids sécurisés |
| einops | reshape tensors |
| albumentations | augmentations |
| albucore | backend image |
| opencv-headless | lecture images |
| numpy | base numérique |
| bitsandbytes | mémoire |
| timm | vision models |
| imagesize | buckets |
| toml | config |
| voluptuous | validation |
| scipy | math |
| tensorboard | monitoring |
---
* SDXL = **stack très fragile**
* Python ≠ environnement reproductible
* numpy 2.x est **récente et cassante**
* les docs officielles sont incomplètes
* peu de gens documentent **les versions exactes**
III BEUGS RENCONTRES
CONCLUSION ET LES COMMANDES ESSENTIELS
Do you want to run your training on CPU only (even if a GPU / Apple Silicon / Ascend NPU device is available)? [yes/NO]
👉 **Réponse : `NO` (appuie simplement sur Entrée)**
### Pourquoi ?
* Tu **as une RTX A6000** détectée par `nvidia-smi`
* Tu veux **entraîner un LoRA SDXL**, ce qui est **impossible / inutile en CPU**
* Répondre `yes` forcerait `accelerate` à **ignorer le GPU** (erreur fatale pour ton cas)
### Donc fais exactement :
```
Do you want to run your training on CPU only? [yes/NO]
→ (Entrée)
```
---
### Pour la suite (pour que tu ne doutes pas), voici **les réponses correctes complètes** de `accelerate config` :
```
Compute environment: This machine
Machine type: No distributed training
Do you want to run your training on CPU only? NO
Do you want to use DeepSpeed? NO
How many processes do you want to use? 1
Do you want to use mixed precision? fp16
Do you want to enable Torch Dynamo? NO
```
À la fin, tu dois voir :
```
Accelerate configuration saved
```
---
### Juste après (très important)
Teste immédiatement :
```bash
accelerate env
```
Tu dois voir :
* `Mixed precision: fp16`
* `Num processes: 1`
* **pas de mention CPU-only**
---
👉 Dis-moi **ce que tu as répondu ensuite** ou colle la sortie finale de `accelerate config`, et on lance l’entraînement **sans perdre une minute**.
Would you like to enable numa efficiency? (Currently only supported on NVIDIA hardware). [yes/NO]:
👉 **Réponse : `NO` (appuie sur Entrée)**
### Pourquoi ?
* La **NUMA efficiency** n’apporte **aucun gain utile** pour :
* un **pod RunPod mono-GPU (RTX A6000)**
* un entraînement **SDXL LoRA**
* Elle peut même **introduire des comportements instables** selon le conteneur / driver
* Elle est surtout utile sur des **serveurs multi-socket / multi-GPU**, ce qui **n’est pas ton cas**
### Donc fais exactement :
```
Would you like to enable numa efficiency? [yes/NO]
→ (Entrée)
```
---
### Récap express des réponses correctes
Pour être sûr que tu ne doutes pas :
```
CPU only? NO
DeepSpeed? NO
Num processes? 1
Mixed precision? fp16
Torch Dynamo? NO
NUMA efficiency? NO
```
---
### Après ça (obligatoire)
Exécute :
```bash
accelerate env
RAPPEL DES COMMANDES
Parfait 👍
Voici **UN BLOC CLAIR, PROPRE ET RÉUTILISABLE** avec **toutes les commandes essentielles**, sans bruit, exactement ce que tu demandais.
---
# 🧠 COMMANDES ESSENTIELLES — RUNPOD SDXL LoRA (RÉFÉRENCE)
## 📁 1️⃣ Création de la structure des répertoires
À lancer **une seule fois** :
```bash
mkdir -p /workspace/{models,train,output,logs}
```
Structure attendue :
```
/workspace
├── models/
├── train/
├── output/
├── logs/
└── sd-scripts/
```
---
## 📦 2️⃣ Téléchargement du modèle SDXL
```bash
cd /workspace/models
wget https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors
```
Vérification :
```bash
ls -lh /workspace/models
```
---
## 🧬 3️⃣ Dataset — structure attendue
```bash
/workspace/train/10_sensual_lingerie_look/
├── image1.jpg
├── image1.txt
├── image2.jpg
├── image2.txt
└── ...
```
10 = le nombre de répétitions (repeats) appliquées à chaque image de ce dossier à chaque epoch.
(
🎯 Règles pratiques (recommandées)
🔹 Dataset petit (10–30 images)
10_ ou 15_
➡️ renforce l’apprentissage
🔹 Dataset moyen (30–80 images)
5_
🔹 Dataset grand (100+ images)
1_ ou 2_
)
⚠️ **Obligatoire**
* même nom image / caption
* `.txt` UTF-8
* pas d’espaces bizarres
---
## 🧪 4️⃣ Test GPU / CUDA (AVANT TOUT)
```bash
python - <<'PY'
import torch
print("Torch:", torch.__version__)
print("CUDA available:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0))
x = torch.randn(1, device="cuda")
print("CUDA OK")
PY
```
Résultat attendu :
```
CUDA available: True
GPU: NVIDIA RTX A6000
CUDA OK
```
---
## 📦 5️⃣ Installation MINIMALE des dépendances (UNE FOIS)
⚠️ **NE PAS installer torch ni numpy ici**
```bash
pip install \
accelerate \
transformers \
diffusers \
safetensors \
einops \
albumentations \
albucore \
opencv-python-headless \
imagesize \
toml \
voluptuous \
bitsandbytes \
timm \
scipy \
tensorboard
```
---
## 🔐 6️⃣ Fixer numpy + opencv (CRITIQUE)
```bash
pip uninstall -y numpy opencv-python opencv-python-headless
pip install numpy==1.26.4 opencv-python-headless==4.8.1.78
```
---
## 🔎 7️⃣ Vérification COMPLÈTE des dépendances critiques
```bash
python - <<'PY'
import torch, accelerate, transformers, diffusers, einops
import albumentations, albucore, cv2, numpy
print("torch:", torch.__version__)
print("accelerate:", accelerate.__version__)
print("transformers:", transformers.__version__)
print("diffusers:", diffusers.__version__)
print("einops:", einops.__version__)
print("albumentations:", albumentations.__version__)
print("albucore:", albucore.__version__)
print("opencv:", cv2.__version__)
print("numpy:", numpy.__version__)
print("CUDA:", torch.cuda.is_available())
x = torch.randn(1, device="cuda")
print("CUDA OK")
PY
```
Résultat **OBLIGATOIRE** :
```
numpy: 1.26.4
opencv: 4.8.1
CUDA OK
```
---
## ⚙️ 8️⃣ Configuration Accelerate (OBLIGATOIRE)
```bash
accelerate config
```
Réponses exactes :
```
Compute environment: LOCAL_MACHINE
Machine type: NO
Use CPU only: NO
Mixed precision: fp16
Num processes: 1
Use Torch Dynamo: NO
```
Vérification :
```bash
accelerate env
```
---
## 🧩 9️⃣ Installation de sd-scripts (kohya)
```bash
cd /workspace
git clone https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts
pip install -r requirements.txt
```
---
## 🚀 1️⃣0️⃣ Lancement du training (SDXL LoRA SAFE)
```bash
cd /workspace/sd-scripts
accelerate launch sdxl_train_network.py \
--pretrained_model_name_or_path=/workspace/models/sd_xl_base_1.0.safetensors \
--train_data_dir=/workspace/train \
--output_dir=/workspace/output \
--resolution=1024,1024 \
--enable_bucket \
--min_bucket_reso=512 \
--max_bucket_reso=1024 \
--bucket_reso_steps=64 \
--network_module=networks.lora \
--network_dim=32 \
--network_alpha=32 \
--network_train_unet_only \
--learning_rate=1e-4 \
--optimizer_type=AdamW \
--lr_scheduler=cosine \
--train_batch_size=1 \
--max_train_epochs=15 \
--caption_extension=.txt \
--gradient_checkpointing \
--save_every_n_epochs=5 \
--save_model_as=safetensors \
--output_name=sensual_lingerie_look_sdxl_lora
```
---
## 🧾 1️⃣1️⃣ Vérification des résultats
```bash
ls /workspace/output
```
Tu dois voir :
```
sensual_lingerie_look_sdxl_lora-000005.safetensors
sensual_lingerie_look_sdxl_lora-000010.safetensors
sensual_lingerie_look_sdxl_lora.safetensors
```
---
## 🏁 RÈGLES D’OR (À NE JAMAIS OUBLIER)
❌ Ne jamais réinstaller torch
❌ Ne jamais laisser pip upgrader numpy
❌ Ne jamais installer opencv >= 4.9
✅ Toujours vérifier CUDA AVANT training
✅ Toujours `accelerate config`
---
NE VOUS DECOURAGEZ PAS SOYEZ PERCEVERANT
j'espere que ce memo vous aura aidé
NB: Lors de l'extinction de Runpod la fois suivante les dépendances sont à réinstaller ce qui prend 10mn.
N'hésitez pas à me faire part de vos retours et améliorations
laurent.gevaert@hotmail.fr
EDIT: TRAINING LoRA SUR VASTAI.AI
INTRODUCTION: contrairement à Runpod ou un pod est mis à votre disposition
Vastai et le RB & B de la location GPU
Vous louez une instance GPU
Vous devez d'abord choisir une image logiciel ou configuration souhaitée sous forme de template et louer (clic sur rent)
sur l'instance GPU souhaitée , il y a plusieurs propositions choisissez en fonction du gpu voulu vram au dessus
de 30 GO et des libs et dépendances installées et du prix/horaire souvent un peu moins cher que Runpod
Vous avez contrairement à runpod la posibilité de sauvegarder votre instance avec les deps installées
pour environs 6 euros par mois.
Vous devez adapter la configuration voulu selon les images et configurations disponibles
je n'ai pas trouvé de RTX A6000 qui est assez ancien (2020).
Pour avoir une image avec un GPU RTX 5090 suffisement puissant et pythorch et cuda , j'ai du choisir une image avec kohya_gui
inutile que j'ai donc supprimé.(voir plus loin)
SUPPRESSION kohya_gui
Suite à une simple tentative de stop du processus pkill qui ne suffit pas
# 🚨 Ce qui se passe réellement (explication claire)
Tu as ceci **qui revient immédiatement** :
```text
/bin/bash /opt/supervisor-scripts/kohya.sh
python kohya_gui.py --server_port 17860 --headless --noverify
```
👉 **Conclusion sans ambiguïté** :
❌ `pkill` **ne suffit pas**, parce que :
> **Supervisor relance AUTOMATIQUEMENT Kohya GUI dès qu’il est tué**
Donc :
* tu tues le process
* supervisor détecte l’arrêt
* il le **redémarre immédiatement**
👉 C’est un comportement **normal** pour cette image Vast.ai.
---
# ✅ Solution DÉFINITIVE (celle qui marche vraiment)
Il faut **neutraliser le script supervisé**, pas juste le process.
---
## 🔐 ÉTAPE 1 — Désactiver le script Kohya (OBLIGATOIRE)
Exécute **exactement ceci** :
```bash
mv /opt/supervisor-scripts/kohya.sh /opt/supervisor-scripts/kohya.sh.disabled
```
👉 Ça empêche supervisor de le relancer.
Vérifie que le fichier n’existe plus :
```bash
ls /opt/supervisor-scripts/
```
Tu dois voir `kohya.sh.disabled` et **plus** `kohya.sh`.
---
## 🔪 ÉTAPE 2 — Tuer UNE DERNIÈRE FOIS Kohya
```bash
pkill -f kohya_gui.py
pkill -f kohya.sh
```
Puis :
```bash
ps aux | grep kohya
```
👉 Il ne doit rester **QUE** :
```text
grep --color=auto kohya
```
---
## 🧪 ÉTAPE 3 — Vérifier que le GPU est LIBRE
```bash
nvidia-smi
```
Résultat attendu :
* **0 process python**
* VRAM quasi vide
Si oui → **victoire** 🎉
---
# 🧠 Pourquoi c’est la BONNE méthode
✔ Tu ne touches PAS à CUDA
✔ Tu ne touches PAS à PyTorch
✔ Tu ne touches PAS à sd-scripts (à installer)
✔ Tu ne casses PAS l’image
✔ Tu empêches le redémarrage automatique
✔ Méthode **réversible**
Pour réactiver Kohya plus tard :
```bash
mv /opt/supervisor-scripts/kohya.sh.disabled /opt/supervisor-scripts/kohya.sh
```
BEUGS RENCONTRES SPECIFIQUES A MON INSTANCE LORS DU LANCEMENT DU TRANING
## ✅ 1️⃣ Supprimer `invisible-watermark` (recommandé)
`invisible-watermark` est **inutile pour l’entraînement LoRA SDXL** et provoque ce faux conflit OpenCV.
```bash
Ensuite retour au tuto Runpod tester et installer dépendance
avec conflit numpy etc
installer les répertoires sd-scripts models etc
installer sd_scripts , dataset (images+captions), model SDXL dans models etc
PROBLEMES DE DEPENDANCE SUR VASTAI
## ✅ 1️⃣ Supprimer `invisible-watermark` (recommandé)
`invisible-watermark` est **inutile pour l’entraînement LoRA SDXL** et provoque ce faux conflit OpenCV.
```bash
pip uninstall -y invisible-watermark
```
👉 Après ça, **le premier warning disparaît**.
---
## 🚨 2️⃣ Le VRAI problème : `albucore` trop récent
Erreur :
```
albucore 0.0.24 requires opencv-python-headless>=4.9.0.80
```
👉 Or **on veut volontairement rester en OpenCV 4.8.1.78**
(pour éviter les bugs SDXL / numpy 2.x).
### ❌ Ce qu’il ne faut PAS faire
* ❌ upgrader OpenCV en 4.9+
* ❌ laisser pip forcer numpy 2.x
---
## ✅ 3️⃣ Solution PRO : pinner `albumentations` / `albucore` compatibles
### 🔧 Désinstaller les versions actuelles
```bash
pip uninstall -y albumentations albucore
```
### 🔒 Installer les versions COMPATIBLES (stables)
```bash
pip install albumentations==1.4.3 albucore==0.0.13
```
Ces versions :
* ✔ fonctionnent avec **opencv-python-headless 4.8.1.78**
* ✔ ne forcent PAS OpenCV 4.9+
* ✔ sont stables pour preprocessing SDXL
* ✔ compatibles Python 3.12
---
## 🧪 4️⃣ Vérification finale (à faire)
```bash
python3 - <<'EOF'
import albumentations, albucore, cv2, numpy
print("albumentations:", albumentations.__version__)
print("albucore:", albucore.__version__)
print("opencv:", cv2.__version__)
print("numpy:", numpy.__version__)
EOF
```
Résultat attendu :
```
albumentations: 1.4.3
albucore: 0.0.13
opencv: 4.8.1
numpy: 1.26.4
```
---
## 🎯 Verdict clair
✔ **Oui**, supprime `invisible-watermark` sans hésiter
✔ **Oui**, downgrade `albucore` (c’est lui le vrai conflit)
✔ **NON**, ne touche pas à OpenCV / numpy (tu as la bonne combo)
✔ Environnement **propre, stable, prêt pour LoRA SDXL
opencv= beug
## 🔍 État ACTUEL de ton environnement
```text
albumentations: 1.4.3 ✅ OK
albucore: 0.0.13 ✅ OK
numpy: 1.26.4 ✅ OK
opencv: 4.11.0 ❌ PAS OK
```
👉 **Le seul problème restant est OpenCV 4.11.0**
👉 Or ton tutoriel (et l’expérience terrain SDXL) impose **OpenCV 4.8.1.78**
---
## 🚨 Pourquoi OpenCV 4.11.0 est un PROBLÈME
Même si tout “s’installe” :
* OpenCV ≥ 4.9 introduit des changements C++ / numpy
* risques de **data augmentation cassée**
* bugs silencieux (pas de crash, mais LoRA dégradée)
* incompatibilités historiques avec SDXL preprocessing
👉 **C’est exactement le piège que ton tutoriel cherche à éviter.**
---
## ✅ FIX DÉFINITIF (à faire MAINTENANT)
### 🔧 1️⃣ Désinstaller TOUT OpenCV (important)
```bash
pip uninstall -y opencv-python opencv-python-headless opencv-contrib-python
```
⚠️ Fais-le même si certains paquets “ne sont pas installés”.
---
### 🔧 2️⃣ Réinstaller LA bonne version (HEADLESS uniquement)
```bash
pip install opencv-python-headless==4.8.1.78
```
DERNIER PROBLEME
```bash
python3 - <<'EOF'
import cv2, numpy
print("opencv:", cv2.__version__)
print("numpy:", numpy.__version__)
EOF
```
Résultat attendu **exactement** :
```text
opencv: 4.8.1
numpy: 1.26.4
```
---
## 🎯 Verdict final (clair et net)
✔ albumentations / albucore : **BONNES versions**
✔ numpy : **PARFAIT**
❌ OpenCV 4.11.0 : **À CORRIGER**
👉 Une fois OpenCV 4.8.1.78 réinstallé → **ENVIRONNEMENT STABLE SDXL**
---
Quand tu m’envoies le **nouveau résultat après correction**, je te donne **la commande finale `accelerate launch` prête à exécuter**, alignée **à 100 % avec ton tutoriel** et ta RTX 4090 / 48 Go.
numpy : 1.26.4
opencv: 4.8.1
torch : 2.8.0+cu128
pip uninstall -y gradio
Script de lancement
cd /workspace/sd-scripts
accelerate launch sdxl_train_network.py \
--pretrained_model_name_or_path=/workspace/models/sd_xl_base_1.0.safetensors \
--train_data_dir=/workspace/train \
--output_dir=/workspace/output \
--resolution=1024,1024 \
--enable_bucket \
--min_bucket_reso=512 \
--max_bucket_reso=1024 \
--bucket_reso_steps=64 \
--network_module=networks.lora \
--network_dim=32 \
--network_alpha=32 \
--network_train_unet_only \
--learning_rate=1e-4 \
--optimizer_type=AdamW \
--lr_scheduler=cosine \
--train_batch_size=1 \
--max_train_epochs=15 \
--caption_extension=.txt \
--gradient_checkpointing \
--save_every_n_epochs=5 \
--save_model_as=safetensors \
--output_name=my_lora_style
Conclusion
La principale difficulté du training LoRA est de trouver un environnement stable et d'accorder les dépendances
pour éviter les conflits, ne pas hesiter à installer les dépendances avec les numeros de versions voulues.
*****************************************************************************************************************
COMMENT TESTER VOTRE LORA
Une fois vos LoRA en safetensors générés dans output, il convient de les tester.
Rassurez vous, c'est beaucoup facile que le training.
L'installation est minimaliste 4 dépendances
Je conseil un pod Runpod ou une instance Vastail distincts du training afin d'eviter les conflits
verifications
transformers
diffusers
safetensors
peft les 4 dépendances souhaitées (peft pour tester plusieurs LoRA en même temps)
python3 - <<'EOF'
import importlib
packages = [
"transformers",
"diffusers",
"safetensors",
"peft"
]
print("=== Vérification des dépendances (transformers / diffusers / safetensors / peft) ===\n")
for pkg in packages:
try:
module = importlib.import_module(pkg)
version = getattr(module, "__version__", "version inconnue")
print(f"[OK] {pkg:12} → {version}")
except Exception as e:
print(f"[MISSING] {pkg:12} → {e}")
EOF
On installe en conséquence pip install \
transformers \
diffusers \
safetensors \
peft
ou
pip install transformers diffusers safetensors peft
et pip install torch pillow sauf si vous venez de faire un training torch est installé ainsi que transformers
et diffusers
toujours verifier ce qui est installé pour éviter les conflits
Vous n'etes pas obligé d'installer directement peft pour un test d'une seul LoRA(je n'ai pas testé)
vous pouvez l'installer plus tard pour tester plusieurs LoRA
pip install peft
n verifie l'installation
Versions exactes installées (recommandé)
```bash
python - << 'EOF'
import transformers, diffusers, safetensors
print("transformers :", transformers.__version__)
print("diffusers :", diffusers.__version__)
print("safetensors :", safetensors.__version__)
EOF
```
👉 Pas de numpy/opencv spécifiques ici
👉 Pas de kohya
👉 Pas de UI
II STRUCTURE MINIMALE POUR LE TEST (utiliser l'éditeur de runpod)
Dans `/workspace` :
```
/workspace
├── models/
│ ├── sd_xl_base_1.0.safetensors
│ └── ma_lora_sdxl.safetensors
├── output_test/
└── test_lora.py
```
👉 **Pas besoin de `sd-scripts`**
👉 **Pas besoin d’albumentations**
👉 **Pas besoin d’accelerate**
---
## 🟢 2️⃣ DÉPENDANCES MINIMALES POUR TEST (INFÉRENCE)
⚠️ **UNIQUEMENT ces libs** (si elles ne sont pas déjà là) :
transformers
diffusers
safetensors
👉 Pas de numpy/opencv spécifiques ici
👉 Pas de kohya
👉 Pas de UI
# 🧠 QUESTIONS IMPORTANTES (RÉPONSES CLAIRES)
### ❓ A-t-on besoin des dépendances de training pour tester ?
❌ **NON**
| Usage | Besoin |
| ------------- | ----------------------------------- |
| Training LoRA | kohya + albumentations + accelerate |
| Test LoRA | diffusers + transformers |
---
### ❓ Un seul pod suffit pour tester ?
✅ **OUI**
Même un **GPU plus petit** suffit pour l’inférence. (mais deux pods conseillés differents , un pour training un pour tester
et générer des images)
---
### ❓ Pourquoi pas ComfyUI ?
Parce que :
* il installe trop de dépendances
* il modifie numpy/opencv
* il **peut casser un environnement propre**
* inutile pour un test LoRA simple
III Création du fichier TEST_LORA.py : script de test Python créé dans workspace
`bash
cat << 'EOF' > /workspace/test_lora.py
import torch
from diffusers import StableDiffusionXLPipeline
BASE_MODEL = "/workspace/models/sd_xl_base_1.0.safetensors"
LORA_PATH = "/workspace/models/ma_lora_sdxl.safetensors"
OUTPUT_DIR = "/workspace/output_test"
prompt = (
"mon_tag_style, studio photography, soft lighting, "
"high detail, professional fashion photo"
)
pipe = StableDiffusionXLPipeline.from_single_file(
BASE_MODEL,
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
pipe.load_lora_weights(LORA_PATH)
pipe.fuse_lora()
image = pipe(
prompt=prompt,
num_inference_steps=30,
guidance_scale=7.0,
).images[0]
image.save(f"{OUTPUT_DIR}/test_lora.png")
print("✅ Image générée :", f"{OUTPUT_DIR}/test_lora.png")
EOF
Entrez y le nom de votre LoRA LORA_PATH = "/workspace/models/ma_lora_sdxl.safetensors" et mettez dans prompt le tag
de votre style(celui écrit en tête de vos captions)
vous pouvez modifier le prompt
IV Lancer le script
python /workspace/test_lora.py
TEST AVEC UNE LoRA MAIS PROMPT EN PARAMETRE ET PROMPT NEGATIF LoRA CARACTERE
Ce script fonctionne avec Accelerate (a utiliser si vous avez entrainer une lora avant ou installer accelerate)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import torch
import subprocess
# -------- AUTO INSTALL DES DEPENDANCES --------
def ensure(pkg):
try:
__import__(pkg)
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", pkg])
for p in ["torch", "diffusers", "safetensors", "transformers", "accelerate"]:
ensure(p)
from diffusers import StableDiffusionXLPipeline
# -------- CONFIG --------
BASE_MODEL = "/workspace/models/sd_xl_base_1.0.safetensors"
LORA_PATH = "/workspace/models/pop_star_caractere_sdxl_lora-000005.safetensors"
OUTPUT_DIR = "/workspace/output_test"
os.makedirs(OUTPUT_DIR, exist_ok=True)
# -------- LECTURE DU PROMPT --------
if len(sys.argv) < 2:
print("❌ Utilisation : python test_lora.py \"ton prompt ici\"")
sys.exit(1)
prompt = sys.argv[1]
print("📝 Prompt :", prompt)
# -------- LOAD PIPELINE --------
pipe = StableDiffusionXLPipeline.from_single_file(
BASE_MODEL,
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
pipe.load_lora_weights(LORA_PATH)
pipe.fuse_lora(lora_scale=0.55)
# -------- GENERATION --------
image = pipe(
prompt=prompt,
negative_prompt=(
"bad eyes, deformed eyes, cross-eye, lazy eye, asymmetrical eyes, "
"extra pupils, mutated eyes, bad face, deformed face, bad anatomy, "
"disfigured, distorted, low quality, blurry, jpeg artifacts"
),
num_inference_steps=30,
guidance_scale=7.0,
).images[0]
out_path = os.path.join(OUTPUT_DIR, "test_lora.png")
image.save(out_path)
print("✅ Image générée :", out_path)
python test_lora.py "pop_star_caractere, studio lighting, soft shadows, portrait"
prendre safetensors minimum 000005 lora moins rigide
image dans /workspace/output_test/test_lora.png
malgré prompte negatif yeux déformés
mauvaise LoRA images du dataset trop proches, début d'overfit
LoRA CORRIGEE SCRIPT SANS ACCELERATE INUTILE
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import torch
import subprocess
# -------- AUTO INSTALL DES DEPENDANCES (INFÉRENCE ONLY) --------
def ensure(pkg):
try:
__import__(pkg)
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", pkg])
# dépendances minimales
for p in ["torch", "diffusers", "safetensors", "pillow"]:
ensure(p)
# transformers seulement si diffusers le réclame
try:
from transformers import CLIPTextModel
except:
ensure("transformers")
from diffusers import StableDiffusionXLPipeline
# -------- CONFIG --------
BASE_MODEL = "/workspace/models/sd_xl_base_1.0.safetensors"
LORA_PATH = "/workspace/models/pop_star_character_sdxl_lora-deux-000002.safetensors"
OUTPUT_DIR = "/workspace/output_test"
os.makedirs(OUTPUT_DIR, exist_ok=True)
# -------- LECTURE DU PROMPT --------
if len(sys.argv) < 2:
print("❌ Utilisation : python test_lora.py \"ton prompt ici\"")
sys.exit(1)
prompt = sys.argv[1]
print("📝 Prompt :", prompt)
# -------- LOAD PIPELINE --------
pipe = StableDiffusionXLPipeline.from_single_file(
BASE_MODEL,
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
pipe.load_lora_weights(LORA_PATH)
pipe.fuse_lora(lora_scale=0.55)
# -------- GENERATION --------
image = pipe(
prompt=prompt,
negative_prompt=(
"bad eyes, deformed eyes, cross-eye, lazy eye, asymmetrical eyes, "
"extra pupils, mutated eyes, bad face, deformed face, bad anatomy, "
"disfigured, distorted, low quality, blurry, jpeg artifacts"
),
num_inference_steps=30,
guidance_scale=7.0,
).images[0]
out_path = os.path.join(OUTPUT_DIR, "test_lora.png")
image.save(out_path)
print("✅ Image générée :", out_path)
-----------------------------------------------------
python test_lora_deux.py "pop_star_caractere, studio lighting, soft shadows, portrait"
Test avec deux LoRA : deux fichiers safetensors
Si peft pas installé
File "/workspace/test_lora_mix.py", line 26, in
pipe.load_lora_weights(LORA_A, adapter_name="A")
File "/usr/local/lib/python3.11/dist-packages/diffusers/loaders/lora_pipeline.py", line 616, in load_lora_weights
raise ValueError("PEFT backend is required for this method.")
ValueError: PEFT backend is required for this method.
pip install peft
Mes LoRA créé des nus artistiques
VERSION FINALE NO MORALIZED ET SAFETY SDXL DESACTIVE
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cat << 'EOF' > /workspace/test_lora_une_image.py
import torch
import argparse
from diffusers import StableDiffusionXLPipeline
# =========================================================
# ARGUMENTS CLI
# =========================================================
parser = argparse.ArgumentParser()
parser.add_argument("--prompt", type=str, required=True)
parser.add_argument("--nude_scale", type=float, default=0.7)
parser.add_argument("--lingerie_scale", type=float, default=0.5)
parser.add_argument("--cfg", type=float, default=6.2)
parser.add_argument("--steps", type=int, default=30)
args = parser.parse_args()
# =========================================================
# PATHS
# =========================================================
BASE_MODEL = "/workspace/models/sd_xl_base_1.0.safetensors"
LORA_NUDE = "/workspace/models/artistic_nude_style_lora.safetensors"
LORA_LINGERIE = "/workspace/models/sensual_lingerie_look_sdxl_lora.safetensors"
OUTPUT_DIR = "/workspace/output_test"
# =========================================================
# PIPELINE (SAFETY CHECKER DÉSACTIVÉ)
# =========================================================
pipe = StableDiffusionXLPipeline.from_single_file(
BASE_MODEL,
torch_dtype=torch.float16,
variant="fp16",
safety_checker=None,
requires_safety_checker=False,
).to("cuda")
# =========================================================
# LOAD LORAS (PEFT)
# =========================================================
pipe.load_lora_weights(LORA_NUDE, adapter_name="NUDE")
pipe.load_lora_weights(LORA_LINGERIE, adapter_name="LINGERIE")
pipe.set_adapters(
["NUDE", "LINGERIE"],
adapter_weights=[args.nude_scale, args.lingerie_scale]
)
# =========================================================
# NEGATIVE PROMPT (ANTI-SOUTIEN-GORGE AUTO)
# =========================================================
negative_prompt = (
"bra, bikini top, chest covered, armor chest, metal bra, "
"clothing on torso, bandeau, fabric covering breasts"
)
# =========================================================
# GENERATION
# =========================================================
image = pipe(
prompt=args.prompt,
negative_prompt=negative_prompt,
num_inference_steps=args.steps,
guidance_scale=args.cfg,
).images[0]
# =========================================================
# SAVE
# =========================================================
safe_prompt = args.prompt.replace(" ", "_").replace(",", "")[:60]
out = (
f"{OUTPUT_DIR}/"
f"nude{args.nude_scale}_lingerie{args.lingerie_scale}_"
f"cfg{args.cfg}_steps{args.steps}_{safe_prompt}.png"
)
image.save(out)
print("✅ Image générée :", out)
EOF
CLI
python /workspace/test_lora_une_image.py \
--prompt "artistic_nude_style, sensual_lingerie_look, topless woman, bare breasts,front-facing, long blond hair, green eyes, red string panties with garter belt, cinematic natural lighting,studio portrait, soft lighting, high detail, 85mm photo, realistic skin texture" \
--nude_scale 0.75 \
--lingerie_scale 0.60 \
--cfg 6.2 \
--steps 30
SDXL exerce une auto censure sur le nu d'ou un prompt negatif et safety_checker=None,
requires_safety_checker=False,
TEST AVEC 3 LoRA AVEC POUR BUT FEMME NUE ARTISTIQUE
Le but de tester une LoRA ou plusieurs est de créer des prompts realisant ce que vous voulez exactement comme image
Le bon prompt est tout un art. Conditions qui privilgie une lora dominante dans le script.
Script python dans workspace
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Test SDXL – Génération d'une image texte avec 3 LoRA (Vast.ai Runpod)
- Artistic Nude
- Sensual Lingerie
- Erotic Nude Style
Inclut :
- Negative prompt anatomie + yeux
- Arbitrage automatique des LoRA pour éviter la casse anatomique
"""
import torch
import argparse
from diffusers import StableDiffusionXLPipeline
# ============================================================
# ARGUMENTS CLI
# ============================================================
parser = argparse.ArgumentParser(
description="Génération SDXL avec 3 LoRA (NUDE / LINGERIE / EROTIC)"
)
parser.add_argument("--prompt", type=str, required=True)
parser.add_argument("--nude_scale", type=float, default=0.7)
parser.add_argument("--lingerie_scale", type=float, default=0.5)
parser.add_argument("--erotic_scale", type=float, default=0.6)
parser.add_argument("--cfg", type=float, default=6.5)
parser.add_argument("--steps", type=int, default=30)
parser.add_argument("--seed", type=int, default=None)
args = parser.parse_args()
# ============================================================
# NEGATIVE PROMPT (STRUCTURE + YEUX)
# ============================================================
negative_prompt = (
# --- vêtements / accessoires ---
"bra, bikini top, chest covered, armor chest, metal bra, "
"clothing on torso, bandeau, fabric covering breasts, "
"panties, underwear, thong, g-string, "
"culotte, culotte en coton, culotte taille haute, "
"shorty, slip, lingerie couvrante, sous-vêtements, "
# --- anatomie / structure ---
"extra limbs, extra legs, extra arms, "
"multiple bodies, duplicate body, "
"deformed anatomy, bad anatomy, "
"fused limbs, malformed body, "
# --- yeux / visage ---
"bad eyes, deformed eyes, malformed eyes, "
"crossed eyes, lazy eye, "
"asymmetrical eyes, misaligned eyes, "
"extra pupils, missing pupils, "
"blurred eyes, melted eyes"
)
# ============================================================
# PATHS
# ============================================================
BASE_MODEL = "/workspace/models/sd_xl_base_1.0.safetensors"
LORA_NUDE = "/workspace/models/artistic_nude_style_lora.safetensors"
LORA_LINGERIE = "/workspace/models/sensual_lingerie_look_sdxl_lora.safetensors"
LORA_EROTIC = "/workspace/models/erotic_nude_style.safetensors"
OUTPUT_DIR = "/workspace/output_test"
# ============================================================
# SEED (OPTIONNEL)
# ============================================================
generator = None
if args.seed is not None:
generator = torch.Generator("cuda").manual_seed(args.seed)
# ============================================================
# PIPELINE SDXL
# ============================================================
pipe = StableDiffusionXLPipeline.from_single_file(
BASE_MODEL,
torch_dtype=torch.float16,
variant="fp16",
safety_checker=None,
requires_safety_checker=False,
).to("cuda")
pipe.enable_xformers_memory_efficient_attention()
# ============================================================
# LOAD LORAS
# ============================================================
pipe.load_lora_weights(LORA_NUDE, adapter_name="NUDE", use_safetensors=True)
pipe.load_lora_weights(LORA_LINGERIE, adapter_name="LINGERIE", use_safetensors=True)
pipe.load_lora_weights(LORA_EROTIC, adapter_name="EROTIC", use_safetensors=True)
# ============================================================
# LORA SAFETY ARBITRATOR (ANTI-CASSE ANATOMIQUE)
# ============================================================
MAX_LORA_SUM = 1.2
lora_weights = {
"NUDE": args.nude_scale,
"LINGERIE": args.lingerie_scale,
"EROTIC": args.erotic_scale,
}
total_weight = sum(lora_weights.values())
active_adapters = []
active_weights = []
if total_weight <= MAX_LORA_SUM:
for name, w in lora_weights.items():
if w > 0:
active_adapters.append(name)
active_weights.append(w)
else:
dominant = max(lora_weights, key=lora_weights.get)
active_adapters = [dominant]
active_weights = [lora_weights[dominant]]
print("⚠️ LORA SAFETY TRIGGERED")
print(f"👉 LoRA conservée : {dominant}")
print("👉 Autres LoRA désactivées pour stabilité anatomique")
pipe.set_adapters(active_adapters, adapter_weights=active_weights)
# ============================================================
# GENERATION
# ============================================================
image = pipe(
prompt=args.prompt,
negative_prompt=negative_prompt,
num_inference_steps=args.steps,
guidance_scale=args.cfg,
generator=generator,
).images[0]
# ============================================================
# SAVE IMAGE
# ============================================================
safe_prompt = args.prompt.replace(" ", "_")[:60]
out_path = (
f"{OUTPUT_DIR}/"
f"nude{args.nude_scale}_"
f"lingerie{args.lingerie_scale}_"
f"erotic{args.erotic_scale}_"
f"cfg{args.cfg}_"
f"steps{args.steps}.png"
)
image.save(out_path)
print("✅ Image générée avec succès :")
print(out_path)
CLI Lancement du script
python text-lora-une-image-trois-lora-vastai.py \
--prompt "artistic_nude_style,sensual_lingerie_look,erotic_nude_style,full-length photo,topless woman, bare breasts,long blonde hair flowing in the wind,beautiful face,green eyes with makeup,
visible pussy, red stiletto heels,tottaly nude,
cinematic natural lighting, realistic skin texture,symmetrical face, well-aligned eyes, sharp gaze" \
--nude_scale 0.35 \
--lingerie_scale 0.25 \
--erotic_scale 0.50 \
--cfg 8.0 \
--steps 30 \
--seed 42
Conclusion et retour d'experience
Mes 3 LoRA sont trop proches d'ou des instructions contraires au niveau des yeux vu les postures trop semblables
Toujours problemes sur les yeux qui doivent être déssinés de maniere très precise.
Donc certaines images incoherentes et au debut des prompt contradictoires sinon belles photos
dans l'ensemble
Solution pour un meilleur rendu et eviter les contadictions et les prises d'avantage des Loras
fusion des 3 Loras dans un seul safetensors.
EDIT supprimer kolya gui et ensuite installer dependance mix d'abord tuto vastai et ensuite runpod
tuto vastai ne pas oublier pinner albumentations albucore
TRAINING LORA CARACTERE
Prendre images differentes peu d'images se ressemblants mais differentes poses et vétement differents
couleurs différentes, de face, de profil, plain pieds ,taille sinon overfit
environs 40 images.
Ne pas les redimensionner mais privilégier des images nets, respecter les proportions (size images >800px)
même installation que pour LoRA style (dépendances identiques ,kolya sd-scripts, sdxl etc)
nouveau script avec nouvelle configuration pour LoRA caractere
accelerate launch sdxl_train_network.py \
--pretrained_model_name_or_path=/workspace/models/sd_xl_base_1.0.safetensors \
--train_data_dir=/workspace/train \
--output_dir=/workspace/output \
--resolution=1024,1024 \
--enable_bucket \
--min_bucket_reso=512 \
--max_bucket_reso=1024 \
--bucket_reso_steps=64 \
--network_module=networks.lora \
--network_dim=64 \
--network_alpha=64 \
--network_train_unet_only \
--learning_rate=1e-4 \
--optimizer_type=AdamW \
--lr_scheduler=cosine \
--train_batch_size=1 \
--max_train_epochs=10 \
--caption_extension=.txt \
--gradient_checkpointing \
--save_every_n_epochs=5 \
--save_model_as=safetensors \
--output_name=caractere_sdxl_lora
VERSION DEFINITIVE ANTI OVERFIT (SURAPRENTISSAGE)
accelerate launch sdxl_train_network.py \
--pretrained_model_name_or_path=/workspace/models/sd_xl_base_1.0.safetensors \
--train_data_dir=/workspace/train \
--output_dir=/workspace/output \
--resolution=1024 \
--enable_bucket \
--min_bucket_reso=512 \
--max_bucket_reso=1024 \
--bucket_reso_steps=64 \
--network_module=networks.lora \
--network_dim=16 \
--network_alpha=8 \
--network_train_unet_only \
--learning_rate=5e-5 \
--optimizer_type=AdamW \
--lr_scheduler=cosine \
--train_batch_size=1 \
--max_train_epochs=8 \
--caption_extension=.txt \
--gradient_checkpointing \
--save_every_n_epochs=2 \
--save_model_as=safetensors \
--seed=42 \
--output_name=character_sdxl_lora-deux
Choisir des images trés differentes, face, profil, en pieds 40 images
Alors que lora style les images doivent etre assez proches
Beug relevé lors de la réinstalation de pip install opencv-python-headless==4.8.1.78(qui avait disparu) pip a réinstallé numpy 2X
Ce qui est normal c'est la derniere version une refonte de numpy mais cette version n'est pas encore utilisée (probleme de compilation)
message d'erreur :python - <<'PY'
import albumentations as A
import albucore
import cv2
import numpy
import torch
print("albumentations:", A.__version__)
print("albucore:", albucore.__version__)
print("opencv:", cv2.__version__)
print("numpy:", numpy.__version__)
print("cuda:", torch.cuda.is_available())
x = torch.randn(1, device="cuda")
print("CUDA OK")
PY
A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.4.1 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.
If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.
Traceback (most recent call last): File "", line 1, in
File "/venv/main/lib/python3.12/site-packages/albumentations/__init__.py", line 3, in
from .augmentations import *
File "/venv/main/lib/python3.12/site-packages/albumentations/augmentations/__init__.py", line 1, in
from .blur.functional import *
File "/venv/main/lib/python3.12/site-packages/albumentations/augmentations/blur/__init__.py", line 1, in
from .functional import *
File "/venv/main/lib/python3.12/site-packages/albumentations/augmentations/blur/functional.py", line 5, in
import cv2
File "/venv/main/lib/python3.12/site-packages/cv2/__init__.py", line 181, in
bootstrap()
File "/venv/main/lib/python3.12/site-packages/cv2/__init__.py", line 153, in bootstrap
native_module = importlib.import_module("cv2")
File "/venv/main/lib/python3.12/importlib/__init__.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
AttributeError: _ARRAY_API not found
Traceback (most recent call last):
File "", line 1, in
File "/venv/main/lib/python3.12/site-packages/albumentations/__init__.py", line 3, in
from .augmentations import *
File "/venv/main/lib/python3.12/site-packages/albumentations/augmentations/__init__.py", line 1, in
from .blur.functional import *
File "/venv/main/lib/python3.12/site-packages/albumentations/augmentations/blur/__init__.py", line 1, in
from .functional import *
File "/venv/main/lib/python3.12/site-packages/albumentations/augmentations/blur/functional.py", line 5, in
import cv2
File "/venv/main/lib/python3.12/site-packages/cv2/__init__.py", line 181, in
bootstrap()
File "/venv/main/lib/python3.12/site-packages/cv2/__init__.py", line 153, in bootstrap
native_module = importlib.import_module("cv2")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/main/lib/python3.12/importlib/__init__.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportError: numpy.core.multiarray failed to import
(main) root@C.30591311:/workspace$ pip uninstall -y numpy
Found existing installation: numpy 2.4.1
Uninstalling numpy-2.4.1:
Successfully uninstalled numpy-2.4.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
(main) root@C.30591311:/workspace$ pip install numpy==1.26.4
Collecting numpy==1.26.4 etc
Toujours verifié ce qui est installé , la bonne méthode est de créer une image docker.
J'y reviendrai.