Table of Contents
이미지 생성 모델을 쓰다 보니 마음에 드는 그림체를 따로 학습시켜보고 싶어졌다. 인물이나 배경을 바꿔도 선이나 색감이 비슷하게 나올까 궁금해서 이미지를 직접 골라 FLUX.2 klein에 LoRA를 학습시켜 봤다.
LoRA와 학습 방식
LoRA는 기존 모델에 추가로 학습한 가중치를 붙여 쓰는 방식이다. 이번에는 Runware에서 제공하는 학습 API를 사용했다. 이미지와 설명을 묶어서 올리고 학습이 끝나면 생성할 때 붙여 쓰는 식이다. GPU 환경을 따로 구성할 필요는 없었다.
Runware의 스타일 LoRA 소개 글에 데이터 준비부터 학습과 생성까지 설명돼 있다. klein 4B·9B도 지원 모델에 포함된다. 호랑이가 학습 단계에 따라 종이공예 스타일로 바뀌는 예시도 있는데 여기에 쓴 모델은 Qwen-Image다. 아래는 내가 klein으로 뽑은 결과다.
47장으로 시작한 첫 학습
처음에는 47장으로 시작했다. 생성해둔 이미지 중에서 원하는 그림체에 가까운 것들을 골랐는데 인물만 있으면 배경이나 효과는 어떻게 나올지 알기 어려워서 이쪽도 같이 넣었다. 이미지마다 무엇을 그린 건지 설명하는 캡션을 붙이고 공통 트리거 단어를 추가했다.
먼저 klein 4B를 1,000스텝 학습했다. 비용은 $3.50이었다. 학습 전후를 비교하려고 같은 프롬프트와 시드로 각각 이미지를 뽑았다. 인물과 배경, 동작과 효과가 있는 네 장면을 비교했다. 여기서는 과일을 주고받는 인물과 눈 내리는 집 배경을 골라봤다.
막상 결과를 보니 처음에는 차이를 잘 모르겠었다. 선이나 얼굴이 달라지기는 했지만 내가 고른 그림체가 학습됐다고 보기에는 애매했다. 노인을 그려달라고 했는데 너무 어려 보이기도 하고, 한 장면 안에 여러 컷이나 글자가 들어가기도 했다.
| 4B · LoRA 없음 | 4B · 47장 / 1,000스텝 |
|---|---|
![]() | ![]() |
같은 프롬프트·시드로 생성한 4B 결과. 얼굴과 채색은 바뀌었지만 컷 분할과 원치 않는 글자는 양쪽 모두 남았다. 이미지를 누르면 원본을 볼 수 있다.
그래서 같은 47장으로 9B도 학습해봤다. 학습률은 0.00005, 스텝은 1,000으로 같게 두었고 비용은 $3.01이었다. 이쪽은 그림체가 조금 반영된 것 같았다. 더 학습하면 어떨까 싶어서 기존 결과에 500스텝을 추가했다.
1,500스텝에서는 이전보다 학습한 느낌이 났다. 다만 손이 이상한 건 여전했다. 두 명을 요청했는데 세 명이 나오기도 했다. 그림체는 조금씩 마음에 들었지만 요청한 장면이 제대로 나오는 건 또 다른 문제였다.
| 9B · LoRA 없음 | 9B · 47장 / 1,500스텝 |
|---|---|
![]() | ![]() |
같은 프롬프트·시드의 9B 결과. 오른쪽은 선과 얼굴 표현이 바뀌었지만 인물이 셋으로 늘었다.
4B와 9B 사이에는 단일 컷을 요청하는 프롬프트도 수정했다. 그래서 두 모델의 성능 비교보다는 각 모델 안에서 학습 전후가 어떻게 달라지는지를 봤다.
데이터를 168장으로 늘리기
다음에는 데이터를 늘려보기로 했다. 비슷한 인물만 반복되지 않도록 성별이나 나이, 체형을 바꾸고 실내외 배경과 손으로 소품을 사용하는 장면도 보충했다.
그런데 새로 만든 그림들을 기존 이미지 옆에 놓고 보니 그림체가 다른 것들이 꽤 있었다. 인물은 괜찮은데 배경의 나뭇결이나 바닥 묘사가 너무 자세하거나, 손이 짧고 둥글어서 아이 손처럼 보이는 경우가 있었다. 두 손이 양쪽에서 들어오는데 누구의 손인지 알아보기 어려운 그림도 있었다. 이런 것들을 다시 고르고 수정하면서 최종적으로 168장을 모았다.
Runware는 데이터 구성 안내에서 화풍은 같게 두되 대상과 구도는 다양하게 하고 비슷한 이미지의 반복은 피하라고 설명한다. 잘 고른 20~30장으로도 시작할 만하다고 한다. 나는 여러 종류를 보충하다 보니 168장이 됐지만 이만큼 모아야 학습되는 건 아니다.
학습 파일을 준비하다가 캡션에서도 문제가 나왔다. 40장의 캡션에 그림 설명 대신 파일 이름이 들어 있었다. 이미지와 캡션 파일은 짝이 맞았는데 정작 내용이 잘못돼 있었다.
이 40장은 그림을 보고 캡션을 다시 썼다. 다른 37장에 섞여 있던 선이나 채색 방식에 대한 설명도 정리했다. 옷 색이나 자세, 표정처럼 그림에 있는 내용을 남기고 화풍을 설명하는 문장은 덜어냈다. 데이터도 함께 바뀌어서 캡션을 고친 효과만 따로 확인하지는 못했다.
Runware의 캡션 안내도 화풍 자체보다 대상·장면·구도·조명을 설명하는 쪽이다. BFL이 Hugging Face에 올린 klein LoRA 학습 가이드에도 같은 방향의 설명이 있다. 옷 색이나 자세는 프롬프트로 바꾸고 공통 그림체는 학습시키려는 방식이다.
스텝을 나눠 이어 학습하기
168장으로는 새로 학습을 시작했다. 1,000스텝 결과를 보고 500스텝씩 두 번 더 돌려서 2,000스텝까지 갔다. 중간 결과도 남겨두고 같은 장면을 뽑아 비교했다.
이어 학습은 Runware 글의 Continue training에 설명돼 있다. 이때 지정하는 스텝은 누적 목표가 아니라 추가 학습량이다. 1,000스텝 결과에서 1,500스텝까지 가려면 500을 더 학습하는 식이다.
| 누적 학습 스텝 | 추가 학습량 | 학습비 |
|---|---|---|
| 1,000 | 1,000스텝 | $3.01 |
| 1,500 | 500스텝 | $1.505 |
| 2,000 | 500스텝 | $1.505 |
학습비는 합쳐서 $6.02, 비교 이미지 12장까지 포함하면 $6.0668이었다. 2026년 10월 실행 당시 API에 기록된 금액이고 앞선 47장 실험과 학습용 이미지 제작비는 빠져 있다. 학습용 이미지를 만든 도구에서는 비용을 알려주지 않아 전체 비용까지 계산하지는 못했다.
인물과 배경 비교
이미지를 생성할 때는 프롬프트와 시드를 고정했다. 해상도는 1024×1536, 추론은 4스텝, CFG는 3.5, LoRA 강도는 1.0이었다. 참조 이미지 없이 LoRA만 붙였다.
사람이 과일을 건네는 장면에서는 차이가 보였다. 47장으로 학습했을 때는 인물이 셋으로 늘고 누가 누구에게 건네는지도 모호했는데 168장에서는 요청한 두 사람의 구도가 나왔다. 1,500·2,000스텝에서는 손 동작과 노인의 표정도 더 안정적으로 보였다.
| 168장 · 1,000스텝 | 168장 · 1,500스텝 | 168장 · 2,000스텝 |
|---|---|---|
![]() | ![]() | ![]() |
같은 프롬프트·시드로 비교했다. 가운데 1,500스텝에서는 과일을 주고받는 손이 비교적 단순하게 표현됐다. 2,000스텝에서도 손이 완벽해진 것은 아니다.
배경도 비교해봤다. 눈 내리는 마당과 문 안쪽의 불빛을 요청한 장면이다. 학습 전에는 화면 전체에 잔질감이 깔려 있었는데 47장·1,500스텝에서는 벽과 눈밭이 좀 더 단순한 면으로 표현됐다. 지붕과 기둥을 그리는 선도 달라졌다.
| 9B · LoRA 없음 | 9B · 47장 / 1,500스텝 |
|---|---|
![]() | ![]() |
같은 프롬프트·시드의 집 배경. 벽과 눈밭의 질감, 기와와 기둥의 선을 비교해볼 수 있다. 색감과 함께 건물 배치도 달라졌다.
168장으로 학습한 배경은 단계별 차이가 인물보다 작았다. 눈과 불빛, 빈 마당은 유지됐지만 지붕의 높이나 문 주변 구조가 조금씩 달라졌다. 1,500스텝에서는 요청하지 않은 현판 글씨가 생겼다가 2,000스텝에서는 없어졌다.
| 168장 · 1,000스텝 | 168장 · 1,500스텝 | 168장 · 2,000스텝 |
|---|---|---|
![]() | ![]() | ![]() |
같은 프롬프트·시드로 생성한 배경 세 장. 가운데 결과에는 문 위에 글씨가 생겼다. 더 학습한다고 요청한 내용까지 계속 좋아지는 건 아니었다.
정리
내가 보기에는 1,000에서 1,500스텝으로 갔을 때 변화가 더 컸고 2,000스텝에서는 차이가 작았다. 그렇다고 1,500스텝이면 충분하다고 말하기는 어렵다. 네 장면을 시드 하나씩 놓고 본 결과이고 학습에 쓴 이미지와 비슷한 상황도 있었다. 학습용과 평가용 데이터를 따로 나누지도 않았다.
BFL의 학습 가이드도 마지막 체크포인트를 그대로 쓰기보다 중간 샘플을 보고 결과가 좋은 것을 고르라고 권한다. 내 비교에서도 과일을 건네는 손은 1,500스텝 쪽이 더 단순하게 나왔다. 최종 스텝 하나만 남겼다면 이런 차이는 놓쳤을 것 같다.
처음 궁금했던 그림체 학습은 어느 정도 됐다고 느꼈다. 4B에서는 잘 모르겠던 차이가 9B를 더 학습하면서 보였고 데이터를 보충한 뒤에는 요청한 장면에 가까워진 그림도 나왔다. 손이나 원치 않는 글씨는 여전히 걸리지만 선과 채색이 달라지는 건 확인할 수 있었다.
다음에는 이미지를 더 늘리기보다 같은 장면에서 시드를 바꿔보고, 집이나 실내 배경에서도 이 느낌이 유지되는지 확인해보려고 한다. 이번에 반복해서 틀린 부분도 그때 같이 살펴볼 생각이다.
이미지 모델 학습이 궁금하다면 마음에 드는 그림체의 이미지를 몇 장 골라서 이렇게 한번 돌려봐도 좋을 것 같다. GPU 환경을 직접 구성하지 않아도 돼서 학습 전후가 얼마나 달라지는지 확인해보기에는 부담이 크지 않았다. Runware의 스타일 LoRA 소개 글에 준비 과정이 나와 있으니 시작할 때 참고하면 된다. 직접 GPU에서 돌려보고 싶다면 BFL의 klein LoRA 가이드도 참고해보면 도움이 될 것 같다.
- #flux
- #klein
- #lora
- #image-generation
- #runware











