Stable Diffusion 모델 학습

제공

개요


파인 튜닝(fine-tuning)

LLM 등의 거대 모델에서 사전훈련 모델(pre-trained model)이 기본이 되었음.

보통 위키피디아 같은 거대한 데이터로 사전훈련을 하면 언어의 기본적인 특징을 이해하게 되며, 그다음 개별 태스크에 맞게 새로운 데이터로 재학습을 하는 파인튜닝(fine-tuning)을 거침.

(거대)모델의 경우는 파라미터 사이즈가 너무나 크기 때문에 재학습을 하는데 시간과 자원이 너무 많이 소요되어서, 파인튜닝이 적합하지 않은 경우가 있음.

이런 문제점을 해결하는 방법으로 P-tuning과 LoRA가 있는데, 사전훈련된 가중치(파라미터)는 그대로 두고, 거기에 별도로 추가된 레이어만 새로운 데이터로 학습을 함.

LoRA(Low-Rank Adaptation)

출처 : https://arxiv.org/abs/2106.09685

사전 훈련된 모델 파라미터를 동결하고 transformer architecture의 각 layer에 훈련 가능한 rank decomposition matrix를 주입하여 다운스트림 작업에서 파라미터의 수를 크게 줄이는 방법

사전 훈련된 모델을 그대로 공유하면서 작은 LoRA 모듈을 여럿 만들고, 이를 쉽게 교체하면서 추론할 수 있음.

사전 훈련 모델은 모든 파라미터를 업데이트 하는 finetuning 방법을 통해 다양한 task에 적용되어 왔음. 하지만, 정작 업데이트에 사용되는 파라미터는 극히 일부이기 때문에 비효율적으로 자원을 사용하게 됨.

  • 모델 adaptation하는데 가중치의 변화 또한 low “intrinsic rank”를 가지고 있다고 가정
  • 이로써 메모리는 3배, 파라미터는 10,000배 정도 줄일 수 있어, 스토리지와 컴퓨팅 자원의 효율성을 높일 수 있음

훈련 방법


본 문서에서는 fine-tuning 은 현실적으로 맞지 않으므로, LoRA(Dreambooth LoRA) 방식을 통해 모델 재학습을 진행함.

훈련 순서

훈련 순서는 크게 아래와 같은 프로세스로 정리할 수 있음.

#작업명세부 내용비고
1환경 구성Python+Gradio 기반 GUI 툴 사용CUDA, bitsandbytes 등의 디펜던시 설정이 필요
2이미지 데이터 수집 및 정제해상도 조절 필요 (코드 자동화)적정 이상의 이미지 데이터 수집 필요
3이미지 데이터 태깅각 이미지에 프롬프트 태그 작성 (확장 자동화)
4LoRA 하이퍼파라미터 설정훈련을 위한 파라미터 값들을 설정
5모델 훈련 시행
6LoRA 적용

환경 구성

트레이닝용 코드들이 공개되어 있으므로, 해당 코드를 사용하면 어렵지 않게 훈련이 가능하다.

그 중에서 Webui 까지 제공하는 코드가 가장 많이 사용되고 있음.

https://github.com/bmaltais/kohya_ss

아래의 커맨드 실행으로 간단하게 툴을 실행시킬 수 있음.

$ python -V
Python 3.10.6
$ git clone https://github.com/bmaltais/kohya_ss.git
$ cd kohya_ss/
$ sudo ./setup.sh
$ ./gui.sh --listen 0.0.0.0

훈련 툴에서 사용하는 CUDA 버전과 시스템 상의 CUDA 라이브러리 버전($LD_LIBRARY_PPATH)이 동일해야 함.

CUDA SETUP: CUDA detection failed. Either CUDA driver not installed, CUDA not installed, or you have multiple conflicting CUDA libraries!

bitsandbytes 패키지(/opt/diffusion/kohya_ss/venv/lib/python3.10/site-packages/bitsandbytes)에도 해당 CUDA 라이브러리 파일이 존재해야 함.

이미지 데이터 수집 및 정제

학습용 이미지는 일정량 이상 수집이 필요하며, 해당 데모에서는 약 30장의 이미지를 사용하였음.

학습 대상의 복잡도, 이미지의 품질 및 가공 상태 등에 따라 최소 3~4장의 이미지로도 학습이 가능함.

이미지 사이즈나 비율도 크게 상관없으며, 리사이징 작업도 선택 사항임.

이미지 데이터 태깅

학습용 이미지에 태깅이 반드시 필요하며, 아래의 툴로 자동 혹은 수동으로 작업할 수 있음.

https://github.com/picobyte/stable-diffusion-webui-wd14-tagger

Stable Diffusion WEBUI 에서 해당 경로를 입력하여 설치 가능함.

설치 후에, WEBUI 를 재실행하면 ‘Tagger’ 라는 탭이 생성되며, 여기서 이미지 데이터의 경로를 지정해주고 자동으로 프롬프트 태깅을 진행할 수 있으며,

수동으로 태그를 지정하거나, 규칙을 지정할 수도 있음.

정상 완료되면 아래와 같이 txt 파일이 생성됨.
훈련 데이터 준비

먼저 훈련 데이터셋을 설정해야 함.

아래와 같이 어플리케이션 내의 훈련 도구를 이용하여 설정할 수 있음.

Instance prompt : 임의 단어를 지정해 토큰을 설정해줌. 적당한 단어를 입력하면 됨.

Class prompt : 훈련한 이미지 데이터의 종류를 입력함. 분류를 위해 입력하는 것이므로, 적당한 단어를 입력하면 됨.

Repeats : 훈련 이미지 반복 횟수. epoch 와 적절히 분배하여 적정 steps1 이상을 달성해야 함.
일반적으로 1000 이상의 스텝이 필요한 것으로 알려져 있으며, 이미지 수나 품질에 따라 더 많이 필요한 경우도 있음.

  1. steps : (number of images x number of repeats) x number of epochs / batch size ↩︎

그리고 소스 모델과 폴더 설정을 해줌.

하이퍼파라미터 설정

하이퍼파라미터는 아직도 많이 연구되고 있으며, 완벽한 셋팅이 있다기보다는 기본적으로 사용하는 셋팅을 찾아두고, 각 데이터셋에 맞게 설정을 바꿔가면서 학습해보면 좋음.

Learning rate : 높으면 빠르지만 학습이 불안정(과적합)하며, 낮으면 안정적이지만 느리며 학습량이 부족할 수 있음. extra arg 를 사용할 경우에는 learning rate 만 조절할 수 있음.
보통 Learning Rate와 U-Net Learning rate 는 0.0001 ~ 0.0002 정도를 많이 사용하며,
Text Encoder Learning rate 는 0.00001~0.00005 정도를 많이 사용함.

Network Rank, Alpha : Rank 는 훈련할 Unet 과 Text Encoder 의 파라미터 수를 나타냄. 특수한 경우가 아니면 8~32 로 설정함. Alpha 는 일반적인 학습에서 1 로 사용하여도 무방함.

batch size : 전체 학습셋을 몇개의 배치로 시행함을 뜻하며, vram 의 크기에 따라 2배수로 설정함

epoch : 학습셋을 몇번 반복할지를 뜻함. epoch 수 만큼 학습 결과물이 출력되기에, 중간 결과를 확인하며 학습할 수 있음.

Optimizer : AdamW8bit 을 일반적으로 많이 사용하며, 최근엔 DAdaptation, Prodigy 와 같은 적응형도 많이 사용되고 있음.

LR Scheduler : cosine with restarts 가 가장 일반적이며, 일부 Optimizer 에서는 constant 를 사용해야하는 경우도 있음.

Gradient checkpointing : vram 사용량을 줄이는 대신 학습 속도가 느려짐
Persistent data loader : vram 사용량을 줄이는 대신 학습 속도가 느려짐
Shuffle Caption : 캡션의 순서를 임의로 섞어서 태그가 골고루 영향을 주도록 해줌.
Color augmentation : 학습 이미지의 수가 적을 경우, 학습 이미지의 색상을 임의로 변경하여 사용
Flip augmentation: 학습 이미지의 수가 적을 경우, 랜덤하게 학습 이미지를 뒤집어서 사용

모델 훈련 시행

생성된 safetensor 파일을 ./models/Lora 디렉토리로 옮겨서 적용할 수 있음.


코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다