스캐터랩 ML팀이 자체 LLM 서비스 '제타'에 GRPO 기반 온라인 강화학습을 도입한 과정을 다룬다. DPO는 기존 선호 데이터 분포 내 학습에 그치지만, GRPO는 모델 생성 응답을 리워드 모델이 실시간 평가해 분포 밖 탐색이 가능하다. 단순 알고리즘 적용이 아니라 비동기 인프라 설계, 확률 불일치 보정(TIS), reward hacking 해결까지 세 가지 도전을 통합한 결과, A/B 테스트에서 DPO 대비 이용시간과 리텐션 모두 유의미하게 개선됐다.
핵심 포인트- 동기식 단일 노드(순차 생성→채점→학습)에서 학습/추론 노드를 완전 분리한 비동기 GRPO 인프라로 전환해 GPU 유휴, 메모리 단편화, 리워드 모델 적재 불가 문제를 해결했다.
- NCCL 기반 가중치 동기화로 HTTP 방식 수백 초 → 수 초로 단축, NVLink+RDMA로 FSDP 파라미터를 broadcast한다.
- TIS(Truncated Importance Sampling)를 도입해 PPO clip(스텝 크기 제어)과 별도 가중치 w_t(분포 불일치 보정) 역할을 분리, 8bit 학습에서 신호 소멸을 방지했다.
- GSPO의 sequence 단위 importance ratio가 띄어쓰기 생략 reward hacking을 유발했고, 토큰 단위로 전환해 해결했다.
- 길이 편향(짧은 응답에 높은 점수) 문제는 채널별 분리 정규화(GDPO)와 목표 길이 대비 연속 감소 보상으로 안정화했다.
상세 정리- 배경: 이루다 서비스 제타의 DPO 모델 이후 추가 개선을 위해 GRPO 적용. DeepSeek이 소개한 GRPO는 리워드 모델이 생성 응답을 실시간 평가해 페어 데이터 없이 온라인 학습이 가능하다.
- 동기 구조 한계: vLLM KV 캐시 CPU offload/reload 오버헤드, PyTorch 메모리 관리자와 vLLM 충돌로 OOM, 다수 리워드 모델 동시 적재 불가.
- 비동기 설계 — 리워드 모델+생성 엔진 공동 배치: forward 연산만 수행해 메모리와 처리 시간이 학습 노드 대비 적으므로 동일 노드에 배치했다.
- 비동기 설계 — NCCL 가중치 동기화: 학습 프로세스와 vLLM 프로세스를 NCCL 그룹으로 묶어 NVLink+RDMA로 broadcast, HTTP(수백 초) → 수 초로 단축했다.
- 비동기 설계 — Staleness 제어: 샘플 생성 시점의 정책 버전을 기록, 현재 정책과 버전 차이가 허용치를 초과하면 해당 샘플을 폐기한다.
- 확률 불일치 원인: vLLM과 학습 프레임워크의 커널 구현·연산 정밀도 차이로 동일 가중치에서도 logprob이 토큰당 평균 0.01~0.02씩 달라져, 수백 토큰 응답에서 학습 신호가 틀어진다.
- TIS 도입: r_t = π_train/π_old(PPO clip, 스텝 크기 제어), w_t = min(π_train/π_vllm, C)(별도 가중치, 분포 불일치 보정)로 역할 분리. 단순 PPO-IS는 8bit 학습에서 정확도가 0에 수렴하는 문제가 있었다.
- Reward hacking 1 — 띄어쓰기 생략: GSPO의 sequence 단위 ratio가 토큰별 신호를 응답 길이로 평균내 희석, 제동이 안 된 채 누적되어 '오늘 어디 가?'→'오늘어디가?' 현상 발생. 토큰 단위 GRPO로 전환 후 해소됐다.
- Reward hacking 2 — 길이 디플레이션: 리워드 모델의 길이 편향으로 응답이 점점 짧아졌다. GDPO의 채널별 분리 정규화를 도입하고, binary 길이 보상 대신 목표 길이에서 벗어날수록 보상이 부드럽게 감소하는 연속 함수로 설계해 해결했다.
- 최종 결과: GRPO 모델이 DPO 대비 이용시간·리텐션 유의미 개선, 반복 표현·띄어쓰기 이상 등 가드레일 지표 안정화, 평균 응답 길이 목표 범위 유지.
- 향후 방향: 세션 전체(다중 턴) 흐름을 보상으로 활용하는 세션 수준 온라인 학습으로 확장 연구 중.
왜 읽나GRPO/RLHF를 프로덕션 LLM 서비스에 적용하려는 ML 엔지니어에게 비동기 인프라 설계, 수식 보정, reward hacking 해결까지 end-to-end 구현 노하우를 담은 드문 사례다.