1편 : https://www.clien.net/service/board/cm_aigurim/18000175CLIEN
2편 : https://www.clien.net/service/board/cm_aigurim/18111060CLIEN
SD 1.5에 이어서 2.1로 신윤복 화백님의 checkpoint를 계속 개량중입니다.
제 자신도 예전 글을 참고해서 다시 설정하기도 해서, 기록을 남겨두는게 의미가 있을 것 같아, 현재 설정을 정보글로 공유해봅니다.
기본적으로 Dreambooth에 있는 "LORA"를 활용한 학습을 진행중입니다. 매번 거대한 checkpoint를 생성할 필요가 없기 때문에 저장 공간을 절약하면서 각 step별로 checkpoint를 저장할 수 있게 됩니다. 현재까지는 별다른 단점을 느끼지 못해서 계속 이 방법을 사용하고 있습니다.
"Use Lora Extended"를 check하는 경우에는 추가로 locon 확장이 필요합니다.
a1111-sd-webui-locon https://github.com/KohakuBlueleaf/a1111-sd-webui-locon
아래는 테스트한 학습중 하나인데, 예전과 달라진 부분이라면 좀 흐린 이미지들을 뺀 121장의 샘플에 각 이미지별로 별도 tagging을 달았습니다. 예전에는 1500~3000 step으로 학습을 했었는데, 최근에는 dalcefo님의 조언에 따라 대충 10000 step을 목표로 학습을 진행하고 있습니다. 중간에 멈춰서 Model Revision이 6776으로 되어있는데, 정상적으로 끝까지 갔다면 40 Epochs에 9680 step까지 가게 됩니다.
(샘플 121 + 대조군 121) * 40
다른 설정은 되도록이면 기본값으로 두고 있습니다.
Learning Rate는 모델별로 다른 것 같습니다. 기본값 0.0001로 테스트 해보고 적당한 값을 찾습니다. Text Encoder의 LR은 UNET의 절반값을 주고 있습니다.
waifuDiffusionBeta03_beta3의 경우는 0.00002로 해본 결과 마지막 모델은 과적합이 되는 것을 확인한 상태입니다.
Replicant-V3.0의 경우는 좀 더 약한 0.000004로 현재 테스트를 진행중입니다.
Learning Rate Scheduler는 저는 단순하게 constant를 사용하고 있습니다. "Starting Factor"를 1로 지정하시면 Scale Position 값에 상관없이 LR값이 유지됩니다. 기본값은 0.5입니다만, 이 경우는 시작은 지정한 LR의 절반값으로 출발해서 Scale Position에 도달하면 지정한 LR로 올라가는 식으로 학습을 하게 됩니다.
저는 CPU로 학습을 진행중이어서 Optimizer는"Lion"을 사용하고 있습니다.
"Cache Latents"는 GPU로 학습하시는 분들은 VRAM이 넉넉한 경우 사용하면 학습 속도가 올라갑니다. 저는 꺼두고 있습니다.
"Shuffle Tags"라는 항목도 있는데, 예를 들어 "shinyunbok anime"라는 학습이라면 "anime shinyunbok"도 하게 되어서 학습이 개선될 가능성이 있다고 하는데, 저는 기본적으로 사용하지 않고 있습니다.
앞서 말한 "과적합"이라는 표현도 다소 주관적인 표현인데, 제 경우에는 모델이 깨지는 경우는 물론이며, 프롬프트에 따른 자유도를 잃어버리는 상황도 포함되어있습니다. 예를 들어 아래처럼 스팀펑크 스타일의 신윤복 화백님 그림을 그려달라고 해도 신윤복 화백님의 스타일이 강하게 그려지고 있어서 약간의 자유도를 원했던 저는 "과적합"이라는 표현을 썼습니다만, 목표하는 바가 다르다면 이 모델이 적정선일수도 있습니다. 그래서 지금은 이 마지막 모델의 그림체 자체는 마음에 들어서, 별도 버전으로 배포할 생각입니다.
이전 글에도 언급했던것처럼, Sample prompt와 Sanity Sample은 해당 모델에서 사용할 것으로 예상되는 내용으로 적었습니다.
"[약후] 학습과 기반 모델의 상관관계"에서 볼 수 있는것처럼 기반이 되는 모델에 추가 학습을 진행하는 것이기에, 원본의 전체적인 구도를 따라갈 수밖에 없습니다. 때문에 현재로서는 원본 모델에 있는 prompt를 흉내내는 것이 좋은 결과를 얻는 방법인 것으로 느껴집니다.
waifuDiffusionBeta03_beta3의 경우
Sanity Sample Prompt: anime, (exceptional, best aesthetic, new, newest, best quality, masterpiece, extremely detailed, waifu:1.2), portrait of a girl holding a cat
Sanity Sample Negative Prompt: ((photo, realistic)), lowres, ((bad anatomy)), ((bad hands)), missing finger, extra digits, fewer digits, blurry, ((mutated hands and fingers)), (poorly drawn face), ((mutation)), ((deformed face)), (ugly), ((bad proportions)), ((extra limbs)), extra face, (double head), (extra head), ((extra feet)), monster, logo, cropped, worst quality, jpeg, humpbacked, long body, long neck, ((jpeg artifacts)), deleted, old, oldest, ((censored)), ((bad aesthetic)), (mosaic censoring, bar censor, blur censor)
Sample Image Prompt: shinyunbok anime, (exceptional, best aesthetic, new, newest, best quality, masterpiece, extremely detailed, waifu:1.2), portrait of a girl holding a cat
Sample Negative Prompt: ((photo, realistic)), lowres, ((bad anatomy)), ((bad hands)), missing finger, extra digits, fewer digits, blurry, ((mutated hands and fingers)), (poorly drawn face), ((mutation)), ((deformed face)), (ugly), ((bad proportions)), ((extra limbs)), extra face, (double head), (extra head), ((extra feet)), monster, logo, cropped, worst quality, jpeg, humpbacked, long body, long neck, ((jpeg artifacts)), deleted, old, oldest, ((censored)), ((bad aesthetic)), (mosaic censoring, bar censor, blur censor)
Replicant-V3.0의 경우
Sanity Sample Prompt: anime, (masterpiece, best quality), portrait of a girl holding a cat
Sanity Sample Negative Prompt: (low quality, worst quality:1.4), (bad anatomy), extra finger, fewer digits, jpeg artifacts
Sample Image Prompt: shinyunbok anime, (masterpiece, best quality), portrait of a girl holding a cat
Sample Negative Prompt: (low quality, worst quality:1.4), (bad anatomy), extra finger, fewer digits, jpeg artifacts
학습시키는 Concept의 경우는 예전에는 전부 shinyunbok painting으로 통일했습니다만, 남여 상관없이 항상 갓을 쓰고 나온다던지 하는 부작용이 있어서 지금은 tagging한 자료를 사용하고 있습니다.
자료는 SD 2.1용 768x768로 적절히 인물이나 물체에 맞춰 crop된 이미지 파일과, 그 파일에 대한 설명이 담겨있는 txt가 함께 들어있습니다. 예를 들어 yunbok000.txt의 경우는 그네타는 여인이라는 설명의 "a woman swinging on a swing, a tree in the background" 만 들어있으며, shinyunbok painting이라던지 관련 언급은 포함되어있지 않고, 아래처럼 prompt에서 별도로 지정하고 있습니다.
Instance Token은 shinyunbok, Class Token은 현재는 anime model 기반으로 학습중이라 anime를 사용하고 있습니다.
Training Prompts에 "[filewords]"를 사용하면 앞서 설정한 text 파일의 설명을 가져옵니다.
Instance Prompt는 학슴용 이미지에서 사용하는 prompt가 되고, Class Prompt는 대조군 이미지를 학습시킬때 사용하는 prompt가 됩니다. 해당 모델로 처음 학습시킬때는 대조군 이미지가 없는 상태에서 시작하기에 "Classification Dataset Directory"를 빈칸으로 두면 아래처럼 대조군 이미지를 만들어줍니다. 그 이후에는 생성된 이미지를 재사용하면 됩니다.
waifuDiffusionBeta03_beta3에서 생성된 대조군 이미지의 예시
Class Images Per Instance Image는 많은 사람들이 추천하는 10을 사용하고 있습니다. 기본 학습 이미지의 10배수에 해당하는 대조군 이미지를 학습에 사용합니다.
Number of Samples to Generate는 각 epoch별로 몇개의 샘플 이미지를 생성 할 것인지를 지정하는 것으로, 저는 3을 사용하고 있습니다. 이때 Sample Seed를 지정해버리면 똑같은 그림이 3장 생성되기에, 저같은 실수를 하지 않기위해서는 빈칸으로 두셔야 합니다.
Saving 탭에서는 ckpt 생성 관련 부분은 빼주고 Lora쪽만 저장하도록 설정해두고 있습니다.
이후에 학습이 완료된 상태에서 sample 이미지를 보며 마음에 드는 모델이 있으면 해당 모델의 checkpoint를 생성합니다.
Select에서 Model을 고른 후 "Load Settings"를 누르면 아래처럼 Lora Model을 선택할 수 있게 됩니다.
"Generate Ckpt" 버튼을 누르면 해당 버전의 checkpoint가 models/Stable-diffusion 에 생성됩니다.
UI 버그인지 모르겠습니다만, 원하는 Lora Model을 선택한 후 "Save Settings"를 눌러줘야 해당 버전으로 생성해주는 듯 합니다.
여기까지가 제가 현재 사용하고 있는 학습 설정이고, 정답이 없는 부분이라 각자의 목표하는 바와 사용하는 환경에 따라 맞지 않는 부분도 있을 것이라, 참고용으로 보시면 되겠습니다.
항상 노고에 감사드립니다.
현재 XL 이 하위 모델(v1.5)과의 호환성이 어느정도 가능한것이 확인되었는데 아마 추후 XL 학습시에 도움이 될만한 솔루션이 나올거 같네요