AI Sparkup

최신 AI 쉽게 깊게 따라잡기⚡

텍스트 디제너레이션, LLM 요청 3%가 시스템 전체를 42% 느리게 만드는 원리

Dharma-AI 팀은 PDF OCR용 소형 언어 모델을 실제 환경에서 운영하다 이상한 패턴을 발견했습니다. 전체 요청의 3%도 되지 않는 소수가 배치 전체의 벽시계 시간을 42% 이상 늘리고 있었습니다. 원인은 모델 설정이나 데이터 문제가 아니었습니다. 거의 모든 언어 모델이 공유하는 학습 목표 자체에 구조적으로 내재된 현상이었습니다.

사진 출처: Dharma-AI / Hugging Face

Dharma-AI 팀이 Hugging Face 블로그에 게재한 이 글은 자체 DharmaOCR 논문의 실험 결과를 기반으로, 텍스트 디제너레이션(Text Degeneration)이라는 현상이 품질 문제를 넘어 시스템 운영 비용 문제임을 수치로 보여줍니다.

출처: Text Degeneration: A Production Failure Mode That Most Benchmarks Do Not Track – Dharma-AI / Hugging Face

루프에 빠진 모델은 멈추지 않는다

정상적인 LLM 요청은 모델이 EOS(End-of-Sequence) 토큰을 생성하면서 끝납니다. 출력이 완성됐다는 신호죠. 그런데 텍스트 디제너레이션이 발생한 요청에서는 이 신호가 나오지 않습니다. 대신 모델이 특정 단어나 문장 조각을 반복하기 시작하고, 시스템이 설정한 최대 토큰 한도에 도달할 때까지 그 반복을 멈추지 않습니다.

현상 자체는 2020년 Holtzman 등의 논문에서 이미 기술된 바 있습니다. 원인도 알려져 있습니다. 최대우도추정(MLE)으로 학습된 모델은 이전 문맥에서 자주 등장한 토큰일수록 다음 단계에서 더 높은 확률을 할당하는 구조를 갖습니다. 한 번 반복 루프에 진입하면 그 루프 안에 머무는 것이 확률적으로 점점 더 유리해지고, EOS 토큰은 상대적으로 낮은 확률 영역에 밀려납니다. 반복 패널티나 temperature 조정 같은 디코딩 전략은 루프 진입 가능성을 낮출 수 있지만, 이 확률 지형 자체를 바꾸지는 못합니다.

Dharma-AI 팀이 새롭게 측정한 것은 이 루프가 요청 하나에 미치는 영향이 아니라, 배치 전체에 미치는 영향이었습니다.

실패한 요청 하나가 이웃을 끌어내린다

현대 추론 서버(팀의 실험에서는 vLLM)는 여러 요청을 동시에 처리하는 동적 배칭 방식으로 GPU 처리량을 극대화합니다. 문제는 메모리입니다. 한 요청이 생성하는 토큰이 많아질수록 그 요청이 차지하는 메모리도 비례해서 늘어납니다. 디제너레이션 루프에 빠진 요청은 최대 한도까지 토큰을 채우는 동안 메모리를 장시간 독점하고, 스케줄러가 새 요청을 배치에 추가할 공간이 줄어들면서 병렬 처리 효율이 떨어집니다.

팀이 측정한 결과는 이렇습니다. 디제너레이션 요청을 평균 지속 시간의 정상 요청으로 교체했을 때 전체 배치의 처리 시간이 7.3분에서 4.2분으로 줄었습니다. 벽시계 시간(wall-clock time, CPU 연산량이 아닌 실제로 흐른 현실 시간) 기준 42.47% 감소입니다. 세 개의 데이터셋에서 실험을 반복했을 때, 디제너레이션 요청이 하나라도 병렬로 실행 중이면 정상 요청의 평균 처리 시간이 최소 15%, 최대 71% 이상 늘어났습니다. 정상 요청들이 더 어려워진 게 아니라, 시스템이 느려진 것입니다.

이 실험에서 사용된 기본 모델(Qwen2.5-VL-7B-Instruct)의 디제너레이션 발생률은 2.42%였습니다. 이 정도면 작은 수치처럼 보이지만, 실제 운영 환경에서 그 영향은 위와 같았습니다.

벤치마크가 이 비용을 보지 못하는 이유

팀이 확인한 바로는, 주요 OCR 벤치마크 중 디제너레이션 발생률을 측정하는 곳은 없습니다. 이유는 단순합니다. 벤치마크는 출력의 평균 품질을 측정하도록 설계됐고, 병리적 엣지 케이스는 그 프레임 밖에 있습니다.

실험에서 나타난 결과는 이 맹점의 실제 결과를 보여줍니다. 품질 점수가 거의 동일한 두 모델이 디제너레이션 발생률에서는 수십 배 차이를 보일 수 있습니다. 품질 벤치마크는 이 차이를 구분하지 못합니다. 배포할 모델을 벤치마크만 보고 고른다면, 운영 비용에서 결정적인 차이를 놓칠 수 있습니다.

추론 레이어 수정은 왜 충분하지 않은가

실시간 반복 감지, 요청 재시도, 폴백 라우팅 같은 추론 레이어 대응책은 실제로 효과가 있습니다. 그러나 각각 비용이 따릅니다. 감지 로직은 실패하지 않는 요청에도 항상 실행되고, 재시도는 이미 소비한 GPU 연산을 환급해주지 않습니다. 루프에 진입한 후 중단하더라도 그동안 배치에 가해진 전염성 영향은 남습니다. 분포의 모양을 바꾸지 않고 표면 증상만 다루는 방식의 한계입니다.

DPO로 실패 영역을 분포에서 밀어낸다

팀이 시도한 구조적 개입은 2단계 훈련이었습니다.

  1. SFT(지도 미세조정): 도메인 정렬 예시로 모델을 목표 분포에 가깝게 이동. 필요하지만 단독으로는 부족했습니다. SFT 이후에도 사전학습에서 물려받은 루프 영역은 여전히 남아 있었습니다.
  2. DPO(직접 선호 최적화): 통상적으로 대화 정렬에 쓰이는 기법이지만, 팀은 다르게 활용했습니다. 같은 모델에서 생성된 디제너레이션 출력을 ‘rejected’, 정상 출력을 ‘chosen’으로 구성한 선호 쌍을 만들어 훈련했습니다. 모델이 자신의 실패 영역에서 멀어지도록 학습 신호를 준 것입니다.

결과는 5개 모델 패밀리(3B~7B)에 걸쳐 SFT 단독 대비 디제너레이션 발생률이 37~87.6% 감소했습니다. 가장 큰 폭의 감소를 보인 모델은 3B 파라미터 소형 모델(Nanonets-OCR2)로, 발생률이 1.61%에서 0.20%까지 내려갔습니다.

여기서 한 가지 흥미로운 패턴이 나타납니다. 실험에서 가장 낮은 디제너레이션 발생률을 기록한 건 가장 큰 모델이 아니라, 해당 도메인에 가장 가깝게 특화된 소형 모델이었습니다. 파라미터 수보다 훈련 이력이 안정성에 더 큰 영향을 미쳤다는 것이 팀의 해석입니다.

측정해야 보이는 것

팀의 주장은 하나로 수렴합니다. 디제너레이션 발생률은 지연 시간, 처리량, 품질과 함께 추적해야 할 1등급 운영 지표입니다. 이 지표를 계산하는 데 필요한 데이터는 추론 서버가 이미 만들어내고 있습니다. 최대 토큰 한도에 도달하면서 말미에 n-gram 반복이 나타난 요청을 카운트하면 됩니다.

디제너레이션 발생률이라는 단 하나의 지표를 추가하는 것만으로, 지금까지 보이지 않던 운영 비용의 형태가 드러납니다.

참고자료: DharmaOCR: Specialized Small Language Models for Structured OCR – arXiv


AI Sparkup 구독하기

최신 게시물 요약과 더 심층적인 정보를 이메일로 받아 보세요! (무료)

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다