본문 바로가기
딥러닝

[논문리뷰] 같은 질문, 같은 GPU, 다른 답 — 왜 LLM은 "재현 불가능"할까? — Understanding and Mitigating Numerical Sources of Nondeterminism in LLM Inference

by 카이스토 2026. 9. 12.

■ 왜 이 연구가 중요한가

 

같은 모델에, 같은 프롬프트에, 심지어 temperature를 0으로 놓고 그리디 디코딩을 해도 답이 매번 똑같이 나올까요. 직관적으로는 당연히 그래야 할 것 같습니다. 그런데 라이스 대학교 연구팀이 NeurIPS 2025 오럴 논문으로 발표한 이 연구는 그 직관이 틀렸다는 걸 정면으로 보여줍니다. 같은 모델을 GPU 개수만 2개에서 4개로 바꾸거나, 배치 크기를 8에서 32로 바꾸거나, A100을 L40S로 바꾸기만 해도 완전히 다른 답이 나올 수 있다는 겁니다. 단순한 재미있는 현상이 아니라, 벤치마크 점수 신뢰성, 모델 평가 재현성, 심지어 실제 서비스 품질 검증까지 흔들 수 있는 실질적인 문제입니다. 논문 제목처럼 이 비결정성이 어디서 오는지 이해하고(Understanding), 그것을 실제로 줄이는(Mitigating) 방법까지 제시했다는 점이 이 연구를 특별하게 만듭니다.

 

■ 핵심 아이디어: 범인은 부동소수점 연산 순서

 

비밀은 생각보다 근본적인 곳에 있습니다. 바로 부동소수점 덧셈이 수학의 결합법칙을 따르지 않는다는 사실입니다. (a+b)+c와 a+(b+c)는 실수 세계에서는 같지만, 유한한 비트로 반올림하는 컴퓨터 세계에서는 다를 수 있습니다. GPU에서 행렬 곱셈을 할 때 배치 크기, GPU 개수, GPU 아키텍처가 달라지면 내부적으로 숫자를 더하는 순서 자체가 달라지고, 이 미세한 반올림 오차의 차이가 모델 출력에 그대로 반영됩니다. 문제는 여기서 끝나지 않습니다. 요즘 화두인 추론 모델들은 긴 사고 사슬(chain of thought)을 생성하는데, 초반 토큰 하나가 반올림 오차로 아주 살짝 흔들리면 그 뒤로 이어지는 수백, 수천 개의 토큰이 완전히 다른 경로로 갈라져 버립니다. 마치 나비효과처럼요.

 

 

■ 어떻게 검증했나

 

연구팀은 GPU 종류 2가지, GPU 개수 2가지, 배치 크기 3가지를 조합해 총 12가지 런타임 조합을 만들고, DeepSeek-R1-Distill-Qwen-7B, DeepSeek-R1-Distill-Llama-8B, Qwen2.5-7B-Instruct 같은 모델들을 AIME'24, MATH500 같은 수학 추론 벤치마크에 돌렸습니다. 정밀도는 BF16, FP16, FP32 세 가지를 모두 비교했습니다. 결과는 놀라웠습니다. DeepSeek-R1-Distill-Qwen-7B를 BF16으로 돌렸을 때 AIME'24 정확도의 표준편차가 무려 9.15퍼센트포인트에 달했습니다. 같은 문제, 같은 그리디 디코딩인데 시스템 설정만 바꿔도 정답률이 9퍼센트나 오르내린 셈입니다. 응답 길이도 요동쳤는데, 표준편차가 최대 9,189토큰, 다른 모델에서는 9,348토큰까지 벌어졌습니다. 반면 FP32로 돌리면 이 편차가 사실상 0에 수렴했습니다. MATH500 문제에서 첫 토큰부터 아예 다른 문제로 갈라지는 비율을 측정했더니 BF16은 96.6퍼센트, FP16은 73.0퍼센트가 초반부터 어긋난 반면 FP32는 2.2퍼센트에 불과했습니다.

 

■ 왜 하필 BF16이 문제일까

 

정밀도 포맷마다 가수부(mantissa) 비트 수가 다릅니다. FP32는 23비트, FP16은 10비트, BF16은 단 7비트입니다. 비트가 적을수록 반올림 오차가 커지고, 이 오차가 1등 후보 토큰과 2등 후보 토큰의 확률 차이가 근소한 지점과 겹치면 토큰이 뒤집혀 버립니다. 요즘 추론 모델 서빙에서 메모리 절약을 위해 BF16을 널리 쓰는데, 바로 그 선택이 비결정성을 키우는 주범이었던 겁니다. 속도와 메모리를 위해 정밀도를 낮췄더니, 그 대가로 재현성을 잃어버린 셈이죠.

 

■ 해결책: LayerCast

 

그렇다면 무조건 FP32로 다시 돌아가야 할까요. 그러면 메모리 사용량이 커져서 배포 비용이 크게 늘어납니다. 연구팀이 내놓은 절충안이 LayerCast입니다. 아이디어는 단순하지만 영리합니다. 가중치는 메모리에 BF16처럼 16비트로 가볍게 저장해두고, 실제 행렬 곱셈을 수행하는 순간에만 FP32로 즉석 변환(upcast)해서 계산하는 방식입니다. 이렇게 하면 저장 공간은 절약하면서도 계산 자체는 FP32 수준의 정밀도로 진행되어 반올림 오차가 누적되지 않습니다. 실제로 LayerCast를 적용하자 MATH500에서의 초반 토큰 발산 비율이 96.6퍼센트에서 3.4퍼센트 이하로 뚝 떨어져 FP32와 거의 동일한 안정성을 보였습니다. 그러면서도 메모리 사용량은 완전한 FP32 추론 대비 34퍼센트나 절감했습니다. 게다가 오픈소스 추론 엔진인 vLLM에 몇 줄의 코드 패치만으로 적용할 수 있도록 구현되어 있어 실무 적용 문턱도 낮습니다.

 

 

■ 결과와 의미

 

이 연구가 던지는 메시지는 명확합니다. 우리가 벤치마크에서 보는 정확도 숫자 하나하나가 생각보다 훨씬 불안정한 기반 위에 서 있을 수 있다는 것입니다. 같은 모델을 다른 서버, 다른 GPU, 다른 배치 크기로 재현했을 때 논문에 적힌 점수와 몇 퍼센트씩 차이가 나는 경험, 연구자라면 한 번쯤 겪어봤을 텐데 그 원인 중 상당 부분이 바로 이 수치적 비결정성이었을 가능성이 큽니다. 특히 긴 추론을 하는 최신 reasoning 모델일수록 이 효과가 증폭된다는 점도 시사하는 바가 큽니다. 모델이 똑똑해질수록, 그 답을 만들어내는 계산 과정의 아주 작은 흔들림에도 더 민감해진다는 뜻이니까요. LayerCast처럼 정밀도와 재현성, 효율성 사이의 균형점을 찾는 연구는 앞으로 LLM을 실제 서비스와 연구 벤치마크 모두에서 더 믿을 수 있게 만드는 중요한 인프라가 될 것으로 보입니다.

 

댓글