Physical AI 엔지니어링 도구

VLA 파인튜닝 VRAM & 최대 배치 계산기

SmolVLA, OpenVLA 등 대규모 로보틱스 VLA 모델을 단일 GPU(24GB/48GB/80GB)에서 파인튜닝할 때 필요한 고정 메모리(혼합 정밀도 Adam 상태)와 활성화 메모리 선형 모델을 통해 OOM 없는 최대 배치 크기(B_max)를 계산합니다.

1. 모델 & 파인튜닝 방식

예: SmolVLA는 450M(0.45B), OpenVLA는 7,000M(7B).

SmolVLA 기본 파인튜닝(행동 전문가만) 시 약 100M, 전체 학습 시 450M.

2. 피크 메모리 실측값 (Probe)

배치 1·2·4로 짧게(수십 스텝) 실행하여 nvidia-smi로 측정한 최고 VRAM을 입력하면 활성화 메모리 기울기를 자동 계산합니다.

B = GB
B = GB

3. 대상 GPU 사양 & 안전 여유율

GB
90 %

일반적으로 VRAM의 90% 이내를 목표로 하여 CUDA 메모리 단편화와 순간 스파이크로 인한 OOM을 방지합니다.

4. 계산 결과

최대 허용 배치 크기 (B_max) 8
최대 배치 시 피크 VRAM 20.0 GB
고정 메모리 (가중치 + 옵티마이저) 2.30 GB
단일 GPU 실행 진단 단일 GPU 학습 적합
고정 파라미터 가중치 0.70 GB
학습 상태 (가중치 + 그래디언트 + 옵티마이저) 1.60 GB
고정 메모리 합계 (M_fixed) 2.30 GB
활성화 메모리 증가율 (기울기 a) 2.00 GB/batch
베이스 오버헤드 절편 (M_0) 4.00 GB
안전 메모리 한도 (V × Margin) 21.6 GB
잔여 여유 메모리 1.6 GB

* 안내: 계산 결과는 실측 프로브 선형 외삽에 기반한 사전 설계용 추정치입니다. 실제 파인튜닝 시 데이터셋 해상도, 시퀀스 길이, 분산 학습 프레임워크에 따라 차이가 발생할 수 있습니다.

VLA 파인튜닝 VRAM 계산 가이드 및 수식 원리

SmolVLA, OpenVLA 등 대규모 비전-언어-행동(VLA) 모델을 소비자용 또는 단일 워크스테이션 GPU에서 파인튜닝할 때, 가장 큰 메모리 병목은 가중치 자체가 아니라 옵티마이저 상태(Optimizer State)와 배치 크기에 비례하는 활성화 메모리(Activation Memory)입니다.

1. 메모리 구성 공식 (ZeRO 혼합 정밀도 Adam)

학습 중 GPU 메모리는 고정항(가중치 + 그래디언트 + 옵티마이저 상태)과 배치 크기에 비례하는 활성화 메모리, CUDA 컨텍스트 오버헤드의 합으로 결정됩니다:

M_train ≈ (P_frozen × b_w + P_train × 16) + M_act(B) + M_overhead M_fixed = (P_frozen × b_w + P_train × 16) / 10^9 [GB]

* ZeRO 논문(arXiv:1910.02054) 기준: 혼합 정밀도 Adam은 FP16 가중치(2B) + FP16 그래디언트(2B) + FP32 마스터 가중치/모멘텀/분산(12B) = 파라미터당 16바이트를 점유합니다.

2. 짧은 2회 측정으로 최대 배치(B_max) 도출하는 법

활성화 메모리는 카메라 대수, 해상도, 토큰 길이, 액션 청크 크기마다 달라 이론식만으로는 정확히 맞추기 어렵습니다. 대신 배치 크기 2와 4로 수십 스텝만 실행한 뒤 최고 메모리를 측정해 직선으로 외삽하면 카드에 맞는 최대 배치를 안전하게 구할 수 있습니다:

a = (M(B2) − M(B1)) ÷ (B2 − B1) [GB / 배치] M_0 = M(B1) − a × B1 [GB, 베이스 오버헤드 절편] B_max = ⌊ (Safety_Margin × V − M_0) ÷ a ⌋

3. 학습 파라미터 수 직접 확인하는 Python 코드

LeRobot 환경에서 실제 requires_grad 파라미터 수를 세어 고정항을 정확히 계산할 수 있습니다:

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)*2 + train*16)/1e9:.2f} GB (frozen BF16)")

4. 자주 묻는 질문 (FAQ)

SmolVLA를 24GB 단일 GPU(RTX 3090/4090)에서 학습할 수 있나요?

기본 설정(비전 고정, 행동 전문가 약 100M만 학습)은 고정항이 약 2.3GB에 불과해 24GB 카드에서 배치 4~8 수준으로 원활하게 학습할 수 있습니다. 단, VLM까지 모두 학습하는 전체 파인튜닝(Full Fine-tuning) 시에는 고정항만 약 7.2GB로 증가하므로 배치를 줄여야 합니다.

혼합 정밀도 Adam에서 왜 파라미터당 16바이트가 필요한가요?

ZeRO 논문(arXiv:1910.02054)에 따르면 혼합 정밀도 Adam 학습 시 가중치 2바이트(FP16), 그래디언트 2바이트(FP16), FP32 마스터 가중치 4바이트, 1차 모멘텀 4바이트, 2차 분산 4바이트가 필요하여 학습 파라미터 1개당 총 16바이트가 소모됩니다.

추론용 VRAM 계산기와 학습 계산기는 무엇이 다른가요?

추론 시에는 옵티마이저 상태와 역전파 그래디언트가 전혀 필요하지 않아 모델 가중치(FP16 기준 1B당 2GB)와 KV 캐시만 필요합니다. 반면 학습 시에는 학습되는 파라미터당 16바이트와 역전파 활성화 버퍼가 추가되므로 훨씬 큰 VRAM이 요구됩니다.