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.