본문으로 건너뛰기

BF16 체크포인트 변환에서 사라지는 가중치 차이

BF16에서 덧셈 시점이 달라지면 서로 다른 체크포인트 값이 같은 표현으로 합쳐진다

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

체크포인트 변환기에서 수학적으로 같은 RMSNorm 파라미터화를 사용하더라도 BF16 반올림이 발생하는 위치에 따라 원래 가중치가 손실될 수 있습니다. Qwen 3.5 0.8B의 3.359375와 3.390625는 FP32에서 1을 더하면 4.359375와 4.390625로 구분되지만, BF16에서 직접 더하면 모두 4.375가 됩니다. 이후 1을 빼도 두 값이 모두 3.375로 돌아가므로 역변환으로 원본을 복구할 수 없습니다. 게시자는 산술 변환 뒤 저정밀 형식으로 저장하는 경로를 작은 재현 테스트와 역변환 검증으로 점검해야 한다고 봅니다.

실용적 조언

  • 변환기가 가중치에 산술 연산을 적용한다면 입력 정밀도, 연산 정밀도, 출력 저장 정밀도를 각각 확인해야 합니다. BF16 offset에 1을 더하는 경우처럼 FP32 승격 후 계산하는 경로와 BF16에서 바로 계산하는 경로를 분리해 비교하면 값의 병합 여부를 확인할 수 있습니다. 특히 변환 결과를 다시 BF16으로 저장한다면 서로 다른 입력이 같은 표현으로 수렴하는지 작은 테스트 벡터로 먼저 검증하는 편이 안전합니다.
  • 파라미터화를 바꾸는 변환에서는 정방향 변환만 통과시키지 말고 역변환까지 수행해 원래 값과 비교해야 합니다. 이 사례처럼 3.359375와 3.390625가 변환 뒤 모두 3.375로 돌아오면 변환은 수학식 수준에서는 맞더라도 체크포인트 정보는 손실된 상태입니다. 프레임워크 간 변환기를 배포하기 전에는 대표 가중치에 대한 최대 오차와 중복 표현 발생 여부를 자동 검사하는 절차가 필요합니다.

섹션별 상세

01
작성자는 HF와 OLMo-core 사이의 체크포인트 변환기를 구현하던 중 RMSNorm 스케일 저장 방식의 차이를 확인했습니다. 한 프레임워크는 BF16 offset을 저장하고 런타임에 FP32로 승격한 뒤 1을 더하지만, 다른 프레임워크는 유효 스케일인 1 + offset을 BF16으로 바로 저장합니다. 두 방식은 수학적으로 같은 파라미터화를 의도하지만 BF16 반올림이 발생하는 위치가 달라 실제 가중치 보존 결과가 달라집니다.
02
Qwen 3.5 0.8B 체크포인트의 3.359375와 3.390625는 FP32에서 1을 더하면 각각 4.359375와 4.390625로 구분됩니다. 그러나 BF16 상태에서 직접 더하면 두 값이 모두 4.375로 반올림되어 같은 표현으로 합쳐집니다. 이후 1을 빼면 두 값이 모두 3.375가 되므로, 두 번째 형식에서 첫 번째 형식으로 되돌리는 변환기는 원래 offset을 복구할 수 없습니다.
03
첨부된 PyTorch 코드는 같은 현상을 재현하며 x.float() + 1의 출력은 tensor([4.3594, 4.3906])이고 x + 1의 BF16 출력은 tensor([4.3750, 4.3750])입니다. 이 결과는 변환 대상이 수학적으로 동형인 표현이어도 중간 연산과 저장 정밀도가 역변환 가능성을 훼손할 수 있음을 수치로 확인합니다. 따라서 체크포인트 변환은 텐서 이름 변경이나 형태 변환만의 문제가 아니라 산술 연산이 개입하는 순간 정밀도 분석까지 요구합니다.

용어 해설

bfloat16(BF16)
BF16은 부동소수점 수를 16비트로 저장하는 저정밀 형식입니다. FP32보다 지수부 범위는 유지하지만 가수부가 짧아, 연산이나 변환 과정에서 서로 다른 값이 같은 표현으로 반올림될 수 있습니다.
RMS 정규화(RMSNorm)
RMSNorm은 입력 벡터의 제곱 평균 제곱근으로 값을 정규화한 뒤 학습 가능한 스케일을 곱하는 정규화 방식입니다. 이 글에서는 스케일을 offset과 1의 합으로 표현하는 두 저장 방식이 문제가 됩니다.
단정밀도 부동소수점(FP32)
FP32는 32비트 부동소수점 형식으로, BF16보다 가수부가 길어 더 세밀한 값을 유지합니다. BF16 값을 FP32로 승격한 뒤 1을 더하면 이 사례의 두 결과가 서로 다른 값으로 남습니다.
반올림 경계(rounding boundary)
반올림 경계는 연산 결과를 특정 정밀도의 표현으로 저장하는 시점에 값이 인접한 표현 중 하나로 수렴하는 지점입니다. 같은 수학식이라도 연산 전후 어느 단계에서 BF16으로 반올림하는지에 따라 정보 손실 여부가 달라집니다.
체크포인트 변환기(checkpoint converter)
체크포인트 변환기는 모델 가중치를 프레임워크나 저장 형식에 맞게 이름 변경, 형태 변환, 순열 또는 산술 변환하는 프로그램입니다. 산술 결과를 저정밀 형식으로 저장하면 역변환으로 원래 값을 복구하지 못할 수 있습니다.
동형성(isomorphism)
동형성은 두 표현 사이에 구조를 보존하는 변환과 역변환이 존재하는 관계입니다. 이 글은 수학적으로 역변환이 가능한 파라미터화라도 유한 정밀도 저장이 끼어들면 실제 값 수준의 복구 가능성이 사라질 수 있음을 보여줍니다.

코드 예제

python
import torch
    
    x = torch.tensor([3.359375, 3.390625], dtype=torch.bfloat16,)
    
    print(x.float() + 1)
    # tensor([4.3594, 4.3906])
    
    print(x + 1)
    # tensor([4.3750, 4.3750], dtype=torch.bfloat16)

동일한 BF16 입력에 FP32 승격 후 덧셈을 적용하는 경우와 BF16 상태에서 직접 덧셈을 적용하는 경우의 결과를 비교합니다.

언급된 도구

torch중립

BF16 텐서에서 FP32 승격 후 덧셈과 BF16 직접 덧셈의 결과를 재현하는 데 사용된 Python 라이브러리입니다.

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 22.수집 2026. 08. 22.출처 타입 REDDIT

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.