Stable Diffusion web UI (이하 SD) 를 사용하다보면 반드시 사용하게 되는 SD 의 기능중 하나가 LoRA (Low-Rank Adaptation of Large Language Models)다. 여기서 Large Language Models 는 Transformer 를 이야기하는거고 Stable Diffusion 에도 Transformer 가 있기 때문에 이 부분에 적용된다.
기본적으로 학습된 모델을 (SD 에서는 체크포인트) 파인튜닝(미세조정)하려면 DreamBooth 를 사용해 재학습 시켜야 한다. 재학습시키는건 비용(=시간)이 많이 들기 때문에 좀 더 빠르게 미세조정할 수 있는 방법을 생각해보다가 나온게 "Low-Rank Adaptation" 이다. 예를 들어 1000 x 2000 행렬을 1000 x 2 + 2000 x 2 로 해서 학습할 파라메터를 줄인다. 이후 LoRA 를 이용한 다양한 기법들이 연구되고 사용되고 있다.
- LoRA: Low-Rank Adaptation (Tranformer 블록만 학습) - LoCon: LoRA for Convolusion Network (Tranformer 외에 Res 블록도 학습) - LoHa: LoRA with Hadamerd Product Representation (LoRA 에서 행열곱 연산 대신 하마다르곱 연산을 사용) - LoKR: LoRA with KRonecker Product Representation (LoRA 에서 행열곱 연산 대신 크로네커곱 연산을 사용) - DyLoRA: Dynamic search-free LoRA (한번의 학습으로 여러 Rank 의 모델을 얻음)
SDUI 에서는 LyCORIS(Lora beYond Conventional methods, Other Rank adaptation Implementations) 라는 확장 프로그램을 사용해 각종 LoRA 들을 사용할 수 있다.
물론 학습이 쉬워졌다(=낮은 사양에서도 실질적으로 학습 할 수 있다)는 이야기지, 대충 만들어도 좋게 나온다는 의미는 아니다. 그래도 학습에 필요한 양질의 이미지를 준비해야하기 때문에, 상당한 노력과 시간이 필요하긴 하다.
학습에 필요한 이미지가 준비되었고 준비된 이미지에 프롬프트를 설정해주었다면, RTX 3060 12G 에서 LoRA 를 생성하는데 3시간 정도 걸린다.
필자가 생성하는 거의 모든 이미지에 koreanDollLikeness_v10 를 사용한다. 심지어 koreanDollLikeness_v20 이 나오긴 했지만 안쓴다. 맘에 드는 LoRA 하나 정도는 찾아 놓는것도 좋을것 같다. 아래 이미지는 이를 사용해 생성한 이미지다.
SD를 사용하다보면, 스탭을 몇번에 놓을지 고민하게 된다. 필자는 처음에는 24 스텝을 사용하고, 업스케일링할 때에는 30으로 놓고 업스케일링 한다. 스텝을 늘이는 이유는 더 선명해지고, 디테일이 증가하기 때문이다.
하지만 이렇게 하다보면 간혹 스텝 24일때와 스텝 30일때 큰 변화를 가지게 되는 경우가 생긴다. 대부분의 이미지는 30으로 설정할 때 더 선명해지기만 하지만, 그렇지 않은게 간혹 나온다. 아래와 같이 말이다.
아래와 같아지는 경우도 있다.
하지만, 선명한 이미지는 스케일업할 때에도 할 수 있고, 그래서 필자는 이런 경우는 스텝을 늘여서 제작하지 않는다. 특히 18, 19, 20, 21 스텝이 이미지가 판이하게 다르게 나오곤 한다. 공통적으로 프롬프트가 적용되는 강도가 달라지는 거지만, 강하게 적용된다고 모두 내 맘에 든다는 아니니 말이다. 그렇다고 모든 스텝을 다 확인해볼 수는 없는 노릇이고 말이다. 어떻게 효율적으로 확인해보는 방법 없을지 고민이다.
인물 사진 얼굴을 변경해보기 위해 체크포인트 머지했다. 얼굴을 변경하는 많은 방법이 있겠지만, 로라사용하는 것 외에는 이게 가장 먼저 생각 났다. 예쁜 얼굴을 만들기 위함이다.
기본적으로 WebUI 에서 머지를 지원한다. 여러가지 모델에 대해 문제 없이 머지되도록 잘 되어있기 때문에 이를 사용해 머지한게 많다. 그냥 체크 포인트 두개 선택하고, 비율 조절해준 다음 safetensors 선택해서 머지해주면 된다. 위 사진과 같이 하면 체크포인트 해시 "ca883fecc7" 값을 가지는 safetensor 파일이 나온다. 이 조합법이 한때 많이 유행했다고 한다.
이렇게 하면 같은 시드, 같은 프롬프트라도 다른 이미지가 나온다. 아래와 같이 말이다. 다른건 몰라도 얼굴형을 미세 조정 하는건 어렵기 때문에 얼굴만 봤다. 이중 맘에 드는거 하나 골랐다. ㅎㅎ
라이저케이블을 사용해 VGA 를 수직 장착했다. 배송비 별도 4.95 만냥에 구매했다. 사용하고 있는 2060이 기가바이트 윈드포스라 바람이 그래픽 카드 위로도 나온다. 따라서 수평 장착시 케이스 측면을 향해 뜨거운 바람이 불게되고, 이때문에 뜨거운 바람이 다시 케이스 안으로 들어가게 된다. 여러모로 발열을 해결하는데 있어 문제가 되기 때문에 수직 장착으로 해결했다. 수직 장착하면 케이스 후면 팬으로 뜨거운 바람이 나가게 된다. 케이스 내부 온도는 쉽게 체감될 정도로 낮아졌고, 그래픽 카드 온도는 72 도 정도로 수직장착 전보다 3도 낮아진걸로 측정되긴 했지만 큰 차이 없는듯 하다.
라이저케이블을 사용해 그래픽 카드를 장착하게 되면, 그래픽 카드가 붕 뜨게 된다. 그냥 그래픽 카드가 떠있는 상태에서 그래픽 카드 받침대를 사용해 지지하고, 라이저케이블을 사용해 마더보드의 PCIe 16 포트와 그래픽 카드의 접속 단자를 연결해주는식으로 설치한다. 초기에는 PCIe 3.0 용 케이블만 판매했고 품질도 조악했었다고 하는데, 요즘 판매되는건 PCIe 4.0 용 케이블이고 속도저하도 없다고하며 무었보다 5만원정도로 저렴하게 구매할 수 있다.
필자의 경우도 다행이 성능 저하는 없는듯 하지만, 현재 사용하고 있는 마더보드는 PCIe 3 까지만 지원하는거라 PCIe 4 로는 확인 못했다.
L610 수직 장착
케이스에 따라 전용 라이저 장치를 달 수 있는경우도 있지만, 그렇게 하면 다른 확장포트를 전혀 쓰질 못하게 되어서 이런식으로 장착했다. 케이스에 수직으로 장착해 고정할 수 있는 확장 포트가 있고, 라이저케이블을 끼울 수 있을 정도의 공간이 있다면, 다른 케이스에도 장치하는건 어렵지 않을것 같다. 참고로 필자는 3RSYS L610 를 사용한다.