번외. 넉 달 묵은 버전을 45분 만에 올린 이야기

시리즈 내내 우리는 Genesis 1.0.0을 썼습니다. 그 사이 세상은 1.4.0까지 갔더군요. 이 글은 “왜 안 올렸나”라는 반성문이자, “올릴 때 뭘 확인해야 하나”라는 절차서이고, 결말은 뜻밖의 해피엔딩입니다.


우리는 왜 구버전을 쓰고 있었을까요?

발단은 다른 질문이었습니다. 요즘 화제인 VLA(비전-언어-행동 모델)나 월드 모델과 시뮬레이터를 결합하는 작업을 Genesis로도 할 수 있는지 찾아보다가, 우리가 쓰는 버전이 1.0.0이고 최신이 1.4.0이라는 걸 그제서야 알았습니다. 넉 달치 업데이트를 놓치고 있었던 거죠.

변명부터 하자면, 시작은 죄가 없습니다. 배포 기록을 확인해 보니 1.0.0은 2026년 5월 27일에 나왔고 우리는 5월 30일에 설치했습니다. 나온 지 사흘 된 최신 정식판으로 시작한 겁니다.

문제는 그다음입니다. 8월 말에 시리즈를 재개할 때는 이미 1.2, 1.3이 나와 있었는데, 우리는 버전을 검토조차 하지 않고 기존 환경을 그대로 썼습니다. 솔직히 말하면 결정이 아니라 관성이었습니다. 다만 결과적으로는 그 관성이 옳았습니다:

  • 시리즈 후반의 뼈대가 “예전 정책을 재검증하고 이어 학습하기”였는데, 엔진을 올리면 물리의 미세한 수치가 달라져 기존 체크포인트와의 비교가 공정하지 않게 됩니다.
  • 셔플 대 교정 걸음, 계단 커리큘럼, 씨드 재현 같은 비교 실험이 전부 같은 물리 위에서 이뤄졌기에 성립했습니다.
  • 00편에서 우리 손으로 적어둔 “환경 박제” 원칙과도 맞고요.

그러니 교훈의 절반은 이렇습니다: 시리즈가 진행 중일 때는 버전을 함부로 올리지 마라. 그리고 나머지 절반은, 올려야 할 때가 오면 어떻게 올리느냐입니다.

업그레이드가 무서운 진짜 이유

버전 업그레이드가 무서운 건 “안 돌아갈까 봐”가 아닙니다. 안 돌아가면 오히려 다행이죠 — 에러는 눈에 보이니까요. 무서운 건 돌아가는데 미묘하게 다른 것입니다. 접촉 계산이 조금 달라져서 걸음 지표가 슬금슬금 밀리는데 아무 에러도 없는 상황. 이 시리즈에서 배운 말로 하면, 업그레이드는 “그럴듯한 성공”을 만들 수 있는 또 하나의 경로입니다.

그래서 원칙을 세웠습니다:

  1. 기존 환경은 건드리지 않는다. 새 conda 환경에 1.4.0을 따로 깔고, 1.0.0 환경은 시리즈의 박제본으로 보존합니다. 실패해도 잃는 게 없습니다.
  2. 합격 기준을 먼저 정한다. 물리가 조금 달라지는 건 정상이므로, “수치 동일”이 아니라 “낙상 없이 동작하고 걸음 지표가 같은 범위(±10~20%)”를 합격선으로 잡았습니다.
  3. 검증은 새로 만들지 않는다. 시리즈 내내 쌓아 온 검증 도구들 — 걸음 지표 측정, 조종 시나리오, 무작위 밀치기 반복 시험, 계단 지면 로그 — 을 그대로 회귀 시험으로 돌립니다. 이 도구들이 이번에 두 번째 밥값을 하는 셈입니다.

45분의 기록

실제 진행은 이랬습니다.

설치 (약 25분) — 새 환경에 Genesis 1.4.0 + PyTorch 2.14 + rsl-rl 5.5.1. 대부분 다운로드 기다리는 시간입니다.

스모크 (약 5분) — 우리 환경 코드를 1.4에서 처음 돌리자마자 에러가 났습니다. 뷰어 옵션 이름이 max_FPS에서 refresh_rate로 바뀐 것. 넉 달치 업데이트에서 우리 코드와 부딪힌 API 변화는 이것 하나였고, 두 버전 모두에서 도는 분기 한 줄로 끝났습니다.

회귀 시험 (약 15분) — 1.0에서 학습한 정책들을 1.4 물리 위에서 그대로 평가했습니다.

시험 1.0.0 1.4.0
걸음 지표 (들림/보폭/간격) 7.9~8.0cm / 29cm / 13cm 7.9~8.0cm / 29cm / 13cm
조종 시나리오 회전각 4개 +2.2 / +101.8 / +0.9 / −99.1° +2.2 / +101.8 / +0.9 / −99.1°
무작위 밀치기 20회 20회 회복 20회 회복
계단 4cm 등반 (지면 로그) +0.285m, 낙상 0 +0.285m, 낙상 0
학습 경로 (짧은 시험 학습) 정상 정상

오차 0이라는 뜻밖의 결과

±20%를 각오하고 잡은 합격선이 민망하게, 모든 수치가 소수점까지 동일했습니다. 버전이 넷 올라가는 동안 렌더러도 컴파일러도 바뀌었지만, 우리가 쓰는 강체 물리 계산은 같은 입력에 같은 출력을 내는 결정론적 재현을 유지하고 있었던 겁니다.

이게 실무적으로 왜 좋은 소식이냐면:

  • 기존 체크포인트가 전부 새 버전에서 그대로 유효합니다. 재학습 없이 이어 쓸 수 있고, 과거 실험과의 수치 비교도 계속 공정합니다.
  • 업그레이드 비용이 “며칠짜리 이식 작업”이 아니라 “한 줄 수정 + 45분 검증”으로 끝났습니다. 검증 배터리를 미리 만들어 둔 덕입니다.

물론 일반화는 금물입니다. 다음 업그레이드도 이러리라는 보장은 없고, 우리가 안 쓰는 기능(유체, 연체, 새 렌더러)까지 같다는 뜻도 아닙니다. 확인한 범위만큼만 믿는 것 — 이 시리즈가 내내 연습해 온 태도 그대로입니다.

그래서 왜 올렸냐면

1.4.0에는 이 시리즈의 다음 이야기와 직결되는 것들이 들어 있습니다. 시뮬레이션 전체를 파일로 녹화했다가 되감아 볼 수 있는 궤적 기록 기능, 강화학습에 쓸 수 있는 촉각 센서, 그리고 조작(manipulation) 실험에 바로 쓸 수 있는 Franka 로봇 팔 내장 에셋 같은 것들요.

한 가지 고백도 해 두겠습니다. 조사 초기에 저희는 “1.4가 로봇 학습 데이터 표준 형식 (LeRobot)으로 내보내기를 지원한다”고 알고 있었는데, 패키지를 직접 뒤져 보니 오픈소스 버전에는 그런 기능이 없었습니다. 개발사의 상용 플랫폼 이야기가 오픈소스 기능처럼 소개된 글들을 그대로 믿었던 거죠. 다행히 시뮬레이션 궤적을 표준 형식으로 기록하는 일은 LeRobot 쪽 도구로 직접 할 수 있다는 걸 확인했습니다만 — 인터넷의 소개 글이 아니라 설치된 패키지가 진실이라는 것, 이것도 “확인한 범위만큼만 믿기”의 한 사례로 남겨 둡니다.

방향 자체는 분명합니다. 시뮬레이터가 “물리 실험실”에서 “로봇 AI를 위한 데이터 공장”으로 확장되고 있고, 우리도 그 문 앞까지 온 겁니다.

정리하면 이번 번외편의 요점은 세 가지입니다.

  1. 진행 중인 시리즈에서는 버전을 고정하라 — 비교의 공정성이 최신 기능보다 귀합니다.
  2. 올릴 때는 새 환경에서, 미리 정한 합격선으로, 기존 검증 도구를 돌려라.
  3. 그 검증 도구는 만들 때는 비용이지만, 두고두고 이자를 줍니다. 이번엔 45분이라는 이자를 받았습니다.

이 시리즈의 전체 글 목록 → 시리즈 목차