-
LLM(대형 언어 모델) 추론에서는 동일한 입력과 조건에도 결과가 다르게 나오는 비결정성(nondeterminism) 문제가 발생함
- 기존에는 동시성(concurrency) 과 부동소수점(floating-point) 연산의 비결합성(non-associativity) 이 비결정성의 주요 원인으로 간주되어 왔음
- 실제 결정적인 원인은 배치 크기(batch size) 변화에 따른 커널(연산 코드) 내부의 계산 순서 변화에서 비롯됨
- 커널 내 모든 연산이 배치 불변성(batch invariance) 을 갖도록 구현하면 완전한 재현성(reproducibility) 보장 가능함
-
데이터 병렬 연산, split reduction, 고정 크기 split 전략 등으로 주요 연산(RMSNorm, matmul, attention)에 대해 배치 불변 커널 제작이 가능함
서론 및 문제 개요
-
과학적 진보의 핵심 요소인 재현성(reproducibility) 이 LLM(대형 언어 모델) 추론에서는 잘 지켜지지 않음
- 같은 질문을 ChatGPT에 여러 번 해도 서로 다른 답변이 생성되는 경우 자주 발생함
- 이는 LLM에서 결과를 샘플링(sampling) 하는 과정이 확률 분포에 기반한 확률적 선택이기 때문임
- 그러나, temperature를 0으로 설정해도 실제로는 LLM API가 반드시 결정적이지 않음(즉, 같은 입력에 대해 결과가 항상 같지 않음)
- 오픈소스 추론 라이브러리(vLLM, SGLang 등)와 자가 하드웨어에서 실행해도 비결정성 문제 존재
기존 가설과 한계
- 널리 알려진 가설: 동시성 + 부동소수점의 비결합성 때문에 비결정성 발생
- GPU에서의 부동소수점 연산은 연산 순서와 스레드 종료 순서에 따라 미세하게 결과 달라짐
- 그러나, 실제로는 동일 데이터에 같은 방식으로 행렬곱을 반복해도 항상 동일한(bw=bitwise equal) 결과 얻어짐
- 진짜 원인을 파악하려면 더 깊은 분석 필요
LLM 추론의 비결정성 원인 심층 분석
부동소수점 비결합성의 본질
- 부동소수점 연산은 (a+b)+c ≠ a+(b+c) 관계를 가짐
- 서로 다른 크기(exponent)를 가진 값들 연산 시 정밀도 손실, 정보 소실, 연산 순서에 따라 결과 달라짐
- 연산 순서가 달라질 수 있으므로, 여러 번의 합계를 랜덤하게 수행하면 다양한 결과(실험적으로도 확인) 가 도출됨
커널의 연산 순서 변화와 동시성
- 일반적으로 비결정성의 주 원인으로 원자적 덧셈(atomic add) 등에서의 동시성 문제 지적
- 하지만, LLM 추론에서 사용하는 대부분의 커널(특히 forward pass)은 원자적 덧셈 없이도 동작함
- 사전 적절한 병렬 전략, split(reduction) 등으로 동일 연산 순서를 확보할 수 있음
사실상 핵심 원인: "배치 불변성(batch invariance)" 결여
- 개별 커널은 입력이 동일하면 항상 같은 결과를 반환(run-to-run deterministic)
- 하지만, 여러 사용자의 동시 요청(batch size)이 비결정적으로 바뀌기 때문에 각 요청에 대해 실질적으로는 결과가 일정하지 않음
-
배치 크기에 따라 내부적으로 연산을 분할하거나 합치는 순서가 달라져서 비결정성 발생
- 즉, 서버 부하와 병렬도(배치 사이즈)가 비결정적이었다는 점이 핵심 원인임
배치 불변 커널 설계와 핵심 연산 사례
RMSNorm
-
데이터 병렬화(data-parallel) 전략 적용: 각 배치 요소를 독립적으로 하나의 코어가 처리
- 배치 크기가 크면 충분한 병렬성 유지, 즉 병렬 전략이 일정하여 배치 불변성이 확보됨
- 배치 크기가 매우 작을 때는 split reduction 등 대안 전략을 쓰나, 이 경우엔 일부 배치 불변성 희생됨
행렬곱(matmul)
- 타일(tile)별로 병렬화하여 데이터 병렬 전략 활용
- 텐서코어 사용 최적화를 위해서는 2D 타일로 분할해야 하며, 매우 작은 배치에서는 split-K 같은 특별 전략 필요
-
split-K 전략을 쓸 때 배치 불변성 깨질 수 있음
- 성능 일부를 희생하더라도, 동일 커널 구성을 강제하여 일정한(reproducible) 연산 순서 확보 가능
어텐션(attention)
- FlashAttention2 등에서 쿼리 방향 병렬화, Key/Value 동시 reduction 전략으로 배치 불변성 확보
- 배치 크기, 시퀀스 분할(chunked prefill, prefix caching 등)에 따라 reduction 순서가 달라지면 불변성 깨짐
- split-KV(FlashDecoding) 등 split-reduction 전략에서는 split 크기를 고정(fixed split-size) 하여 연산 순서를 동일하게 유지
- 내부 동작상 key/value 캐시와 신규 토큰을 별도 처리하지 않고, 모든 연산에서 키/값 레이아웃을 일관적으로 유지해야 함
구현
실험 및 성능
비결정성 측정 실험
- Qwen/Qwen3-235B-A22B-Instruct-2507 모델로 temperature 0 조건에서 동일 프롬프트(“Tell me about Richard Feynman”) 1000회 생성
-
80가지 서로 다른 완성이 생성(동일 프롬프트이지만 비결정성 존재)
- 처음 102개 토큰까지는 동일, 103번째 토큰에서 첫 분기 발생(“Queens, New York” vs “New York City”)
-
배치 불변 커널 사용 시 1000번 모두 동일 결과, 완전 재현성 확보
성능 평가
- GPU 1대, Qwen-3-8B 구동, 각각 90~110 길이의 시퀀스 1000개 요청
- vLLM 기본: 26초
- 비최적화 deterministic vLLM: 55초
- 개선된 attention 커널 적용: 42초
- 최적화가 부족하지만 실용 가능한 성능 수준 유지
On-policy RL에서의 가치
- 기존에는 training과 inference 간 미세한 숫자 차이로 인해 on-policy RL이 정확히 구현되지 않음
- 결정적 추론이 가능해지면, 샘플링과 트레이닝 모두 bitwise identical하게 만들어 진정한 on-policy RL 구현 가능
- KL-divergence, reward 등 주요 metric에서 완전히 일치하는 결과 확인
결론
- LLM 추론 시스템에서 비결정성과 수치 오차를 무시하기 쉽지만, 이 문제의 근본 원인(배치 불변성 결여) 을 파악하고 개선하면 완전한 재현성 및 결정성을 얻을 수 있음
- 본 연구는 LLM 추론의 비결정성 문제 해결 방안을 밝혀 개발자들이 자체 시스템 내에서 완전한 재현성을 확보할 수 있게 도움
인용 정보
He, Horace and Thinking Machines Lab, "Defeating Nondeterminism in LLM Inference",
Thinking Machines Lab: Connectionism, Sep 2025.
또는
@article{he2025nondeterminism,
author = {Horace He and Thinking Machines Lab},
title = {Defeating Nondeterminism in LLM Inference},
journal = {Thinking Machines Lab: Connectionism},
year = {2025},
note = {https://thinkingmachines.ai/blog/…},
doi = {10.64434/tml.20250910}
}