4-4. 도구와 실습: LoRA 세 개 만들기
4단계에서 배운 것을 실제로 한다. 캐릭터, 화풍, 개념 LoRA를 하나씩 만든다. 이번 수업은 학습 도구를 고르는 법과, 세 실습의 절차를 정리한다. 명령어는 도구와 판에 따라 바뀌므로 무엇을 왜 하는지만 적는다.
학습 도구
LoRA 학습은 전용 도구로 한다. 0-6처럼 직접 짤 필요는 없다. 안에서 하는 일은 같다. 노이즈를 섞고, 방향을 맞히게 하고, A와 B를 움직인다.
| 도구 | 형태 | 강점 |
|---|---|---|
| kohya sd-scripts | 명령줄 스크립트 | 오래된 표준. SD 1.5, SDXL 계열의 자료와 설정 예시가 가장 많다 |
| OneTrainer | 화면이 있는 프로그램 | 설정을 눈으로 보며 고른다. 입문에 좋다 |
| ai-toolkit | 설정 파일 + 화면 | 새 모델을 빨리 지원한다. Flux 이후의 DiT 계열에 강하다 |
| musubi-tuner | 명령줄 스크립트 | 영상 모델과 최신 이미지 모델. 메모리를 아끼는 기능이 많다 |
고르는 기준은 하나다. 내가 쓸 기반 모델을 지원하는가. 새 모델이 나오면 어느 도구가 먼저 지원하는지 각 도구의 설명서에서 확인한다.
도구가 달라도 설정의 이름과 뜻은 거의 같다. 학습률, 랭크, alpha, 에폭, 해상도. 4-3에서 배운 그것이다.
필요한 장비
학습은 추론보다 메모리를 훨씬 많이 쓴다. 가중치 말고도 기울기와 계산 중간값을 들고 있어야 하기 때문이다.
| 기반 모델 | 학습에 필요한 그래픽카드 메모리(대략) |
|---|---|
| SDXL 계열 | 12~16GB |
| 수십억~백억 대 DiT | 16~24GB, 설정에 따라 그 이상 |
| 영상 모델 | 24GB 이상. 큰 메모리일수록 편하다 |
메모리가 모자랄 때 쓰는 방법들이 있다.
- 배치 크기를 1로 한다.
- 학습 해상도를 낮춘다. 디테일을 덜 배운다.
- 기울기 체크포인팅을 켠다. 중간값을 저장하지 않고 필요할 때 다시 계산한다. 느려지지만 메모리가 준다.
- 텍스트 인코더와 VAE의 결과를 미리 계산해 저장해 둔다. 학습 중에는 그 둘을 메모리에 올리지 않는다.
- 블록 일부를 일반 메모리에 둔다(2-4). 느려진다.
공통 절차
세 실습 모두 같은 순서다.
1. 목표를 정한다 무엇을 가르치고, 무엇은 프롬프트로 조절할 것인가
2. 그림을 모은다 4-2 의 원칙대로
3. 캡션을 단다 자동으로 만들고 손으로 고친다
4. 설정을 정한다 도구의 모델별 기본값에서 출발한다
5. 학습한다 중간 저장과 표본 생성을 켠다
6. 고른다 표본을 보고 알맞은 시점의 저장본을 고른다
7. 시험한다 강도를 바꿔 가며, 데이터에 없던 상황을 시킨다
8. 고친다 문제가 있으면 한 가지만 바꿔 다시 한다
1번을 건너뛰면 2번부터 전부 흔들린다. "이 LoRA를 켜면 무엇이 항상 나오고, 무엇은 내가 프롬프트로 바꿀 수 있어야 하는가"를 먼저 글로 적는다.
실습 1: 캐릭터 LoRA
목표: 내 캐릭터를 트리거 단어 하나로 불러내고, 자세, 표정, 배경, 옷은 프롬프트로 조절한다.
데이터 만들기
캐릭터 그림이 한두 장뿐이어도 된다. 3-4의 편집 모델로 불린다.
- 기준이 되는 캐릭터 그림을 정한다.
- 편집 모델로 여러 각도(정면, 옆, 반측면, 뒤), 여러 자세(서기, 앉기, 걷기), 여러 표정, 여러 배경을 만든다.
- 얼굴이 흔들린 것, 세부가 틀린 것을 버린다. 이 단계가 가장 중요하다. 틀린 그림이 섞이면 틀린 것을 배운다.
- 얼굴 클로즈업, 상반신, 전신을 골고루 20~30장 남긴다.
캡션
- 트리거 단어를 맨 앞에 넣는다.
- 얼굴, 머리, 눈 같은 고유 특징은 적지 않는다.
- 옷, 자세, 표정, 배경, 구도는 적는다.
확인할 것
| 시험 | 통과 기준 |
|---|---|
| 트리거 단어만 | 캐릭터가 닮았다 |
| 데이터에 없던 자세 | 시킨 자세로 그린다 |
| 다른 옷 | 옷이 바뀌고 얼굴은 그대로다 |
| ControlNet 포즈와 함께 | 지정한 뼈대대로, 캐릭터가 유지된다 |
| 트리거 단어 없이 | 그 캐릭터가 나오지 않는다 |
실습 2: 화풍 LoRA
목표: 켜기만 하면 그 화풍으로 그린다. 무엇을 그릴지는 프롬프트가 정한다.
데이터
- 한 화풍으로 그려진 그림 50장 이상.
- 대상이 다양해야 한다. 여러 인물, 여러 구도, 풍경과 사물도 섞는다.
- 한 캐릭터가 절반을 넘으면 그 캐릭터가 화풍에 섞여 굳는다.
캡션
- 화풍을 가리키는 말은 적지 않는다.
- 그려진 내용만 충실히 적는다.
- 트리거 단어는 없어도 된다.
설정에서 다른 점
- 화풍은 캐릭터보다 담을 것이 많다. 랭크를 조금 높인다.
- U-Net 계열에서는 합성곱 층에도 붙이는 방식(4-1의 LoCon)이 화풍을 더 잘 담는다.
확인할 것
| 시험 | 통과 기준 |
|---|---|
| 데이터에 없던 대상 (동물, 건물) | 그 화풍으로 그려진다 |
| 강도 0.5, 1.0 | 강도에 따라 화풍이 약하게, 강하게 들어간다 |
| 캐릭터 LoRA와 함께 | 캐릭터는 유지되고 화풍만 바뀐다 |
| 데이터에 자주 나온 인물이 튀어나오나 | 나오지 않는다 |
실습 3: 개념 LoRA
목표: 기반 모델이 모르거나 서툰 개념 하나를 가르친다. 특정 자세, 특정 의상, 특정 소품, 특정 구도.
데이터
- 그 개념이 들어간 그림 20~100장.
- 개념은 모든 그림에 있고, 나머지는 전부 다르게. 인물, 화풍, 배경, 각도가 다양해야 개념만 분리된다.
캡션
- 개념에 트리거 단어를 붙인다.
- 그 개념을 이루는 세부는 적지 않는다. 트리거에 흡수시킨다.
- 나머지(인물의 특징, 배경, 화풍)는 전부 적는다.
확인할 것
| 시험 | 통과 기준 |
|---|---|
| 트리거 단어 + 데이터에 없던 인물 | 그 인물이 그 개념을 한다 |
| 캐릭터 LoRA와 함께 | 내 캐릭터에 그 개념이 적용된다 |
| 트리거 단어 없이 | 개념이 나타나지 않는다 |
| 화풍이 데이터 쪽으로 끌려가나 | 끌려가지 않는다 |
개념 LoRA는 5단계와 바로 이어진다. 학습 데이터에서 걸러져 모델이 모르는 개념을 가르치는 방법이 이것이다.
설정을 찾는 실험
같은 데이터로 설정만 바꿔 여러 번 학습해 본다. 이 실험을 한 번 해 두면 감이 생긴다.
| 학습률 낮음 | 학습률 기본 | 학습률 높음 | |
|---|---|---|---|
| 랭크 낮음 | |||
| 랭크 기본 | |||
| 랭크 높음 |
아홉 칸을 각각 학습하고, 같은 표본 프롬프트와 시드로 그림을 뽑아 표에 채운다. 어느 쪽으로 가면 미적합이고 어느 쪽으로 가면 과적합인지가 한눈에 보인다.
그래픽카드가 여러 장이면 칸마다 따로 돌린다. 한 장이면 며칠에 나눠 한다.
결과물 관리
LoRA 파일만 남기면 나중에 아무것도 알 수 없다. 함께 남긴다.
- 기반 모델의 이름과 판
- 트리거 단어
- 권장 강도
- 학습 설정 파일
- 데이터셋(그림과 캡션)
- 고른 시점과, 그 시점을 고른 이유
- 표본 그림
기반 모델이 바뀌면 LoRA를 다시 학습해야 한다. 데이터셋과 설정이 남아 있으면 다시 돌리기만 하면 된다. 데이터셋이 진짜 자산이다.
4단계에서 얻은 것
모델이 모르는 것을 가르칠 수 있게 됐다.
- 3단계: 모델이 아는 것을 통제한다.
- 4단계: 모델이 모르는 것을 가르친다.
둘을 합치면 "내 캐릭터가, 내가 원하는 화풍으로, 내가 지정한 자세로" 그려진다. 여기까지가 이미지다. 이 그림을 움직이는 것은 6단계에서 다룬다.
확인 문제
- 개념 LoRA의 데이터에서 "개념 외의 나머지를 전부 다르게" 해야 하는 이유는?
- 캐릭터 그림이 한 장뿐일 때 학습 데이터를 어떻게 만드나?
- LoRA 파일과 함께 데이터셋을 남겨야 하는 이유는?
풀이
- LoRA는 데이터 전체에 공통인 것을 배운다. 개념만 공통이어야 개념만 분리된다. 인물이나 화풍이 같으면 그것까지 함께 굳는다.
- 편집 모델로 여러 각도, 자세, 표정, 배경의 그림을 만든다. 얼굴이 흔들리거나 세부가 틀린 것을 버리고 잘 나온 것만 남긴다.
- 기반 모델이 바뀌면 LoRA를 다시 학습해야 하기 때문이다. 데이터셋과 설정이 있으면 다시 돌리기만 하면 된다.