[실습] SmolVLA로 시작하기 — 맥북에서도 도는 작은 VLA

들어가며

7편의 SmolVLA는 450M 파라미터로 맥북·라즈베리파이에서도 작동합니다. 이 실습 글은 "GPU 없이도 VLA를 가질 수 있다"는 명제를 직접 확인하는 자리입니다.

이번 글에서 다룰 두 가지는 다음과 같습니다.

  1. SmolVLA 추론 — LeRobot에 통합된 사전학습 모델로 시뮬레이션 task 수행
  2. 자기 데이터로 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 논문이나 코드를 만나도 그것이 어느 단계의 어떤 흐름에 속하는지 감을 잡으실 수 있을 겁니다.


다음 글 안내