LoRA 학습법 (Google Colab)

Google Colab에서 Stable Diffusion LoRA를 학습해봤습니다. 이미지 준비부터 학습 파일 생성까지의 흐름을 정리하되, 설정값을 복사하는 것보다 무엇을 바꾸고 어떻게 비교할지에 초점을 맞췄어요.

화면과 폴더 경로는 2023년 4월 당시 kohya-colab 노트북 기준입니다. 현재 저장소에는 XL용 노트북도 별도로 있으므로 사용하는 모델 계열과 노트북을 맞춰야 합니다. 이 글의 화면을 현재 셀 구성과 동일하다고 가정하지 마세요. 프로젝트 저장소

LoRA가 학습하는 것

LoRA(Low-Rank Adaptation)는 기존 가중치를 고정하고, 가중치의 변화량을 작은 두 행렬의 곱으로 표현해 학습하는 방법입니다. 전체 가중치를 다시 학습하는 것보다 학습 파라미터와 그에 필요한 메모리를 줄일 수 있어요. 완성된 LoRA 파일만으로 이미지를 만드는 것이 아니라 호환되는 기본 모델과 함께 사용합니다. LoRA 원 논문, Diffusers의 Stable Diffusion LoRA 설명

일반적인 LoRA 표현은 W = W₀ + (alpha / rank) × B × A입니다. W₀는 고정한 기존 가중치이고 A, B를 학습합니다. 실제 적용 대상과 배율 규칙은 구현에 따라 확인해야 하지만, rank는 변화량을 표현할 공간의 크기이고 alpha는 그 변화량에 적용하는 배율에 관계한다고 이해하면 출발하기 좋습니다.

시작 전에 목표와 비교 조건 정하기

이 예제에서는 Google Drive와 중복 없는 이미지 20장을 준비했습니다. 20장은 LoRA의 최소 요구 수량이 아니에요. 필요한 양과 구성은 특정 대상의 외형을 학습할지, 다양한 대상에 적용할 스타일을 학습할지에 따라 달라집니다.

예를 들어 자동차의 외형을 학습하려는데 모든 사진이 같은 각도와 배경이라면, 원하는 대상과 배경을 분리해서 학습했는지 확인하기 어렵습니다. 정면·측면·다른 배경처럼 목표를 검증할 수 있는 변화를 포함하고, 대상이 잘리거나 식별하기 어려운 사진은 먼저 점검하세요. 무조건 장수를 늘리기보다 비슷한 사진을 반복하는지 살펴보는 편이 좋습니다.

당시 사용한 아이오닉6 샘플 이미지는 예제 자료로 남겨둡니다. 학습에는 사용할 권한이 있는 자료를 준비하세요.

학습 전 다음을 기록해두면 결과를 비교할 수 있어요.

  • 기본 모델 이름과 버전, 사용하는 노트북의 커밋 또는 사본
  • 데이터 이미지와 캡션, 해상도와 자르기 방식
  • 비교에 사용할 프롬프트, seed, sampler, 생성 steps와 LoRA 적용 강도

아래 설정값은 시작 예시입니다. 이후 결과를 비교할 때는 한 번에 한 원인 후보를 바꾸는 것이 중요해요.

Data Maker: 이미지보다 캡션까지 준비하기

Data Maker를 열고 당시의 Setup 셀에 프로젝트명을 입력합니다.

Data Maker 프로젝트명 설정 당시 Setup 화면

Setup이 끝나면 생성된 Loras/{project_name}/dataset 폴더에 이미지를 업로드합니다. “Curate Your Images”에서는 중복과 저품질 이미지를 제거합니다. 직접 준비한 이미지가 있으므로 스크래핑 단계는 건너뛰어도 됩니다.

이미지 큐레이션 화면 중복과 학습 목적에 맞지 않는 이미지 확인

“Tag Your Images”에서는 당시 기준으로 실사 사진에 “Photo captions”, 애니메이션·일러스트에 “Anime tags”를 선택했습니다. 프로젝트는 사진 캡션 생성과 태그 생성 도구를 제공하지만, 자동 생성 결과가 정답인 것은 아닙니다. Dataset Maker의 기능 설명

자동 캡션과 태그 선택 화면 데이터 성격에 맞는 자동 생성 방식 선택

캡션을 만들고 나면 이미지와 짝지어진 텍스트를 직접 보세요. 대상의 이름이 일관적인지, 보이지 않는 특징이 적혀 있지는 않은지, 배경이나 시점을 잘못 설명하지는 않는지 확인합니다. 자동차 측면 사진이라면 a side view of a car on a road처럼 보이는 것을 설명한 캡션 예시를 기준으로 오인식을 찾을 수 있어요. 이는 당시 사용한 실제 캡션이 아닙니다.

데이터 준비가 끝나면 당시의 Ready 셀을 실행하고 LoRA Trainer로 이동합니다.

LoRA Trainer: 학습량과 표현력을 구분하기

기본 모델과 프로젝트 연결

Data Maker와 같은 프로젝트명을 입력합니다. 학습하려는 기본 모델과 추론에 사용할 모델이 호환되는지도 확인하세요. SD 1.x용 설정을 SDXL에 그대로 적용하는 방식으로 이해하면 안 됩니다.

LoRA Trainer 프로젝트 설정 같은 프로젝트의 데이터 연결

Repeats, epochs, batch size

num_repeats는 한 epoch에서 이미지를 반복해서 학습에 넣는 횟수입니다. 이미지가 늘어나는 것이 아니라 같은 이미지를 더 자주 보는 것이죠.

이미지 수 Repeats Epochs Batch size Optimizer steps
20 10 10 2 1,000
100 3 10 2 1,500
400 1 10 2 2,000

표는 단일 GPU, gradient accumulation 1, 배치에 나머지가 없다는 조건의 계산 예시입니다.

전체 steps = 이미지 수 × repeats × epochs ÷ batch size

해상도별 버킷과 마지막 배치 처리, gradient accumulation이 있으면 실제 optimizer step 수는 달라질 수 있어요. 공식으로 예상한 뒤 학습 로그의 실제 값을 확인해야 합니다. 이미지 수 × repeats를 200~400 정도로 두는 것은 이 예제의 출발점일 뿐, 모든 데이터의 최적값이 아닙니다.

반복 횟수를 늘리면 새로운 정보가 생기는 것은 아닙니다. 이미 있는 외형을 더 잘 반영할 수도 있지만 특정 배경이나 구도를 따라 하는 방향으로 치우칠 수도 있어요. 따라서 “더 오래 학습하면 더 좋다”는 가정은 결과 비교로 확인해야 합니다.

Rank와 alpha

파라미터 설정 예시 바꿀 때 확인할 점
network_dim 32 LoRA rank. 늘리면 학습 파라미터와 파일 크기도 증가. 높은 값이 좋은 결과를 보장하지 않음
network_alpha 16 일반적인 LoRA의 alpha / rank 배율과 관련. optimizer learning rate 자체가 아님
Learning rate 선택한 노트북의 기본값에서 시작 데이터와 학습 대상에 맞춰 비교. rank·steps와 동시에 바꾸면 원인 분리가 어려움

위의 32와 16은 설명용 조합이며 재현 실험으로 찾은 최적값은 아닙니다. 학습할 행렬만 optimizer에 전달하고 learning rate를 별도로 설정하는 구조는 Diffusers LoRA 학습 코드 설명에서 확인할 수 있습니다.

network_dim과 network_alpha 설정 당시 Structure 설정 화면

당시에는 이미지 20장으로 약 30분이 걸렸습니다. GPU, 해상도와 전체 학습 옵션이 고정된 벤치마크는 아니므로 예상 소요 시간의 보장값으로 쓰기는 어렵습니다.

결과는 마지막 파일부터 고르지 않기

학습이 끝나면 프로젝트의 output 폴더에 결과 파일이 생깁니다.

epoch별 LoRA 결과 파일 여러 시점에 저장된 LoRA 파일

같은 기본 모델·프롬프트·seed·생성 설정에서 LoRA를 끈 결과와 켠 결과를 먼저 비교하세요. 이후 여러 epoch의 결과를 비교합니다. 하나의 seed에만 잘 맞는 결과를 고르지 않도록 여러 seed에서도 확인하되, 각 후보에는 같은 seed 묶음을 사용하면 됩니다.

관찰 원인 후보 다음에 해볼 비교
대상 특징이 거의 나타나지 않음 호환성·적용 문제, 부족한 학습, 부정확한 캡션 로딩 여부와 기본 모델을 먼저 확인한 뒤 적용 강도 또는 학습량 하나를 변경
배경·구도가 학습 사진과 지나치게 비슷함 데이터 편향 또는 과적합 가능성 더 이른 epoch, 다른 배경의 프롬프트, 데이터 다양성 비교
형태가 무너지거나 질감이 과함 과한 적용 강도, 학습량·학습률 문제 등 추론 강도를 먼저 낮춰보고 여전히 같으면 학습 설정을 한 가지씩 비교
학습 중 메모리 부족 해상도·배치·학습 대상 등 로그를 확인하고 batch size 등을 조정. batch 변경 후 steps도 재확인

표는 진단 가설이며 증상 하나로 원인을 확정하는 규칙은 아닙니다. 학습 loss가 낮아지는 것과 원하는 이미지를 잘 만드는 것도 같은 지표가 아니므로 실제 생성 결과로 선택해야 합니다.

학습한 LoRA로 생성한 자동차 예시 당시 학습 결과. 다른 설정과 통제 비교한 벤치마크는 아님

LoRA 실험에서 남겨야 할 것은 잘 나온 이미지뿐 아니라 그 결과를 만든 데이터·설정과 무엇을 비교했는지입니다. 그래야 다음 실험이 무작정 재학습하는 일이 아니라 원인 후보를 하나씩 줄이는 과정이 됩니다.