← BLOG✎ 편집

논문은 안다고 착각하게 만듭니다: VLA를 직접 돌려 검증한 기록

VLA(Vision-Language-Action) 논문 다섯 편을 정독했습니다. OpenVLA와 π0, ACT, 거기에 서베이 한 편. 노트를 다섯 섹션으로 쪼개 정리하고 나니 이 분야를 좀 안다는 기분이 들었습니다. 그 기분은 모델을 제 GPU에 올리는 순간 깨졌습니다.

읽어서 아는 것과 돌려서 아는 것은 다른 종류의 앎입니다. 논문이 보여 주는 것은 깔끔하게 정리된 결과 표입니다. 그 표 한 줄을 내 손으로 재현하려면 책에 없는 벽을 여럿 넘어야 합니다. 두 모델을 같은 자리에 세워 보고, 제가 무엇을 잘못 알았는지까지 들킨 기록을 적어 둡니다.

모델이 갈리는 진짜 지점

VLA는 카메라 이미지와 말을 받아 로봇 팔의 동작을 내놓는 모델입니다. "접시 옆 그릇을 집어" 같은 한 문장이 입력입니다. 요즘 모델들은 뼈대가 닮았습니다. 큰 비전-언어 모델을 백본으로 깔아 둡니다. 갈림길은 마지막 한 걸음, 동작을 어떻게 표현하느냐입니다.

OpenVLA는 동작을 단어처럼 다룹니다. 연속적인 팔의 움직임을 잘게 토큰으로 쪼갠 뒤, 문장을 쓰듯 한 토큰씩 내놓는 방식. π0 계열은 정반대입니다. 동작 한 묶음을 통째로, flow matching이라는 연속 생성 기법으로 한 번에 빚어냅니다. 같은 일을 하는데 출력의 문법이 전혀 다른 셈입니다.

이산 토큰 (OpenVLA)
  • 동작을 잘게 토큰으로 쪼갬
  • 문장 쓰듯 한 토큰씩 생성
  • 쉬운 과제는 90%+, 어려운 과제서 붕괴
flow matching (π0.5)
  • 동작 묶음을 통째로 생성
  • 연속 분포를 한 번에 빚음
  • 어려운 과제서도 94% 유지

이 차이가 성능을 가르는가. 그것이 제 질문이었습니다. 다만 논문 속 숫자들은 잰 환경이 제각각이라 직접 포개기 어려운 값입니다. 그래서 둘을 같은 자리에 세워 보기로 했습니다.

표 한 줄을 재현하는 데 드는 벽

계획은 단순했습니다. 두 모델을 같은 LIBERO 시뮬레이터에 올려 성공률을 재는 것. 현실은 전혀 단순하지 않았습니다.

첫 벽은 세그폴트였습니다. 시뮬레이터의 렌더링 엔진과 모델의 텐서 라이브러리가 한 프로세스 안에서 충돌해 그냥 죽어 버립니다. 해법은 둘을 떼어 놓는 것. 모델은 서버로, 시뮬레이터는 클라이언트로. REST로 대화시키니 그제야 살아났습니다.

다음은 GPU. 최신 Blackwell 카드(RTX 5090)를 기본 빌드된 텐서 라이브러리가 못 알아봤습니다. 맞는 빌드를 따로 물리고, 패키지 매니저가 자꾸 옛 버전으로 되돌리는 통에 인터프리터를 직접 가리켜 우회했습니다. 마지막은 체크포인트. 공식 가중치는 구글 클라우드에 있는데, 윈도우용 다운로드 도구가 리눅스 파일시스템에 큰 파일을 못 썼습니다. 빈 에러만 여섯 번. 결국 파이썬으로 직접 받아 돌아갔습니다.

이런 벽은 논문에 한 줄도 없습니다. 그런데 이걸 다 넘겨야 표의 첫 숫자가 나옵니다. 한 번 넘은 벽은 다시 넘기 아까운 법입니다. 그래서 해법을 설치 스크립트 한 파일에 박아 두었습니다. 다음 사람은 같은 데서 헤매지 않도록. 돌이켜 보면 제가 만든 건 비교 숫자가 아니라 그 도구였습니다.

그래서 누가 이겼나

같은 LIBERO 과제 열 개를 각각 50번씩, 총 500번. 양쪽을 똑같은 조건으로 세웠습니다.

+21%p같은 500회 평가에서 flow matching(π0.5)이 이산 토큰(OpenVLA)을 앞선 격차LIBERO libero_spatial, n=500, 2026

flow matching을 쓰는 π0.5가 98.4퍼센트, 토큰을 쓰는 OpenVLA가 77.4퍼센트. 차이는 21퍼센트포인트로, 우연으로 보기엔 너무 큰 격차였습니다.

더 흥미로운 건 격차가 벌어지는 위치입니다. 평평한 바닥의 그릇을 집는 쉬운 과제는 두 모델 다 90퍼센트를 넘겼습니다. 정작 격차는 어려운 곳에서 터졌습니다. 그릇이 다른 그릇 위에 얹힌, 가려지고 높이가 있는 과제. 여기서 OpenVLA는 36퍼센트까지 주저앉았고 π0.5는 94퍼센트를 지켰습니다. 동작 표현의 차이는 쉬운 일에선 숨어 있다가 어려운 공간 추론에서 비로소 모습을 드러냈습니다.

내가 틀렸던 자리

여기서 끝났으면 깔끔한 승리담이었을 것입니다. 그런데 이 글을 쓰게 만든 진짜 사건은 따로 있습니다.

처음 비교했을 때 저는 OpenVLA를 세 과제에서 다섯 번씩, 열다섯 번만 측정했습니다. 결과는 73퍼센트. π0.5의 99퍼센트 옆에 놓으니 격차가 어마어마해 보였고, 저는 "26퍼센트포인트 차이"라고 적었습니다. 그게 과장이었습니다.

표본 열다섯 개는 너무 적은 수입니다. 같은 세 과제를 50번씩, 150번으로 다시 쟀습니다. 결과는 OpenVLA 89퍼센트. 73퍼센트는 실력이 못 되는 숫자였습니다. 열다섯 번 중 운이 나빴을 뿐입니다. 표본만 키웠을 뿐인데 같은 모델이 16퍼센트포인트 올라간 것입니다.

처음 이걸 짚어 준 쪽은 제가 아니었습니다. 교차검증을 맡긴 다른 모델이 "서로 다른 과제 집합끼리 신뢰구간을 비교하고 있다"고 지적했습니다. 부끄럽지만 맞는 말. 그래서 양쪽을 똑같이 500번으로 다시 쟀습니다. 진짜 격차는 21퍼센트포인트. 여전히 flow matching의 승리지만, 처음 적은 26에는 거품이 섞여 있었습니다.

숫자를 다루는 일에서 무서운 건 틀린 숫자가 아니라 그럴듯한 숫자입니다. 73과 99는 너무 깔끔해서 의심이 들지 않았습니다. 작은 표본일수록 큰 격차를 손쉽게 지어내는 법입니다.

읽기와 돌리기 사이

논문을 덮었을 때 저는 동작 표현의 차이를 안다고 믿었습니다. 직접 돌려 보고 나서야 그 앎이 절반이었음을 알았습니다. 어떤 과제에서 격차가 벌어지는지, 재현에 어떤 벽이 있는지, 제 측정이 어디서 흔들리는지. 표를 읽어서는 닿지 않는 것들입니다.

피지컬 AI를 공부하며 원칙 하나가 생겼습니다. 개념은 코드로 내려 보고, 주장은 숫자로 검증하고, 그 숫자가 내 편이어도 한 번 더 의심한다. 모델이 21퍼센트포인트로 이긴 사실보다, 제가 26을 21로 내려 적은 그 교정이 더 오래 남을 것 같습니다. 혹시 지금 어떤 결과 표를 그대로 믿고 계신다면, 한 줄만 직접 재현해 보세요. 거기서 보이는 것이 종이에 적힌 것보다 많을 때가 있습니다.

참고
  • OpenVLA: An Open-Source Vision-Language-Action Model (openvla/openvla)
  • π0 / openpi (Physical Intelligence)
  • LIBERO: Benchmarking Knowledge Transfer for Lifelong Robot Learning
이 글 공유