본문 바로가기

SmolVLA 파인튜닝, GPU 메모리는 얼마나 필요할까: 단일 GPU VRAM 계산법

450M 파라미터 SmolVLA를 파인튜닝할 때 가중치·그래디언트·옵티마이저 상태·활성화 메모리를 나눠 계산하고, 기본 설정(행동 전문가만 학습)과 전체 학습의 차이, 24GB·48GB 카드에서 배치 크기를 정하는 방법을 정리합니다.

목차

핵심 요약

  1. SmolVLA 논문 기준 모델은 450M 파라미터이고, 그중 약 100M이 행동 전문가(action expert)다. 모델 카드는 0.5B로 반올림해 표기한다.
  2. LeRobot 기본값은 freeze_vision_encoder와 train_expert_only가 모두 True라서, 기본 파인튜닝에서 옵티마이저 상태가 붙는 파라미터는 전체의 일부다.
  3. Adam 계열 학습은 학습되는 파라미터 1개당 약 16바이트(ZeRO 논문의 혼합 정밀도 Adam 기준)가 필요하므로, 고정항은 기본 설정 약 3.0GB, 전체 학습 약 7.2GB로 추정된다.
  4. 배치 크기를 정하는 변수는 활성화 메모리이며, 배치 1·2·4로 짧게 학습해 최고 메모리를 재고 직선으로 외삽하면 카드에 맞는 최대 배치를 계산할 수 있다.
  5. 추론은 별개 계산이다. 기본 청크 50스텝을 30Hz로 실행하면 다음 청크까지 약 1.67초가 주어진다.

SmolVLA는 논문 초록에서 “단일 GPU에서 학습하고 소비자용 GPU나 CPU에서도 배포"할 수 있게 설계했다고 소개하는 VLA입니다. 그렇다고 아무 GPU에서나 공식 예시 설정 그대로 학습이 되는 것은 아닙니다. 이 글은 SmolVLA 파인튜닝에 필요한 GPU 메모리를 가중치, 그래디언트, 옵티마이저 상태, 활성화로 나눠 계산하고, 자신의 카드에서 배치 크기를 정하는 방법을 정리합니다. 수치는 논문·모델 카드·LeRobot 설정 파일에서 확인한 값과 그 값으로 계산한 추정치이며, 추정에는 가정을 함께 적었습니다.

모델을 아직 고르지 않았다면 ACT·Diffusion Policy·SmolVLA 선택 기준에서 데이터 규모별로 어떤 모델이 맞는지 먼저 볼 수 있습니다.

SmolVLA의 450M은 어디에 쓰이나

SmolVLA 논문에 따르면 주 모델은 450M 파라미터이고, 그중 약 100M이 행동 청크를 만드는 행동 전문가에 할당됩니다. 나머지는 SmolVLM-2 기반 VLM입니다. 논문은 VLM 언어 모델의 앞쪽 16개 층만 쓰고, 프레임당 시각 토큰을 64개로 제한한다고 설명합니다. 모델 카드는 같은 모델을 0.5B로 반올림해 표기합니다.

학습 메모리를 계산할 때 중요한 것은 전체 크기가 아니라 어떤 파라미터가 학습되는가입니다. configuration_smolvla.py의 기본값은 다음과 같습니다.

설정기본값메모리에 미치는 영향
freeze_vision_encoderTrue비전 인코더 가중치는 고정, 그래디언트·옵티마이저 상태 없음
train_expert_onlyTrueVLM을 고정하고 행동 전문가 쪽만 학습
train_state_projTrue로봇 상태 투영층은 학습
chunk_size / n_action_steps50 / 50행동 전문가가 처리하는 토큰 수
resize_imgs_with_padding(512, 512)이미지 입력 해상도
tokenizer_max_length48언어 지시 토큰 상한

즉 기본 설정의 파인튜닝은 450M 전체가 아니라 행동 전문가 약 100M과 상태 투영층 정도가 학습 대상입니다.

학습 메모리를 네 부분으로 나눠 계산하기

학습 중 GPU 메모리는 다음 네 항의 합으로 볼 수 있습니다.

Mtrain≈Pfrozen⋅bw⏟고정 가중치+Ptrain⋅16⏟학습 파라미터 상태+Mact(B)+Moverhead M_{train} \approx \underbrace{P_{frozen} \cdot b_w}_{\text{고정 가중치}} + \underbrace{P_{train} \cdot 16}_{\text{학습 파라미터 상태}} + M_{act}(B) + M_{overhead}
  • Pfrozen P_{frozen} : 고정된 파라미터 수, bw b_w : 그 가중치의 바이트 수(FP32 4, BF16 2)
  • Ptrain P_{train} : 학습되는 파라미터 수
  • Mact(B) M_{act}(B) : 배치 크기 B B 에 비례해 늘어나는 활성화 메모리
  • Moverhead M_{overhead} : CUDA 컨텍스트, 캐시 할당자 예약분

학습 파라미터 1개당 16바이트는 ZeRO 논문이 혼합 정밀도 Adam에 대해 정리한 값입니다. FP16 가중치 2바이트, FP16 그래디언트 2바이트, FP32 가중치 사본·모멘텀·분산 12바이트를 합한 것입니다. 전부 FP32로 학습해도 가중치 4 + 그래디언트 4 + 모멘텀·분산 8로 같은 16바이트가 됩니다. SmolVLA 설정 파일의 옵티마이저 기본값(optimizer_betas (0.9, 0.95), optimizer_eps 1e-8)은 Adam 계열이므로 이 값을 그대로 씁니다.

논문 수치(전체 450M, 행동 전문가 약 100M)로 고정항을 계산하면 다음과 같습니다. 1GB는 109 10^9 바이트로 계산했습니다.

학습 방식고정 가중치학습 파라미터 상태고정항 합계 (추정)
기본값: 행동 전문가만 학습, 고정부 FP32350M × 4B = 1.4GB100M × 16B = 1.6GB약 3.0GB
기본값, 고정부 BF16350M × 2B = 0.7GB100M × 16B = 1.6GB약 2.3GB
전체 학습 (450M 모두)0450M × 16B = 7.2GB약 7.2GB

고정항만 보면 기본 설정은 소비자용 카드에도 여유가 큽니다. 실제로 배치 크기를 제한하는 것은 마지막 두 항, 특히 활성화 메모리입니다. 모델 카드의 예시 명령도 --policy.dtype=bfloat16과 --batch_size=4를 쓰고, 그래디언트 체크포인팅을 선택 옵션으로 둡니다.

학습되는 파라미터 수를 직접 세는 코드

논문 수치는 근사값이므로, 사용하는 LeRobot 버전에서 실제 학습 대상 수를 세어 위 식에 넣는 편이 정확합니다.

from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy

policy = SmolVLAPolicy.from_pretrained("lerobot/smolvla_base")
total = sum(p.numel() for p in policy.parameters())
train = sum(p.numel() for p in policy.parameters() if p.requires_grad)

print(f"total {total/1e6:.0f}M, trainable {train/1e6:.0f}M")
print(f"fixed term ≈ {((total-train)*4 + train*16)/1e9:.2f} GB (frozen FP32)")

train_expert_only나 freeze_vision_encoder를 바꿔 실험할 계획이라면, 정책을 만들 때 그 설정을 넣고 같은 코드를 다시 실행해 학습 대상 수가 어떻게 바뀌는지 확인합니다.

배치 크기는 짧은 측정 세 번으로 정한다

활성화 메모리는 카메라 수, 이미지 해상도, 언어 토큰 길이, 청크 길이, 그래디언트 체크포인팅 여부에 따라 달라져서 식 하나로 정확히 맞추기 어렵습니다. 대신 배치 크기에 거의 비례한다는 성질을 이용해 측정으로 구합니다.

  1. 학습 데이터셋과 설정을 고정하고 --batch_size=1, 2, 4로 각각 수십 스텝만 학습합니다.
  2. 각 실행의 최고 메모리 M(B) M(B) 를 기록합니다. 별도 터미널에서 nvidia-smi --query-gpu=memory.used --format=csv -l 1로 보면 됩니다.
  3. 두 점으로 기울기 a=(M(4)−M(2))/2 a = (M(4) - M(2)) / 2 와 절편 M0=M(2)−2a M_0 = M(2) - 2a 를 구합니다.
  4. 카드 용량 V V 의 0.9배까지만 쓴다고 가정하고(나머지는 단편화·피크 변동 여유분) 최대 배치를 계산합니다.
Bmax=⌊0.9 V−M0a⌋ B_{max} = \left\lfloor \frac{0.9\,V - M_0}{a} \right\rfloor
lerobot-train \
  --policy.path=lerobot/smolvla_base \
  --dataset.repo_id=${HF_USER}/mydataset \
  --batch_size=2 \
  --steps=50 \
  --output_dir=outputs/mem_probe_b2 \
  --policy.device=cuda

예를 들어 측정값이 M(2) M(2) =8GB, M(4) M(4) =12GB라면 a a =2GB, M0 M_0 =4GB이고, 24GB 카드의 최대 배치는 ⌊(21.6−4)/2⌋=8 \lfloor (21.6 - 4)/2 \rfloor = 8 , 48GB 카드는 ⌊(43.2−4)/2⌋=19 \lfloor (43.2 - 4)/2 \rfloor = 19 입니다. 이 숫자는 계산 방법을 보여 주기 위한 가정값이며, 실제 측정값으로 바꿔 넣어야 합니다.

LeRobot SmolVLA 문서의 예시는 --batch_size=64, --steps=20000이고, 이 설정이 A100 한 장에서 약 4시간 걸린다고 밝힙니다. 문서는 작은 배치에서 시작해 GPU가 허용하는 만큼 늘리라고 권합니다. 배치를 줄여야 한다면 학습률과 스텝 수도 함께 조정해야 같은 학습량이 됩니다.

오해하기 쉬운 세 가지

추론 메모리와 학습 메모리는 다르다. 추론에는 그래디언트와 옵티마이저 상태가 없습니다. FP16 가중치 기준 0.5B × 2바이트 ≈ 1GB에 KV 캐시와 시스템 여유분이 더해지는 수준입니다. 추론 장비는 VRAM 계산기에서 SmolVLA 프리셋, 제어 주기 30Hz, 청크 50스텝으로 바로 확인할 수 있습니다.

추론에서는 메모리보다 주기가 먼저 막힌다. 기본값 n_action_steps 50을 30Hz로 실행하면 다음 청크까지 50/30≈1.67 50/30 \approx 1.67 초가 주어집니다. 실행 행동 수를 10으로 줄이면 예산은 약 0.33초로 짧아집니다. 대역폭과 추론 주기의 관계는 VLA 메모리·대역폭 산정 방법에서 자세히 다룹니다.

“6배 적은 메모리"는 π0와의 상대 비교다. SmolVLA 논문은 π0 대비 학습이 약 40% 빠르고 메모리를 6배 적게 쓴다고 보고하지만, 절대 메모리 값은 제시하지 않습니다. 자신의 카드에 맞는지는 위의 측정 절차로 확인해야 합니다.

학습 전에 계산기에 넣어 볼 값

학습 전에 세 값을 정리해 두면 장비 판단이 빨라집니다. 첫째, 위 코드로 센 학습 파라미터 수로 고정항을 구합니다. 둘째, 배치 1·2·4 측정으로 활성화 기울기를 구해 최대 배치를 계산합니다. 셋째, 배포할 장비에서 VRAM 계산기로 추론 주기를 확인합니다. 학습 장비와 배포 장비를 따로 계산해야 “학습은 되는데 로봇에서는 느린” 상황을 피할 수 있습니다.

환경 설치가 아직이라면 MuJoCo·LeRobot 설치 가이드에서 lerobot[smolvla] extra와 CUDA 조합부터 맞춥니다. 오픈 모델 전체의 크기와 라이선스는 오픈소스 로봇 정책 모델 비교에서 볼 수 있습니다.

자주 하는 실수

  • 파라미터 수 × 2바이트(FP16 가중치)만 계산해 학습에 필요한 메모리를 추론 메모리 수준으로 잡는 경우
  • train_expert_only를 끄고 전체 학습으로 바꾸면서 같은 배치 크기를 유지해 메모리 부족이 나는 경우
  • 공식 예시의 batch_size=64를 그대로 쓰면서 그 예시가 A100 기준이라는 점을 놓치는 경우
  • nvidia-smi의 사용량을 텐서 메모리로 착각하는 경우 — CUDA 컨텍스트와 캐시 할당자 예약분이 포함된다.

적용 전 체크리스트

  • 학습할 파라미터 수를 requires_grad 기준으로 직접 셌는가
  • freeze_vision_encoder·train_expert_only 값을 명시적으로 기록했는가
  • 배치 1·2·4로 짧게 학습해 최고 메모리를 측정했는가
  • 카드 용량에서 고정항과 10% 안팎 여유분을 뺀 뒤 최대 배치를 계산했는가
  • 학습 장비와 별도로 추론 장비의 메모리·대역폭을 계산기로 확인했는가

자주 묻는 질문

SmolVLA를 LoRA로 파인튜닝하면 더 줄어드나요?
LoRA는 학습되는 파라미터 수를 줄이므로 옵티마이저 상태와 그래디언트가 줄어듭니다. 다만 SmolVLA 기본 설정은 이미 VLM을 고정하고 행동 전문가만 학습하므로, 줄어드는 폭은 전체 학습과 비교할 때보다 작습니다. LoRA 지원 여부와 옵션은 사용하는 LeRobot 버전의 lerobot-train –help로 확인합니다.
Colab 무료 GPU로도 학습할 수 있나요?
LeRobot 문서는 GPU가 없으면 SmolVLA 학습 Colab 노트북을 쓰라고 안내합니다. Colab 무료 버전은 세션이 최대 12시간이고 GPU 종류가 보장되지 않으므로, 배치 크기를 작게 잡고 체크포인트를 자주 저장해야 합니다.
학습한 모델을 Jetson에서 돌릴 수 있나요?
추론 메모리는 학습보다 훨씬 작지만, 실시간 제어에서는 메모리 대역폭과 추론 주기가 함께 맞아야 합니다. 대상 Jetson의 메모리와 대역폭으로 VRAM 계산기에서 최대 추론 주기를 먼저 확인합니다.

참고 자료 · 검증 기준

  1. Shukor et al., SmolVLA: A Vision-Language-Action Model for Affordable and Efficient Robotics (arXiv:2506.01844)
  2. Hugging Face — lerobot/smolvla_base 모델 카드
  3. Hugging Face LeRobot Docs — SmolVLA
  4. LeRobot GitHub — configuration_smolvla.py
  5. Rajbhandari et al., ZeRO: Memory Optimizations Toward Training Trillion Parameter Models (arXiv:1910.02054)

마지막 검증일: