SweetBrothers / sweetbrothers

이어드림 스쿨 스윗한형제들 이미지 생성 프로젝트
MIT License
1 stars 6 forks source link

LoRA 학습 및 적용 #16

Closed proportionequation closed 9 months ago

proportionequation commented 10 months ago

설명(Description)

특정인의 이미지 수를 5~30장 사이에서 LoRA를 학습한 후 적용한다.

할 일(Tasks)

참조(References)

ahfmrptEkd commented 10 months ago

진행상황 공유해주세요. 어떤가요

proportionequation commented 10 months ago

[Dataset 0] caching latents. checking cache validity... 100%|█████████████████████████████████████████| 41/41 [00:00<00:00, 872926.21it/s] caching latents... 0%| | 0/41 [00:01<?, ?it/s] Traceback (most recent call last): File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/./sdxl_train.py", line 775, in train(args) File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/./sdxl_train.py", line 258, in train train_dataset_group.cache_latents(vae, args.vae_batch_size, args.cache_latents_to_disk, accelerator.is_main_process) File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/library/train_util.py", line 1887, in cache_latents dataset.cache_latents(vae, vae_batch_size, cache_to_disk, is_main_process) File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/library/train_util.py", line 922, in cache_latents cache_batch_latents(vae, cache_to_disk, batch, subset.flip_aug, subset.random_crop) File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/library/train_util.py", line 2230, in cache_batch_latents raise RuntimeError(f"NaN detected in latents: {info.absolute_path}") RuntimeError: NaN detected in latents: /home/cora3/vscode_project/SweetBrothers/kohya_ss/img/10_iom 1girl/10iom 1girl/danielle(1).jpg Traceback (most recent call last): File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/venv/bin/accelerate", line 8, in sys.exit(main()) File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/venv/lib/python3.10/site-packages/accelerate/commands/accelerate_cli.py", line 47, in main args.func(args) File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/venv/lib/python3.10/site-packages/accelerate/commands/launch.py", line 986, in launch_command simple_launcher(args) File "/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/venv/lib/python3.10/site-packages/accelerate/commands/launch.py", line 628, in simple_launcher raise subprocess.CalledProcessError(returncode=process.returncode, cmd=cmd) subprocess.CalledProcessError: Command '['/home/cora3/vscode_project/SweetBrothers/kohya_ss/kohya_ss/venv/bin/python', './sdxl_train.py', '--enable_bucket', '--min_bucket_reso=256', '--max_bucket_reso=2048', '--pretrained_model_name_or_path=stabilityai/stable-diffusion-xl-base-1.0', '--train_data_dir=/home/cora3/vscode_project/SweetBrothers/kohya_ss/img/10_iom 1girl', '--resolution=512,512', '--output_dir=/home/cora3/vscode_project/SweetBrothers/kohya_ss/destination', '--save_model_as=safetensors', '--output_name=last', '--lr_scheduler_num_cycles=1', '--max_data_loader_n_workers=0', '--learning_rate_te1=1e-05', '--learning_rate_te2=1e-05', '--learning_rate=1e-05', '--lr_scheduler=cosine', '--lr_warmup_steps=41', '--train_batch_size=1', '--max_train_steps=410', '--save_every_n_epochs=1', '--mixed_precision=fp16', '--save_precision=fp16', '--cache_latents', '--optimizer_type=AdamW8bit', '--max_data_loader_n_workers=0', '--bucket_reso_steps=64', '--xformers', '--bucket_no_upscale', '--noise_offset=0.0']' returned non-zero exit status 1.

proportionequation commented 10 months ago

raise RuntimeError(f"NaN detected in latents: {info.absolute_path}") RuntimeError: NaN detected in latents <- error?

proportionequation commented 9 months ago

LoRA 학습 및 적용 성공

ahfmrptEkd commented 9 months ago
proportionequation commented 9 months ago

4 원본 haerinS1 haerinS2 LoRA 적용

ahfmrptEkd commented 9 months ago

좀 만 많은 예시가 필요해 보입니다. 조금의 느낌은 있는것 같아요.

ahfmrptEkd commented 9 months ago

예시 유저 데이터 학습해서 적용했을 때 정성평가 시 좋은 성적을 내는 것 같습니다. 좋았습니다.

proportionequation commented 9 months ago

diffuser를 활용한 추론

from diffusers import StableDiffusionXLPipeline
import torch
pipe = StableDiffusionXLPipeline.from_pretrained("segmind/SSD-1B", torch_dtype=torch.float16, use_safetensors=True, variant="fp16")
pipe.to("cuda")
#if using torch < 2.0
#pipe.enable_xformers_memory_efficient_attention()
prompt = "An astronaut riding a green horse" # Your prompt here
neg_prompt = "ugly, blurry, poor quality" # Negative prompt here
image = pipe(prompt=prompt, negative_prompt=neg_prompt).images[0]

print("done")
image.show()
proportionequation commented 9 months ago

SSD-1B LoRA train 을 이용한 학습

from torch.onnx import export

from accelerate import Accelerator
export MODEL_NAME="segmind/SSD-1B"
export VAE_NAME="madebyollin/sdxl-vae-fp16-fix"
export DATASET_NAME="/home/cora3/vscode_project/SweetBrothers/kohya_ss/images/train/"

accelerate launch train_text_to_image_lora_sdxl.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --pretrained_vae_model_name_or_path=$VAE_NAME \
  --dataset_name=$DATASET_NAME --caption_column="text" \
  --resolution=1024 --random_flip \
  --train_batch_size=1 \
  --num_train_epochs=2 --checkpointing_steps=500 \
  --learning_rate=1e-04 --lr_scheduler="constant" --lr_warmup_steps=0 \
  --mixed_precision="fp16" \
  --seed=42 \
  --output_dir="sd-pokemon-model-lora-ssd" \
  --validation_prompt="cute dragon creature" --report_to="wandb" \
  --push_to_hub
proportionequation commented 9 months ago

SDXL LoRA 을 이용한 학습

export MODEL_NAME="stabilityai/stable-diffusion-xl-base-1.0"
export VAE_NAME="madebyollin/sdxl-vae-fp16-fix"
export DATASET_NAME="/home/cora3/vscode_project/SweetBrothers/kohya_ss/images/train/haerin10"

accelerate launch train_text_to_image_lora_sdxl.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --pretrained_vae_model_name_or_path=$VAE_NAME \
  --dataset_name=$DATASET_NAME --caption_column="text" \
  --resolution=1024 --random_flip \
  --train_batch_size=1 \
  --num_train_epochs=20 --checkpointing_steps=500 \
  --learning_rate=1e-04 --lr_scheduler="constant" --lr_warmup_steps=0 \
  --mixed_precision="fp16" \
  --seed=42 \
  --output_dir="haerin-model-lora40with-ssd_50" \
  --validation_prompt="realistic, potrait, beautiful girl idol" --report_to="wandb" \
  --push_to_hub
proportionequation commented 9 months ago

SD 1.5을 이용한 학습

export MODEL_NAME="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="haerin-model-lora10with-1_5"
export DATASET_NAME="/home/cora3/vscode_project/SweetBrothers/kohya_ss/images/train/haerin10"

accelerate launch --mixed_precision="fp16"  train_text_to_image_lora.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --resolution=512 --center_crop --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-04 \
  --max_grad_norm=1 \
  --lr_scheduler="cosine" --lr_warmup_steps=0 \
  --output_dir=${OUTPUT_DIR} \
  --push_to_hub \
  --report_to=wandb \
  --checkpointing_steps=500 \
  --validation_prompt="realistic, potrait, beautiful girl idol" \
  --seed=1337
proportionequation commented 9 months ago

Fuse LoRA test

from diffusers import DiffusionPipeline
import torch 

pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16).to("cuda")

#Lora 1
#pipe.load_lora_weights(".", weight_name="lora_models/dd.safetensors")
#pipe.fuse_lora()

#Lora 2
#pipe.load_lora_weights(".", weight_name="lora_models/pxart.safetensors")
#pipe.fuse_lora()

#Lora 3
pipe.load_lora_weights(".", weight_name="lora_models/ink.safetensors")
pipe.fuse_lora()

generator = torch.manual_seed(0)
images_fusion = pipe("masterpiece, best quality, mountain", generator=generator, num_inference_steps=20).images[0]
images_fusion.save("out/img8.png")
proportionequation commented 9 months ago

학습방법 비교 (12/07)

학습시간 30분 +-10%기준이 소요되는 시간으로 비교하였고 추론 시간은 SSD-1B 가 제일 짧았고, SD1.5, SDXL 순으로 점점 길어졌으며 전부 2분 안 입니다.

proportionequation commented 9 months ago

학습 비교를 통한 학습 방법 결정 (12/08)

LoRA 학습 후 LoRA 적용하였고, 옵션별로 비교한 결과 최종 결과로 face swap 모델인 easy photo 사용으로 결론지었습니다. api작성 후 원할한 작동 확인하였습니다.

ahfmrptEkd commented 9 months ago

음... 위 부분들의 각 모델의 옵션값은 보이는데 추론 결과는 따로 지표가 없는건가요? 확인 부탁드립니다.

proportionequation commented 9 months ago

추론 결과는 대용량이기에 slack에 압축 파일로 올려두었습니다.

ahfmrptEkd commented 9 months ago

추론 결과는 3주차에 올리는게 좋을 것 같습니다.

proportionequation commented 9 months ago

LoRA 학습 비교

캡처1 캡처2 캡처3 캡처4

ahfmrptEkd commented 9 months ago

장단점 과 경험 적어줘요.

proportionequation commented 9 months ago

학습 결과 와 결론

결론

  1. SSD-1B의 경우 추론속도 빠르나 품질이 만족스럽지 않았고, 결국 SDXL과 SD1.5 기반으로 결정하게 됐습니다.
  2. 얼굴사진 학습시 512*512인 SD1.5가 학습 상태가 좋았기에 SD 1.5로 결정
  3. 셋 다 LoRA 를 제작시 얼굴 부분을 크롭 및 text matching 시켜줘야 하는데 EasyPhoto가 그 역할을 더 잘 수행하였기 때문에, EasyPhoto로 결정, 만들어주는 LoRA 성능이 높았고, FaceSwap시에도 적절하였음