본문 바로가기

AI

AUTOMATIC1111 드림부스(Dream Booth)사용법

AUTOMATIC1111 드림부스(Dream Booth)사용법

드림부스 사용법

드림부스 (Dreambooth)는 원본 모델로 그릴 수 없는 개체를 학습하고 그립니다. 그러나 이를 추가하여 학습시킬 수는 없습니다. 객체 A에 대해 학습된 모델에 B라는 객체가 추가로 학습되면 A가 영향을 받아 모호해집니다. 따라서 드림부스 (Dreambooth)에서 여러 개념을 배우려면 동시에 배워야 합니다. 아래에서는 드림부스 사용법에 대해 알아보겠습니다.

Extension 드림부스 (Dreambooth)는 다음과 같이 작동합니다.

  • cpkt를 Diffusion 형식으로 변환(변환된 모델은 models/dreamboth에 있음)
  • ShivamShhrirao의 드림부스 (Dreambooth) 실행
  • cpkt로 변환

정칙화 이미지의 필요성

sks guitar라는 Instance 프롬프트에서 sks에게 기타 무늬를 학습시키고 싶다고 합니다. 이때 정칙화 이미지가 없으면 sks에 어떤 내용이 학습될지 알 수 없습니다 .sks와 guitar 두 단어의 개념이 변경되기 때문입니다. 여기서 guitar라는 Class 프롬프트에서 정칙화 이미지도 사용하여 학습시키면 guitar라는 단어의 개념을 수정할 수 있으므로 sks에 guitar 이외의 개념을 학습시킬 수 있다.

prior-preservation loss

정칙화 이미지는 과학습과 language-drift(어 의미 변화)를 막는 효과가 있습니다. 정칙화 이미지가 없으면 Instance prompt에 포함한 단어의 의미가 변화해 버립니다.

인스톨

Extensions 로 인스톨 합니다.

webui-user.bat 의 'set COMMANDLINE_ARGS=' 아래 행에 이하를 추가하여 webui 를 재기동 합니다.

set TORCH_COMMAND=pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116

Create Model

ckpt 를 Diffuser 형식으로 변환합니다.

Parameters

Training Steps

스텝 수를 지정합니다. Training Epochs보다 우선되므로  에포크를 사용할 경우 빈칸으로 합니다.

Training Epochs

에포크 수를 지정합니다. Basic 드림부스 (Dreambooth) Guide에 의하면, 100 epoch(Instance 이미지 수*100)는 필요하게 됩니다.

Scale learning rate

GPU 수, gradient accumulation steps, 배치 크기로 학습률을 스케일할지 여부.

Warmup Steps

적응학습률을 도입한 최적화 알고리즘은 학습 초기 단계에서는 적응학습률 자체의 분산이 극단적으로 커져 터무니없이 큰 값을 받을 수 있습니다. Warmup은 학습 초기 단계를 평소보다 작은 학습률로 시작해 학습이 진행됨에 따라 점차 정상적인 학습률까지 끌어올리는 기법입니다.

Center Crop

타겟 해상도에 리사이즈 하기 전에 센터 크롭 여부.

Apply Horizontal Flip

화상을 랜덤으로 좌우 반전한다.좌우 비대칭 객체를 학습시킬 경우 체크를 제거합니다.

Concepts List

설정을 쓴 JSON 파일.여러 개념을 동시에 학습시킬 때 사용한다. 예. 설정할 수 있는 것은 instance prompt, class prompt, instance data dir, class data dir뿐.

Concepts 탭이 보다 상세한 설정을 할 수 있습니다.

Advanced

Batch size

학습 병렬 실행 수.

Class batch size

정칙화 이미지의 병렬 생성 수.

Use CPU Only (SLOW)

CPU로 계산합니다. 필요 메모리는 48GB 이상. 32GB이면 앱을 모두 종료시키지 않으면 스와핑이 일어납니다.  8비트 아담과 동시에 사용할 수 없습니다.

Use 8bit Adam

체크를 하면 정확도는 악화되지만 VRAM을 절약할 수 있습니다.

Mixed Precision bf16

bf16은 fp16보다 지수의 비트를 많이 할당한 것. fp16보다 딥 뉴럴 네트워크를 트레이닝하는 데 적합한 것 같습니다. 그러나 실행할 수 있는 하드웨어는 한정되어 있습니다.

Memory Attention

Comparison of speed and VRAM of different attention optimizations #230에 따르면 xformers와 flash_attention은 메모리 사용량에 큰 차이가 없으므로 flash_attention을 사용할 이유가 없습니다.

  • default: 가장 빠르지만 VRAM 사용량이 많음
  • xformers:속도,VRAM 사용량 모두 보통
  • flash_attention: 가장 느리지만 VRAM 사용량이 가장 적음Don't cache latentsVAE 출력을 캐시하지 않는 설정. 체크하면 VRAM을 절약할 수 있습니다.

Train Text Encoder

Text Encoder도 동시에 학습시키면 얼굴 품질이 올라갑니다. 체크를 풀면 VRAM을 절약할 수 있습니다.

Train EMA

최종 이텔레이션에서 과학습이 되는 것을 막기 위해 지수 이동 평균(exponential moving average weight)을 사용합니다. 품질이 올라가지만 학습 시 VRAM을 불필요하게 사용합니다.

Prior Loss Weight

정칙화 이미지의 loss 무게. 통상은 1을 지정합니다.

Pad Tokens

75 토큰이 되도록 프롬프트 채웁니다.

gradient checkpointing

속도는 느려지지만 VRAM을 절약하는 옵션.

Concepts

Instance prompt

이미지 생성 시 호출할 때 사용하는 단어를 포함한 프롬프트. 호출할 때 사용하는 단어는 1토큰으로 모델에서 사용되지 않는 것이 좋습니다. 예를 들어 복잡한 프롬프트를 넣으면 안됩니다. 복잡한 프롬프트를 넣어 버리면 Class prompt를 설정해도 단어의 의미가 변화(language-drift)하게 됩니다. 

[filewords] 를 넣으면 Textual Eversion이나 Hypernetwork 에서 하듯이 화상 파일명의 txt 파일에 적힌 프롬프트를 사용합니다.

Instance prompt 는 prior preservation 을 할 경우에만 필요합니다.

Class prompt

정칙화 이미지를 설명하는 프롬프트는 모델이 인식할 수 있는 것이 아니면 의미가 없습니다. Instance prompt 가 shs girl 인 경우 Class prompt 는 girl 이 된다.

[filewords] 를 넣으면 Textual Eversion이나 Hypernetwork 에서 하듯이 이미지명의 txt 파일에 적힌 프롬프트를 사용합니다.

prior preservation을 하지 않는다면 공백이면 됩니다.

Instance prompt와  class prompt의 사례 

Training objects #19에서는 Instance prompt 에 "sks guiter", class prompt 에 "guiter" 를 입력하여 학습시킨 예가 있습니다.이 예에서는 sks에 기타 무늬만 학습되고 있습니다.

Diffusion 베이스의 드림부스 (Dreambooth)의 정밀도를 한층 더 올립니다(Windows 대응, VRAM 12GB)#학습용 이미지의 준비로 학습용 화상과 정칙화 화상의 예를 볼 수 있습니다.

Classification dataset directory

정칙화 화상(Class prompt 로 설명되어 있는 화상)을 넣어 두는 디렉토리. Class prompt 가 입력되어 있고, 이 디렉토리 란이 공백인 경우에는 /models/드림부스 (Dreambooth)/MODELNAME/classifiers/ 에 이미지를 생성하여 사용합니다.

Existing Prompt Contents

[filewords] 를 사용할 경우 사용한다. [filewords] 에 포함된 컨텐츠 내용을 지정합니다.

Instance Prompt 와 Class Prompt 는 제약이 있습니다. Instance Prompt는 항상 Instance Token과 Class Token이 세트여야 합니다. Class Prompt에는 Instance Token이 들어 있어서는 안됩니다. Existing Prompt Contents는 캡션 파일에 Instance Token과 Class Token이 들어 있는지 여부로 캡션 파일의 내용을 가공하여 프롬프트로 사용합니다.

Description

캡션 파일에 Class Token이 있는 경우 Class Token 앞에 Instance Token을 삽입하여 Instance Prompt로 사용합니다. Class Prompt 는 그대로 사용합니다.

Instance Token + Description

Instance Token 뒤에 Class Token을 삽입한 것을 Instance Prompt 로 사용한다.Class Prompt는 Instance Token을 Class Token으로 대체한 것을 사용합니다.

Class Token + Description

Class Token 앞에 Instance Token을 삽입하여 Instance Prompt로 사용한다.Class Prompt 는 그대로 사용합니다.

Instance Token + Class Token + Description

그대로 Instance Prompt 에 사용한다.Class Prompt 는 Instance Token 을 삭제하여 사용합니다.

코드

finetune_utils.py#L40-L61

Instance Token

화상 생성 시 호출할 때 사용할 단어만 지정한다.화상 생성 시 호출할 때 사용하는 말이 sls라면 sls만을 지정합니다. aphoto of sls나 slsdog 등은 틀림. Instance prompt 에 [filewords] 가 포함되어 있을 때만 기능합니다.

Class Token

Instance token과 같지만, 이쪽은 복수의 태그를 지정할 수 있다. class prompt 에 [filewords] 가 포함되어 있을 때만 기능한다.

Instance Token 과 Class Token 의 사용법

Instance token에 sks, Class token에 a woman, woman이 지정되어 있다고 하자.이때 [filewords]가 a photo of a woman이나 a photo of a man and a woman이었다면 학습시와 샘플 화상 작성시 각각 a photo of sks woman과 a photo of a man and sks woman으로 치환되어 실행됩니다. 정칙화 화상 생성 시에는 이 기능은 작용하지 않습니다.

Total Number of Class/Reg Images
준비한 정칙화 화상의 10배 정도를 지정한다.prior preservation을 하지 않는다면 0을 지정합니다.

학습의 재개

Load Params 를 클릭하면 입력 파라미터를 복원해줍니다.

A Few 드림부스 (Dreambooth) Observations and Tips, Leafier Closer Shots With the New Vae File (higher CFG)

준비할 이미지

  • 20장 이상의 업이미지
  • 4장 이상의 몸통 + 얼굴 이미지
  • 4장 이상의 전신 이미지
  • 1장 이상의 착석 이미지

주의할 것

  • 고해상도의 화상을 모은다.
  • 범용성을 높이기 위해서는 배경이나 글쓰기, 머리 모양, 표정 등 많은 이미지를 모을 필요가 있다.
  • 어안렌즈 효과를 좋아하지 않는 경우 어안렌즈로 촬영된 이미지는 피한다.
  • 얼룩이나 주근깨가 있는 사진은 가공한다. 그렇지 않으면 부자연스러운 이미지를 생성하게 된다.
  • 클래스 이름은 a로 시작한다(a dog, a girl 등). 그러면 여러 인스턴스를 생성하는 것을 막을 수 있다(dog라고 하는 class prompt 로 학습시키면 dog 로 여러 개를 그리게 된다).
  • 정칙화 이미지는 엄선한다. a girl로 생성해도 a girl과 관계없는 이미지가 생성되므로 관계없는 이미지는 제거한다

피하는 것이 좋을 것

  • 초점이 흐린 이미지는 사용하지 않는다.
  • 얼굴 가까이에 손이 있는 이미지는 손을 학습하게 되므로 피하는 것이 좋다.
  • 틀이 있는 이미지는 틀을 학습해 버리기 때문에 피한다.
  • 노이즈가 너무 강한 사진은 피한다.

그 외

512x512보다 큰 사이즈로의 출력을 예정하고 있는 경우, 큰 해상도의 화상(예를 들어 640x640)의 화상으로 학습시키면 품질이 올라간다.

60 매의 화상과 2,000 매의 "person" 정칙화 화상으로 6,000 스텝으로 학습시켰을 경우, 높은 CFG 를 설정해도 망치기 어렵게 됩니다.

Dehydrate and Rehydrate ckpt model

드림부스 (Dreambooth) 로 작성한 모델을 1GB 미만으로 압축합니다.

LORA

LORA 의 파일 사이즈가 작은 것은 U-Net 의 일부만 fine tune 하는 것과 차분 정보만 출력하기 때문이다.또한 그 차분 정보를 저등급 행렬 A와 행렬 B로 분해하여 A와 B를 각각 fine tune 한다. A와 B의 합계 사이즈는 차분 정보보다 작습니다.

LORA는 U-Net 전체를 fine tune 하는 것이 아니라 트랜스포머 모델의 어텐션층(Q, K, V, O)만을 fine tune 한다.

kohya판 LoRA를 사용하다

환경 구축

틀리기 쉬운 포인트

  • Python 3.10.x를 사용하다
  • 학습 전에 venv 를 활성화하다
  • 학습 이미지의 디렉토리 구조
  • 가상 메모리 용량 부족

학습 이미지의 디렉토리 구조
--train_data_dir 에는 ./임의 디렉토리/training,--reg_data_dir 에는 ./임의 디렉토리/reg를 지정한다.10_ AAA나 10_BBB를 지정하는 것이 아니다.

임의의 디렉토리---training---10_AAA
          │      └─10_BBB
          │
          └─reg ─┬─10_AAA
              └─10_BBB
페이징 파일 부족 오류가 나다
Windows의 설정->시스템->상세정보->시스템의 상세설정->퍼포먼스[설정]->가상메모리[변경]에서 가상메모리의 최대값을 80GB(80,000MB)정도로 설정한다.

학습 방법

아래 설정의 경우 VRAM 사용량은 6.2GB였습니다. RAM이 16GB일 경우 페이징 파일 부족 에러가 납니다. 학습 중에는 10GB 정도 RAM을 소비하기 때문에 다른 앱을 실행시키면 16GB에서는 RAM이 부족할 수 있습니다.

AUTOMATIC11에서 Kohya판의 .pt 파일을 사용하는 경우는 sd-webui-additional-networks를 사용한다.

Composable LoRA

"AND"를 사용했을 경우에, LoRA의 적용 범위를 한정할 수 있습니다.

Additional Networks for generating images

색상 분류한 1매의 마스크 이미지의 각각의 마스크에 Controlnet이나 Lora를 적용할 수 있는 확장 기능. 두 사람 이상의 사람이 있는 구도를 제어하는 경우에 유용합니다.

sd_드림부스 (Dreambooth)_extension 에서 LORA 사용

설정을 줄이면 VRAM 8GB에서도 실행할 수 있습니다.

vram 8g
VRAM8GB에서 실행하는 설정 예
Parameters 탭의 Advanced 에서 Use LORA 에 체크를 하면 사용할 수 있다. 설정 방법은 드림부스 (Dreambooth) 와 같습니다.

출력

학습 결과의 차분 파일(.pt)이 출력된다.차분 파일은 models/lora/로 출력됩니다.

차분 파일 적용

드림부스 (Dreambooth) 탭의 Create Model 탭에서 적용할 모델을 Diffusion 형식으로 변환합니다.
모델과 Lora 모델을 각각 선택하고 Generate Ckpt를 누릅니다. 이상 드림부스 이용방법입니다.

교차형 무한