[AWQ: ACTIVATION-AWARE WEIGHT QUANTIZATION FOR ON-DEVICE LLM COMPRESSION AND ACCELERATION](AWQ: ACTIVATION-AWARE WEIGHT QUANTIZATION FOR ON-DEVICE LLM COMPRESSION AND ACCELERATION)
Lin, J., Tang, J., Tang, H., Yang, S., Chen, W. M., Wang, W. C., ... & Han, S. (2024). Awq: Activation-aware weight quantization for on-device llm compression and acceleration. Proceedings of Machine Learning and Systems, 6, 87-100.
bitsandbytes
를 사용하여 4bit weight-only 양자화를 적용, 원본(FP16) 모델과 추론 속도 및 응답 품질을 비교 평가또한 실험 과정에서 발생한 문제점과, 왜 양자화가 성능을 해칠 수 있는지, 그리고 AWQ 논문이 어떤 점에서 기존 양자화 방식보다 개선된 접근인지를 이론 및 실습 기반으로 정리하였다.
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch, time
model_id = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
# 토크나이저 및 원본 모델 로딩
tokenizer = AutoTokenizer.from_pretrained(model_id)
model_fp16 = AutoModelForCausalLM.from_pretrained(model_id).to("cuda")
from transformers import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_use_double_quant=True)
model_4bit = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto"
)
from transformers import GenerationConfig
def run(model, prompt):
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
generation_config = GenerationConfig(
max_new_tokens=256,
do_sample=True,
top_k=50,
top_p=0.95,
temperature=0.7,
pad_token_id=tokenizer.eos_token_id,
eos_token_id=tokenizer.eos_token_id
)
start = time.time()
output = model.generate(
**inputs,
generation_config=generation_config
)
end = time.time()
print(f"\\u23f1\\ufe0f 추론 시간: {end - start:.2f}\\ucd08")
print(tokenizer.decode(output[0], skip_special_tokens=True))
question = "question = 사용자: 수소와 산소가 반응하면 무엇이 되나요?\\n\\n### 어시스턴트:"
print("🔹 [FP16 원본 모델]")
run(model_fp16, question)
print("\\n🔸 [4bit 양자화 모델]")
run(model_4bit, question)
항목 | FP16 모델 | 4bit 모델 |
---|---|---|
추론 시간 | 약 0.95초 | 약 11.5초 |