[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 Systems6, 87-100.

awq.ipynb

TinyLlama 4bit 양자화 실험 및 분석

실험 목적

또한 실험 과정에서 발생한 문제점과, 왜 양자화가 성능을 해칠 수 있는지, 그리고 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))

4. 실험 질문 및 실행


question = "question = 사용자: 수소와 산소가 반응하면 무엇이 되나요?\\n\\n### 어시스턴트:"

print("🔹 [FP16 원본 모델]")
run(model_fp16, question)

print("\\n🔸 [4bit 양자화 모델]")
run(model_4bit, question)

실험 결과 및 분석

1 . 추론 속도 결과

항목 FP16 모델 4bit 모델
추론 시간 약 0.95초 약 11.5초