반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

가끔 보자, 하늘.

Stable diffusion을 업무에 활용하기 #3 Kohya로 LoRA 학습하기 본문

개발 이야기/개발툴 및 기타 이야기

Stable diffusion을 업무에 활용하기 #3 Kohya로 LoRA 학습하기

가온아 2023. 4. 26. 09:56

#2에서 끝났는데 colab에서 gpu 사용 불가 방침이 결정되어 #2의 방식을 더 이상 사용할 수 없게 되었습니다. 대신 kohya로 LoRA 학습을 대신하는 방법을 기술합니다. web ui extension은 사용해보지 않아 추후 확인하면 정리해서 올려보겠습니다.

https://github.com/bmaltais/kohya_ss 내용을 확인, 설치하세요. nvidia rtx 3060 12GB VRAM이상의 시스템에서 진행하시는게 좋습니다.( VRAM은 최소 8GB 이상이어야 합니다.) 아래 내용은 windows11, python 10, git이 설치된 환경을 기준으로 설명합니다.

(* 이 예제에서는 라이센스 이슈, 원작자와 협의없이 이미지를 사용하지 않기 위해 공개된 일러스트를 사용해 학습 테스트를 진행하지 않습니다. 테스트 하실 이미지는 각자 준비해서 사용해 보시기 바랍니다.)

우선 터미널에서 설치할 폴더를 만듭니다. 그리고 해당 폴더에서 아래를 실행합니다.

git clone https://github.com/bmaltais/kohya_ss.git
cd kohya_ss
.\setup.bat

설치가 완료되면 아래와 같이 실행하시면 됩니다.

gui.bat --inbrowser

정상적으로 실행되면 아래와 같은 화면을 볼 수 있습니다.

여기서는 LoRA 학습 절차를 확인할 예정이니 실행 화면의 상단 탭에서 "Dreambooth LoRA"탭을 선택합니다.

먼저 학습할 이미지를 준비합니다. 여기서는 D 드라이브에 training 이라는 폴더를 만들었다고 가정하겠습니다. 그리고 학습용 이미지(training image)를 넣을 폴더(이 예제에서는 train_images로 명명)와 정규화 이미지(regularisation image)를 넣을 폴더(이 예제에서는 reg_images로 명명)를 만듭니다. 정규화 이미지는 학습된 이미지로만 생성되는 것을 막기 위함입니다. 학습용 이미지가 캐릭터라면 유사한 캐릭터를 학습할 checkpoint에서 50장 정도 무작위로 생성해 넣어두면 됩니다.

폴더 구조는 아래와 같이 구성해야 합니다.

  • d drive  -> training -> train_images -> your_training_images_folder_name
  •                               -> reg_images -> your_reg_images_folder_name

your_training_images_folder_name와 your_reg_images_folder_name은 이 링크를 참고해 만들어야 합니다.

학습용 이미지는 <repeat count>_<identifier> <class> 형식이며 20번 반복에 식별자(identifier)가 sls 이고 클래스(class)가 flog라면 폴더명은 "20_sls flog"라고 명명해야 합니다. 여기서 식별자는 학습시킬 이미지를 식별할 수 있는 고유 키워드를 말하며 토크나이저로 하나의 토큰이 되는 3글자 이하의 희귀한 단어가 좋다고 합니다. 클래스는 일반적인 학습 유형을 말하며, 여성 캐릭터라면 girl 혹은 woman 과 같은  같은 단어로 명명할 수 있습니다.

정규화 이미지는 <repeat count>_<class>로 명명하면 됩니다.

이제 훈련을 위해 설정해야 할 각 탭의 설정값을 알아 보겠습니다.

Source Model

  • Pretrained model name or path : 베이스 모델의 경로를 지정합니다.
  • Model Quick Pick : 온라인에서 모델 파일을 다운받아서 학습에 사용합니다.
  • Save trained model as : safetensors로 설정해 사용하세요.
  • v2, v_parameterization : stable diffusion 2.0이상의 모델로 학습할 경우 활성화하여 사용하세요.

Folders

  • Image folder : 학습할 이미지의 폴더를 지정합니다. 위 폴더 예제 중 your_training_images_folder_name이 아닌 "d drive  -> training -> train_images"를 지정합니다.
  • Regularisation folder : (option)정규화 이미지의 폴더를 지정합니다. 위 폴더 예제 중  "d drive  -> training -> reg_images"를 지정합니다.
  • Output folder : 학습이 끝난 모델 파일을 저장하는 폴더 위치를 지정합니다.
  • Logging folder : (option)학습에 대한 로그 파일을 저장할 폴더 위치를 지정합니다.
  • Model output name : 학습된 모델 파일의 이름을 지정합니다.

Training parameters

  • LoRA type : Kohya DyLoRA , Kohya LoCon , LyCORIS/LoCon , LyCORIS/LoHa , Standard 중 하나를 선택할 수 있으며 무엇이 가장 좋은 옵션인지는 결과물을 만들어 비교해 보시는게 가장 좋습니다. 여기서는 Standard를 기준으로 설명합니다.
  • LoRA network weights : (option) 기존 학습된 데이터를 이용하는 듯 한데, 어떤 영향을 미치는지는 저도 잘 모르겠네요. (아시는 분 댓글 부탁드려요.)
  • Train batch size : 한번에 학습되는 이미지의 숫자를 입력합니다. 높을수록 빠르지만 vram 사용량이 증가합니다.
  • Epoch : 학습 횟수를 지정할 수 있습니다.
  • Save every N epochs : 학습 중간 모델을 저장할 epoch 간격을 지정합니다.
  • Mixed precision : 일반적인 사양의 PC에서는 fp16을 사용하세요. 
더보기

fp16/bf16 모두 16비트로 인코딩하기 때문에 정확히 동일한 메모리를 소비합니다. 하지만 만약 A100 혹은 rtx 3090이상의 좋은 하드웨어 사양이라면 BF16을 사용하세요.

구형 GPU(V100 또는 T4 등)에서는 bfloat16도 지원하지 않기 때문에 no로 설정하세요. 

fp16은 지수에 5비트가 있어 -65K에서 +65 사이의 숫자를 인코딩할 수 있고, bf16은 지수에 fp32와 같은 8비트가 있어 대략 fp32만큼 큰 숫자를 인코딩할 수 있습니다.

혼합 정밀도 훈련 중에 값이 너무 커서 fp16으로 인코딩할 수 없는 경우(>65K 또는 <-65K) 그라데이션의 크기를 다시 조정하는 트릭이 적용됩니다. 그러나 초대형 모델(GPT3가 좋아하는)에서는 nnet을 불안정하게 만드는 것으로 보입니다.

bf16도 fp32보다 정밀도가 떨어지기 때문에 완벽하지는 않습니다. 발생할 수 있는 한 가지 나쁜 점은 0에 매우 가까운 값은 인코딩할 수 없고 0으로 반올림된다는 것입니다(fp16과 동일하지만 bf16에서는 가치가 있음). 예를 들어 0으로 무언가를 나누려고 할 때 문제가 됩니다.

IRL의 또 다른 단점은 모델에 큰 값이 포함될 수 있으며 bf16을 지원하지 않는 하드웨어에서 추론을 수행하려는 경우 작업이 필요할 수 있다는 것입니다. 그래도 가능합니다. 예를 들어, Google의 T5 모델은 FP16에서 작동하도록 만드는 작업이 필요한 것으로 알려져 있습니다.

(* 출처 : https://www.reddit.com/r/MachineLearning/comments/vndtn8/d_mixed_precision_training_difference_between/)

  • Save precision : mixed precision과 동일한 값을 설정하세요.
  • Number of CPU threads per core : 코어당 사용할 cpu thread 개수입니다.
  • Seed : (option) 학습에 사용할 seed 값이 있을 경우 설정하세요.
  • Cache latent : VAE 관련 옵션일 듯 한데 자료가 잘 없네요. 체크를 해제하면 학습 속도가 늦어진다는 이야기는 있는데 근거 자료를 찾아보려해도 없었습니다. 이후 찾으면 다시 갱신하겠습니다.
  • Learning rate : 학습 강도값(gradient의 보폭값)이며 기본값은 1e-04입니다.
  • LR Scheduler : 학습 성능 향상을 위해 LR(learning rate)을 학습 중 조정하는데 사용합니다. pytorch 메뉴얼에서 상세한 내용을 볼 수 있는데, WebUI의 명칭과 일부 차이가 있습니다. 기본값은 constant이며, LR값을 변경하지 않고 학습을 수행합니다.
  • LR warmup : LR scheduler가 constant가 아닌 경우 현재 step이 warmup보다 낮을 경우 lr을 linear하게 증가하고 warmup 후에는 각 lr scheduler에서 정한 방법대로 lr을 update합니다. lr scheduler가 constant로 설정했다면 warmup값은 0이어야 합니다.
  • Optimizer : 딥러닝 모델의 최적화 알고리즘은 선택하는 옵션이며, 기본은 AdamW8bit입니다.
더보기

현재 선택 가능한 알고리즘의 종류는 Adam, SGD(Stochastic Gradient Descent), Adafactor, Lion, D-Adaptation 가 있으며, 각 알고리즘의 특징은 이 글에서는 상세히 언급하지 않습니다. (상세히 보다보면 저 세상 이야기라 저도 정확히 이해는 못합니다. -_-;; chatGPT로 요점 정리해서 보시는걸 추천 드립니다. 결론은 대부분 보다 적은 메모리로, 더 빠르고 효율적이게라... 벤치마크한 논문도 있네요. -_-a)

  • Optimizer extra arguments : (options) 각 optimizer에 필요한 arguments 설정하는 입력창입니다.
  • Text Encoder learning rate : 텍스트 인코더와 연결된 LoRA 모듈에 대해 일반 학습 속도와 다른 학습 속도를 사용할 때 지정합니다. 일부 사람들은 텍스트 인코더를 약간 낮은 학습 속도로 설정하는 것이 더 좋다고 말합니다.
  • Unet learning rate : U-Net과 관련된 LoRA 모듈에 대해 일반 학습 속도와 다른 학습 속도를 사용할 때 지정합니다.
  • Network Rank(Dimension) : LoRA의 차원 수를 지정합니다. 숫자가 클수록 표현력은 커지지만 학습에 필요한 메모리와 시간도 증가합니다. 또한 무턱대고 늘리는 것은 좋지 않은 것 같습니다.
  • Network Alpha : 결과물 생성 학습에 대해 영향을 미치는 것으로 예상되는 수치입니다. 구글링 해보니 아래와 같은 내용이 있으니 참고해보시고 정확히 아시면 댓글 부탁드립니다. 
더보기

"네트워크 알파를 낮추면 AI가 피사체를 재현하고 재구성할 때 미적 창의성을 높이기 시작합니다.
하지만 얼굴이 다소 기괴하고 소름 끼치게 보입니다. 업스케일링과 인페인팅을 통해 이러한 문제를 해결하고 더 높은 품질의 작품을 만들 수 있습니다.
이상하게도 네트워크 알파를 낮추면 배경 환경이 생깁니다. 하지만 CFG 스케일을 높이면 계절이 겨울에서 봄으로 바뀝니다. AI는 이상하죠.
16에서 8 사이의 값은 이 캐릭터에 적합한 반면, 1은 소스에서 너무 많이 벗어난 값입니다."

 

"저는 네트워크_딤 128과 네트워크_알파 64를 사용하는데, 사람에게는 매우 잘 작동하지만 다른 스타일에 대해서는 언급할 수 없습니다. 네트워크_알파가 1까지 낮을 수 있다고 읽었지만 테스트해 보지는 않았습니다.
이 값은 파일 크기에 직접적인 영향을 미치며, 128이면 200MB 출력 파일을 얻을 수 있고 32이면 약 70MB가 된다는 점에 유의해야 합니다. LoRa 파일에서 이 정도의 공간은 크게 문제가 되지 않습니다."

  • Max resolution : 1024x1024로 훈련 가능하지만, 훈련 시간이 꽤 길어집니다. 그래도 가능하면 1024로 설정하는게 좋습니다.
  • Stop text encoder training : 어느 스탭 이후에 text encoder 학습을 중단할지 지정합니다.0으로 설정되면 중단없이 모든 스탭에 훈련이 진행됩니다.

Tools

  • Dreambooth/LoRA Folder preparation : 훈련 이미지와 정규화 이미지를 설정할 폴더 구조를 생성해 줍니다. 수동으로 해도 되고, 이 툴을 이용해도 됩니다.
  • Dreambooth/LoRA Dataset balancing : 데이터 세트 폴더의 각 개념 폴더가 각 폴더의 이미지 수에 관계없이 dreambooth 기계 학습 모델의 훈련 프로세스 중에 동일하게 사용되도록 config를 설정해 주는 툴입니다.
  • LoRA Merge : 최대 4개의 LoRA를 병합하거나 최대 4개의 LoRA를 SD Checkpoint에 병합해주는 툴입니다.
  • Merge LoRA(SVD) : 두 개의 LoRA 네트워크를 병합하는 툴입니다.
  • Resize LoRA : LoRA의 크기를 조정하는 툴입니다.
  • Verify LoRA : LoRA네트워크를 확인해 제대로 훈련되었는지 확인하는 툴입니다.

학습 이미지 캡션 자동 생성

기본적인 설정이 끝났다면 학습할 이미지의 캡션을 생성해야 합니다. 수동으로 지정할 수 있으나 자동 생성 후 보정하는게 더 효율적입니다.

상단의 Utilities 탭 -> Captioning -> Basic Captioning 로 간 후 "Image folder to caption"에서 학습할 이미지가 있는 폴더를 지정합니다. 이후 "Caption images"버튼을 누르면 이미지를 분석해 이미지에 포함된 객체의 이름들을 자동 분류하여 [이미지 파일명].txt 에 자동 생성합니다. 이후 txt 파일을 보면서 추가하고 싶은 키워드를 다시 추가하면 됩니다.

학습하기

이제 다시 "Dreambooth LoRA" 탭으로 돌아와 "Train model"을 눌러 학습을 시도하세요. 

학습 결과를 Web UI에서 확인하기

학습이 끝난 파일은 output 폴더에 safetensors 확장자로 저장됩니다. 한 번 학습 시 "Save every N epochs"값에 따라 여러 파일이 생성될 수 있습니다. 이 파일들을 모두 web ui의 models > lora 폴더로 이동시킵니다. 그리고 txt2img로 가서 "show/hide extra networks" 버튼 클릭 ->  "Lora" 탭을 확인합니다.  (아래 이미지 참고)

그리고 여러 파일 중 하나를 선택하면 prompt 창에 <lora:lora_file_name:1> 이라는 텍스트가 추가됩니다. 마지막 숫자는 0일 때 학습된 결과와 상관없어지고 1이면 학습된 결과에 가까워지는 설정값입니다.

이렇게 하나씩 선택하면서 결과를 확인해 가장 좋은 결과물을 사용하시면 됩니다. 맘에 안들면 위 과정을 다시 실행해 테스트하는 것을 반복하세요. 

#2의 colab을 사용할 때보다 신경써야 할 내용도 많고 조금 복잡하게 느껴지지만 몇 번 하다보면 금방 익숙해 집니다. 설정값도 크게 변동시킬 일도 없어서요. 

#3에서는 python을 몰라도 학습할 수 있도록 글을 정리해봤습니다.

#4에서는 colab으로 학습하는 방법을 로컬에서 사용할 수 있게 변경해서 다시 글을 올려보겠습니다.

그럼 도움 되셨기를... :)

 

 

반응형