피드로 돌아가기
Quanto: a PyTorch quantization backend for Optimum
Hugging Face BlogHugging Face Blog
AI/ML

Hugging Face가 PyTorch 양자화 백엔드 Quanto를 개발해 float32 모델을 int8, int4, float8 등 저정밀도로 변환하고 CUDA 장치에서 최적화된 연산 지원

Quanto: a PyTorch quantization backend for Optimum

2024년 3월 18일9intermediate

Context

LLM 배포 시 모델 크기와 메모리 사용량이 소비자 장치 배포의 주요 장벽이다. 기존 양자화 라이브러리들은 각각 특정 모델 구성과 장치에만 호환되며, 동일한 설계 원칙을 기반하면서도 서로 호환되지 않는 문제가 있었다.

Technical Solution

  • 동적 양자화 지원: 표준 float 모델을 quantize() 함수로 동적 양자화 모델로 변환하고 int8, int4, int2, float8 가중치와 int8, float8 활성화 지원
  • 캘리브레이션 모드: 대표 샘플을 통과시키면서 활성화 범위를 자동 기록하는 Calibration 컨텍스트 제공
  • 양자화 인식 훈련(QAT): 성능 저하 시 역전파 학습을 통해 float 모델 성능 복구 가능
  • 모델 고정 및 직렬화: freeze() 함수로 float 가중치를 양자화 가중치로 교체하고 PyTorch weight_only, Safetensors 형식 지원
  • 크로스 플랫폼 지원: CPU/GPU/MPS 장치 자동 선택, CUDA에서 int8-int8, fp16-int4, bf16-int8, bf16-int4 가속 행렬 곱셈 제공
  • Transformers 통합: QuantoConfigfrom_pretrained()에 전달하면 자동 양자화, torch.compile 호환성 지원
  • 모달리티 무관 설계: 음성-텍스트 모델(openai/whisper-large-v3) 등 임의 모달리티 모델 양자화 가능

Impact

Meta-Llama-3.1-8B 모델에서 Post-Training-Optimization 적용 없이 int8, int4, float8 등 다양한 양자화 구성에 대한 정확도 평가 수행, NVIDIA A10 GPU에서 토큰당 레이턴시 측정 및 벤치마크 제공.

Key Takeaway

양자화 백엔드의 핵심은 특정 모델이나 장치에 제한되지 않으면서도 eager mode 동작, 자동 양자화 stub 삽입, 선택적 캘리브레이션과 QAT를 제공하는 단순한 선형 양자화 원시 요소의 조합에 있다. 이는 LLM뿐 아니라 모든 모달리티의 모델에 대한 통일된 양자화 워크플로우를 가능하게 한다.


LLM이나 비전 모델을 소비자 장치에 배포해야 하는 엔지니어는 Quanto를 통해 사전 훈련된 float32 모델에서 시작해 `quantize() → Calibration() → freeze() → save_file()`의 5단계 워크플로우로 int8 또는 int4 양자화 모델을 만들 수 있으며, 성능 저하 시에만 QAT로 미세 조정하면 메모리 사용량을 대폭 줄이고 CUDA 가속 연산을 활용할 수 있다.

원문 읽기