본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 27. 20:03

GPTQ를 밑바닥부터 구현하며 배운 것들

요약

nanoGPT 모델에 GPTQ 양자화 기법을 밑바닥부터 직접 구현한 과정을 다룹니다. 단순 양자화의 한계를 극복하기 위해 헤시안 행렬을 활용한 2차 근사 및 오차 전파 방식을 통해 퍼플렉시티 저하를 최소화하는 방법을 설명합니다.

핵심 포인트

  • 단순 PTQ의 가중치 독립적 반올림 방식이 초래하는 정확도 저하 문제 분석
  • 헤시안 행렬을 이용한 레이어별 로컬 최적화 및 2차 근사 접근법
  • 양자화 오차를 미양자화 가중치에 분산시켜 출력 손실을 최소화하는 원리
  • nanoGPT 적용 결과 퍼플렉시티 저하를 1.1% 수준으로 방어

저는 nanoGPT 모델에 GPTQ를 밑바닥부터 구현하였으며, 61개의 양자화된 레이어(layers) 전체에 걸쳐 단 1.1%의 퍼플렉시티(perplexity) 저하만을 기록했습니다. 이것이 정확히 어떻게 작동하는지, 그리고 제가 무엇을 만들었는지 소개합니다.

1. 단순 양자화(Naive Quantization)의 문제점

양자화(Quantization)는 신경망(neural networks)을 실행하는 비용을 줄이는 가장 간단하고 효과적인 방법 중 하나입니다. 가중치(weights)를 32비트 부동 소수점(32-bit floating point) 형식으로 저장하는 대신, INT8 또는 INT4와 같은 낮은 정밀도로 줄이는 것입니다. 이를 통해 메모리 사용량을 줄일 수 있으며, 저정밀도 산술 연산을 지원하는 하드웨어에서 추론(inference) 속도를 크게 높일 수 있습니다.

가장 간단한 접근 방식은 사후 훈련 양자화(Post-Training Quantization, PTQ)로, 각 가중치를 가장 가까운 양자화 값으로 독립적으로 반올림하는 방식입니다. 이는 빠르고 구현하기 쉽지만, 중요한 사실 하나를 간과합니다. 바로 신경망의 가중치들은 독립적이지 않다는 점입니다. 각 가중치는 공유된 출력에 기여하며, 한 가중치의 작은 섭동(perturbations)은 다른 가중치들과 복잡한 방식으로 상호작용할 수 있습니다.

이 때문에 단순한 PTQ는 종종 눈에 띄는 정확도 저하를 초래합니다. 어떤 레이어들은 매우 민감하며, 균일한 반올림은 모든 가중치를 동일하게 중요하게 취급합니다. 실제로 이는 레이어 전반에 걸쳐 오차가 누적되는 결과를 낳으며, 특히 표현(representations)이 밀접하게 결합된 트랜스포머(transformers) 구조에서 더욱 두드러집니다.

이것이 핵심 문제입니다. 우리는 단순히 개별적인 크기(magnitudes)만이 아니라, 네트워크의 구조를 존중하며 가중치를 양자화할 수 있는 방법이 필요합니다.

2. GPTQ가 다른 점

GPTQ는 양자화를 단순한 반올림 연산이 아닌, **레이어당 로컬 최적화 문제(local optimization problem per layer)**로 접근합니다. 각 가중치를 독립적으로 다루는 대신, 다음과 같은 질문을 던집니다. "이 가중치를 변경하는 것이 레이어의 출력 손실(output loss)에 어떤 영향을 미치며, 이를 어떻게 보상해야 하는가?"

이에 답하기 위해 GPTQ는 손실 지형(loss landscape)의 2차 근사(second-order approximation)를 사용합니다. 핵심 객체는 헤시안 행렬(Hessian matrix)로, 이는 각 가중치 쌍의 변화에 대해 손실이 얼마나 민감하게 반응하는지를 측정합니다. 직관적으로, 이는 가중치 공간에서 어떤 방향이 "가파르고(steep)", 어떤 방향이 "평탄한지(flat)\

모든 파라미터 상호작용에 대해 명시적으로 그래디언트 (gradient)를 계산하는 대신 (이는 비용이 많이 듭니다), GPTQ는 보정 데이터 (calibration data)를 사용하여 헤시안 (Hessian)을 근사합니다. 이를 통해 하나의 가중치에 가해진 섭동 (perturbation)이 다른 가중치들에 어떻게 영향을 미치는지에 대한 압축된 표현을 얻을 수 있습니다.

핵심 아이디어는 오차 전파 (error propagation)입니다. 가중치 열 (weight column)이 양자화 (quantized)될 때 오차가 발생합니다. GPTQ는 이 오차를 고립된 상태로 두는 대신, 남은 미양자화 가중치들에 그 민감도 (sensitivity)에 비례하여 분산시킵니다. 이는 오차 누적을 방지하며, 단순한 반올림 (naive rounding) 방식보다 레이어의 출력 동작을 훨씬 더 밀접하게 보존합니다.

3. 구현 과정

첫 번째 단계는 각 선형 레이어 (linear layer)에 대한 활성화 통계 (activation statistics)를 수집하는 것이었습니다. 저는 PyTorch의 포워드 훅 (forward hooks)을 사용하여 보정 단계 (calibration phase) 동안 모든 nn.Linear 레이어에 도달하는 입력값들을 캡처했습니다. 이를 통해 모델의 순전파 (forward pass)를 수정하지 않고도 대표적인 활성화 값 데이터셋을 확보할 수 있었습니다.

이러한 활성화 값들로부터 저는 다음과 같은 식을 사용하여 헤시안 행렬 (Hessian matrix)의 근사치를 구성했습니다:

H = 2 * Xᵀ X

여기서 (X)는 수집된 입력값들의 행렬입니다. 이 단계는 입력이 각 가중치 열과 어떻게 상호작용하는지에 대한 기하학적 구조를 인코딩하기 때문에 매우 중요합니다. 보정 데이터가 없다면, 모델은 가중치 공간의 어떤 방향이 가장 중요한지에 대한 개념을 가질 수 없습니다.

헤시안이 계산되면, 수치적 안정성 (numerical stability)을 위해 댐핑 (damping)을 추가하고 촐레스키 분해 (Cholesky decomposition)를 사용하여 역행렬을 구했습니다. 이 역헤시안 (inverse Hessian) 덕분에 GPTQ는 열 전체에 걸쳐 오차를 효율적으로 전파할 수 있습니다.

핵심 양자화 루프 (quantization loop)는 각 가중치 열을 순차적으로 처리합니다. 각 열에 대해 양자화를 수행하고, 결과로 발생하는 오차를 계산한 다음, 이를 보상하기 위해 남은 미양자화 열들을 조정합니다. 업데이트 규칙은 다음과 같습니다:

W[:, j+1:] -= err_j * H_inv[j, j+1:] / H_inv[j, j]

이 코드는 GPTQ의 핵심입니다. 이는 한 열을 양자화함으로써 발생하는 오차가 국소적으로 누적되는 대신, 손실 함수 지형 (loss landscape)의 곡률 (curvature)에 따라 재분배되도록 보장합니다.

4. 결과

61개의 선형 레이어 (linear layers)를 가진 nanoGPT 스타일 모델에 GPTQ를 적용한 결과, 구현의 단순함을 고려했을 때 성능 저하가 놀라울 정도로 작았습니다.

모델손실 (Loss)퍼플렉서티 (Perplexity)
Baseline1.85216.37
GPTQ1.86236.44

손실의 증가는 전체 네트워크에 걸쳐 약 1.1%의 성능 저하에 해당합니다. 단 10개의 교정 배치 (calibration batches)만을 사용하여 모든 선형 레이어를 독립적으로 양자화 (quantization)했다는 점을 고려하면, 이는 매우 강력한 결과입니다. 이는 2차 정보 (second-order information)가 공격적인 압축 상황에서도 모델 구조를 보존하는 데 매우 효과적임을 보여줍니다.

5. 다르게 시도했을 점

이 구현은 알고리즘적으로는 정확하지만, 실제 운영 환경 (production)에서 사용하기 위해 최적화되지는 않았습니다. 모든 양자화된 가중치 (quantized weights)가 역양자화 (dequantization) 후에 여전히 float32로 저장되므로, 실행 시간 (runtime) 동안 실제 메모리 절약 효과는 없습니다. 실제 운영 환경의 GPTQ 구현체들은 가중치를 INT4 또는 INT8 형식으로 저장하고 추론 (inference) 중에 실시간으로 역양자화합니다.

또 다른 개선 사항은 열 단위 양자화 (per-column quantization) 대신 채널 단위 (per-channel) 또는 그룹 단위 (group-wise) 양자화를 사용하는 것입니다. 이는 가중치 분포 전반의 분산 (variance)을 줄여줄 것이며, 특히 활성화 통계 (activation statistics)가 크게 변하는 깊은 트랜스포머 (transformer) 레이어에서 정확도를 더욱 향상시킬 가능성이 높습니다.

마지막으로, 더 정교한 교정 전략 (더 큰 데이터셋, 더 나은 샘플링)을 사용하면 헤시안 추정 (Hessian estimation)을 개선하고 근사 오차 (approximation error)를 줄일 수 있을 것입니다.

ptq.py, gptq.py 및 벤치마크 결과를 포함한 전체 구현은 다음에서 확인할 수 있습니다:
https://github.com/Thoki-Buthelezi/elite-ai-systems-engineer-2026/tree/main/phase2_content/quantization

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0