GR00T N1.5
GR00T N1.5는 NVIDIA에서 개발한 휴머노이드 로봇을 위한 오픈 파운데이션 모델입니다. 멀티모달 입력(언어, 이미지)을 받아 다양한 환경에서 조작 작업을 수행할 수 있습니다.
GR00T N1.5의 특징
- Cross-Embodiment: 다양한 로봇 형태에 적용 가능
- 멀티모달 입력: 언어, 이미지, 고유수용감각 통합 처리
- 강력한 일반화: 대규모 데이터셋으로 사전학습된 3B 파라미터 모델
- Flow Matching: Action Transformer 기반 동작 생성
하드웨어 요구사항
GR00T N1.5는 Flash Attention이 필요하므로 CUDA GPU가 필수입니다.
개요
GR00T N1.5는 NVIDIA Isaac GR00T N1의 업그레이드 버전으로, 휴머노이드 로봇의 일반화 능력과 언어 이해 능력이 향상되었습니다.
학습 데이터 구성
- 실제 로봇 데이터: 실제 로봇에서 캡처한 데이터
- 합성 데이터: NVIDIA Isaac GR00T Blueprint로 생성
- 인터넷 비디오: 대규모 인터넷 비디오 데이터
모델 아키텍처
GR00T N1.5-3B 모델은 다음을 사용합니다:
- 비전 인코더: 사전학습된 비전 인코더
- 언어 인코더: 사전학습된 언어 인코더
- Action Transformer: Flow matching 기반 동작 생성
- 출력: 조건부 동작 시퀀스 (비전, 언어, 고유수용감각)
프로세스
1. 환경 변수 설정
export TASK_NAME="pick_and_place_red_pen"
export TASK_DESCRIPTION="pick a red pen and place it into box"
export HF_USER="Your_HuggingFace_Account"
# 설정 확인
echo "HF_USER: ${HF_USER}"
echo "TASK_NAME: ${TASK_NAME}"
echo "TASK_DESCRIPTION: ${TASK_DESCRIPTION}"
2. 설치
설치 순서 중요
Flash Attention을 먼저 설치한 후 LeRobot을 설치해야 합니다.
# 1. PyTorch 설치 (CUDA 버전에 맞게 조정)
pip install "torch>=2.2.1,<2.8.0" "torchvision>=0.21.0,<0.23.0"
# 2. Flash Attention 의존성 설치
pip install ninja "packaging>=24.2,<26.0"
# 3. Flash Attention 설치
pip install "flash-attn>=2.5.9,<3.0.0" --no-build-isolation
# 4. 설치 확인
python -c "import flash_attn; print(f'Flash Attention {flash_attn.__version__} imported successfully')"
# 5. LeRobot with GR00T 설치
pip install lerobot[groot]
3. 데이터셋 준비
SmolVLA와 마찬가지로 자연어 명령 레이블링이 필요합니다. --dataset.single_task 옵션으로 명확한 작업 설명을 지정하세요.
데이터 수집 권장사항
- 최소 50개 에피소드 권장
- 일관된 속도로 부드럽게 동작
- 다양한 물체 위치와 상황 포함
- 명확한 자연어 명령 레이블링 (GR00T는 언어 조건부 모델)
4. 파인튜닝
GR00T N1.5는 NVIDIA의 사전학습된 모델(nvidia/GR00T-N1.5-3B)을 기반으로 파인튜닝합니다.
export TASK_NAME="pick_and_place_red_pen"
export HF_USER="Your_HuggingFace_Account"
# 단일 GPU 기본 설정
CUDA_VISIBLE_DEVICES=0 lerobot-train \
--dataset.repo_id=${HF_USER}/${TASK_NAME} \
--policy.repo_id=${HF_USER}/${TASK_NAME}_groot \
--policy.type=groot \
--policy.tune_diffusion_model=false \
--output_dir=outputs/train/grootn1.5_so101/${TASK_NAME} \
--job_name=grootn1.5_so101 \
--batch_size=4 \
--steps=30_000 \
--save_checkpoint=true \
--save_freq=5_000 \
--log_freq=100 \
--wandb.enable=true# Multi-GPU 설정 (Accelerate 사용)
accelerate launch \
--multi_gpu \
--num_processes=2 \
$(which lerobot-train) \
--dataset.repo_id=${HF_USER}/${TASK_NAME} \
--policy.repo_id=${HF_USER}/${TASK_NAME}_groot \
--policy.type=groot \
--policy.push_to_hub=true \
--policy.tune_diffusion_model=false \
--output_dir=outputs/train/grootn1.5_so101/${TASK_NAME} \
--job_name=grootn1.5_so101 \
--batch_size=8 \
--steps=30_000 \
--save_checkpoint=true \
--save_freq=5_000 \
--log_freq=100 \
--wandb.enable=true \
--wandb.disable_artifact=true# 추가 설정 (Diffusion Model 튜닝 포함)
CUDA_VISIBLE_DEVICES=0 lerobot-train \
--dataset.repo_id=${HF_USER}/${TASK_NAME} \
--policy.repo_id=${HF_USER}/${TASK_NAME}_groot \
--policy.type=groot \
--policy.tune_diffusion_model=true \
--output_dir=outputs/train/grootn1.5_so101/${TASK_NAME} \
--job_name=grootn1.5_so101 \
--batch_size=4 \
--steps=100_000 \
--save_checkpoint=true \
--save_freq=10_000 \
--log_freq=100 \
--wandb.enable=true# 학습 재개
CUDA_VISIBLE_DEVICES=0 lerobot-train \
--config_path=outputs/train/grootn1.5_so101/${TASK_NAME}/checkpoints/last/pretrained_model/train_config.json \
--resume=truetune_diffusion_model 옵션
false: 빠른 학습, 적은 메모리 사용 (기본 권장)true: 더 정밀한 동작 생성, 더 많은 메모리와 시간 필요
5. 평가 및 실행
학습된 모델로 실제 로봇에서 추론을 실행합니다. eval_ 접두사를 붙여 평가 데이터셋과 훈련 데이터셋을 구분합니다.
export TASK_NAME="pick_and_place_red_pen"
export HF_USER="Your_HuggingFace_Account"
# 단일 암 로봇 평가
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/so101_follower \
--robot.id=follower \
--robot.cameras='{
camera1: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 25},
camera2: {type: opencv, index_or_path: 4, width: 640, height: 480, fps: 25},
}' \
--policy.path=${HF_USER}/${TASK_NAME}_groot \
--dataset.repo_id=${HF_USER}/eval_${TASK_NAME} \
--dataset.single_task="Pick up the red pen and place it in the box" \
--dataset.num_episodes=10 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=5 \
--display_data=true# 양팔 로봇 평가
lerobot-record \
--robot.type=bi_so100_follower \
--robot.left_arm_port=/dev/ttyACM1 \
--robot.right_arm_port=/dev/ttyACM0 \
--robot.id=bimanual_follower \
--robot.cameras='{
right: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30},
left: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30},
top: {type: opencv, index_or_path: 4, width: 640, height: 480, fps: 30},
}' \
--policy.path=${HF_USER}/${TASK_NAME}_groot \
--dataset.repo_id=${HF_USER}/eval_${TASK_NAME}_bimanual \
--dataset.single_task="Grab and handover the red cube to the other arm" \
--dataset.num_episodes=10 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=10 \
--display_data=true# 연속 실행 (에피소드 끊김 없이)
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/so101_follower \
--robot.id=follower \
--robot.cameras='{
camera1: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 25},
camera2: {type: opencv, index_or_path: 4, width: 640, height: 480, fps: 25},
}' \
--policy.path=${HF_USER}/${TASK_NAME}_groot \
--dataset.repo_id=${HF_USER}/eval_${TASK_NAME} \
--dataset.single_task="Pick up the red pen and place it in the box" \
--dataset.num_episodes=1 \
--dataset.episode_time_s=10000 \
--dataset.reset_time_s=1 \
--display_data=true성능 벤치마크
Libero Benchmark 결과
| Benchmark | LeRobot 구현 | GR00T Reference |
|---|---|---|
| Libero Spatial | 82.0% | 92.0% |
| Libero Object | 99.0% | 92.0% |
| Libero Long | 82.0% | 76.0% |
| Average | 87.0% | 87.0% |
벤치마크 조건
LeRobot 구현으로 30,000 steps 파인튜닝 후 측정된 결과입니다.
SmolVLA와의 비교
| 특징 | GR00T N1.5 | SmolVLA |
|---|---|---|
| 파라미터 수 | 3B | 450M |
| 자연어 명령 | ✅ 지원 | ✅ 지원 |
| Multi-GPU 지원 | ✅ Accelerate | ❌ |
| Flash Attention | 필수 | 불필요 |
| 메모리 사용량 | 높음 | 중간 |
| 학습 시간 | 더 김 | 빠름 |
| 일반화 능력 | 매우 높음 | 높음 |
| CPU 추론 | ❌ | ✅ |
주요 파일 위치
| 파일 | 경로 |
|---|---|
| 모델 구현 | lerobot/common/policies/groot/modeling_groot.py |
| 설정 | lerobot/common/policies/groot/configuration_groot.py |
| GR00T N1 코어 | lerobot/common/policies/groot/groot_n1.py |
문제 해결
일반적인 이슈
Flash Attention 설치 실패
해결책:
- CUDA 버전 확인 (11.6 이상 권장)
--no-build-isolation플래그 필수- ninja 패키지 먼저 설치
GPU 메모리 부족 (OOM)
해결책:
batch_size감소 (4 → 2)tune_diffusion_model=false설정- Multi-GPU 사용 (Accelerate)
- Gradient checkpointing 활성화
Multi-GPU 학습 불안정
해결책:
--wandb.disable_artifact=true추가- 각 GPU당 배치 크기 균등 분배 확인
- NCCL 환경 변수 설정
추가 리소스
GR00T N1.5는 Apache 2.0 라이선스를 따릅니다. 최신 업데이트는 NVIDIA Isaac GR00T 저장소를 확인하세요.