강화학습을 수행하는 개발자들은 모델이 학습 과정에서 뱉어내는 수치들이 갑자기 튀거나, 이전 버전과 다른 방향으로 움직일 때 당혹감을 느낀다. 최근 vLLM(대규모 언어 모델을 빠르게 추론하기 위한 엔진)이 V0에서 V1으로 대대적인 구조 변경을 단행하면서, 기존에 잘 돌아가던 강화학습 파이프라인에서 결과값이 어긋나는 현상이 관찰되었다. 이는 단순히 모델의 성능 문제가 아니라, 데이터를 뽑아내는 엔진의 기초 체력이 달라지면서 발생한 일이다.

V1 엔진 전환과 수치적 불일치

연구팀은 vLLM 0.8.5 버전(V0)을 기준으로 하던 강화학습 환경을 vLLM 0.18.1 버전(V1)으로 옮기는 작업을 진행했다. 이 과정에서 GSPO(그룹화된 전략적 정책 최적화) 학습을 수행한 결과, 초기 V1 시도(빨간색 그래프)는 기존 V0 참조값(녹색 그래프)과 확연히 다른 궤적을 그렸다. 특히 학습 초기부터 트레이너 측의 로그 확률(모델이 특정 토큰을 선택할 확률의 로그값)과 보상 수치가 V0의 기준점에서 멀어지는 현상이 나타났다. 연구팀은 이 문제를 해결하기 위해 다음 네 가지 지점을 수정했다.

첫째, 로그 확률 처리 방식이다. V1은 기본적으로 모델의 원시 출력값에서 로그 확률을 가져오지만, 강화학습 시스템인 PipelineRL(학습 데이터 생성과 모델 업데이트를 연결하는 도구)은 샘플링 과정에서 필터링된 확률값을 기대했다. 이를 해결하기 위해 다음 설정을 적용했다.

python

V1에서 처리된 로그 확률을 사용하도록 설정

processed_logprobs = True

둘째, V1 전용 런타임 기본값 조정이다. V1은 이전 버전과 달리 접두사 캐싱(이미 계산된 앞부분 토큰을 재사용하여 속도를 높이는 기술)과 비동기 스케줄링이 기본으로 활성화되어 있다. 이를 V0와 동일한 조건으로 맞추기 위해 캐싱을 비활성화하고 가중치 업데이트 시점을 동기화했다. 셋째, 가중치 업데이트 경로를 정밀하게 조정했다. 넷째, 최종 투영 단계에서 fp32(32비트 부동소수점 정밀도)를 사용하는 lm_head(언어 모델의 마지막 출력층)를 적용하여 수치적 정밀도를 높였다.

추론 엔진의 정밀도와 학습 결과의 관계

예전에는 강화학습의 성능을 높이기 위해 학습 알고리즘 자체의 수식이나 보상 함수를 튜닝하는 데 집중했다. 이제는 엔진의 동작 방식이 학습 결과에 직접적인 영향을 미친다는 점이 명확해졌다. 특히 MiniMax-M1 기술 보고서에서도 언급되었듯, 모델의 마지막 출력층에서 fp32 정밀도를 사용하지 않으면 토큰 확률 계산에서 미세한 오차가 발생한다. 이 오차는 강화학습의 정책 비율(학습 전후 모델의 확률 차이)과 KL 발산(두 확률 분포의 차이)에 누적되어 학습 전체를 왜곡한다. 연구팀은 V1 엔진에서 이 fp32 경로를 강제로 맞춤으로써, 보상 그래프가 V0 참조값과 완벽하게 일치하는 결과를 얻어냈다.

개발자가 바로 체감하는 변화는 문제 해결의 순서다. 과거에는 엔진의 동작이 조금 달라도 학습 알고리즘에서 보정값(중요도 샘플링 등)을 넣어 억지로 맞추려 했다. 하지만 이는 엔진의 오류를 알고리즘의 탓으로 돌리는 결과를 낳는다. 이번 사례는 강화학습 모델을 개선하기 전에, 데이터를 생성하는 추론 엔진의 수치적 일관성을 먼저 확보하는 것이 무엇보다 중요하다는 점을 보여준다. 엔진의 동작이 일치하지 않는 상태에서 알고리즘을 수정하는 것은 밑 빠진 독에 물을 붓는 것과 같다.