본문 바로가기

IT Note/Data&AI

On-Prem LLM 실행기 (2): 양자화란?

 

안녕하세요! 여립입니다.

 

지난 글에서는 LLM이 왜 이렇게 큰지, 그리고 모델을 구조적으로 효율화하는 기법을 살펴봤습니다.

 

On-Prem LLM 실행기 (1): LLM 구조 파악하기

안녕하세요! 여립입니다. 최근 서버에 로컬모델 실행을 위한 인프라를 구성하고 실행해보았는데요, 이 경험을 토대로 이 시리즈에서는 LLM의 구조에 대해 이해하고, 모델 양자화란 무엇인지, 그

it-ist.tistory.com

 

하지만 마지막에 말한대로 구조를 효율화해도 한 가지 문제는 남습니다.

 

파라미터 개수 자체는 그대로라는 점입니다.

 

GPT-OSS 20B는 약 210억 개의 파라미터를 가진 모델입니다. 16비트 기준으로 단순 계산하면 약 42GB가 필요합니다. 제가 가진 RTX 3090 GPU의 VRAM은 24GB이고요.

 

그런데 OpenAI가 공개한 GPT-OSS 20B는 16GB 메모리로 실행할 수 있습니다.

 

42GB짜리 모델이 어떻게 16GB 안에 들어갈까요? 이번 글에서는 그 핵심인 양자화(quantization)를 다뤄보겠습니다.

 


 

1. 양자화란 무엇인가

이제 양자화가 실제로 무엇을 하는지 보겠습니다.

 

참고로, 여기서 말하는 양자화는 양자컴퓨팅의 양자와는 다른 이야기입니다. 이름이 비슷한 이유는 둘 다 영어 quantum에서 출발했기 때문인데요, quantum은 원래 "더 이상 쪼개지지 않는 작은 단위"라는 뜻 입니다.

 

양자컴퓨팅의 양자는 물리학의 quantum, 즉 아주 작은 에너지 단위와 관련된 개념이고, LLM 양자화는 연속적인 숫자를 몇 개의 단계로 나누어 더 적은 비트로 저장하는 방법입니다.

 

지난 글에서 파라미터를 사진 편집 앱의 슬라이더에 비유했습니다. 밝기, 대비, 채도 같은 슬라이더 값이 아주 촘촘하게 저장되어 있다고 생각해봅시다. 예를 들어 어떤 값이 `0.3712654...`처럼 소수점 아래까지 정밀하게 저장되어 있는 식입니다.

 

이 값을 꼭 그렇게까지 정밀하게 저장해야 할까요?

 

사람 눈으로 보기에는 밝기 37.12654와 37.1의 차이를 거의 느끼지 못할 수 있습니다. 디지털 사진도 비슷합니다. 원본 RAW 파일은 수십 MB지만, JPEG로 저장하면 1~2MB로 줄어듭니다. 그래도 대부분의 사람은 같은 사진으로 느낍니다.

 

 



양자화도 같은 발상입니다.

 

모델 안의 숫자를 원래보다 덜 정밀하게 저장해서 크기를 줄입니다. 원래 16비트로 저장하던 숫자를 8비트, 4비트처럼 더 작은 단위로 표현하는 것입니다. 예를 들어 16비트 숫자를 4비트로 줄이면, 숫자 하나가 차지하는 공간은 이론적으로 4분의 1이 됩니다.

16비트 = 2바이트
4비트 = 0.5바이트
=> 가중치 기준으로 약 1/4 크기

 

GPT-OSS 20B를 단순 계산하면 이렇습니다.

210억 개 × 2바이트 ≈ 42GB
210억 개 × 0.5바이트 ≈ 10.5GB

 

물론 실제 실행에는 가중치만 필요한 게 아닙니다. 추론 중간에 생기는 다양한 단계를 위한 작업 공간도 필요합니다. 그래서 공식 문서에서 말하는 16GB는 순수 가중치 크기라기보다, 모델 실행에 필요한 메모리에 가까운 값입니다.

 

그래도 핵심은 같습니다. 숫자를 얇게 저장하면, 실행하기 어려운 크기의 모델을 GPU에 실행할 수 있게 됩니다.

 




2. 압축하면 손실이 발생하는거 아닌가? 왜 답변이 멀쩡할까?

 

여기서 자연스럽게 의문이 생깁니다. 숫자를 대충 저장하면 모델이 망가져야 하는 것 아닐까요?

 

맞아요! 양자화는 기본적으로 손실 압축입니다. 원본 숫자를 그대로 보존하지 않습니다. JPEG 사진을 확대해서 보면 원본과 차이가 보이는 것처럼, 양자화된 모델도 원본 모델과 완전히 같지는 않습니다.

 

그런데도 많은 양자화 모델은 생각보다 잘 동작합니다. 이유는 크게 두 가지입니다.

 

첫째, 모든 파라미터가 똑같이 중요한 것은 아니기 때문입니다.

 

LLM 안에는 수십억 개에서 수천억 개의 파라미터가 들어 있지만, 실제 출력에 큰 영향을 주는 값은 일부입니다. 어떤 값은 조금 바뀌어도 결과가 거의 달라지지 않고, 어떤 값은 조금만 바뀌어도 답변 품질에 영향을 줍니다.

 

양자화 알고리즘은 이 차이를 활용합니다. 중요한 값은 최대한 조심해서 다루고, 덜 민감한 값은 더 과감하게 줄입니다.

 

둘째, 값의 범위를 맞춰주는 장치가 있기 때문입니다.

 

모델 안의 숫자는 모두 같은 크기로 움직이지 않습니다. 어떤 구간은 값이 작고, 어떤 구간은 튀는 큰 값이 있습니다. 이런 큰 값을 아웃라이어(outlier)라고 부릅니다. 단순히 모든 숫자를 같은 기준으로 잘라버리면 아웃라이어가 망가지고, 모델 품질도 같이 떨어집니다.

 

 

 

그래서 더 정밀한 양자화 방식은 그룹별로 스케일을 맞추거나, 양자화 후 오차가 덜 생기도록 보정합니다.


 

결론적으로 양자화는 중요한 정보는 최대한 살리면서 표현만 더 작게 바꾸는 기술입니다. 물론 공짜는 아닙니다. 복잡한 수학 문제, 긴 추론 과정, 민감한 벤치마크에서는 원본 모델과 차이가 더 크게 날 수 있습니다.

 

 

 




3. INT4, FP8, MXFP4 이게 뭘까요?

모델명칭에 이런 방식으로 작성되어 있는 모습을 보신적 있으실지 모르겠습니다.

 

태그에 보시면 mxfp4라는 명칭을 보실 수 있습니다. 이건 뭘 의미할까요?


 

 

양자화라고 해서 한 가지 방식만 있는 것은 아닙니다. 어떤 숫자 형식으로 줄이느냐에 따라 성격이 꽤 달라집니다.

형식 의미 특징
INT4 4비트 정수 압축률이 높고 오픈소스 모델에서 흔함
FP8 8비트 부동소수점 압축률은 낮지만 안정적이고 학습에도 쓰임
MXFP4 4비트 부동소수점 + 블록별 스케일 GPT-OSS가 채택한 방식

INT4

INT4는 숫자를 4비트 정수로 표현하는 방식입니다.  장점으로는 압축률이 좋습니다. 16비트 가중치를 4비트로 줄이면 가중치 크기가 대략 4분의 1이 됩니다. 하지만 표현이 거칠어집니다. 그래서 그냥 반올림만 하면 품질이 많이 떨어질 수 있기 때문에, 이 문제를 줄이기 위해 AWQGPTQ같은 알고리즘을 함께 씁니다. (이건 뒤에서 자세히 얘기할게요!)

 
대표적인 예시로는 Gemma 계열 AWQ 모델이 있습니다.

 

FP8

FP8은 8비트 부동소수점입니다. INT4보다 더 많은 비트를 쓰기 때문에 압축률은 낮습니다. 대신 숫자의 크고 작음을 표현하는 능력이 더 좋기 때문에, 아주 작은 값과 큰 값을 함께 다루는 데 유리합니다. 그래서 FP8은 단순 저장용 압축을 넘어, 학습이나 고성능 추론에서도 많이 이야기됩니다. 특히 NVIDIA H100 같은 Hopper 세대 이후 GPU에서는 FP8 연산을 하드웨어에서 직접 지원합니다.

 

다만 제가 사용한 3090이나 A6000 같은 Ampere 세대 GPU는 FP8을 네이티브로 지원하지 않습니다. 이 경우 FP8의 장점을 제대로 누리기 어렵습니다.

 

MXFP4

GPT-OSS 20B가 16GB 메모리로 실행될 수 있는 핵심 이유 중 하나가 바로 이 MXFP4입니다.

 

이름을 풀어보면 Microscaling FP4입니다. 기본은 4비트 부동소수점이지만, 그냥 FP4만 쓰면 표현력이 너무 부족해서, 여러 숫자를 작은 블록으로 묶고, 블록마다 별도의 스케일 값을 둡니다. 비유하자면, 사진 전체에 같은 밝기 보정을 거는 것이 아니라, 작은 영역마다 밝기 기준을 따로 맞춰주는 방식에 가깝습니다. 이렇게 하면 작은 크기를 유지하면서도, 각 블록 안의 값 분포를 더 잘 표현할 수 있게 됩니다.

 


4. AWQ와 GPTQ는 숫자 형식이 아니라 알고리즘입니다

양자화 글을 읽다 보면 INT4, FP8, MXFP4 같은 이름과 함께 AWQ, GPTQ 같은 이름도 자주 나옵니다. 처음 보면 전부 같은 분류처럼 보이지만, 사실 역할이 다릅니다.

 

INT4, FP8, MXFP4는 숫자를 어떤 형식으로 저장할 것인가에 가깝습니다. 반면 AWQ, GPTQ는 원본 모델을 그 형식으로 바꿀 때 품질 손실을 어떻게 줄일 것인가에 가깝습니다.

 

AWQ (Activation-aware Weight Quantization)

실제 추론 중 어떤 값이 중요한지 보고, 중요한 채널은 더 조심해서 양자화하고자 하는 방법입니다. 그래서 모든 가중치를 똑같이 다루지 않고, 모델 출력에 민감한 부분을 살려두는 방식입니다. 그래서 AWQ 모델은 보통 INT4 양자화와 함께 등장합니다. 가중치는 최소한으로 하되, 품질에 중요한 부분은 최대한 보존하려는 조합입니다.

 

GPTQ (Accurate Post-Training Quantization for Generative Pre-trained Transformers)

GPTQ도 비슷한 목적을 가집니다. 원본 모델과 양자화 모델의 출력 차이가 작아지도록, 레이어 단위로 오차를 줄이는 방식입니다.

 

AWQ와 GPTQ 중 어느 쪽이 항상 더 좋다고 말하기는 어렵습니다. 환경과 양자화 방식에 따라 결과가 달라지기 때문이죠. 다만, 단순히 어떤 압축방식을 썼는지 보다 어떤 알고리즘으로 양자화했는지가 실제 품질과 속도에 큰 영향을 줍니다.


5. 양자화가 줄이는 것은 가중치입니다

여기서 꼭 짚고 넘어가야 할 점이 있습니다. 16비트를 4비트로 줄이면 4분의 1이 된다고 했습니다. 하지만 이 말은 주로 가중치 기준입니다 . 실제 LLM 추론 서버의 GPU 메모리에는 가중치 말고도 여러 가지가 올라갑니다.

 

  • 모델 가중치
  • KV Cache
  • Activation (중간 계산값들)
  • CUDA 런타임 작업 공간
  • 추론엔진이 잡아둔 메모리
  • 등등...

그래서 42GB 모델을 4비트로 줄였다고 해서, 전체 실행 메모리가 무조건 10.5GB가 되는 것은 아닙니다.

GPT-OSS 20B도 가중치만 보면 약 10~11GB 수준으로 줄어들지만, 실제 실행 기준으로는 약 16GB가 필요하다고 설명됩니다. 나머지는 추론 중 필요한 작업 공간입니다.

 

이 차이를 모르고 "4비트니까 무조건 4분의 1"이라고 생각하면 배포할 때 OOM(Out Of Memory)을 만나게 됩니다!

 

 

제가 실제로 vLLM을 올릴 때도 이 지점이 중요했습니다. gpu에 사용할 메모리 한도를 너무 낮게 잡으면 모델 가중치는 올라가도 KV cache를 만들 공간이 부족해 서버가 뜨지 않습니다.

 

양자화는 모델을 GPU에 올릴 수 있게 만들어주지만, 실제 배포 가능 여부는 가중치 + KV cache + 런타임 작업 공간을 모두 합쳐 판단해야 합니다.






6. 그래서 어떤 모델을 실행했을까요?

모델 양자화 방식 선택이유
GPT-OSS 20B MXFP4 모델이 네이티브 MXFP4로 공개됨
Gemma 계열 AWQ / INT4 네이티브로는 양자화 미지원. 오픈소스 배포본과 vLLM 지원이 안정적

 

GPT-OSS 20B는 애초에 MXFP4 형태로 공개되었기에 별도의 양자화를 거치지 않고 그대로 사용할 수 있습니다. 반면 Gemma 계열은 기본적으로는 양자화를 제공하지 않기에 커뮤티니 버전 혹은 다른 기업체에서 양자화한 AWQ 모델을 사용했습니다. 4비트 가중치로 줄여 VRAM 부담을 낮추고, vLLM의 AWQ Marlin 커널을 통해 Ampere GPU에서도 비교적 안정적으로 실행할 수 있기 때문입니다.

 

중요한 점은 어떤 양자화 방식을 선택할지는 모델과 GPU, 추론 엔진의 조합으로 결정된다는 것입니다. 어떤 방식이 무조건 최고라고 말하기 어렵습니다.

 

  • 모델이 어떤 포맷으로 공개됐는지
  • 내가 가진 GPU가 어떤 연산을 지원하는지
  • vLLM, TensorRT-LLM 같은 추론 엔진이 어떤 커널을 안정적으로 지원하는지
  • 품질 손실을 어느 정도까지 허용할 수 있는지

등을 함께 고려해 선택해야 합니다.

 

제가 모델들을 배포한 환경은 Ampere 세대 GPU를 중심으로 구성되어 있습니다. 그래서 Blackwell 세대에서 네이티브로 빛나는 FP4/MXFP4를 누리기는 어렵고, Hopper 세대의 FP8 이점도 제한적이였기에, AWQ+INT4방식을 선택한 것도 있습니다.

 

 


예전에는 양자화를 "모델을 억지로 줄이는 사후 압축" 정도로 보는 경우가 많았습니다. 하지만 최근 모델들은 점점 처음부터 낮은 정밀도 실행을 염두에 두고 공개되거나, 양자화 친화적인 구조를 갖추거나, 특정 하드웨어의 저정밀도 연산을 활용하는 방향으로 가고 있습니다. 

 

GPU 하드웨어도 같은 방향으로 움직입니다. Ampere 세대에서는 4비트 모델을 소프트웨어 커널로 잘 돌리는 것이 중요했고, Hopper 세대에서는 FP8 Tensor Core가 본격적으로 쓰이기 시작했습니다. Blackwell 세대에서는 FP4 같은 더 낮은 정밀도 포맷이 하드웨어 차원에서 더 중요해지고 있습니다.

 

결국 모델과 GPU는 더 큰 모델을 만들되, 더 낮은 정밀도로 효율적으로 실행하는 방향으로 발전하고 있습니다.

 

BUT! 모델이 GPU에 올라갔다고 바로 서비스가 되는 것은 아닙니다. 여러 사용자의 요청을 동시에 받고, 응답을 빠르게 생성하고, API 형태로 안정적으로 제공하려면 또 다른 계층이 필요합니다.

 

다음 글에서는 이 모델을 실제로 서비스까지 어떻게 제공하는지 다뤄보겠습니다.

 

긴 글 읽어주셔서 감사합니다..!

 

반응형