AWQ
AWQ (Activation-aware Weight Quantization)
GPTQ와 비슷하게, AWQ는 GPU 추론에 최적화된 양자화 방법이에요. 실제로 가중치의 약 1%가 모델 정확도에 크게 기여한다는 사실에 기반해요. 그래서 추론 중 활성화(activation) 분포를 분석하기 위해 데이터셋을 사용해서 중요하고 결정적인 가중치를 식별하고, 이를 섬세하게 다뤄야 해요.
출처: 문서
본문
AutoAWQ로 양자화하기
짧은 데모로 Mistral 7B를 양자화해 볼게요!
먼저 autoawq를 설치해요. 이걸로 AWQ 모델을 쉽게 양자화하고 추론할 수 있어요! AutoAWQ는 기본적으로 양자화 과정에 사용될 pile-val 데이터셋도 함께 제공해요!
!pip install autoawq
설치가 끝나면 양자화할 모델을 다운로드할 수 있어요. 먼저 모델 접근 권한을 얻기 위해 읽기 전용 액세스 토큰으로 로그인할게요.
Note: 먼저 해당 리포지토리의 이용 약관에 동의해야 해요.
from huggingface_hub import login
login("read_token")
이제 준비가 끝났으니 모델을 로드하고 양자화할 수 있어요! 여기서는 모델을 4비트로 양자화할 거예요.
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
pretrained_model_dir = "mistralai/Mistral-7B-Instruct-v0.3"
quantized_model_dir = "mistral_awq_quant"
model = AutoAWQForCausalLM.from_pretrained(
pretrained_model_dir, **{"low_cpu_mem_usage": True, "use_cache": False}
)
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, trust_remote_code=True)
# quantize the model
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }
model.quantize(tokenizer, quant_config=quant_config)
이제 모델이 양자화됐으니, 나중에 공유하거나 다시 로드할 수 있도록 저장할게요. AWQ로 양자화하는 것은 시간과 리소스가 꽤 들기 때문에, 항상 저장해 두는 걸 권장해요.
model.save_quantized(quantized_model_dir)
tokenizer.save_pretrained(quantized_model_dir)
모델이 AWQ 4비트 정밀도로 양자화되어 저장됐어요!
autoawq로 추론을 위해 다시 로드할 수도 있어요:
model = AutoAWQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0") # loads quantized model to the first GPU
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir)
conversation = [{"role": "user", "content": "How are you today?"}]
prompt = tokenizer.apply_chat_template(
conversation,
tokenize=False,
add_generation_prompt=True,
)
inputs = tokenizer(prompt, return_tensors="pt")
inputs.to("cuda:0") # loads tensors to the first GPU
outputs = model.generate(**inputs, max_new_tokens=32)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)