들어가며
7편의 SmolVLA는 450M 파라미터로 맥북·라즈베리파이에서도 작동합니다. 이 실습 글은 "GPU 없이도 VLA를 가질 수 있다"는 명제를 직접 확인하는 자리입니다.
이번 글에서 다룰 두 가지는 다음과 같습니다.
- SmolVLA 추론 — LeRobot에 통합된 사전학습 모델로 시뮬레이션 task 수행
- 자기 데이터로 finetune — LeRobot Hub의 데이터셋으로 SmolVLA를 적응
GR00T N1(NVIDIA Isaac Sim 필요)은 환경 설치가 무거워 별도로 다룹니다. 글 끝에 진입점만 안내합니다.
0. 환경 준비
git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[smolvla,aloha]"
설치 확인:
from lerobot.common.policies.smolvla.modeling_smolvla import SmolVLAPolicy
print("smolvla available")
CPU만 있어도 추론은 가능합니다. M-series 맥북에서는 MPS로 가속됩니다.
1. SmolVLA 추론
import torch
import gym_aloha
import gymnasium as gym
import imageio
from lerobot.common.policies.smolvla.modeling_smolvla import SmolVLAPolicy
# Apple Silicon이면 MPS, 그 외엔 CUDA / CPU
device = (
"mps" if torch.backends.mps.is_available()
else "cuda" if torch.cuda.is_available()
else "cpu"
)
# 사전학습 SmolVLA (~1GB)
policy = SmolVLAPolicy.from_pretrained("lerobot/smolvla_base")
policy.to(device).eval()
env = gym.make(
"gym_aloha/AlohaTransferCube-v0",
obs_type="pixels_agent_pos",
max_episode_steps=400,
)
obs, info = env.reset(seed=42)
frames = [env.render()]
done = False
total_reward = 0
while not done:
state = torch.from_numpy(obs["agent_pos"]).float().to(device).unsqueeze(0)
images = {
f"observation.images.{cam}":
torch.from_numpy(obs["pixels"][cam])
.float().permute(2, 0, 1).unsqueeze(0).to(device) / 255.0
for cam in obs["pixels"]
}
observation = {
"observation.state": state,
**images,
"task": "transfer the cube",
}
with torch.no_grad():
action = policy.select_action(observation)
obs, reward, terminated, truncated, info = env.step(action.squeeze(0).cpu().numpy())
done = terminated or truncated
frames.append(env.render())
total_reward += reward
print(f"reward: {total_reward:.2f}, success: {info.get('is_success', False)}")
imageio.mimsave("smolvla_aloha.mp4", frames, fps=50)
결과 해석
이 코드를 맥북에서 돌리면 한 episode가 5~10분 정도 걸립니다. SmolVLA는 π₀의 ⅙ 크기지만 task description을 받아 적절한 양팔 행동을 만들어냅니다.
추론 속도가 부족하면 policy.async_inference = True를 활성화해 다음 chunk를 미리 계산하게 할 수 있습니다 (LeRobot ≥ 0.10).
2. 자기 데이터로 SmolVLA Finetune
LeRobot Hub에는 SO-100·SO-101 같은 저가 양팔 시스템으로 수집한 공개 데이터셋이 많습니다. 이걸로 SmolVLA를 자기 task에 적응시킬 수 있습니다.
2-1. 데이터셋 받기
# Hugging Face에서 LeRobot 데이터셋 다운로드 (예: 양말 정리 task)
huggingface-cli download lerobot/koch_sock_pickup --repo-type dataset
RoboCasa 같은 시뮬레이션 데이터셋도 같은 형식으로 사용할 수 있습니다.
2-2. 학습 스크립트
python lerobot/scripts/train.py \
--dataset.repo_id=lerobot/koch_sock_pickup \
--policy.path=lerobot/smolvla_base \
--output_dir=outputs/smolvla_koch_sock \
--job_name=smolvla_koch_sock \
--policy.device=cuda \
--batch_size=64 \
--steps=20000 \
--eval_freq=2500 \
--wandb.enable=false
핵심 인자:
--batch_size=64— 24GB GPU 기준. 8GB라면 16~32로 낮춥니다.--steps=20000— SmolVLA는 작아서 짧게 학습해도 충분합니다.--policy.path=lerobot/smolvla_base— 사전학습 체크포인트에서 출발.
학습 시간은 RTX 4090 기준 약 2~4시간입니다.
2-3. Finetuned 모델로 추론
policy = SmolVLAPolicy.from_pretrained(
"outputs/smolvla_koch_sock/checkpoints/last"
)
이전 코드에서 모델 경로만 바꾸면 됩니다.
결과 해석
자기 task에 맞춘 SmolVLA는 base보다 훨씬 정밀하게 작동합니다. 다만 SmolVLA의 한계는 명확합니다 — 학습 task의 다양성이 부족하면 일반화가 약합니다. SO-100·SO-101 같은 저가 하드웨어로 모은 다양한 task를 함께 학습하면 더 좋아집니다.
3. (옵션) GR00T N1 — 휴머노이드를 다루고 싶다면
GR00T N1은 NVIDIA Isaac Sim과 묶인 휴머노이드 전용 generalist입니다. 환경 설치가 무겁습니다(NVIDIA Isaac, Omniverse).
진입점만 안내하면:
- GR00T N1 GitHub — 사전학습 체크포인트와 추론 가이드
- Isaac Lab — 시뮬레이션 환경
- 권장 사양: RTX 4090 이상 + 64GB RAM + Linux (또는 WSL2)
휴머노이드 전체 시뮬레이션은 무거우므로, 본격적으로 들어가기 전에 SmolVLA·OpenVLA로 충분히 익숙해지신 다음을 권합니다.
정리
| 실습 | 손에 잡힌 개념 |
|---|---|
| SmolVLA + ALOHA sim | 작은 VLA가 노트북에서 작동하는 모습 |
| SmolVLA finetune | 저가 데이터셋으로 자기 task에 적응 |
이 시리즈의 마지막 실습입니다. SmolVLA는 SO-100·SO-101 같은 저가 양팔과 묶여 진짜 책상 위 로봇 실험으로 자연스럽게 연결됩니다.
읽어 주셔서 감사합니다. 시리즈를 처음부터 끝까지 따라오신 분이라면, 이제 어떤 VLA 논문이나 코드를 만나도 그것이 어느 단계의 어떤 흐름에 속하는지 감을 잡으실 수 있을 겁니다.
다음 글 안내
- 이전 실습 → [실습] π₀
- 본문 글 → 휴머노이드와 최전선
- 시리즈 전체 지도 → VLA 학습 로드맵