hako-mikan LoRA어떻게 쓰는건지 내가 알아내본거 개인정리 및 공유해본다. 다시 현생에 뛰어들게 되면 백퍼 까먹는다..

내가 찾는 능지가 딸려서 그런진 모르겠지만, 자세한 설명을 한/영권에서 못찾았다. github wiki패이지가 읽기 난해하게 써져있는건 덤. 벌써 있고 중복이면 미안하다. 개인용이구나 하고서 봐줘.


LoRA란?

쉽게얘기하면 트래이닝된 모델이고 이것의 장점은 전에 하이퍼 쓸때는 그냥 적용 해놓고 프롬으로 깎아야 했는데, 지금은 특정 부분만 적용 가능하다. 의상만 반영하던가 얼굴만 반영.

작동 원리는 여기 읽으면 좋다 https://arca.live/b/aiart/68914565 도움된다. 


hako-mikan

여기서 매인으로 설명할거는 hako-mikan의 LoRA Block weight extension사용법이다.

먼저 없으면 받자 https://github.com/hako-mikan/sd-webui-lora-block-weight

WebUI에서 Extensions > Install from URL에서도 할수있다.


먼저 알아둬야할게 LoRA는 17개의 block들이 있다. 17개 블록들은 각각 Block ID 이름이 있다. 

1234567891011121314151617
BASEIN01IN02IN04IN05IN07IN08MIDOUT03OUT04OUT05OUT06OUT07OUT08OUT09OUT10OUT11

블록26개짜리 모델들도 있다. LyCORIS/LoCon, LoHA. kohya_ss꺼는 얘네들도 지원한다. 


설치하면 이게 뜬다.


1, 2, 3 설명:


1: LoRA Block Weight

여기는 Original Weights들을 넣는곳이다. 

보면은 지금 NONE,ALL,INS,IND,INALL,MIDD,OUTD,OUTS,OUTALL,ALL0.5,CU1 이렇게 써있다. 이게 다 뭐냐?

요놈들은 Weight (가중치)들의 variable이름이다. 아래 3에서 정의되있는 애들이다. 


3: Weights setting

여기서 Original Weights들을 정의한다.

펼치면 이렇다

NONE:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

ALL:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

INS:1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0

IND:1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0

INALL:1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0

MIDD:1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0

OUTD:1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0

OUTS:1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1

OUTALL:1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1

ALL0.5:0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5

CU1:1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0

전에 내가 LoRA는 17개짜리 블록이라고 했다. 그래서 얘네들은 다 17개들의 수치이고, 각 포지션은 각 블록ID에 해당한다.

여기서 원하는대로 Original Weight들을 정의할수 있다. CU1 (custom 1) 은 내가 정의한놈이다. 이름 상관없다 BOJI로도 해도 된다.

17블록짜리 LoRA를 쓸경우, 나머지 미기입 수치들은 1로 친다. 그래서 26개 안넣어도 된다 17개만.

개인적으로 정의한 애들은 "Save Presets"해서 저장하고 나중에 WebUI끄면 다시 "Reload Presets"로 불러올수 있다.


그래서 1 에서 쓸 Original Weight들을 3에다가 먼저 정의를 해줘야 한다.


정의는 해놨는데 어떻게 써먹냐?

3가지가 있다.


a) 프롬 창에, <lora:"lora name":1:17/26개짜리 수치>를 추가해라.

 i.e. <lora:"lora name":1:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>

26개는 <lora:"lora name":1:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>

"lora name"이름은 당연히 니가 쓰는 LoRA모델이름. e.g. <lora:shiroko:1:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>

이러면 좋은게, exif에 설정값 저장된다.


b) a랑 같지만 번거롭게 17개짜리 콤마 적는대신에 3애서 정의한 이름들을 쓸수 있다. <lora:shiroko:1:CU1>.

Block ID도 넣을수 있다. <lora:shiroko:1:IN04>


c) a랑 같지만 마지막에 XYZ를 적어, 2XYZ Plot에서 설정을 한다. <lora:shiroko:1:XYZ>


이제 2 설명을 한다.


2: XYZ Plot

이제 2 설명을 한다. 여기가 핵심.

일단 펼치면 이렇다

Disable 에서 XYZ로 안바꾸면 작동 안한다. 당연히..


보면 "changeable blocks: BASE,IN00,IN01,IN02,IN03,IN04,IN05,IN06,IN07,IN08,IN09,IN10,IN11,M00,OUT00,OUT01,OUT02,OUT03,OUT04,OUT05,OUT06,OUT07,OUT08,OUT09,OUT10,OUT11" 라고 되있는데 이건 26개짜리. 전에 말한대로 신경 안써도 된다.

하지만 주의할점이 써있는걸 보면 알수있지만 는 Block ID MID를 M00으로 쓰기때문에 MID쓰면 에러뜬다.

마찬가지로 OUT03안쓰고 OUT3쓰면 에러뜬다. 당황하지 말고 확인하자


자 보면 이런 드랍다운 메뉴가 있다 

이 4가지 타입들을 각각 "X Types"/"Y Types"/"Z Types" 에 설정할수 있고, 설정값은 각각  "X Values"/"Y Values"/"Z Values" 창에다가 기입한다.

아마 설치하면 다 none이 기본값인거 같다.

순서 상관없다. 아무 타입 XYZ에 갈수있다.


4가지 설명:


"Original Weights" 은 전에 3번에 정의해둔 이름들을 적을 곳에 설정 해두는거다.

X를 "Original Weights"로 설정했으면 아래 "X Values"에 이름들을 적는다.

예시: INS,OUTS,ALL0.5


"Block ID" 는 원하는 LoRA블록을 정하는 설정칸이다. 당연히 원하는 Block ID는 Values칸에 기입. 여기다가 3번에 정의해둔거 넣으면 애가 모른다. 하지마라

기입 방법이다.

하나만 원하면: OUT03

두개이상 원한다면, 콤마로 구분. OUT03, OUT04

한꺼번에 원한다면, 스패이스를 쓰거나 대시 (-) 를 쓴다. OUT03 OUT04 또는 OUT03-OUT04


이걸 응용하면 범위도 가능하다.만약 OUT03부터 OUT11 한꺼번에 원하면? 일일이 Block ID를 기입해야하나? 

그럼 OUT03-OUT11 또는 OUT03 OUT04 OUT05 OUT06 OUT07 OUT08 OUT09 OUT10 OUT11이라고 적으면 된다.

OUT03부터 OUT11빼고 원하면? 그러면 NOT을 앞에 추가하면 된다. NOT OUT03-OUT11


참고로 NOT OUT03-OUT11은 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 인데, 이렇게 적으면 애가 모른다.

1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 이것도 안된다.

BASE IN01 IN02 IN04 IN05 IN07 IN08 M00 이렇게 적던가, BASE-M00이렇게 적어야 한다.

BASE, IN01, IN02, IN04, IN05, IN07, IN08, M00이거는 한꺼번에가 아니고 하나하나 따로따로 인식한다.


"values" 는 가중치를 적는 곳이다. 이 가중치들이 블록들에 곱해진다. 

예시: 0,0.25,0.5,0.75,1

1넘어가면 에러는 안뜨고 진행되지만 의미불명 쓰래기 나오더라. 


"seed" 는 당연히 원하는 시드 적는 곳이다. 시드를 적는 수만큼 그 시드로 이미지가 생성된다.

XY에 뭔가 기입하고 Z에 seed를 2개적으면 XY 설정대로 2개의 다른 시드로 2번 생성된다.

-1 넣으면 랜덤시드.


자 이제 XYZ의 패러미터들이 어떻게 작용을 하는가.

예시를 들어보겠다.


XY:

X Original Weights: NONE,ALL,INS,IND,INALL,MIDD,OUTD,OUTS,OUTALL,ALL0.5,CU1

Y Block ID: BASE,IN01,IN02,IN04,IN05,IN07,IN08,MID

결과: [NONE, BASE], [ALL, BASE], ... [CU1, BASE], 다음 [NONE, IN01], [ALL, IN01], ... [CU1, IN01]


X values: 0,0.25,0.5,0.75,1

Y Block ID: BASE,IN01-IN08,IN05-OUT05,OUT03-OUT11,NOT OUT03-OUT11

결과: [0, BASE] [0.25, BASE] ... [1, BASE] 다음 [0, IN01-IN08] ... [1, IN01-IN08]


XYZ:

X values: 0,0.25,0.5,0.75,1

Y Block ID: BASE-M00

Z Original Weights: INS,OUTS,ALL0.5

결과 [0.25, BASE-M00, INS], ... [1, BASE-M00, INS], 다음 [0.25, BASE-M00, OUTS], ... [1, BASE-M00, OUTS], 최종 [1, BASE-M00, ALL0.5]


X values: 0,0.25,0.5,0.75,1

Y Block ID: BASE-M00, M00

Z Original Weights: INS,OUTS,ALL0.5

it will do [0.25, BASE-M00, INS], ... [1, BASE-M00, INS], 다음 [0.25, M00, INS], ... [1, M00, INS], 

[0.25, BASE-M00, OUTS], ... [1, BASE-M00, OUTS], 다음  [0.25, M00, OUTS], ... [1, M00, OUTS], 

[0.25, BASE-M00, ALL0.5], ... [1, BASE-M00, ALL0.5], 다음 [0.25, M00, ALL0.5], ...최종 [1, M00, ALL0.5]


XYZ 설정 예시 짤


generalized form을 유추해보면 대충 이렇다

For a = 1:n, b = 1:m, c = 1:k

X = an, i.e. [a1, a2, a3, ... an]

Y = bm, i.e. [b1, b2, b3, ...bm]

Z = ck, i.e. [c1, c2, c3, ...ck]


XY: 

[a1, b0], [a2, b0], ... [an, b0], and finally [a1, bm] ... [an, bm]


XYZ:

[a1 b1 c1] ... [an b1 c1], [a1 b2 c1], ... [an b2 c1], [a1 bm c1], ... [an bm c1],

[a1 b1 c2] ... [an b1 c2], [a1 b2 c2], ... [an b2 c2], [a1 bm c2], ... [an bm c2],

[a1 b1 ck] ... [an b1 ck], [a1 b2 ck], ... [an b2 ck], [a1 bm ck], ... [an bm ck]


총 생성 짤 수:

n x m x k


matrix multiplication이랑 비슷한데 또 완전 같진 않은것 같다. 사이즈 달라도 그냥 잘만 곱해지는거 보니..


이걸 왜 알아야 하냐면 지금 이 extension에 버그가 있는데 hires. fix를 같이 쓰면 grid쪽에서 문제가 꽥 하고 생겨서 LoRA가 그냥 일을 멈춘다. 그래서 난 미리 XYZ에 기입한대로 뭐가 순서대로 나올지 알고싶다.

hires. fix안쓰면 잘 되더라. github에 오토좌나 hako-mikan한테 문의해볼 예정.


Effective Block Analyzer: 안해봐서 모름. 해보면 또 글 쓰게..되겠지 아마?


추가1:

Grid generation에 대해서/예시 짤

LoRA 모델마다 캐바캐이긴 한데 그래도 넣어봤다.

grid는 이미지 작업 후 WebUI가 만드는 비교짤 모음을 말하는거.

LoRA플러그인이랑 쓰면, Original Weights의 수 만큼의 grid짤이 생성된다. (Original Weights있으면)

LoRA모델은 흰둥이 (exif있음) 내가 만든건 아님. 원링크/ 내가 업로드한 백업 링크 한번 다운받아서 연습해봐.

원모델은 AbyssOrange쓰셈. (AOM2-nutmegmixGav2+ElysV3있으면 더 좋고)


1. 

X values: 0,0.25,0.5,0.75,1

Y Block ID: BASE-M00

Z Original Weights: INS,OUTS,ALL0.5

보다시피 왼쪽 위 상단에 Original Weights를 알려준다.

숫자만 보여준다고 해서 어렵게 생각할건 없고, 내가 Z: INS,OUTS,ALL0.5를 넣었잖아? 그게 딱 저거다. 전에 설명한 3구역에 다 정의되있다.

좀 해석을 해본다면 보기에는 ALL0.5가 제일 성능이 나은것 같다. (3번째 짤.) INS (1번째)는 학생해일로말고 잡몹해일로를 들고 왔네..ALL0.5도 뭐라 할말은 아니다만. 가중치는 0.5~1.0이 적당한거 같고.

총 생성 짤 수는 n x m x k인데 n은 여기는 각각 5 x 1 x 3 = 15.


2. 

X values: 0,0.25,0.5,0.75,1

Y Block ID: BASE-M00, IN01

Z Original Weights: INS,OUTS,ALL0.5

1)이랑 같은데 IN01추가.

Y값에 하나더 들어가서 행이 하나더 생겼다.

IN01이 BASE-M00이랑 비교했을때 애매하지만 ALL0.5에서는 확실히 더 좋은것 같다. 

총 생성 짤 수 = n x m x k = 5 x 2 x 3 = 30.


3. 

X values: 0,0.25,0.5,0.75,1

Y Block ID: IN01, IN02-IN08

Z: None

n x m = 5 x 2 = 10

역시 IN01은 옳다. IN02-IN08 뭔가 비슷하면서도 다르네..

그냥 이런식으로 해보면서 어떻게 되는지 봐야 한다

(근데 어떻게 한번도 해일로가 제대로된 모양으로 안나오냐)


4. 

X Original Weights: IND,CU1,ALL0.5

Y Block ID: IN01, IN02-IN08

Z: None

n x m = 3 x 2 = 6개

음.. IND, CU1은 쓰래기인걸로..


추가2:

hires. fix버그 제보로 인해 고쳤다고 함.


틀린거있거나 추가내용있으면 환영