pull/3451/head
sungjoonkim 2025-10-29 15:50:00 +09:00
parent fc781dc61f
commit 9fcdc423b1
7 changed files with 101 additions and 99 deletions

View File

@ -1,17 +1,21 @@
# I. 단일폴더 수동 학습 사용 예시
## 1. 기본 사용 (자동 계산)
```bash
```cmd
run-train-single --folder ../dataset/training/01_alice
```
## 2. Epochs만 수동 지정
```bash
```cmd
run-train-single --folder ../dataset/training/01_alice --epochs 25
또는
run-train-single --folder ../training/mainchar/01_alic3 --epochs 17 --resume alic3-000009.safetensors
```
## 3. 세밀한 조정
```bash
```cmd
run-train-single ^
--folder ../dataset/training/01_alice ^
--epochs 30 ^
@ -22,7 +26,7 @@ run-train-single ^
```
## 4. 고해상도 학습
```bash
```cmd
run-train-single ^
--folder ../dataset/training/01_alice ^
--resolution 1024,1024 ^
@ -30,7 +34,7 @@ run-train-single ^
```
## 5. 빠른 테스트
```bash
```cmd
run-train-single ^
--folder ../dataset/training/01_alice ^
--epochs 5 ^
@ -39,7 +43,7 @@ run-train-single ^
```
## 6. 완전 수동 모드
```bash
```cmd
run-train-single ^
--folder ../dataset/training/01_alice ^
--no-auto ^
@ -75,14 +79,14 @@ run-train-single ^
## 비교
### train_batch.py (일괄 자동)
```bash
```cmd
# 여러 폴더 자동 학습
python train_batch.py
→ 01_alice, 02_bob, 03_background 모두 학습
```
### train_single.py (단일 수동)
```bash
```cmd
# 특정 폴더만 세밀 조정
run-train-single --folder ../dataset/training/mainchar/01_alice --epochs 30 --lr 0.00015
→ alice만 커스텀 파라미터로 학습
@ -91,7 +95,7 @@ run-train-single --folder ../dataset/training/mainchar/01_alice --epochs 30 --lr
## 워크플로우 추천
### 초보자
```bash
```cmd
# 1. 먼저 일괄 자동으로 테스트
python train_batch.py
@ -100,7 +104,7 @@ run-train-single --folder ../dataset/training/mainchar/01_alice --epochs 25
```
### 고급 사용자
```bash
```cmd
# 처음부터 세밀하게 조정
run-train-single ^
--folder ../dataset/training/mainchar/01_alice ^

View File

@ -26,6 +26,7 @@ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin으로 복사합니
## 학습방법 1: 폴더명 규칙 사용 (자동)
./train.sh config.json 0
# 방법 2: 강제로 15번 반복
./train.sh config.json 0 15

82
TRAINING.md Normal file
View File

@ -0,0 +1,82 @@
🎨 폴더 명명 예시:
```cmd
01_alice_woman (3단어와 언더스코어 2개: 클래스 포함)
- name=alice, class=woman -> --class_tokens=woman 적용.
02_style (2단어와 언더스코어 1개: 클래스 미포함)
- name=style, class=None -> --class_tokens 미적용.
```
🎨 클래스 키워드 선정 기준 및 분류 예시
#### 클래스 키워드를 선정할 때는 **"이 대상이 없었을 때, 모델이 원래 무엇을 생성해야 하는가?"**를 생각하면 쉽습니다.
### 1. 인물/캐릭터 학습 시
사람이나 캐릭터를 학습시킬 때는 성별, 연령대, 종족 등 가장 넓은 카테고리를 사용합니다.
| 학습 대상 (ID 토큰) | 클래스 키워드 | 설명 |
|---------------------|---------------------------|-------|
| 특정 인물 (alice) | woman 또는 man | 성별을 나타내는 가장 일반적인 단어. |
| 특정 어린이 (child_A) | child 또는 kid | 연령대를 나타내는 일반적인 단어. |
| 특정 동물 캐릭터 (pet_dragon) | dragon 또는 monster | 해당 대상의 종족 또는 종류. |
| 만화체 캐릭터 (manga_hero) | person 또는 character | 스타일이 강한 경우 일반적인 '사람'이나 '캐릭터'로 정의. |
### 2. 스타일/화풍 학습 시
스타일을 학습시킬 때는 그 스타일이 적용될 가장 일반적인 대상을 클래스로 지정합니다.
| 학습 대상 (ID 토큰) | 클래스 키워드 | 설명 |
|---------------------|---------------------------|--------|
| 특정 작가 화풍 (artstyle_A) | style 또는 art | '스타일' 자체를 클래스로 지정하는 것이 일반적입니다. |
| 특정 조명 효과 (cinema_light) | lighting 또는 effect | 모델이 **'조명'**의 개념을 잃지 않도록 합니다. |
| 특정 의상 (maid_dress_v2) | clothing 또는 dress | 의류의 일반적인 카테고리. |
### 3. 사물/배경 학습 시
특정 사물이나 배경을 학습시킬 때는 그 사물의 가장 넓은 범주를 사용합니다.
| 학습 대상 (ID 토큰) | 클래스 키워드 | 설명 |
|---------------------|---------------------------|--------|
| 특정 자동차 모델 (car_v1) | car 또는 vehicle | 해당 사물의 일반적인 명칭. |
| 특정 건물 (my_house) | house 또는 building | 해당 배경의 일반적인 명칭. |
| 특정 음식 (korean_dish) | food 또는 dish | 해당 카테고리의 일반적인 명칭. |
### 🛑 클래스 키워드를 넣는 경우 (정규화의 중요성)
클래스 키워드를 01_alice_woman처럼 넣는다는 것은 다음과 같은 의미가 있습니다.
ID 토큰 정의: alice는 **woman**이다.
정규화 활성화: Kohya_SS에게 **woman**이라는 클래스에 대한 **정규화 이미지(Regularization Images)**를 찾아서 함께 학습하라고 지시합니다.
정규화 이미지가 없다면 클래스 키워드를 넣어도 효과가 없거나 미미합니다. 따라서 클래스 키워드를 정했다면, 해당 키워드(예: woman)로 생성된 수백~수천 장의 이미지를 정규화 폴더 (일반적으로 reg_woman 등)에 넣어 함께 학습해야 가장 좋은 품질을 얻을 수 있습니다.
### 🎯 SDXL Base 모델 학습 시 정규화 이미지의 역할
#### SDXL Base 1.0 모델을 기반으로 학습할 때, woman과 같은 일반적인 클래스 이미지(정규화 이미지)를 추가로 넣어줄 필요는 없습니다.
### 1. SDXL의 강점: 이미 "알고 있음"
- SDXL Base 1.0은 수많은 이미지로 학습된 **대규모 모델(Foundation Model)**입니다.
- 이미 **woman (여성), car (자동차), house (집)**과 같은 일반적인 개념과 해당 개념의 다양한 형태를 매우 잘 이해하고 표현할 수 있습니다.
- LoRA 학습의 목표는 SDXL이 이미 알고 있는 **일반적인 지식(클래스 지식)**을 잊어버리지 않게 하면서, **새로운 고유 개념(ID 토큰)**만 추가로 학습시키는 것입니다.
### 2. 정규화 이미지의 필요성
- 일반 LoRA/Dreambooth 학습: SD 1.5 같은 구형 모델이나 미세 조정되지 않은 모델로 학습할 때는 정규화 이미지가 필수였습니다. 이는 모델이 일반적인 개념을 잊어버리는 **재앙적 망각(Catastrophic Forgetting)**을 방지하기 위함이었습니다.
- SDXL LoRA 학습: SDXL은 기본적으로 이 지식을 매우 잘 보존합니다. 따라서 **woman**이라는 클래스에 대해 수백, 수천 장의 정규화 이미지를 직접 수집하고 넣어주는 노동은 대부분의 경우 불필요합니다.
### 3. Kohya_SS 설정 (SDXL에 특화된 방식)
- Kohya_SS를 포함한 최신 학습 툴들은 SDXL 학습 시 정규화 이미지 폴더를 비워두거나, 아예 지정하지 않는 방식을 지원합니다.
- 이 방식은 SDXL이 이미 방대한 내부 지식을 가지고 있기 때문에, 따로 외부 이미지를 가져와 정규화하지 않아도 충분히 안정적인 결과를 얻을 수 있다는 전제에 기반합니다.
### ⚠️ 예외적인 경우: 정규화가 필요한 경우
- 대부분의 경우 woman에 대한 정규화는 불필요하지만, 매우 특수한 형태의 클래스를 학습시킬 때는 고려해 볼 수 있습니다.
| 경우 | 예시 | 설명 |
|---------------------|---------------------------|--------|
| 강력한 스타일 학습 | artstyle_A (극도로 만화적인 스타일) | "스타일 자체가 SDXL이 '인간'으로 인식하는 방식을 크게 왜곡할 때, 일반적인 woman 이미지를 정규화하여 모델의 지식을 보호할 수 있습니다." |
| 특정 자세/배경에 과적합 우려 | 특정 포즈만 있는 pose_v1 |"pose 클래스에 대해 다양한 일반 포즈 이미지를 정규화하여, 모델이 모든 사람의 포즈를 해당 포즈로 고정시키지 않도록 방지합니다." |
#### - 일반적으로 사람이나 평범한 사물을 학습할 때는 클래스 명만 지정(01_alice_woman)하고 정규화 이미지는 넣지 않는 것이 시간과 자원(디스크 공간)을 아끼는 가장 효율적인 방법입니다.

View File

@ -1,3 +1,3 @@
docker build --no-cache -t aicompanion/sdxl_train_captioner:1.0.2 .
docker build --no-cache -t aicompanion/sdxl_train_captioner:1.0.3 .
docker tag aicompanion/sdxl_train_captioner:1.0.2 aicompanion/sdxl_train_captioner:latest
docker tag aicompanion/sdxl_train_captioner:1.0.3 aicompanion/sdxl_train_captioner:latest

View File

@ -1,31 +1 @@
accelerate launch --num_cpu_threads_per_process 1 --mixed_precision bf16 ^
sdxl_train_network.py ^
--resume="../output_models" ^
--max_train_epochs=20 ^
--pretrained_model_name_or_path="../models/sd_xl_base_1.0.safetensors" ^
--train_data_dir="../dataset/train/mainchar" ^
--output_dir="../output_models" ^
--logging_dir="../logs" ^
--output_name="karina" ^
--network_module=networks.lora ^
--network_dim=32 ^
--network_alpha=16 ^
--learning_rate=1e-4 ^
--optimizer_type="AdamW8bit" ^
--lr_scheduler="cosine" ^
--lr_warmup_steps=100 ^
--save_every_n_epochs=1 ^
--mixed_precision="bf16" ^
--save_precision="bf16" ^
--cache_latents ^
--cache_latents_to_disk ^
--gradient_checkpointing ^
--xformers ^
--seed=42 ^
--bucket_no_upscale ^
--min_bucket_reso=512 ^
--max_bucket_reso=2048 ^
--bucket_reso_steps=64 ^
--resolution="1024,1024" ^
--network_train_unet_only ^
--cache_text_encoder_outputs
run-train-single --resume ../output_models/alic3-000009.safetensors --epochs 17 --folder ../training/mainchar/01_alic3

View File

@ -1,55 +0,0 @@
# ===================================
# SDXL LoRA 단일 학습 (PowerShell → Docker)
# ===================================
param(
[Parameter(ValueFromRemainingArguments=$true)]
[string[]]$Arguments
)
if ($Arguments.Count -eq 0) {
Write-Host "Usage: run-train-single.ps1 --folder FOLDER [OPTIONS]" -ForegroundColor Yellow
Write-Host ""
Write-Host "Examples:" -ForegroundColor Cyan
Write-Host " .\run-train-single.ps1 --folder ../dataset/training/01_alice"
Write-Host " .\run-train-single.ps1 --folder ../dataset/training/01_alice --epochs 25"
Write-Host " .\run-train-single.ps1 --folder ../dataset/training/01_alice --lr 0.0002 --dim 64"
exit 1
}
# 타임스탬프
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
# Arguments를 문자열로 결합
$argsString = $Arguments -join ' '
# 작은따옴표 이스케이프
$argsString = $argsString -replace "'", "'\\''"
Write-Host "===================================" -ForegroundColor Green
Write-Host "Starting SDXL LoRA Training" -ForegroundColor Green
Write-Host "===================================" -ForegroundColor Green
Write-Host "Arguments: $argsString" -ForegroundColor Cyan
Write-Host "Log file: train_$timestamp.log" -ForegroundColor Cyan
Write-Host "===================================" -ForegroundColor Green
Write-Host ""
# Docker 명령어
$dockerCmd = "cd /app/sdxl_train_captioner/sd-scripts && python run-train-single.py $argsString 2>&1 | tee /app/sdxl_train_captioner/logs/train_$timestamp.log"
# 실행
docker exec -it sdxl_train_captioner bash -c $dockerCmd
if ($LASTEXITCODE -eq 0) {
Write-Host ""
Write-Host "===================================" -ForegroundColor Green
Write-Host "Training completed successfully!" -ForegroundColor Green
Write-Host "===================================" -ForegroundColor Green
} else {
Write-Host ""
Write-Host "===================================" -ForegroundColor Red
Write-Host "Training failed with error code: $LASTEXITCODE" -ForegroundColor Red
Write-Host "===================================" -ForegroundColor Red
}
pause

@ -1 +1 @@
Subproject commit 22f559dbe24db93979ce508a5033a8272989a80d
Subproject commit 8cf42e0e2fbd1ff5dc55aa0a7e63acb5f98e89de