VLA 인 GR00T N1.5를 파인튜닝하다가 GPU OOM이 떴다. RTX4090으로 돌리는 학습을 돌리는데, 학습을 돌리기만 하면 VRAM이 터지고, 배치 줄이고 시퀀스 줄이고 이것저것 깎아도 한계가 있었다. “모델을 조금만 학습시키는 방법이 없나?”를 찾기 시작했고, 그 과정에서 LoRA를 처음 제대로 알게 됐다.
이 글은 “왜 LoRA가 필요했는지”에서 시작해서, LoRA를 이해하기 위한 전 단계인 Adapter를 먼저 짚고, 마지막에 S-LoRA는 “서빙 관점”에서 아주 짧게 정리한다.
1) LoRA를 알게 된 계기: GR00T N1.5 파인튜닝 OOM
VLA 계열 모델(특히 VLM + action head 조합)은 덩치가 크다. 학습 과정에서 메모리를 잡아먹는 요소는 단순히 모델 파라미터 만이 아니다.
- 학습 중간에 필요한 activation(중간 결과)
- 역전파를 위한 gradient 메모리
- 옵티마이저 상태(Adam이면 특히 큼)
- 긴 시퀀스 / 큰 이미지 토큰 / 큰 배치가 만드는 누적 비용
결국 “모델 전체를 업데이트하는 방식”을 그대로 쓰면, VRAM이 빠르게 한계에 도달한다. 여기서 자연스럽게 나오는 질문이 하나 있다.
“모델 전체를 다 학습하지 말고, 필요한 부분만 가볍게 학습하면 안 되나?”
이 질문이 바로 PEFT(파라미터 효율 미세조정) 계열 기법들의 출발점이고, 그 대표가 Adapter와 LoRA다.
2) LoRA 이전의 해법: Adapter란 무엇인가
Adapter는 이름 그대로 “끼워 넣는 작은 모듈” 이다.
핵심 아이디어
- 큰 프리트레인 모델은 그대로 둔다(대부분 동결).
- 대신 Transformer 블록 중간중간에 작은 네트워크(MLP 구조) 를 추가한다.
- 학습은 그 어댑터만 한다.
즉, 작업/도메인에 맞게 바뀌어야 하는 부분을 전체 모델이 아니라 작은 플러그인으로 처리하는 방식이다.
왜 이게 이득인가
- 업데이트해야 할 파라미터 수가 확 줄어든다.
- 작업별로 저장해야 하는 것도 모델 전체가 아니라 어댑터만 이라 가볍다.
- 여러 작업을 운영할 때 베이스 모델 하나 + 여러 어댑터로 조합이 가능하다.
그런데 단점이 있다: 추론 속도/최적화 관점
Adapter는 구조적으로 새 레이어가 늘어나는 방식이다.
작은 MLP 하나가 레이어마다 추가되는 셈이라, 추론 단계에서:
- 계산이 추가되고
- GPU 커널 호출이 늘거나
- 기존에 잘 최적화된 연산 흐름을 깨는 경우가 생긴다
그래서 “Adapter는 유용하지만, 서빙/추론 효율 면에서 더 깔끔한 방식이 없나?”라는 흐름에서 LoRA가 주목받는다.
3) LoRA는 무엇인가
LoRA는 “새 레이어를 끼워 넣는” 방식이 아니다.
대신 기존 레이어의 가중치 업데이트를 아주 작은 형태로만 허용한다.

기존에 W 전체를 파인튜닝하던 방식과 다르게 LoRA에선 파라미터 수가 훨씬 작아진 A와 B만 학습시킨다.
“Pretrained 가중치는 고정하고, 업데이트는 저랭크(low-rank) 형태로만 학습한다.”
Transformer 안에는 큰 선형층들이 많다. (어텐션의 Q/K/V/O 같은 것들)
풀 파인튜닝은 그 큰 행렬들을 전부 업데이트한다. LoRA는 이걸 이렇게 바꾼다:
- 큰 가중치 행렬은 그대로 둔다(동결).
- 대신 “보정값”만 학습한다.
- 그 보정값을 작은 두 행렬의 곱 형태로 제한한다.
이렇게 한다면 학습해야 하는 파라미터 수가 대폭 줄고, 옵티마이저 상태/그래디언트 메모리도 줄고, OOM이 나던 설정이 “돌아갈 가능성”이 확 올라간다.
LoRA를 구현할 때 보통 이런 형태로 표현된다:
- 메인 경로: 기존 가중치로 계산
- 보조 경로: LoRA 보정값으로 계산
- 둘을 더해서 출력
그래서 그림으로 보면 “기존 데이터 흐름 옆에 가지가 하나 생긴 것”처럼 보인다.
다만 중요한 차이는 이거다.
- Adapter의 우회로는 새 네트워크(작은 MLP 블록) 를 추가한 것
- LoRA의 우회로는 기존 선형층 가중치의 보정값(ΔW) 을 추가한 것
겉으로는 둘 다 “옆 가지”인데, Adapter는 모듈을 추가하는 방식이고 LoRA는 가중치 업데이트를 표현하는 방식이다.
LoRA가 추론에서 유리한 이유
LoRA는 상황에 따라 병합(merge) 이 가능하다.
- 추론 전에 보정값을 기존 가중치에 합쳐서 하나로 만들어두면
- 실행할 때는 “원래 모델과 똑같이” 한 번의 선형층 연산만 하면 된다
즉, Adapter처럼 “추론 때 매번 추가 모듈을 통과”하는 구조적 부담을 줄일 수 있다.
(물론 실시간으로 여러 어댑터를 바꿔 끼우는 서빙에서는 병합이 항상 정답은 아니다. 이 얘기가 S-LoRA로 이어진다.)
4) 그래서 S-LoRA는 뭐냐: “학습”이 아니라 “서빙” 이야기
여기서부터는 결이 다르다.
LoRA는 “학습을 가볍게 하는 방법”이고,
S-LoRA는 “학습된 LoRA 어댑터를 엄청 많이 동시에 서비스하려면 어떻게 하냐”에 대한 답이다.
S-LoRA를 아주 짧게 요약하면
“수천 개의 LoRA 어댑터를 요청마다 빠르게 적용하면서도, 배칭 효율과 메모리 효율을 유지하는 서빙 시스템” 이다.
현실 서비스에서는 사용자/테넌트/업무별로 LoRA가 수백~수천 개 생길 수 있다.
그때 문제는:
- 요청마다 다른 LoRA를 GPU에 올렸다 내렸다 해야 하고
- 그 과정에서 메모리 단편화/로딩 지연이 생기고
- 서로 다른 LoRA가 섞이면 배칭이 깨져 처리량이 떨어진다
S-LoRA는 이 갈아끼우기를 잘 하려고,
- 메모리(특히 KV cache와 LoRA 가중치)를 페이지 단위로 관리하고
- 필요한 LoRA를 미리 가져오고
- 서로 다른 LoRA가 섞여도 효율이 나도록 커널/배칭을 최적화한다
요약하면, LoRA를 ‘많이, 동시에, 빠르게’ 쓰기 위한 런타임이다.
GR00T N1.5 같은 VLA 모델을 만지다 보면 “성능 개선” 이전에 “일단 학습이 돌아가야” 한다.
OOM을 겪는 순간, LoRA는 단순한 유행이 아니라 훈련을 가능하게 만드는 실용적인 선택지가 된다.
GR00T N1.5를 파인튜닝할 때 --lora-rank 32 --lora-alpha 64 --lora-dropout 0.1 조합으로 OOM을 피하면서 학습을 실제로 성공시켰다. 이제 이 옵션들이 정확히 무엇을 의미하는지 정리해본다.
1) --lora-rank 32 : LoRA 보정의 용량
LoRA는 기존 선형층의 가중치를 통째로 학습하지 않고, 저차원(rank) 보정만 학습한다.
이때 rank는 그 보정이 가질 수 있는 “자유도”를 결정한다.
- rank가 클수록: 더 다양한 방향으로 가중치를 보정할 수 있어서 성능이 올라갈 가능성이 커진다.
- rank가 작을수록: 학습 파라미터가 줄어들고 메모리/연산이 가벼워져서 안정적으로 돌아갈 가능성이 커진다.
LoRA 논문에선 최소 8을 권장하고 최대 128까지도 사용한다.
2) --lora-alpha 64 : LoRA 보정의 세기
LoRA는 보정값을 그대로 더하지 않고, 보통 스케일링해서 더한다.
alpha는 그 스케일을 정하는 하이퍼파라미터다.
- alpha가 클수록: LoRA 보정이 더 강하게 반영된다. (학습이 더 적극적으로 바뀌는 느낌)
- alpha가 작을수록: 보정이 약하게 들어가서 더 보수적으로 변한다.
실무적으로는 alpha를 rank와 같이 본다. 많은 구현에서 LoRA 보정은 대략:
- “alpha / rank” 비율로 스케일되는 형태가 흔하다.
그래서 rank=32, alpha=64면:
- 비율이 2 정도라서 “보정이 너무 미약하지 않게” 힘을 실어주는 세팅이라고 볼 수 있다.
보통 alpha를 rank와 비슷하거나 조금 더 크게 설정한다.
3) --lora-dropout 0.1 : LoRA 경로에만 거는 정규화
lora-dropout은 말 그대로 LoRA 보정 경로에만 dropout을 적용하는 옵션이다.
- base 모델의 원래 경로는 그대로 두고,
- LoRA로 추가된 보정 경로만 랜덤하게 일부를 꺼서 학습한다.
효과는 전형적인 dropout과 비슷하다.
이렇게하면 LoRA로 학습이 가능하다.
'로보틱스' 카테고리의 다른 글
| Sharpa CraftNet / Genesis GENE-26.5 (0) | 2026.06.30 |
|---|---|
| RLDX-1 정리 (0) | 2026.06.30 |
| [논문리뷰] Alpamayo-R1: Bridging Reasoning and Action Predictionfor Generalizable Autonomous Driving in the Long Tail (1) | 2026.01.15 |
| [논문리뷰] RT-2: Vision-Language-Action Models TransferWeb Knowledge to Robotic Control (0) | 2026.01.14 |
| 자율주행 로봇 기초 (0) | 2025.12.23 |