AEGLOSLAB 엔비디아 기술 스택

제9부 로보틱스

9.14 Isaac Lab II — 도메인 랜덤화·학습

9.14.1 이 장에서 배우는 것 / 선수 지식

9.13에서 Isaac Lab의 대규모 병렬 RL 구조(수천 환경을 한 GPU에서, 전부 GPU 텐서)를 봤다. 이 장은 그 구조 위에서 실제로 정책을 학습하고 — 그리고 가장 중요한 — 학습한 정책이 실로봇으로 전이되게(Sim2Real) 하는 핵심 기법 도메인 랜덤화(domain randomization) 를 실습으로 익힌다. 9.13가 "어떻게 빨리 학습하나(구조)"였다면, 이 장은 "어떻게 학습하고, 어떻게 실세계로 넘기나"다. 제9부 로보틱스의 마무리.

핵심 통찰: 시뮬에서 잘 걷는 정책이 실로봇에서 넘어지는 이유는 "정책이 시뮬의 특정 물리에 과적합"하기 때문이고, 도메인 랜덤화가 이를 푼다. 시뮬의 마찰·질량·게인·지연은 단일한 근사값이라, 그 값에 맞춰 학습한 정책은 실로봇의 (다른) 물리에서 무너진다(Sim2Real 갭). 해법은 물리를 환경마다 무작위로 크게 흔드는 것 — 수천 환경이 각각 다른 마찰·질량·게인을 가지면, 정책은 특정 물리가 아니라 물리의 분포 전체에 강건한 행동을 배운다. 그러면 실로봇도 "또 하나의 무작위 변형"처럼 보여 전이된다. 병렬(9.13)과 랜덤화는 한 쌍이다 — 수천 환경이 동시에 다른 물리를 겪으니 랜덤화가 추가 비용 없이 대규모로 된다. 단 "얼마나 흔드나"는 기술이다(과적합↔학습 불가).

배우는 것:

  • 학습 워크플로우 — 환경 설정 → RL 라이브러리·PPO → 학습 실행(headless) → 곡선 모니터 → 평가(play).
  • 곡선 읽기 — 보상·에피소드 길이·손실로 학습 진단(plateau·collapse·reward hacking).
  • 도메인 랜덤화 I·II — 무엇을(물리·센서·외란·지형) 흔드나, 얼마나(과적합↔학습 불가)·자동 랜덤화(ADR).
  • Sim2Real 기법 더 — 관측 설계·teacher-student(특권 학습)(심화 10.7 예고).
  • 엣지 배포 — 정책 → ONNX → TensorRT(5.2) → Jetson(9.1) 제어 루프, 관측 정합.

선수 지식: 9.13(병렬 RL 구조·벡터화 환경·PPO·보상)·9.11(PhysX 물리·게인·도메인 랜덤화 토대)·9.12(랜덤화 개요·SIL)·5.2(TensorRT — 정책 배포)·9.1(Jetson). RL 학습 루프(롤아웃·업데이트·하이퍼파라미터)의 기초는 가정. Sim2Real의 심화(이전·system identification·미세조정)는 10.7, 휴머노이드 파운데이션 모델은 10.10·10.11.

정직: Isaac Lab의 학습 스크립트·RL 라이브러리 통합·도메인 랜덤화 API·설정 방식은 릴리스 의존이 크다. 이 장은 "어떻게 학습하고 곡선을 읽고 랜덤화로 전이를 만드는가의 절차·원리"를 가르치고, 구체 명령·config·클래스는 "그 릴리스 문서로 확인". 학습 곡선·하이퍼파라미터·랜덤화 범위는 태스크·로봇·GPU 의존 개략값이며, 정답이 아니라 출발점이다. 도메인 랜덤화는 Sim2Real을 좁히되 보장하지 않는다 — 실로봇 검증·미세조정(10.7)이 필요함을 정직하게 둔다. 코드는 개념 골격.

9.14.2 학습 워크플로우 — 환경 설정에서 정책까지

RL 정책 학습의 전체 흐름을 큰 그림으로 잡자(9.13의 구조를 실행으로).

Isaac Lab 학습 워크플로우(개념):

다시 ④ ① 태스크 선택/정의 — 환경(씬·관측·행동·보상·종료, 9.13.5) + 환경 수 N ② RL 라이브러리·알고리즘 — rl_games/RSL-RL 등 + PPO config(LR·rollout·minibatch…) ③ 도메인 랜덤화 설정 — 물리·센서·외란·지형 무작위 범위(9.14.4) ④ 학습 실행(headless·GPU) — 수천 환경 병렬, 수천만~수억 스텝 ⑤ 모니터 — 보상·에피소드 길이·손실 곡선 (TensorBoard/wandb), 체크포인트 ⑥ 평가(play) — 학습된 정책을 렌더로 관찰(기행·실패 확인) ⑦ 반복 — 보상·랜덤화·하이퍼 조정 ⑧ 배포 — 정책 → ONNX → TensorRT(5.2) → 엣지 (9.14.7)
# 학습 실행(개념 — 스크립트·인자는 릴리스 의존, 반드시 확인)
python train.py --task=Isaac-Velocity-Anymal-v0 \
    --num_envs=4096 --headless \
    --max_iterations=1500                    # PPO 반복 수
# --num_envs=4096: 수천 환경 GPU 병렬(9.13) · --headless: GUI 없이
# 모니터:
tensorboard --logdir logs/                   # 보상·에피소드·손실 곡선
# 평가(학습된 정책 관찰):
python play.py --task=Isaac-Velocity-Anymal-v0 --checkpoint=logs/.../model.pt
  • headless가 기본: 상태 기반 RL은 렌더가 불필요하니(9.11) --headless로 렌더를 끄고 물리만 최대 처리량(9.13). 비전 기반 RL만 렌더 필요.
  • 핵심 하이퍼파라미터: 환경 수 N(처리량), rollout/horizon 길이(한 업데이트당 환경별 스텝), minibatch·epoch(업데이트 강도), 학습률, 할인 γ·GAE λ, 엔트로피 계수(탐험), 보상 스케일. 대부분 태스크별 스윕으로 찾는다(9.14.9).
  • 체크포인트·재개: 긴 학습은 주기적 체크포인트로 저장·재개(중단·튜닝). 최고 성능 모델 보존.
  • 평가(play) 필수: 곡선이 좋아도 실제 행동을 눈으로 봐야 한다 — reward hacking(9.13)·기행을 곡선만으론 검출하지 못한다. play 모드로 정책을 렌더하며 관찰.

핵심: 학습 워크플로우는 환경 설정 → PPO·랜덤화 설정 → headless 병렬 학습 → 곡선 모니터 → play로 관찰 → 반복 → 배포다. 상태 RL은 렌더 끄고 N 최대(9.13). 하이퍼는 태스크별 스윕. 곡선이 좋아도 play로 행동을 눈으로 확인(reward hacking 검증). 마지막은 정책을 엣지에 배포(TensorRT 5.2).

9.14.3 학습 곡선 읽기 — 보상·에피소드·디버깅

학습 모니터링의 핵심은 곡선을 읽어 무엇이 잘못됐나를 아는 것이다.

주요 곡선과 해석:

곡선해석
에피소드 보상(reward)우상향이 정상. 학습이 되고 있나의 1차 지표 — 안 오름→보상 신호 약함·탐험 부족·물리 불안정·LR 문제 / 오르다 정체→국소 최적·랜덤화 과함·태스크 한계·하이퍼 / 올랐다 붕괴→불안정(LR 큼·보상 스케일·발산)·정책 무너짐
에피소드 길이(length)생존 시간. 보행이면 길수록 안 넘어짐(보상과 함께)
정책·가치 손실PPO 손실·KL·엔트로피 — 발산·과/소 탐험 진단
엔트로피높으면 탐험 중, 너무 빨리 떨어지면 조기 수렴(국소)
  • 보상 곡선이 1순위: 우상향하면 학습 중. 안 오르면 보상이 행동을 못 유도하거나(셰이핑 9.13), 탐험이 부족하거나(엔트로피↑), 물리가 불안정(9.11)하거나, LR이 부적절. 정체면 랜덤화가 너무 세거나(9.14.5) 태스크 한계. 붕괴면 불안정(LR↓·보상 정규화).
  • 에피소드 길이와 함께: 보행은 보상이 높아도 금방 넘어지면(짧은 에피소드) 의미 없다 — 둘을 함께 본다. 길이가 늘며 보상이 오르면 건강.
  • 곡선↔play 교차 검증: 곡선이 좋아도 play로 보면 기행(미끄러지기·진동으로 점수 따기, reward hacking 9.13)일 수 있다 → 곡선과 실제 행동을 항상 교차. "곡선만 믿지 마라"가 RL 디버깅의 철칙.
  • 랜덤화의 곡선 효과(정직): 도메인 랜덤화를 켜면 학습이 느려지고 최종 보상이 낮아 보인다(어려운 분포라) — 이것은 정상이고, 실로봇 전이를 위한 대가다(9.14.5). 랜덤화 없는 학습이 곡선은 좋아도 실로봇서 무너진다.

견해: 곡선 읽기의 핵심은 보상(우상향?)·에피소드 길이(생존?)·엔트로피(탐험?) 를 함께 보고, 안 오름/정체/붕괴를 원인(보상·탐험·물리·LR·랜덤화)으로 진단하는 것. 그러나 곡선이 좋아도 play로 행동을 눈으로 봐야 reward hacking을 검출한다. 그리고 랜덤화를 켜면 곡선이 나빠 보여도 정상 — 보기 좋은 곡선이 아니라 전이되는 정책이 목표.

9.14.4 도메인 랜덤화 I — 무엇을 흔드나

도메인 랜덤화(DR) 는 Sim2Real의 핵심 수단이다(9.12 개요의 심화). 환경마다 물리·센서를 무작위로 바꿔, 정책이 특정 시뮬이 아니라 분포에 강건하게 만든다.

무엇을 흔드나(로봇 제어/RL — 동역학 중심):

범주항목무작위(예)대상
물리·동역학(dynamics)마찰계수friction × uniform(0.5, 1.5)지면·발 접촉
질량·관성mass × (1 ± 0.15)적재·제작 편차
드라이브 게인stiffness/damping ± %액추에이터(9.11)
모터 강도·지연torque scale, action delay 스텝실액추에이터 비이상
센서·관측(observation)관측 노이즈obs += gaussian(0, σ)실센서 노이즈
관측 지연·드롭latency, dropout통신·처리 지연
외란(perturbation)랜덤 푸시매 N스텝 무작위 힘외부 충격·균형
지형·씬(scene)지면 거칠기·경사·계단·장애물—다양한 환경

(비전 기반이면 시각도: 조명·텍스처·카메라, 9.12.)

  • 왜 이것들인가: 실로봇과 시뮬이 다른 지점이 갭의 원천이다 — 마찰(지면마다 다름)·질량(적재·제작)·게인(액추에이터 비이상)·지연(통신)·센서 노이즈·외란. 이 갭의 원천을 무작위로 흔들면 정책이 그 변동을 견디게 배운다.
  • 병렬과 한 쌍(9.13): 수천 환경이 각각 다른 물리(env 0은 마찰 0.6·질량 큼, env 1은 마찰 1.4·질량 작음…)를 가지면, 정책은 한 배치에 분포 전체를 본다 — 병렬 덕에 랜덤화가 대규모에서도 추가 비용이 들지 않는다. CPU 단일 환경이면 시간순으로 겪어야 하지만, 병렬은 동시에.
  • 물리 vs 시각 랜덤화: 제어/RL(이 장)은 동역학(마찰·질량·게인·외란)이 핵심 — 동역학 갭을 좁힌다. 비전 인지(9.7~9.9·9.12)는 시각(조명·텍스처)이 핵심. 용도가 무엇을 흔들지 정한다.
  • 관측 설계와 함께: 관측에 실로봇에서 못 얻는 정보(특권 정보) 를 넣으면 배포 때 무너진다 — 관측은 실로봇에서 얻을 수 있는 것으로(9.14.6). 랜덤화 + 관측 노이즈가 강건성.

핵심: 도메인 랜덤화는 갭의 원천(마찰·질량·게인·지연·센서 노이즈·외란·지형)을 환경마다 무작위로 흔들어 정책을 분포에 강건하게 만든다. 제어/RL은 동역학 중심(비전은 시각). 병렬(9.13)과 한 쌍 — 수천 환경이 각각 다른 물리를 동시에 겪어 랜덤화가 대규모에서도 추가 비용이 들지 않는다. 관측은 실로봇에서 얻을 수 있는 것으로(특권 정보 금지).

9.14.5 도메인 랜덤화 II — 얼마나·자동 랜덤화

DR의 어려운 부분은 "무엇을"이 아니라 "얼마나" 다. 범위가 너무 좁으면 갭이 안 닫히고, 너무 넓으면 학습이 안 된다.

랜덤화 범위의 딜레마:

너무 좁게(약한 DR) · 특정 물리에 과적합 · 시뮬 보상은 높음 · 실로봇서 무너짐(갭) 너무 넓게(강한 DR) · 정책이 분포를 못 배움(학습 실패·수렴 안 됨) · 배워도 지나치게 보수적 (느리고 소극적 = 차선) · 비현실적 물리까지 포함 (쓸데없이 어려움) 적정 범위: 현실의 불확실성을 덮되 학습 가능하고 과보수 아닌 균형 ← 실로봇 파라미터 분포를 포함하게 (system identification 10.7로 안내)
  • 과적합 ↔ 학습 불가: 약한 DR은 시뮬 곡선이 예쁘지만 실로봇서 실패(갭). 강한 DR은 학습이 안 되거나(너무 어려움) 지나치게 보수적(모든 경우에 안전하려다 느리고 소극적 = 차선 정책). 둘 사이 적정점.
  • 범위를 어떻게 잡나: 이상적으론 실로봇의 실제 파라미터 분포를 덮도록 — 실로봇의 마찰·질량·게인을 측정(system identification, 10.7)해 그 불확실성 범위로. 측정 없이는 보수적으로 넓게 잡되 학습 가능 한도에서.
  • 자동 도메인 랜덤화(ADR): 범위를 고정하지 않고 점진 확대 — 처음엔 좁게(쉬움) 시작해 정책이 잘하면 범위를 넓힌다(어려움 커리큘럼). 정책 성능에 맞춰 랜덤화 난이도를 자동 조절 → 과한 범위로 학습 실패를 피하면서 점점 강건하게(OpenAI Dactyl류 발표 사례). 커리큘럼 학습의 랜덤화판.
  • 커리큘럼 일반: 지형도 쉬운→어려운(평지→계단), 명령도 느린→빠른으로 점진. 처음부터 최난도면 학습이 안 된다.
  • 정직(10.7): DR은 갭을 좁히되 없애지 못한다 — 너무 넓히면 보수적, 너무 좁히면 갭. system identification(실측)·실로봇 미세조정과 함께 써야 한다(10.7). "DR만 키우면 다 된다"는 환상.

견해: DR의 기술은 "얼마나" 다 — 약하면 과적합(갭), 강하면 학습 불가/과보수. 적정 범위는 실로봇 파라미터 분포를 덮되 학습 가능한 균형이고, ADR(점진 확대)로 자동 조절한다(커리큘럼). 범위는 system identification(실측, 10.7) 으로 안내하는 것이 이상적. DR만으로는 충분하지 않고 실측·미세조정과 한 팀(10.7) — 갭을 좁히되 없애진 못한다.

9.14.6 Sim2Real 기법 더 — 관측 설계·teacher-student

DR 외에도 전이를 돕는 기법들이 있다(심화·이론은 10.7, 여기선 RL 학습에 직접 쓰는 둘).

증류 ① 관측 설계 (deployable observation) — 학습 관측 = 실로봇에서 실제로 얻을 수 있는 것만 O: 관절각·속도(엔코더)·IMU·명령·이전 행동 X 특권 정보: 정확한 지면 마찰·실제 질량· 미래·전역 위치(실로봇서 못 얻음 → 특권 정보로 학습하면 배포 때 그 입력이 없어 무너짐) ② Teacher-Student (특권 학습, asymmetric) Teacher: 시뮬의 특권 정보(마찰·지형 높이맵 등)까지 보고 잘하는 정책 학습 (쉬움) (또는 critic만 특권 정보 — asymmetric actor-critic) Student: 배포 가능한 관측(엔코더·IMU)만 보고 Teacher를 모방(증류) 배포는 Student (특권 정보 불필요) 보행 로코모션의 표준 기법(발표 사례)
  • 관측 설계가 먼저: 아무리 DR을 해도 관측에 특권 정보(실로봇서 못 얻는 정확한 마찰·전역 위치·미래)가 있으면 배포 때 그 입력이 없어 정책이 무너진다. 관측은 실로봇 센서로 얻을 수 있는 것(엔코더·IMU·명령)으로 한정 — 이것이 전이의 전제.
  • Teacher-Student(특권 학습): 그런데 특권 정보가 있으면 학습이 훨씬 쉽다. 그래서: ① Teacher — 시뮬의 특권 정보(지형 높이맵·정확한 물리)까지 보고 쉽게 잘하는 정책을 학습 ② Student — 배포 가능한 관측만 보고 Teacher의 행동을 모방(증류). 배포는 Student(특권 정보 불필요). 사족 보행에서 거친 지형을 이렇게 정복한 유명한 사례(발표 기준). asymmetric actor-critic(critic만 특권 정보, actor는 배포 관측)도 같은 정신.
  • 그 외(10.7): action smoothing(부드러운 출력), 저수준 컨트롤러 정합(시뮬 게인=실로봇), system identification(실측), 실로봇 미세조정 — 심화는 10.7.
  • 조합: DR(분포 강건) + 관측 설계(배포 가능) + Teacher-Student(어려운 태스크) + sysID/미세조정(10.7)이 함께 Sim2Real을 좁힌다 — 단일 기법이 아니라 묶음.

견해: 전이의 전제는 관측을 실로봇에서 얻을 수 있는 것으로 한정하는 것(특권 정보 금지) — 안 그러면 DR이 무의미. 특권 정보의 학습 이점은 Teacher-Student(특권 Teacher → 배포 가능 Student 증류)로 살린다(거친 지형 보행의 표준). DR·관측 설계·Teacher-Student·sysID(10.7)는 한 묶음 — Sim2Real은 단일 기법이 아니라 전략의 조합이다.

9.14.7 워크스루 — 보행 정책 학습→DR→엣지 배포

전체를 한 흐름으로: 학습 → 랜덤화 → 배포.

# ① 도메인 랜덤화 설정(개념 — config·API는 릴리스 의존, 반드시 확인)
domain_randomization = {
    "friction":   {"range": (0.5, 1.5),  "op": "scale"},   # 마찰 무작위
    "mass":       {"range": (0.85, 1.15), "op": "scale"},  # 질량 ±15%
    "stiffness":  {"range": (0.8, 1.2),  "op": "scale"},   # 게인(9.11)
    "obs_noise":  {"std": 0.02},                            # 관측 노이즈
    "push":       {"interval_s": 5, "max_vel": 1.0},       # 랜덤 외란
    # ADR: 처음 좁게 → 정책 성능 따라 범위 확대(9.14.5)
}
# ② 학습(수천 환경 병렬 + DR, headless GPU, 9.13)
python train.py --task=Isaac-Velocity-Anymal-v0 --num_envs=4096 --headless \
    --max_iterations=1500   # DR은 환경 config에 포함
tensorboard --logdir logs/   # 보상·길이 곡선(랜덤화로 느리지만 전이됨, 9.14.3·9.14.5)

# ③ 평가(play로 행동 확인 — 기행·강건성)
python play.py --task=... --checkpoint=logs/.../model.pt
#   다양한 마찰·외란에도 안 넘어지나(강건성)·기행 없나(reward hacking)

# ④ 배포: 정책 NN → ONNX → TensorRT(5.2) → Jetson(9.1)
python export.py --checkpoint=model.pt --output=policy.onnx     # 정책만 export(작은 MLP)
trtexec --onnx=policy.onnx --saveEngine=policy.plan --fp16      # TensorRT 엔진(5.2)

⑤ 엣지 제어 루프(Jetson, 개념):

while running:
    obs = read_robot_state()       # 엔코더·IMU·명령 → 학습 때와 "같은" 관측 구성 ★
    obs = normalize(obs)           # 학습 때 정규화와 동일하게
    action = policy_trt(obs)       # TensorRT 추론(수십 µs~, 작은 NN)
    apply_to_motors(action)        # 관절 목표(시뮬과 같은 드라이브·게인 9.11)

제어 주파수(예: 50~1000Hz)·게인·관측 구성이 시뮬과 일치해야 전이.

  • 관측 정합이 생명: 배포 시 관측을 학습 때와 정확히 같은 방식(같은 양·순서·정규화·단위)으로 구성해야 한다 — 틀리면 정책이 잘못된 입력을 받아 무너진다. "특권 정보 없는 관측(9.14.6)"이라야 실로봇에서 구성 가능.
  • 추론은 경량이다(9.13): 정책은 작은 MLP라 TensorRT(5.2)로 수십 µs~ 추론 → 고주파 제어 루프에서 실시간(Jetson 9.1). 학습은 거대(데이터센터), 추론은 경량(엣지) — 0.1.
  • 저수준 정합: 시뮬의 드라이브 게인·제어 주파수·액추에이터 모델을 실로봇과 맞춰야 전이된다(9.11·10.7). DR이 이 불확실성을 덮지만, 기본 정합도 중요.
  • 반복(플라이휠): 실로봇서 실패하면 → 그 조건을 DR 범위·sysID(10.7)에 반영 → 재학습. 9.12의 데이터 플라이휠이 RL에도.

견해: 전체 흐름은 DR 설정 → 병렬 학습(곡선은 느려도 전이) → play 검증 → 정책 export → TensorRT(5.2) → Jetson 제어 루프다. 배포의 생명은 관측 정합(학습과 같은 양·정규화, 특권 정보 없이)과 저수준 정합(게인·주파수). 추론은 작은 MLP라 경량이다(0.1). 실패는 DR·sysID(10.7)로 환류해 반복 — Sim2Real은 한 번이 아니라 루프.

9.14.8 중간 점검 (체크포인트)

  • [ ] 학습 워크플로우(환경·PPO·DR 설정 → headless 병렬 학습 → 곡선 모니터 → play 검증 → 배포)를 안다.
  • [ ] 곡선(보상·에피소드 길이·엔트로피)을 읽고 안 오름/정체/붕괴를 진단하며, 곡선↔play 교차(reward hacking)를 안다.
  • [ ] 도메인 랜덤화가 갭의 원천(마찰·질량·게인·지연·노이즈·외란·지형)을 흔들어 분포에 강건하게 하고, 병렬(9.13)과 한 쌍임을 안다.
  • [ ] DR의 "얼마나"(과적합↔학습 불가)와 ADR(점진 확대)·system identification(10.7) 안내를 안다.
  • [ ] 관측 설계(특권 정보 금지) 와 Teacher-Student(특권 학습 증류) 가 전이를 돕는 법을 안다.
  • [ ] 정책을 ONNX→TensorRT(5.2)→Jetson 배포하며 관측·저수준 정합이 전이의 전제임을 안다.

증상→의심: 시뮬은 잘되는데 실로봇 실패 → DR 부족(과적합)·관측 불일치(특권 정보/정규화)·저수준 게인 차이 → DR↑·관측 정합·sysID(10.7). 학습이 안 됨(보상 정체) → DR 너무 강함·보상 셰이핑·탐험 부족·물리 불안정 → DR 좁히기·ADR·엔트로피·물리 안정(9.11). 곡선 좋은데 기행 → reward hacking → play 검증·보상 재설계(9.13·6.5). 배포 후 정책이 떪/이상 → 관측 양·순서·정규화 불일치·제어 주파수·게인 → 학습과 정확히 정합. 정책이 너무 보수적·느림 → DR 과하거나 보상 과보수 → 범위·보상 균형. 추론이 느림(엣지) → TensorRT 미적용·NN 큼 → trtexec·작은 MLP(5.2·9.13).

9.14.9 트레이드오프·대안

결정트레이드오프
강한 DR vs 약한 DR강건·전이 vs 학습 용이·고성능(과적합 위험)
고정 DR vs ADR(자동)단순 vs 점진 커리큘럼(학습 안정·강건)
특권 관측 직접 학습 vs Teacher-Student단순 vs 어려운 태스크 정복(배포 가능)
시뮬만(DR) vs 시뮬+실로봇 미세조정안전·규모 vs 갭 보정(10.7)
상태 기반 vs 비전 기반 정책빠름·전이 쉬움(상태) vs 풍부·시각 갭(렌더·랜덤화)
PPO 큰 배치 vs 작은안정·처리량 vs 샘플 효율·세밀

견해: 로봇 RL의 실전 성패는 "얼마나·무엇을 랜덤화하나" 에 달렸다 — 약하면 갭, 강하면 학습 실패/과보수. ADR(점진 확대) + system identification(실측, 10.7) 으로 범위를 안내하는 것이 최선이고, 어려운 태스크(거친 지형 보행)는 Teacher-Student가 거의 필수. 시뮬만으로 완벽 전이는 드물다 — DR로 좁히고 실로봇 미세조정(10.7)으로 닫는다. 상태 기반은 전이가 쉽고 비전 기반은 시각 갭이 더해져 어렵다(시각 DR·렌더 비용). 핵심: DR·관측 설계·Teacher-Student·sysID·미세조정은 한 팀, 단일 기법 환상 금물.

비엔비디아 정직: 도메인 랜덤화·Teacher-Student·ADR은 학계·업계 공통 기법이다 — OpenAI(Dactyl·ADR), ETH(거친 지형 보행 Teacher-Student), UC Berkeley·CMU(RMA), 다양한 sim2real 연구가 원천. RL 라이브러리도 rl_games·RSL-RL·SKRL·Stable-Baselines3 등 오픈소스. Isaac Lab의 강점은 이 기법들을 대규모 GPU 병렬(9.13)·PhysX·RTX·USD·Isaac 스택에 통합한 것 — 알고리즘 자체는 NVIDIA 고유가 아니다. MuJoCo·Brax 등 다른 시뮬로도 같은 기법을 쓴다. Sim2Real 전이 성공은 로봇·태스크·튜닝·실측 의존이라 보장이 없고, 실로봇 검증이 필수(발표 사례를 자기 로봇으로 단정 금지). 심화 전략은 10.7.

9.14.10 흔한 함정

  • DR 없이 학습. 시뮬 한 물리에 과적합 → 실로봇 무너짐 → 동역학 DR(마찰·질량·게인·외란·노이즈) 필수.
  • DR 너무 강함. 학습 실패 또는 과보수(느린 정책) → ADR로 점진·범위 조정(9.14.5).
  • 관측에 특권 정보. 실로봇서 못 얻는 정확한 마찰·전역 위치·미래로 학습 → 배포 때 무너짐 → 배포 가능 관측·Teacher-Student(9.14.6).
  • 배포 관측 불일치. 학습과 다른 양·순서·정규화·단위 → 정책 오작동 → 정확히 정합(9.14.7).
  • 저수준 정합 무시. 시뮬 게인·제어 주파수·액추에이터가 실로봇과 다름 → 전이 실패 → 정합·DR로 덮기.
  • 곡선만 믿음. reward hacking·기행을 곡선이 못 보여줌 → play로 행동 검증(9.13·6.5).
  • 랜덤화로 곡선 나빠짐을 버그로 오해. DR은 학습을 어렵게 함(정상) → 곡선이 아니라 전이가 목표.
  • 시뮬 성공을 실로봇으로 단정. Sim2Real 갭 → 실로봇 검증·미세조정(10.7).
  • 거대 정책 NN. 엣지 추론 고부하 → 작은 MLP·TensorRT(5.2·9.13).
  • system identification 생략. DR 범위를 감으로 → 실측으로 안내가 이상(10.7).

9.14.11 연습문제

연습 1 (학습·곡선). 보행 정책 학습의 워크플로우를 단계로 설명하고, 학습 곡선(보상·에피소드 길이·엔트로피)을 어떻게 읽어 "안 오름·정체·붕괴"를 진단하는지, 왜 곡선만으로 부족한지 답하라.

정답

워크플로우: ① 태스크/환경 정의(씬·관측·행동·보상·종료, 9.13) + 환경 수 N. ② RL 라이브러리(rl_games/RSL-RL) + PPO config(LR·rollout·minibatch·γ·λ·엔트로피). ③ 도메인 랜덤화 설정(9.14.4). ④ headless GPU 병렬 학습(수천 환경, 수천만~수억 스텝). ⑤ TensorBoard로 곡선 모니터·체크포인트. ⑥ play로 행동 관찰. ⑦ 조정·반복. ⑧ 배포(TensorRT 5.2). 곡선 읽기: 보상(1순위) — 우상향=학습 중. 안 오름 → 보상 신호 약함(셰이핑)·탐험 부족(엔트로피↑)·물리 불안정(9.11)·LR 부적절. 정체 → 국소 최적·DR 과함·태스크 한계·하이퍼. 붕괴(올랐다 떨어짐) → 불안정(LR 큼·보상 스케일·발산)·정책 무너짐 → LR↓·보상 정규화. 에피소드 길이 — 생존(보행이면 안 넘어짐). 보상 높아도 짧으면(금방 넘어짐) 문제 → 길이+보상 함께. 엔트로피 — 탐험 정도. 너무 빨리 떨어지면 조기 수렴(국소). 곡선만으론 부족한 이유: 곡선(보상↑)이 좋아도 정책이 reward hacking(9.13·6.5) — 보상의 빈틈을 악용한 기행(미끄러지며 전진 점수·관절 진동)일 수 있다. 곡선은 "보상이 오르는지"만 보여주지 그 행동이 의도대로인지는 못 보여준다 → play 모드로 렌더하며 실제 행동을 눈으로 확인해야 한다. 또 DR을 켜면 곡선이 나빠 보여도(어려운 분포) 정상이며 전이엔 더 낫다 → 보기 좋은 곡선이 아니라 전이되는 정책이 목표. 철칙: 곡선↔play 교차 검증.

연습 2 (DR의 무엇·병렬). 도메인 랜덤화로 무엇을 흔드는지(제어 RL 기준) 범주별로 들고, 각 항목이 어떤 Sim2Real 갭을 좁히는지, 그리고 대규모 병렬(9.13)이 왜 랜덤화와 한 쌍인지 설명하라.

정답

무엇을(제어/RL — 동역학 중심): ① 물리·동역학 — 마찰계수(지면·발 접촉 갭), 질량·관성(적재·제작 편차), 드라이브 게인 stiffness/damping(액추에이터 비이상 9.11), 모터 강도·action delay(실액추에이터 지연). ② 센서·관측 — 관측 가우시안 노이즈(실센서 노이즈), 관측 지연·dropout(통신·처리 지연). ③ 외란 — 매 N스텝 랜덤 푸시/힘(외부 충격·균형 회복). ④ 지형·씬 — 지면 거칠기·경사·계단·장애물(환경 다양성). (비전 기반이면 시각: 조명·텍스처·카메라 — 9.12.) 각 항목이 좁히는 갭: 마찰/질량/게인 = 동역학 갭(시뮬 물리 ≠ 실물리)을 정책이 견디게. 노이즈/지연 = 센서·제어 갭. 외란 = 모델 안 한 교란에 강건. 지형 = 환경 일반화. 공통: 실로봇과 시뮬이 다른 지점(갭의 원천)을 무작위로 흔들어 정책이 그 변동을 견디게 → 실로봇도 "또 하나의 변형"처럼. 병렬과 한 쌍인 이유: 도메인 랜덤화는 정책이 분포 전체를 봐야 효과가 있다. 대규모 병렬(9.13)은 수천 환경이 각각 다른 물리(env 0: 마찰 0.6·질량 큼, env 1: 마찰 1.4·질량 작음…)를 동시에 시뮬하므로, 정책이 한 배치에 분포 전체를 한꺼번에 본다 — 랜덤화가 대규모에서도 거의 추가 비용이 들지 않는다. CPU 단일 환경이면 다른 물리를 시간순으로 하나씩 겪어야 해 비효율. 즉 병렬은 처리량(9.13)만이 아니라 랜덤화의 효율도 준다 — 수천 변형을 동시에 경험. 그래서 "GPU 병렬 + DR"이 Isaac Lab Sim2Real의 한 쌍. 정직: DR은 갭을 좁히되 없애진 못함(10.7).

연습 3 (얼마나·ADR). DR 범위가 너무 좁을 때와 너무 넓을 때 각각 무엇이 문제인지 설명하고, 적정 범위를 어떻게 정하며 ADR(자동 도메인 랜덤화)이 어떻게 돕는지 답하라.

정답

너무 좁게(약한 DR): 정책이 특정 시뮬 물리에 과적합 → 시뮬 보상은 높지만(곡선 예쁨) 실로봇의 (다른) 물리에서 무너짐(갭 안 닫힘). 약한 DR은 DR 없는 것과 비슷한 위험. 너무 넓게(강한 DR): ① 정책이 분포를 못 배움 — 너무 다양해 일관된 행동을 학습 못 함(수렴 실패·보상 정체) ② 배워도 지나치게 보수적 — 모든 극단적 경우에 안전하려다 느리고 소극적인 차선 정책 ③ 비현실적 물리(실제로 없는 마찰/질량)까지 포함해 쓸데없이 어려움. 적정 범위 정하기: 이상적으론 실로봇의 실제 파라미터 분포를 덮도록 — 실로봇의 마찰·질량·게인을 측정(system identification, 10.7) 해 그 불확실성 범위 + 여유. 측정 없이는 보수적으로 넓게 잡되 학습 가능한 한도에서. 즉 "현실의 불확실성은 덮되 학습 가능하고 과보수 아닌" 균형. ADR(자동 도메인 랜덤화): 범위를 고정하지 않고 점진 확대 — 처음엔 좁게(쉬움) 시작해 정책이 그 범위에서 잘하면 범위를 넓힌다(어려움). 정책 성능에 맞춰 랜덤화 난이도를 자동 조절(커리큘럼의 랜덤화판). 효과: ① 처음부터 넓은 범위로 학습 실패하는 것을 피함(쉬운 데서 시작) ② 정책이 강해질수록 점점 강건하게(범위 확대) ③ 수동 범위 튜닝 부담↓. OpenAI Dactyl(손 조작)이 ADR로 강건성을 얻은 발표 사례. 지형·명령도 쉬운→어려운 커리큘럼과 같은 정신. 정직: ADR·적정 범위도 Sim2Real을 좁히되 보장 못 함 — system identification(실측)·실로봇 미세조정(10.7)과 함께. "DR만 키우면 다 된다"는 환상이고, 과한 DR은 과보수 정책을 낳는다.

연습 4 (관측 설계·Teacher-Student). "관측에 특권 정보를 넣으면 안 된다"는 말의 의미와 이유를 설명하고, 그럼에도 특권 정보의 학습 이점을 살리는 Teacher-Student(특권 학습)가 어떻게 동작하는지 답하라.

정답

특권 정보 금지의 의미·이유: 특권 정보(privileged information)는 시뮬에선 알지만 실로봇에선 못 얻는 것 — 정확한 지면 마찰계수, 실제 질량, 지형 높이맵, 전역 위치, 미래 상태 등. 정책의 관측에 이를 넣어 학습하면, 정책이 그 입력에 의존해 행동을 정한다. 그런데 배포(실로봇) 때는 그 입력을 구성할 수 없으므로(센서로 못 얻음) 정책이 잘못된/없는 입력을 받아 무너진다. 그래서 학습 관측은 실로봇 센서로 실제 얻을 수 있는 것(관절각·속도=엔코더, IMU, 명령, 이전 행동)으로 한정해야 전이된다 — 이것이 DR보다 먼저인 전제(특권 정보가 있으면 DR도 무의미). Teacher-Student(특권 학습)의 동작: 문제는 특권 정보가 있으면 학습이 훨씬 쉽다(예: 지형 높이맵을 알면 거친 지형 보행을 쉽게 배움). 이 이점을 버리지 않으려고 두 단계: ① Teacher — 시뮬에서 특권 정보까지 보고(지형·정확한 물리) 잘하는 정책을 학습. 특권 정보 덕에 어려운 태스크도 학습 성공. ② Student — 배포 가능한 관측(엔코더·IMU만)으로 Teacher의 행동을 모방(증류, distillation). Student는 특권 정보 없이, 관측 이력(과거 몇 스텝)으로 숨은 상태(지형·물리)를 암묵 추정하며 Teacher를 따라함. 배포는 Student(특권 정보 불필요). 변형: asymmetric actor-critic — critic(가치 함수, 학습 때만 씀)은 특권 정보를 보고 actor(정책, 배포됨)는 배포 관측만 → 학습은 특권 정보로 안정적, 배포는 관측만. ETH의 거친 지형 사족 보행이 이 기법의 유명 사례(발표 기준). 요지: 관측 설계(특권 정보 금지)는 전이의 전제이고, Teacher-Student는 특권 정보의 학습 이점과 배포 제약을 둘 다 만족시키는 다리 — 어려운 로코모션·매니퓰레이션의 표준. DR과 함께 쓴다.

연습 5 (배포·전체 루프). 학습된 정책을 Jetson에 배포하는 흐름을 단계로 설명하고, "관측 정합"과 "저수준 정합"이 왜 전이의 생명인지, 실로봇 실패가 어떻게 학습으로 환류되는지(플라이휠) 답하라.

정답

배포 흐름: ① 정책 export — 학습된 정책 NN(작은 MLP)을 ONNX로 export(정책만, 가치 함수·학습 코드 제외). ② TensorRT 엔진 — trtexec로 ONNX→.plan(FP16 등, 5.2), Jetson 타깃에서 빌드(9.2). ③ 엣지 제어 루프(Jetson 9.1): 반복 — 로봇 상태 읽기(엔코더·IMU·명령) → 학습 때와 같은 관측 구성·정규화 → TensorRT 추론(action) → 모터에 적용(관절 목표). 작은 MLP라 추론 수십 µs~ → 고주파 제어(50~1000Hz) 실시간. 관측 정합이 생명: 정책은 학습 때 본 특정 관측 형식(양·순서·정규화·단위·이전 행동 포함 여부)에 맞춰 행동을 배웠다. 배포 시 관측을 정확히 같은 방식으로 구성·정규화해야 정책이 의미 있는 입력을 받는다 — 하나라도 다르면(순서 바뀜·정규화 누락·단위 차이) 정책이 잘못된 입력에 잘못된 출력 → 무너짐. 그리고 관측은 특권 정보 없이(9.14.6) 실로봇에서 구성 가능해야. 저수준 정합이 생명: 시뮬의 드라이브 게인·제어 주파수·액추에이터 모델(9.11)이 실로봇과 다르면, 같은 action이 다른 움직임을 내 전이 실패. DR이 이 불확실성을 덮지만, 기본 정합(게인·주파수 맞추기)도 필요. 플라이휠(9.12·8.14): 실로봇서 실패하면(특정 지형·속도서 넘어짐) → ① 그 실패 조건을 DR 범위에 추가하거나 ② system identification(10.7) 으로 실로봇 파라미터를 측정해 시뮬을 보정하거나 ③ 실로봇 데이터로 미세조정(10.7) → 재학습 → 재배포 → 재검증. 즉 "학습→배포→실패→환류→재학습"의 루프. 시뮬이 학습·검증을 모두 담당하니 빠른 반복. 정직: 한 번에 완벽 전이는 드물다 — DR·관측/저수준 정합·플라이휠·실로봇 검증이 함께여야(10.7). 추론은 경량이지만(작은 NN, 9.13) 전이는 별개 문제. 핵심: 학습은 거대 병렬(데이터센터), 추론은 경량(엣지, 0.1), 전이는 정합+DR+반복.

9.14.12 요약 · 다음 장

  • 학습 워크플로우: 환경·PPO·DR 설정 → headless 병렬 학습(9.13) → 곡선 모니터 → play로 행동 검증(reward hacking) → 배포. 상태 RL은 렌더 끄고 N 최대.
  • 곡선 읽기: 보상(우상향?)·에피소드 길이(생존?)·엔트로피(탐험?)로 진단. 곡선↔play 교차 필수(곡선만 믿지 마라). DR로 곡선 나빠짐은 정상(전이가 목표).
  • 도메인 랜덤화: 갭의 원천(마찰·질량·게인·지연·노이즈·외란·지형)을 흔들어 분포에 강건. 병렬과 한 쌍(수천 환경이 다른 물리 동시). "얼마나" 가 기술 — 과적합↔학습 불가, ADR(점진)·sysID(실측 10.7)로 안내.
  • 전이 기법 더: 관측 설계(특권 정보 금지 = 전이 전제)·Teacher-Student(특권 Teacher→배포 Student 증류, 거친 지형 보행 표준). DR·관측·Teacher-Student·sysID는 한 팀.
  • 배포: 정책 → ONNX → TensorRT(5.2) → Jetson(9.1). 관측·저수준 정합이 전이의 생명. 추론은 작은 MLP(0.1 학습=거대/추론=경량). 정직: DR은 갭을 좁히되 보장 못 함 — 실로봇 검증·미세조정(10.7), 기법은 학계 공통.

제9부 로보틱스(9.1~9.14) 완료 — Jetson(9.1~9.4)·DeepStream/VPI(9.5·9.6)·Isaac ROS(9.7·9.8)·인지/매니퓰레이션(9.9·9.10)·Isaac Sim(9.11·9.12)·Isaac Lab(9.13·9.14).

다음 장: 10.1 Omniverse I — Kit·확장·앱. Isaac Sim·Lab이 무엇 위에 서 있나(9.11.3)를 미뤄뒀다 — 이제 그 토대인 Omniverse 플랫폼으로 간다. 앱 프레임워크 Kit와 확장(extension) 구조, Omniverse가 어떻게 USD·RTX·PhysX를 묶어 Isaac Sim 같은 앱과 디지털트윈(10.8)을 만드는지. 로보틱스에서 플랫폼·시뮬레이션 기반으로.