vLLM V0 to V1: Correctness Before Corrections in RL
Quick Summary
온라인 강화학습의 vLLM V0→V1 전환에서는 목적함수 보정을 서두르기보다 로그확률 의미, 런타임 기본값, 비행 중 가중치 갱신, fp32 출력 헤드를 먼저 일치시켜 추론 백엔드의 정확성을 복원해야 했다.
🖼️ 인포그래픽
🖼️ 4컷 인포그래픽
💡 한 줄 요약
온라인 강화학습의 vLLM V0→V1 전환에서는 목적함수 보정을 서두르기보다 로그확률 의미, 런타임 기본값, 비행 중 가중치 갱신, fp32 출력 헤드를 먼저 일치시켜 추론 백엔드의 정확성을 복원해야 했다.
📌 핵심 요약
- PipelineRL은 vLLM이 생성한 토큰과 로그확률을 정책 비율, KL, 클립률, 엔트로피, 보상 계산에 직접 사용하므로, 추론 엔진의 작은 차이도 전체 학습 궤적을 바꿀 수 있었다.
- 초기 V1 실행은 원시 모델 출력의 로그확률과 V1 전용 런타임 기본값이 섞여 있었으며, 클립률·KL·엔트로피·보상이 V0 기준 실행에서 조기에 이탈했다.
- 처리된 샘플링 분포의 로그확률을 반환하도록 설정하고, 접두사 캐싱과 비동기 스케줄링을 명시적으로 끄며, V0와 가까운 비행 중 가중치 갱신 경로를 적용해 백엔드 차이를 줄였다.
- 백엔드 설정을 맞춘 뒤에도 남은 수치적 차이는 최종 로짓 투영을 수행하는 lm_head를 fp32로 계산함으로써 해소됐고, 최종 V1 실행은 주요 지표와 보상에서 V0 궤적에 근접했다.
- 저자들은 올바르지 않은 추론 동작을 목적함수 보정으로 덮으면 원인 해석이 어려워진다고 강조하며, 백엔드 동등성을 먼저 확립한 뒤 실제 비동기성이나 오프폴리시 잔차에 대한 보정을 별도로 설계해야 한다고 결론짓는다.
🧩 주요 포인트
- PipelineRL은 vLLM이 생성한 토큰과 로그확률을 정책 비율, KL, 클립률, 엔트로피, 보상 계산에 직접 사용하므로, 추론 엔진의 작은 차이도 전체 학습 궤적을 바꿀 수 있었다.
- 초기 V1 실행은 원시 모델 출력의 로그확률과 V1 전용 런타임 기본값이 섞여 있었으며, 클립률·KL·엔트로피·보상이 V0 기준 실행에서 조기에 이탈했다.
- 처리된 샘플링 분포의 로그확률을 반환하도록 설정하고, 접두사 캐싱과 비동기 스케줄링을 명시적으로 끄며, V0와 가까운 비행 중 가중치 갱신 경로를 적용해 백엔드 차이를 줄였다.
- 백엔드 설정을 맞춘 뒤에도 남은 수치적 차이는 최종 로짓 투영을 수행하는 lm_head를 fp32로 계산함으로써 해소됐고, 최종 V1 실행은 주요 지표와 보상에서 V0 궤적에 근접했다.
- 저자들은 올바르지 않은 추론 동작을 목적함수 보정으로 덮으면 원인 해석이 어려워진다고 강조하며, 백엔드 동등성을 먼저 확립한 뒤 실제 비동기성이나 오프폴리시 잔차에 대한 보정을 별도로 설계해야 한다고 결론짓는다.
🧠 상세 정리
1. 마이그레이션의 핵심 문제와 좁은 검증 목표
PipelineRL에서 vLLM은 롤아웃 생성을 담당하면서 토큰을 샘플링하고 각 토큰의 로그확률을 반환한다. 트레이너는 이 값을 정책 비율, KL, 클립률, 엔트로피, 보상 계산에 직접 사용하므로, 로그확률의 의미나 계산 경로가 달라지면 단순한 추론 차이를 넘어 학습 동역학 자체가 바뀐다. 이에 따라 저자들은 대규모로 다시 설계된 vLLM V1으로 옮기면서 기능 확대보다 V0 기준 실행과의 동등성 검증에 목표를 한정했다. 구체적으로 V1이 트레이너가 기대하는 형태의 롤아웃 로그확률을 반환하는지 확인하고, 동일한 워크로드를 V0 기준과 비교한 다음, 백엔드 동등성을 복원한 뒤에만 강화학습 목적함수 변경을 검토하기로 했다.
2. 초기 V1 실행에서 드러난 학습 궤적의 이탈
비교 기준은 vLLM 0.8.5를 사용한 V0 실행이었고, V1 실험은 vLLM 0.18.1을 사용했다. 초기 V1 실행에서는 GSPO 학습의 clamp_log_ratio_new_old_indicator, kl_new_old, 엔트로피, 보상 지표가 V0 기준에서 일찍 벗어났으며, 트레이너가 업데이트 중 계산한 현재 정책 로그확률과 보상도 뚜렷하게 분리됐다. 특히 클립률은 롤아웃 정책과 트레이너 정책 사이의 간격을 비교적 쉽게 보여주는 신호였고, 엔트로피와 보상은 그 차이가 후속 학습에 전파되는 모습을 나타냈다. 실험은 GSPO를 사용했지만, 롤아웃 단계의 로그확률을 최적화 목표의 일부로 취급하는 PPO, GRPO 및 다른 온라인 강화학습 시스템에서도 같은 종류의 불일치가 나타날 수 있다고 설명한다.
3. 원인을 세 계층으로 분리한 진단 방식
저자들은 가능한 원인을 의미적 불일치, 추론 경로 불일치, 목적함수 불일치라는 세 계층으로 나눴다. 의미적 불일치는 백엔드가 트레이너의 기대와 다른 의미의 로그확률을 반환하는 경우이고, 추론 경로 불일치는 캐싱·스케줄링·요청 처리 기본값의 차이로 같은 프롬프트가 서로 다른 실행 경로를 거치는 경우다. 목적함수 불일치는 남아 있는 정책 지연이나 백엔드 차이에 맞춰 강화학습 목표에 별도의 보정이 필요한 경우를 뜻한다. 처음에는 세 번째 가능성을 너무 일찍 의심했지만, 실제로 유효한 진단은 앞의 두 항목을 백엔드 동작의 정확성 문제로 취급하고 먼저 제거하는 과정에서 나왔다.
4. 처리된 로그확률로 의미적 불일치 해결
첫 번째 문제는 V1이 기본적으로 온도 조정, 페널티, top-k 및 top-p 필터링 같은 로짓 후처리 이전의 원시 모델 출력에서 로그확률을 반환한다는 점이었다. 반면 PipelineRL은 실제 샘플러가 사용한 후처리된 분포의 로그확률을 기대했으므로, 두 값은 이름이 같아도 강화학습 관점에서는 의미가 달랐다. 저자들은 V1에 logprobs-mode를 processed_logprobs로 설정해 이 차이를 바로잡았고, 그 결과 롤아웃 로그확률에서 보이던 명백한 평균 오프셋이 제거됐다. 정책 비율의 평균도 세 실행 모두에서 거의 1.0을 중심으로 유지돼 평균 편향이 해결됐음을 보여줬지만, 클립률·KL·엔트로피와 후속 학습에는 여전히 차이가 남아 추가적인 추론 경로 점검이 필요했다.
5. V1 런타임 기본값과 접두사 캐시 통제
초기 V1 실행에는 엔진 버전 변경뿐 아니라 접두사 캐싱과 비동기 스케줄링의 V1 기본값, 그리고 커밋된 동등성 설정 밖에서 전달된 임시 disable-cascade-attn 재정의가 함께 섞여 있었다. 공정한 비교를 위해 저자들은 V1 사용과 processed_logprobs를 명시하는 동시에 접두사 캐싱과 비동기 스케줄링을 모두 false로 고정했다. 접두사 캐싱은 고정된 모델 상태에서는 일반적으로 정확성을 보존하는 최적화지만, 이 온라인 강화학습 환경에서는 반복 접두사, 동시 요청, 비동기 스케줄링, 비행 중 가중치 갱신이 함께 존재했다. 캐시 정책이 가중치 갱신 경계를 고려하지 않으면 갱신 이전에 계산한 상태가 재사용될 수 있으므로, 이를 끄는 것은 V0 기준 경로에 없던 V1 전용 자유도를 동등성 비교에서 제거하는 조치였다.
6. 비행 중 가중치 갱신 경로의 V0 동작 재현
가중치 동기화에서는 V1을 더 엄격하게 만들어 매 갱신마다 요청을 모두 비우고 캐시를 삭제하는 방법도 가능했지만, 그것은 V0와의 동등성 검증과는 다른 질문이었다. 저자들이 먼저 재현하려 한 V0 동작은 엔진 경계에서 실행을 막고 새 가중치를 불러온 뒤, 캐시 상태를 명시적으로 무효화하지 않은 채 다시 실행하는 방식에 가까웠다. 이에 가장 근접한 V1 경로로 pause_generation을 mode="keep", clear_cache=false로 호출하고, 비동기 집단 RPC를 통해 가중치 갱신을 받은 다음 생성을 재개했다. 여기서 keep은 wait나 abort보다 기존 비행 중 갱신 모델과 유사하고, 캐시를 지우지 않는 설정은 갱신 시 캐시 상태를 유지했던 V0 래퍼 동작과 맞으며, 수정 후에는 학습 후반에 지속되던 롤아웃 서버의 정책 지연도 감소했다.
7. 남은 수치 차이와 fp32 lm_head의 역할
로그확률 의미, 런타임 설정, 가중치 갱신 경로를 맞춘 뒤에도 최종 동등성을 위해서는 로짓을 계산하는 수치 경로까지 일치시켜야 했다. 트레이너는 최종 투영을 담당하는 lm_head를 fp32로 계산하고 있었으므로, 롤아웃 백엔드도 동일한 정밀도의 출력 헤드를 사용해야 했다. 온라인 강화학습은 토큰 로그확률을 직접 업데이트에 소비하기 때문에 로짓의 작은 차이도 정책 비율, KL, 클리핑에 관측 가능한 변화로 증폭될 수 있으며, 저자들은 최종 투영 정밀도 역시 정확성 범위에 포함된다고 본다. fp32 lm_head 경로까지 적용한 최종 V1 실행은 보상뿐 아니라 클립률, KL, 엔트로피에서도 V0 기준 궤적에 가까워졌고, 초기 V1 실행과는 분명히 다른 결과를 보였다.
8. 부정적 실험과 백엔드 정확성 우선 원칙
절제 실험에서는 processed_logprobs만 적용하면 의미적 로그확률 오류는 고쳐지지만 전체 학습 불일치는 남는다는 사실이 확인됐다. 별도의 배치 불변성 시험에서도 더 높은 지연과 클립률, NCCL 관련 복잡성과 함께 불일치가 지속됐으며, 여러 V1 전용 기본값이 동시에 켜진 첫 실행은 공정한 기준선으로 볼 수 없었다. 절단 중요도 샘플링이나 중요도 비율 재가중 같은 목적함수 보정은 의도적으로 오래된 롤아웃을 쓰거나 비동기 생성으로 정책 동등성을 확보할 수 없을 때 유용하지만, 잘못된 추론 동작에 먼저 적용하면 백엔드 오류와 실제 오프폴리시 문제를 뒤섞게 된다. 저자들은 동등성 복원 이후 행동 정책 로그확률과 최적화 시점의 이전 정책 로그확률을 분리하고, 보정항의 유효 표본 크기 같은 진단을 추적하는 개선을 제시하면서도, 이번 마이그레이션의 핵심 교훈을 ‘백엔드 정확성을 먼저 고치고 남은 불일치만 보정하라’는 원칙으로 한정한다.
🧾 핵심 주장 / 시사점
- 온라인 강화학습에서 로그확률은 부가적인 관측값이 아니라 목적함수의 직접 입력이므로, 후처리 전후의 의미와 최종 투영 정밀도까지 인터페이스 정확성의 일부로 관리해야 한다.
- 엔진 버전 비교에서는 새 버전의 기본값과 임시 실행 옵션을 그대로 두면 여러 원인이 결합된 비교가 되므로, 캐시·스케줄링·가중치 갱신 경계를 명시적으로 고정해야 한다.
- 목적함수 보정은 잘못된 백엔드를 정상처럼 보이게 만드는 수단이 아니라, 백엔드 동등성을 확인한 뒤에도 실제 비동기성이나 정책 지연으로 남는 차이를 다루는 별도의 단계여야 한다.
✅ 액션 아이템
- vLLM 로그확률은 처리된 샘플링 분포 기준으로 통일하고, 원시 출력 혼입을 제거해 목적함수 입력을 정규화한다.
- V1 전환 초기에는 V0와 동일한 비행 중 가중치 갱신 경로를 채택하고, 접두사 캐싱·비동기 스케줄링은 명시적으로 끈다.
- 남은 수치 편차를 제거하려면 lm_head 최종 로짓 투영을 fp32로 계산해 핵심 지표와 보상 궤적을 V0에 근접시킨다.
❓ 열린 질문
- 초기 V1에서 로그확률 의미가 원시 출력과 달리 섞였는지 운영 단계에서 실시간으로 어떻게 판별하고 경고 기준을 잡을 것인가?
- 클립률·KL·엔트로피·보상이 V0 대비 빠르게 분기할 때 실제 비동기성, 오프폴리시 잔차, 로직 오류 중 무엇이 주 원인인지 어떤 순서로 분리 판단할 것인가?
- 목적함수 보정으로 차이를 덮지 않고도 백엔드 동등성 이후의 보정 설계를 위해 비행 중 가중치 갱신·표본 분포·수치 오차 중 어떤 항목을 우선 관찰해야 하는가?