LLM 엔지니어링15장 · 모델 경량화: 양자화, 프루닝, 지식증류7 / 22← 이전목차다음 →MetaContents

15장. 모델 경량화: 양자화, 프루닝, 지식증류

GPTQ 와 AWQ

교과서를 요약 노트로 줄일 때, 시험에 자주 나오는 부분은 자세히 남기고 덜 나오는 부분은 짧게 줄입니다. GPTQ 와 AWQ 는 보정 데이터(시험 문제 예시)를 모델에 흘려 보내, 실제로 자주 쓰이는 길의 오차가 작아지도록 4비트로 줄입니다.

층마다 양자화 오차를 남은 가중치로 메우는 GPTQ 와, 활성값이 큰 채널의 가중치를 키워 보호하는 AWQ 를 견준 두 카드

왼쪽 GPTQ 는 층마다 가중치를 한 열씩 4비트로 바꾸고, 그때 생긴 오차를 아직 바꾸지 않은 열을 조금씩 고쳐 메웁니다. 오른쪽 AWQ 는 보정 데이터에서 활성값이 큰 채널을 찾아, 그 채널의 가중치를 미리 키워(스케일) 양자화 오차의 영향을 줄입니다. 둘 다 보정 데이터로 몇 분에서 몇십 분 걸려 파일을 만듭니다. 여기서 시험에 자주 나오는 부분이 활성값이 큰 채널입니다.

둘 견주기

견줄 것GPTQAWQ
생각오차를 남은 가중치로 메운다중요한 채널을 보호한다
보정 데이터수백 문장수백 문장(더 적어도 된다고 알려짐)
만드는 시간길다(모델 크기에 따라 몇십 분)비교적 짧다
쓰는 곳vLLM, TGI, transformersvLLM, 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 로 줄여 둔 모델이 많이 올라와 있습니다. 직접 만들기 전에 공식 판이 있는지 찾아봅니다. 내려받을 때 라이선스는 원래 모델을 따릅니다.
← 이전 절15장 · 양자화를 하는 때와 도구다음 절 →15장 · 프루닝