아티클

Quantization 관련 알아두면 좋을 짧막 지식들

어니언킴 2025. 10. 10. 18:35

모델 최적화 및 서빙 작업을 할 때, Quantization 관련 알아두면 좋을 짧막 지식들을 소개한다. (지식이라곤 했지만 글쓴이의 주관이 한스푼 섞여있을 수 있다.)

 

  • 당연하겠지만 Quantization은 모델이 가벼워 지는 대신 추론의 정확도를 떨어뜨린다. 모델의 사이즈를 줄이는 동시에 정확도를 최대한 보존하는 것이 Quantization 기술이 풀어야 핵심 과제이다.
  • 주로 쓰는 Quantization 의 단위는 16bit, 8bit, 4bit 이다. 8bit 를 기준으로 위는 Float, 아래는 Int 라고 생각하면 편하다. 8bit 는 Float, Int 둘다 쓰이기에 INT8인지 FP8 인지를 잘 확인하자.
  • Naive - 가장 쉬운 Quantization 방법은 FP32 의 Weight 을 스케일을 정해 냅다 INT4 로 매핑하는 것일 것이다. 예를 들어, weight 의 최댓값이 3.0 이라면 스케일을 3으로 정해 (-3.0 ~ 3.0) 구간의 float을 (-8 ~ 7) 구간의 int 로 반올림하여 매핑 할 수 있을 것이다.
  • GPTQ - Quantization 이 weight 값을 Scale 로 나눈 이후 가까운 구간의 정수로 ‘반올림’하여 매핑하는 과정에 있어 ‘반올림’이 가장 효율적이라는건 어떤 근거로 하는 말인가? 단순 반올림하여 정수를 매핑하는 것이 아니라 아웃풋의 오차를 최소화하는 정수를 수학적으로 계산하여 찾을 수 있는데 이 방법을 GPTQ(Generalized Post-Training Quantization) 라 한다.
  • AWQ - 단순하게 Quantization의 스케일을 Weight 의 최댓값으로 정하는 것이 아닌, 최종 모델의 아웃풋의 오차가 최소가 되도록 스케일을 정하는 방식이다. GPTQ 와 다른 점은 GPTQ는 float 을 최적화된 정수로 매핑해주는 과정이라면 AWQ 는 Layer 별 Scale 을 정해주는 과정이라는 점이다. 요즘은 AWQ가 Quantization 을 하는데 걸리는 시간이 월등히 짧아 GPTQ 보다 선호된다.
  • PTQ vs QAT - 위 방법처럼 이미 학습된 모델을 quantization 하는 방법을 PTQ(Post-Training Quantization)이라 하고 애초에 학습할 때 부터 quantization 을 염두해두고 weight 의 오차가 최소가 되게끔 학습을 하는 방법을 QAT(Quantization Aware Training) 이라고 한다. 학습 과정이 매우 귀찮으나 성능은 QAT가 PTQ 보다 조금 더 좋다. (시간과 리소스가 남아 돌면 추천한다.)
  • Mixed Precision - Layer마다 정확도가 떨어지는 정도가 다르다. 예를들어 Normalization Layer 나 Softmax 는 일반 matrix 연산 (CNN, Linear) 보다 더 정확도가 많이 떨어진다. 이에 따라 layer 마다 정확도 (4bit, 8bit 등) 을 다르게 하는 Mixed Pricision (MP) 연산이 쓰인다.
  • 그럼에도 불구하고 엣지 추론의 경우에는 8bit 또는 4bit 연산을 하는 경우가 있다. W4A8 같은 기호를 본다면 weight 는 4bit로, 연산 결과(Activation)는 8bit 로 저장한다는 말이다.
  • CW - 모델 내부의 모든 레이어에 똑같은 Global Scale 의 Quantization 을 적용하면 정확도 손실이 클 수 있다. 그래서 모델을 쪼개서 quantization 을 하기 시작했는데 Vision 모델을 통해 예시를 들어보면,
    • Layer Wise - layer 별로 quantization 스케일링을 적용 (CNN, Linear 별 scale하나씩)
    • Channel Wise - layer 안 channel 별 quantization 스케일링을 적립 ( CNN 안에 필터, channel 별로 스케일 하나씩. 예를 들어, 16x3x3 CNN 은 16개의 스케일 존재)
    • Block Wise - layer 의 단위는 너무 크고, channel 의 단위는 너무 세세하다고 layer 와 channel 사이를 적당히 그룹별로 묶어놓아 scaling 을 하게 되면 그것을 blockwise 라고 한다. (구현체마다 정의가 다르다.) gguf 의 Q6_K 의 K 가 blockwise 를 의미한다.
    • 현재는 CW quantization 이 복잡한 계산과 스케일에도 불구하고 transformer 등 모델에서 기본으로 적립된 듯 하다.
  • BitNet - 1.58bit quantization을 내걸고 나온 모델. 1bit quantization 의 시대가 왔다고 호들갑을 떠는 경우가 많은데 이게 왜 호들갑인지는 추후 따로 정리해보도록 하겠다. (실제 1bit quantization 으로 서비스를 운영했다는 소리를 들어보았는가?)
  • gguf - 모델 경량화를 위한 프레임워크 ggml 에서 사용하는 표준화 된 파일 포맷 형식이다. 보통 "tinyllama-1.1b-chat-v1.0.Q6_K.gguf” 처럼 모델 이름 뿐 아니라 사이즈, 경량화 방식 등을 함께 표기한다. llama.cpp 등 서빙 프레임워크에서 쓸 수 있고 gguf 가 붙은 모델을 받아서 돌리면 경량화 관련 엔지니어링이 다 되어 있어 매우 편하다. 다만 CPU 기반 환경에서도 효율적인 추론이 가능하지만, GPU 최적화 방식보다는 추론 속도가 다소 느릴 수 있긴 하다.
  • 하드웨어 별 Optimization Framework - 사실 당신이 Quantization 에 대해서 아무것도 몰라도 딸깍 하면 모델이 하드웨어에 맞게 최적화 된다. 하드웨어 벤더 들은 대부분 Quantization을 포함한 최적화 프레임워크를 제공한다. Nvidia의 TensorRT 부터 Intel 의 OpenVINO, Qualcomm의 AIMET등.. 성능 측면에서 돌리고자 하는 하드웨어 벤더의 최적화 플랫폼에서 Quantization 을 진행하는것이 가장 쉽고 최적화 된 성능을 내는 방법이다.

정리를 하면 이러하다. 만약 후임이 모델 Quantization을 해서 가져왔다고 하면 팀 상황에 맞게 다음과 같은다음과 같은 질문을 해 볼 수 있을 것이다.

 

“모델 받아서 한거야? 그럼 PTQ네”

“PTQ 방법은 뭐로 했어? GPTQ? AWQ? 아님 그 외의 수많은 다른 방법?”

“몇비트야? 스케일은 뭐 기준으로 나눴어? Channel 별, Layer 별, Block 별?”

 

후임은 잠시 침묵하다 이렇게 답할 수 있다.

 

“그냥.. 잘 모르겠고 gguf 썼는데요?”

 

그럼 당신은 이렇게 답할 수 있을 것이다.

 

“좋아. 그럼 일단 TensorRT부터 깔자.”