GPU에서 수천 개의 로봇을 동시에 학습시키기
강화학습(RL)으로 로봇이 걷거나 물건을 집는 정책을 배우게 하려면 — 엄청나게 많은 시행착오가 필요합니다. 로봇이 넘어지고, 일어나고, 또 넘어지기를 수백만 번. 이걸 실시간으로 한 대씩 돌리면 몇 달이 걸립니다. 해법은 GPU에서 수천 마리를 동시에 굴리는 것입니다.
이 글은 RL 시리즈의 입구라 기초를 제대로 짚습니다 — RL이 무엇인지, 왜 그렇게 느린지, 어떻게 GPU에서 수천 개를 동시에 돌릴 수 있는지, 그리고 정작 가장 어려운 보상 설계까지.
RL이란 — 정답 대신 보상으로 배운다
지도학습은 "이 사진은 고양이"처럼 정답이 필요합니다. 그런데 "걷기"의 정답 동작표는 없습니다. RL은 정답 대신 보상(reward) 으로 배웁니다 — 로봇이 시도하고, 잘하면 +보상 못하면 −벌점을 받고, 그 신호로 조금씩 행동을 고칩니다.
도식 렌더링 중…
정답 시연이 없는 기술(균형 잡기, 험지 보행)을 배울 수 있다는 게 RL의 힘입니다. 대신 아주 많이 시도해야 합니다 — 여기서 느림이 시작됩니다.
왜 RL은 느린가 — 표본 비효율
RL의 고질병은 표본 비효율(sample inefficiency) 입니다. 좋은 정책 하나에 수백만~수십억 스텝의 경험이 듭니다. 두 가지가 겹칩니다.
- 희소 보상(sparse reward) — "넘어졌다"는 신호는 어느 행동이 잘못이었는지 거의 안 알려줍니다. 수천 스텝 중 하나가 범인인데 벌점은 끝에 한 번.
- 연속·고차원 — 관절 수십 개의 연속 제어라, 탐색해야 할 공간이 방대합니다.
⚠️ 실물 한 대로는 답이 없다 — 수백만 스텝을 실시간으로 = 몇 달, 게다가 넘어질 때마다 하드웨어가 상합니다. RL을 현실로 만들려면 경험을 값싸게 대량으로 만들어야 합니다.
한 마리 직렬 vs 수천 마리 병렬
핵심 아이디어는 환경을 벡터화(vectorize) 하는 것입니다. 한 환경을 직렬로 굴리는 대신, GPU 메모리에 환경 수천 개를 타일처럼 깔고 한꺼번에 한 스텝씩 전진시킵니다.
도식 렌더링 중…
num_envs = 4096처럼 환경 개수를 늘리면, GPU가 4096개 로봇의 물리·관측·보상을 동시에 계산합니다. 데이터 수집 속도가 수천 배가 되니, 학습 시간이 몇 달에서 몇 시간~며칠로 줄어듭니다.
왜 GPU에서 동시에 되나 — 전부 텐서다
여기가 핵심 통찰입니다. 옛날엔 물리는 CPU, 신경망은 GPU 라서 매 스텝 CPU↔GPU로 데이터를 옮겼고, 그 전송이 병목이었습니다. 새 세대(Isaac Lab·Genesis·MuJoCo MJX)는 물리와 신경망을 둘 다 GPU 위 텐서로 돌립니다.
도식 렌더링 중…
4096개 환경이 그냥 배치 차원 하나가 됩니다 — GPU 커널 한 번이 4096개를 동시에 전진시키고, 관측·행동·보상이 전부 큰 텐서로 오갑니다. CPU 왕복이 사라지니 처리량이 수백~수천 배가 됩니다. "수천 마리 동시 학습"이 가능한 진짜 이유가 이것입니다.
학습의 한 바퀴 — 관측·행동·보상
각 환경에서는 똑같은 RL 루프가 돕니다.
도식 렌더링 중…
정책은 "지금 상태에서 어떤 행동이 보상을 키우는가"를 점점 학습합니다. 대표 알고리즘은 PPO(안정적, 가장 널리 씀)·SAC(표본 효율)·MAPPO(다중 에이전트)입니다.
# 수천 개 환경을 한 번에 — 벡터화 RL 루프
envs = make_envs(num_envs=4096) # GPU에 4096개를 타일처럼
obs = envs.reset()
for step in range(total_steps):
actions = policy(obs) # 정책: 관측 → 행동 (4096개 배치 전체)
obs, rewards, done = envs.step(actions)
buffer.add(obs, actions, rewards)
if buffer.is_full():
policy.update(buffer) # PPO 등으로 정책 갱신
💡 도메인 무작위화를 함께 — 4096개 환경을 조금씩 다르게(마찰·질량·지형) 만들면, 정책이 한 조건에만 과적합하지 않고 일반화됩니다. 이게 시뮬에서 배운 정책이 실제 로봇에서도 통하는(Sim-to-Real) 비결의 하나입니다.
⚠️ 보상 스케일은 그대로 못 옮긴다 — 한 에이전트에서 잘 되던 보상을 다중 에이전트(수천 마리)에 그대로 쓰면, 누적 보상이 폭증해 학습이 NaN으로 터질 수 있습니다. 병렬·다중 환경에선 보상을 정규화하는 게 필수입니다.
진짜 어려운 건 보상 설계
알고리즘은 라이브러리가 줍니다. RL 작업의 90%는 보상 함수를 짜는 일 입니다.
- 희소 vs 조밀(shaped) — "목표 도달 시 +1"만 주면 학습이 거의 안 됩니다(언제 +1 받는지를 영영 못 만나니까). 그래서 "목표에 가까워지면 조금씩 +" 같은 조밀한 보상으로 길을 깔아줍니다.
- 보상 해킹(reward hacking) — 정책은 당신이 적은 그대로 최적화합니다. 의도와 다른 허점이 있으면 그걸 악용합니다 — "빨리 가라"고 했더니 제자리에서 빙빙 돌거나, "넘어지지 마라"고 했더니 아예 안 움직이는 식으로.
💡 보상은 '의도'가 아니라 '문자 그대로' 작동한다 — RL이 이상하게 학습되면 알고리즘보다 보상 함수를 먼저 의심하세요. 정책이 영리하게 못된 짓을 한다면, 그건 버그가 아니라 당신의 보상에 그 길이 열려 있다는 뜻입니다.
학습이 끝나면 — 정책 체크포인트
학습된 정책은 신경망 가중치(checkpoint)로 저장됩니다. 이걸 시뮬에서 검증하고, 양자화해 실제 로봇의 Edge AI에 이식하면 — 가상에서 배운 지능이 현실로 넘어갑니다.
한 줄 정리
📌 RL은 정답 대신 보상으로 배워 막대한 시행착오가 필요하다(표본 비효율). 물리와 신경망을 둘 다 GPU 텐서로 올려 환경 수천 개를 배치 한 번에 굴리면(num_envs=4096) 학습이 몇 달→며칠로 준다. PPO/SAC/MAPPO로 돌리되, 진짜 난제는 보상 설계 — 정책은 의도가 아니라 문자 그대로 최적화한다.
