15장. 모델 경량화: 양자화, 프루닝, 지식증류
GPTQ 와 AWQ
교과서를 요약 노트로 줄일 때, 시험에 자주 나오는 부분은 자세히 남기고 덜 나오는 부분은 짧게 줄입니다. GPTQ 와 AWQ 는 보정 데이터(시험 문제 예시)를 모델에 흘려 보내, 실제로 자주 쓰이는 길의 오차가 작아지도록 4비트로 줄입니다.
왼쪽 GPTQ 는 층마다 가중치를 한 열씩 4비트로 바꾸고, 그때 생긴 오차를 아직 바꾸지 않은 열을 조금씩 고쳐 메웁니다. 오른쪽 AWQ 는 보정 데이터에서 활성값이 큰 채널을 찾아, 그 채널의 가중치를 미리 키워(스케일) 양자화 오차의 영향을 줄입니다. 둘 다 보정 데이터로 몇 분에서 몇십 분 걸려 파일을 만듭니다. 여기서 시험에 자주 나오는 부분이 활성값이 큰 채널입니다.
둘 견주기
| 견줄 것 | GPTQ | AWQ |
|---|---|---|
| 생각 | 오차를 남은 가중치로 메운다 | 중요한 채널을 보호한다 |
| 보정 데이터 | 수백 문장 | 수백 문장(더 적어도 된다고 알려짐) |
| 만드는 시간 | 길다(모델 크기에 따라 몇십 분) | 비교적 짧다 |
| 쓰는 곳 | vLLM, TGI, transformers | vLLM, TGI, transformers |
안내 코드
아래는 GPTQ 로 4비트 모델을 만드는 코드의 생김새입니다. GPTQ 도구는 리눅스와 큰 GPU 를 전제로 하고 Windows 에서 설치가 어려워, 이 PC 에서 실행하지 않은 안내 코드입니다. 도구의 판에 따라 이름과 인자가 바뀌므로 쓰는 판의 문서를 확인합니다.
from gptqmodel import GPTQModel, QuantizeConfig
calib = [line for line in open("shop_corpus.txt", encoding="utf-8")][:256] # 보정 데이터 256문장
config = QuantizeConfig(bits=4, group_size=128)
model = GPTQModel.load("Qwen/Qwen2.5-0.5B-Instruct", config)
model.quantize(calib)
model.save("out_qwen05b_gptq_4bit")예상 출력(실행하지 않고 유추한 예시)입니다. 걸리는 시간과 크기는 GPU 와 판에 따라 다르며 둥글게 적었습니다.
Quantizing layer 1 of 24 ...
...
Quantizing layer 24 of 24 ...
Saved to out_qwen05b_gptq_4bit (약 450MB, 원래 fp16 약 1GB)주의할 점
- 보정 데이터는 실제로 쓸 글과 비슷해야 합니다. 영어 위키 글로 보정한 모델은 한국어 상담 글에서 오차가 더 클 수 있습니다.
- Hugging Face 에는 이미 GPTQ, AWQ 로 줄여 둔 모델이 많이 올라와 있습니다. 직접 만들기 전에 공식 판이 있는지 찾아봅니다. 내려받을 때 라이선스는 원래 모델을 따릅니다.