8시간의 긴 기다림 끝에 드디어 학습이 완료되었습니다.
DGX Spark(ARM 기반)에서 FLUX 1-dev 12B 모델을 파인튜닝한 결과, 과연 90W의 저전력으로 빚어낸 결과물은 어땠을까요?
오늘은 250, 500, 750, 1000 스텝별로 생성된 LoRA 어댑터를 비교 분석하고, 제가 발견한 '학습의 허니스팟(Honey Spot)' 에 대해 이야기해 보려 합니다.
1. 테스트 환경 및 조건
-
Base Model: FLUX 1-dev (12B)
-
Dataset: 인물 실사 이미지 40장 (1024x1024)
-
Sampler: dpmpp_2m, euler
-
Hardware: DGX Spark (120GB Unified Memory)
-
LoRA Checkpoints: 250, 500, 750, 1000 Step
2. 스텝별 결과 비교 (The Battle of Steps)
학습된 인물이 등장하는 실사 이미지를 생성하며 정합성을 테스트했습니다.
🥉 Step 250: "너... 누구니?" (Underfitting)
-
결과: 학습 대상과 분위기는 비슷하지만, "동일 인물인가?"라고 묻는다면 고개를 갸웃하게 됩니다. 이목구비의 미묘한 디테일이 부족합니다.
-
속도: 생성 속도는 가장 빨랐지만(100초 미만), 원하는 퀄리티는 아니었습니다.
-
진단: 과소적합(Underfitting). 모델이 아직 데이터의 특징을 충분히 흡수하지 못한 단계입니다.
🥈 Step 500: "어! 너구나!" (Good Fit)
-
결과: 누가 봐도 학습된 그 인물입니다. 드디어 LoRA가 제대로 작동한다는 느낌을 받았습니다.
-
특이점: 가끔 표정을 다양하게 시키면 다른 사람처럼 보일 때가 있지만, 전반적으로 훌륭한 정합성을 보입니다.
-
진단: 적정 학습 구간 진입. 40매 데이터 기준으로 이 지점부터 실사용이 가능해 보입니다.
🥇 Step 750: "안정감의 미학" (Stable)
-
결과: 500 스텝과 큰 차이는 없지만, 좀 더 안정적인 느낌입니다. 다양한 포즈에서도 인물 특성이 잘 유지됩니다.
-
진단: 500 스텝의 연장선상에 있으며, 굳이 따지자면 '숙성된' 느낌입니다.
🏅 Step 1000: "완벽하지만... 너무 완벽해서 탈" (Overfitting Risk)
-
결과: 정합성 100%. 블라인드 테스트를 해도 원본과 구별하기 힘들 정도로 자연스럽습니다.
-
문제점: 학습 데이터에 없던 '화난 표정', '섹시한 표정' 등을 요구하면 인물 정합성이 깨지는 현상이 발생합니다.
-
진단: 과적합(Overfitting)의 경계. 모델이 학습 데이터("이 사람의 이 표정")를 너무 달달 외워버려서, 응용력(Generalization)이 떨어지기 시작했습니다.
3. 기술적 미스터리와 분석
테스트 과정에서 두 가지 흥미로운(혹은 당황스러운) 기술적 이슈를 발견했습니다.
1) LoRA 파일이 5GB?
생성된 4개의 LoRA 파일 용량이 모두 5GB로 동일했습니다. 보통 LoRA 어댑터는 수십 MB에서 수백 MB 수준이어야 정상입니다.
분석:
처음에는 “옵티마이저 상태나 텍스트 인코더 전체가 같이 저장된 건가?” 의심했지만,
FLUX 12B 규모에 rank 256 LoRA를 전 레이어에 붙이면, LoRA 자체 파라미터 수가 몇 GB까지 커질 수 있을 것입니다.
즉, SD1.5 기준으로 ‘LoRA는 수십~수백 MB’라는 감각을 그대로 적용하면 안 되고,
대형 모델에서는 LoRA의 rank와 적용 범위가 곧 용량과 직결된다는 점을 체감하게 되었습니다.
다음 번에는 network_dim을 64~128 수준으로 낮춰, 용량과 성능 밸런스를 다시 잡아볼 예정입니다.
2) 생성 속도 저하 (97~130초)
LoRA 적용 전보다 생성 시간이 늘어났습니다.
분석:
-
구조적 원인: LoRA는 기본 가중치($W$)에 학습된 가중치($B \times A$)를 더해서 연산하므로 계산량이 늘어납니다.
-
병목 현상: 학습 스크립트 설계상, T5XXL 텍스트 인코더는 캐싱 후 CPU로 내리는 구조이기 때문에,
추론 파이프라인에서도 비슷한 경로로 CPU↔GPU 왕복이 발생했을 가능성을 의심하고 있습니다.
다만 이 부분은 아직 코드 레벨로 완전히 확인하지 못했기 때문에, 다음 실험에서는 -
TE를 모두 CUDA에 강제 배치했을 때
- 캐시 전략을 바꿨을 때
생성 속도와 품질이 어떻게 달라지는지 비교해볼 계획입니다.
4. 결론: '허니스팟(Honey Spot)'을 찾아서
이번 8시간의 대장정을 통해 얻은 결론은 명확합니다. "무조건 많이 학습시킨다고 좋은 것은 아니다."
-
최적의 구간: 40매 데이터셋 기준, 400~600 스텝 사이가 '가성비'와 '퀄리티'를 모두 잡는 허니스팟으로 보입니다. 1000 스텝은 시간 낭비일 뿐만 아니라 유연성을 해칠 수 있습니다.
-
데이터의 중요성: 특정 표정만 학습하면 그 표정밖에 못 짓는 '표정 로봇'이 됩니다. 데이터셋 구성 시 다양한 각도와 표정을 넣는 것이 스텝 수를 늘리는 것보다 훨씬 중요합니다.
-
DGX Spark의 가능성: 비록 8시간이 걸렸고 세팅 이슈가 있었지만, 90W 전력으로 12B 모델을 파인튜닝해냈다는 사실 자체가 고무적입니다.
물론 이 허니스팟(400~600 스텝 구간)은
“40장 데이터 / FLUX 1-dev / 이 LoRA 설정” 이라는 꽤 특정한 조건에서 나온 결과입니다.
다만 이 경험을 바탕으로,
- 데이터 수에 비례해서 적당한 step 범위를 먼저 탐색하고
- 그 안에서 세밀하게 잘라 저장하면서 최적의 지점을 찾는 방법으로 접근해야한다는 것을 느꼈습니다.
5. Next Step
다음 실험의 목표는 명확해졌습니다.
-
최적화: 텍스트 인코더(TE)를 모두 CUDA에 강제 할당할지, 이것은 FLUX LoRA 스크립트의 설계(큰 T5XXL을 캐시 후 CPU로 내려 VRAM 절약) 의도인지 깊게 파헤쳐보기
-
LoRA 다이어트:
network_dim256 → 128 → 64로 줄였을 때 용량/퀄리티/정합성 비교하기 -
정밀 타격: 1000 스텝까지 가지 않고, 400~600 스텝 구간을 세밀하게 쪼개서(Save every 50 steps) 최고의 모델을 찾아내기
-
학습 데이터셋에 캡션 도입 :
- 지금과 동일 인물 40장, 캡션 추가 vs 없는 경우 비교
- “표정/포즈 다양성 vs 과적합” 관점에서 분석
저전력 고효율 AI 연구는 계속됩니다. 다음 포스팅에서는 다이어트에 성공한 LoRA와 함께 돌아오겠습니다!
댓글이 없습니다.