← 목록으로

퀄컴 NPU에서 VLA 실시간 구동하기: 백본 선정부터 제어 루프까지 실측 기록

요약
  • 퀄컴 Dragonwing IQ-9075 NPU에서 VLA 백본들을 실측하여 로봇팔을 실시간 구동한 기록이다.
  • GR00T N1.7 백본 선정, 그래프 및 런타임 최적화, 제어 루프 비동기화를 거쳐 E2E 레이턴시를 단축하고 장시간 연속 구동을 달성했다.
  • 퀄컴 Dragonwing IQ-9075(Hexagon NPU ×2)에 VLA(Vision-Language-Action) 백본 5종을 올려 실측하고, SO-101 로봇팔을 실시간 구동한 기록
    • 태스크: 자연어로 지정한 색의 큐브만 집어 옮기는 pick-and-place. 방해 큐브가 함께 놓여 있고, 놓은 자리가 다음 태스크의 시작점이 되는 연쇄 구성
  • 공개된 VLA 레이턴시는 대부분 데이터센터 GPU 기준이라, 임베디드 NPU에서 얼마나 벌어지는지는 직접 재는 수밖에 없었음
  • 실시간 목표는 320~400ms. 첫 백본은 68%를 줄이고도 기각함. LLM을 0으로 놓아도 약 415ms가 남았기 때문
  • 백본을 GR00T N1.7로 바꿔 E2E를 1,602.4ms에서 약 230ms로 단축
  • 모델이 기준 안에 들어온 뒤에도 팔이 멈춤. 원인은 제어 루프의 동기식 카메라 대기였고, 팔 정지 501ms → 247ms, 관측 지연 700ms → 58ms
  • 최종 구성에는 가장 빠른 230ms를 쓰지 않음. RTC가 1-step 증류 모델에는 붙지 않기 때문

실시간 기준 정의

  • SO-101 관절은 30Hz지만, VLA는 스텝을 하나씩 내지 않고 액션 청크(GR00T N1.7 기준 32스텝, 약 1초)를 통째로 냄
    • 기본 sync 모드는 청크를 다 쓴 뒤 다음 추론을 함. 추론 시간이 그대로 팔의 정지 시간이 됨
  • Jetson Thor에서 MolmoAct2(flow matching 10-step)를 돌렸을 때 356~373ms 구간에서 동작이 끊기지 않아, 여유를 두어 정함

첫 백본 MolmoAct2 기각

  • 온디바이스 추론 스택이 모델 하나를 NPU 하나에 올리는 구조라 두 NPU를 다 쓰지 못했음. 그래프를 두 NPU에 분할하는 자체 런타임과 그래프 최적화로 E2E 3,681ms → 1,173.9ms
    • Action Head를 1스텝으로 압축한 배포 구성에서 구간별 프로파일링: LLM 775.8ms / Vision Encoder 278.5ms / Action Head 136.6ms
    • LLM을 뺀 나머지만으로 이미 기준 상단 400ms를 넘김
  • LLM 구간은 작은 연산이 직렬로 늘어서 있어 양자화·프루닝이 잘 듣지 않고, 듣는 건 모델 구조가 정하는 시퀀스 길이임. 기법이 아니라 구조의 한계로 판단하고 백본을 교체함

백본 스크리닝과 5종 실측

  • 후보 12종을 네 기준으로 걸렀음: Step Distillation 가능 여부, Temporal Caching 가능 여부, Vision Token Pruning 유효 여부, 베이스라인 레이턴시. 3개 이상 충족한 4종에 MolmoAct2를 더해 5종을 같은 보드에 올림
    • 정확도는 기준에서 뺌 — 환경마다 파인튜닝이 필수라 문헌 정확도가 SO-101 위의 값을 말해주지 않음
  • LIBERO 폐루프에서 성공률 손실 1%p 안까지 기법을 쌓았을 때의 가속 배수(LIBERO 기준)는 GR00T N1.7 7.0배, MolmoAct2 3.8배, X-VLA 2.7배, VLA-JEPA 2.1배, Pi-0.5 2.1배. 같은 기법도 구조에 따라 세 배 넘게 벌어짐
  • 최종 선정은 최적화 후 레이턴시와 SO-101 실기 성공률을 함께 놓고 했고, 실기 성공률 80%의 GR00T N1.7을 고름
  • Vision Token Pruning은 스크리닝을 통과하고도 쓰지 않음. LIBERO에서는 성립했으나 실기에서 10회 중 0회
    • 상단 카메라의 큐브가 24픽셀 남짓이라 소형 물체의 위치 정보가 토큰과 함께 잘린 것으로 분석함

GR00T N1.7 최적화 결과 (IQ-9075 E2E 실측)

  • 그래프·런타임 최적화만으로 Baseline 1,602.4ms → 399.0ms. 실시간 기준 상단에 들어옴
  • Step Distillation으로 2-step 287.4ms, 1-step 증류(drift) 약 230ms. E2E 기준 Baseline 대비 약 7배

제어 루프 병목

  • 모델이 실시간 기준 안에 들어온 뒤에도 팔이 서 있는 시간은 501ms로 기준 밖이었음
  • 제어 루프가 매번 동기로 프레임을 기다리는 구조였음. 프레임당 약 96.5ms 대기가 1초 넘던 추론 시간에 묻혀 있다가, 추론이 줄자 드러남
  • 카메라 스레드를 분리해 최신 프레임을 버퍼에 상시 갱신하고, 제어 루프는 버퍼를 참조만 하도록 바꿈. 모델 코드는 한 줄도 수정하지 않음
    • 프레임 읽기 약 96.5ms → 0.1ms 대 / 팔 정지 501ms → 247ms / 관측 지연 700ms → 58ms
  • sync 모드에서는 청크가 전환되는 순간 팔이 미세하게 튀었음. 청크 경계에 시간적 스무딩(LiPo 계열 참고 구현)을 얹어 jerk RMS 5.175 → 0.110 (open-loop 기준)
  • n_action_steps는 16/24/32를 비교함. 32로 올리면 움직임은 부드러워지지만 새 관측으로 재판단하는 주기가 길어져 반응성이 떨어짐. 기본값은 16 유지
  • 모델이 기준 안에 들어와도 병목은 제어 루프에 남음

최종 구성의 트레이드오프

  • 230ms 1-step 증류 대신 flow matching 모델에 RTC(Real-Time Chunking)를 얹은 구성을 올림
    • RTC는 앞 청크 실행 중 다음 청크를 추론해 이어 붙임. 추론 한 번은 더 길어지지만 팔은 서지 않음
    • RTC는 flow matching의 연속성을 쓰므로 스텝을 1까지 줄인 모델에는 적용 불가
  • 공짜는 아니었음. 15도를 넘는 action spike가 RTC 165회, sync 0회
    • 한 스텝의 목표 이동 폭에 상한을 걸어 눌렀음
  • Jetson Thor에서 1시간 연속 구동으로 비교했을 때 RTC가 시간당 성공 약 37% 많고, 평균 성공 시간도 34.3초로 약 21% 짧았음
  • 사람이 개입하지 않고 장시간 연속 구동하는 것이 요구 조건이었음. 최저 레이턴시보다 사이클이 끊기지 않는 쪽이 중요하다고 판단함

결론

  • 단일 모델 압축으로는 끝나지 않았음. 하한 계산, 백본 스크리닝, 그래프 재작성, 제어 루프 비동기화가 함께 맞물려야 기준 안에 들어왔음
  • 레퍼런스가 없는 모델군에서는 같은 수치를 두고도 판단이 갈림. 판단 근거는 같은 보드·같은 태스크의 실측이었음
그냥 목록으로
원문 보기 ↗