Quantization: ຫຍໍ້ຂະໜາດໂມເດວພາສາຂະໜາດໃຫຍ່ (LLM) ໃຫ້ໃຊ້ງານເທິງແລັບທັອບທົ່ວໄປໄດ້
Quantization: ຫຍໍ້ຂະໜາດໂມເດວພາສາຂະໜາດໃຫຍ່ (LLM) ໃຫ້ໃຊ້ງານເທິງແລັບທັອບທົ່ວໄປໄດ້
ປັດຈຸບັນ, ຖ້າທ່ານເປັນນັກພັດທະນາ AI ຢູ່ລາວທີ່ຢາກຈະນຳໃຊ້ໂມເດວພາສາຂະໜາດໃຫຍ່ (LLM) ເຊັ່ນ Llama-3 ທີ່ລຸ້ນ 70 ຕື້ພາຣາມິເຕີ (70B parameters) ເພື່ອມີເປົ້າໝາຍສ້າງລະບົບວິເຄາະຂໍ້ມູນລູກຄ້າສຳລັບ SME ທ້ອງຖິ່ນ ຫຼື ພັດທະນາແຊັດບັອດທ່ອງທ່ຽວໃນນະຄອນຫຼວງວຽງຈັນ, ສິ່ງກີດຂວາງທຳອິດທີ່ທ່ານຈະພົບຄື “ຮາດແວ” (Hardware).
ໂມເດວ 70B ໃນຮູບແບບມາດຕະຖານ FP16 (16-bit Floating Point) ຕ້ອງການໜ່ວຍຄວາມຈຳ VRAM ເຖິງ 140GB! ນັ້ນໝາຍຄວາມວ່າທ່ານອາດຈະຕ້ອງເຊົ່າ Cloud GPU ລະດັບ A100 (80GB) ເຖິງ 2 ໜ່ວຍເຊິ່ງມີຄ່າໃຊ້ຈ່າຍທີ່ສູງຫຼາຍ. ແຕ່ຈະເປັນແນວໃດຖ້າພວກເຮົາສາມາດບີບອັດໂມເດວນີ້ໃຫ້ສາມາດຣັນເທິງ MacBook Pro ທີ່ມີ Unified Memory ຫຼື Gaming Laptop ທີ່ມີການາດຈໍທົ່ວໄປໄດ້? ຄຳຕອບສຳລັບການແກ້ບັນຫານີ້ແມ່ນ Quantization.
Quantization ແມ່ນຫຍັງ? ເຈາະເລິກເບື້ອງຫຼັງທາງຄະນິດສາດ
ໃນທາງຄອມພິວເຕີ ແລະ ຄະນິດສາດ, Quantization ແມ່ນການສ້າງ Mapping Function ເພື່ອແປງຄ່າ Weights ແລະ Activations ຈາກຂໍ້ມູນທີ່ມີຄວາມລະອຽດສູງ (High-Precision) ເຊັ່ນ 16-bit (FP16) ຫຼື 32-bit (FP32) ລົງມາເປັນຂໍ້ມູນທີ່ມີຂະໜາດນ້ອຍກວ່າ (Low-Precision) ເຊັ່ນ 8-bit Integer (INT8) ຫຼື ແມ້ກະທັ່ງ 4-bit (INT4/NF4).
ສົມຜົນພື້ນຖານຂອງການເຮັດສາເຍົາແບບ Linear Quantization ຄື:
Q = clip(round(R / S) + Z)
ໂດຍທີ່:
- R: ແມ່ນຄ່າ Floating-point ເດີມ (ພື້ນຖານ).
- S (Scale Factor): ຄືຕົວຫານທີ່ໃຊ້ໃນການແບ່ງຊ່ວງຫ່າງຂອງຂໍ້ມູນ (Step size).
- Z (Zero-point): ຄືຄ່າອອຟເຊັດເພື່ອໃຫ້ແນ່ໃຈວ່າຄ່າ 0 ຂອງ floating-point ຈະຖືກແມັບ (Mapped) ຕົງກັບຄ່າ integer ທີ່ແທ້ຈິງ.
- clip(): ປ້ອງກັນບໍ່ໃຫ້ຄ່າທີ່ໄດ້ເກີນຂອບເຂດຂອງ Data type ໃໝ່ (ເຊັ່ນ INT8 ຈະຕ້ອງຢູ່ລະຫວ່າງ -128 ຫາ 127).
ເມື່ອເຮົາສູນເສຍຄວາມລະອຽດ, ໂມເດວຈະມີຄ່າ Perplexity (ຄວາມສັບສົນໃນການທຳນາຍຄຳສັບ) ເພີ່ມຂຶ້ນເລັກນ້ອຍ. ແຕ່ດ້ວຍເຕັກນິກສະໄໝໃໝ່, ເຮົາສາມາດຮັກສາຄວາມສາມາດຂອງໂມເດວ 70B ໄວ້ໄດ້ເກືອບ 95% ໃນຂະນະທີ່ໃຊ້ VRAM ຫຼຸດລົງເຫຼືອພຽງປະມານ 35-40GB (ສຳລັບ 4-bit).
ເຕັກນິກການເຮັດ Quantization ທີ່ນິຍົມໃນປັດຈຸບັນ (Advanced Approaches)
ສຳລັບນັກພັດທະນາ AI (AI Developers) ທີ່ຕ້ອງການເອົາໂມເດວມາເຊີບ (Serve) ຫຼື ຝຶກສອນເພີ່ມ (Fine-tune) ທ້ອງຖິ່ນ, ການເລືອກ Algorithm ເປັນສິ່ງສຳຄັນ:
1. GPTQ (Accurate Post-Training Quantization)
GPTQ ແມ່ນການເຮັດ Quantization ໃນລະດັບບລັອກ (Block-wise) ທີ່ໃຊ້ຂໍ້ມູນສົມຜົນ Hessian (Second-order information) ເພື່ອຊອກຫາວ່າ Weights ໃດທີ່ສາມາດຕັດອອກ ຫຼື ຫຼຸດຄວາມລະອຽດໄດ້ໂດຍທີ່ສົ່ງຜົນກະທົບຕໍ່ Output ໜ້ອຍທີ່ສຸດ. ເໝາະສຳລັບການເອົາໂມເດວໄປໃຊ້ງານຈິງ (Inference) ເທິງການາດຈໍ NVIDIA (CUDA).
2. AWQ (Activation-aware Weight Quantization)
ແທນທີ່ຈະສົນໃຈແຕ່ຄ່າ Weights ຢ່າງດຽວ, AWQ ຈະສັງເກດການປ່ຽນແປງຂອງ “Activations” ຕອນທີ່ຂໍ້ມູນໄຫຼຜ່ານໂມເດວ. ມັນຈະຮັກສາ Weights ປະມານ 1% ທີ່ສຳຄັນທີ່ສຸດໄວ້ໃນຮູບແບບ FP16 ແລະ ບີບອັດສ່ວນທີ່ເຫຼືອເປັນ 4-bit. AWQ ໃຫ້ປະສິດທິພາບຄວາມໄວສູງຫຼາຍເມື່ອຣັນຜ່ານ vLLM.
3. GGUF & llama.cpp (The Best For Mac & Consumer Laptops)
ນີ້ຄື Game-changer ສຳລັບນັກພັດທະນາໃນປະເທດລາວ. GGUF ເປັນ Format ຂອງໂມເດວທີ່ອອກແບບມາສຳລັບເຄື່ອງມືຊື່ llama.cpp. ມັນອະນຸຍາດໃຫ້ເຮົາສາມາດແບ່ງການປະມວນຜົນ (Offloading) ລະຫວ່າງ CPU RAM ແລະ GPU VRAM. ຖ້າທ່ານມີ MacBook ມັນຍັງຮອງຮັບ Apple Metal (MPS) ຢ່າງເຕັມຮູບແບບ, ເຮັດໃຫ້ການຣັນ 70B Model ສາມາດເຮັດໄດ້ຢ່າງມີປະສິດທິພາບ.
ການນຳໃຊ້ງານຈິງ: ການໂຫຼດໂມເດວ 70B ແບບ 4-bit ສຳລັບລະບົບພາສາລາວ
ຖ້າພວກເຮົາຕ້ອງການ Fine-tune ໂມເດວ 70B ໃຫ້ເຂົ້າໃຈໄວຍາກອນພາສາລາວ ຫຼື ບໍລິບົດສະເພາະເຊັ່ນ: ການອັບເດດລະດັບນໍ້າຂອງ, ການສັນຈອນໃນວຽງຈັນ ຫຼື ສິນຄ້າກະສິກຳຈາກປາກຊ່ອງ, ເຮົາຈະໃຊ້ເຕັກນິກທີ່ເອີ້ນວ່າ QLoRA ຮ່ວມກັບຫໍສະໝຸດ BitsAndBytes.
ລຸ່ມນີ້ຄືຕົວຢ່າງ Code ໃນການໂຫຼດໂມເດວລະດັບ 70B ມາໄວ້ເທິງ Hardware ທີ່ມີຊັບພະຍາກອນຈຳກັດ ໂດຍໃຊ້ເຕັກນິກ NF4 (NormalFloat 4-bit):
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
# 1. ກຳນົດຄ່າ BitsAndBytes ໃຫ້ເປັນ 4-bit Quantization (NF4)
# NF4 (NormalFloat 4) ແມ່ນ Data type ທີ່ຖືກອອກແບບມາສຳລັບ Weights ທີ່ມີການແຈກຢາຍແບບ Normal Distribution ໂດຍສະເພາະ
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16, # ປະມວນຜົນການຄຳນວນ (Matrix multiplication) ດ້ວຍ FP16 ເພື່ອຄວາມໄວ
bnb_4bit_quant_type="nf4", # ໃຊ້ NF4 ສໍາລັບເກັບຂໍ້ມູນ Weights
bnb_4bit_use_double_quant=True, # Quantize ຕົວ Scale factor ອີກຮອບເພື່ອປະຢັດ VRAM ເພີ່ມຕື່ມ
)
model_id = "meta-llama/Llama-2-70b-hf" # ຕົວຢ່າງໂມເດວ 70B
# 2. ໂຫຼດ Tokenizer ແລະ Model
print("ກຳລັງໂຫຼດໂມເດວຂະໜາດໃຫຍ່ ເຂົ້າສູ່ VRAM...")
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto" # ໃຫ້ລະບົບແບ່ງໂຫຼດເຂົ້າ VRAM ຂອງ GPU ອັດຕະໂນມັດ
)
print(f"ການໂຫຼດສຳເລັດ! ປະລິມານ VRAM ທີ່ໃຊ້ປະຈຸບັນ: {model.get_memory_footprint() / 1e9:.2f} GB")
ໝາຍເຫດ: ໂມເດວຂະໜາດ 70B ເມື່ອໂຫຼດດ້ວຍ 4-bit ຈະກິນພື້ນທີ່ VRAM ປະມານ 36-38 GB ເທົ່ານັ້ນ! ເຊິ່ງທ່ານສາມາດໃຊ້ GPU ເຊັ່ນ NVIDIA RTX 4090 (24GB) ຈຳນວນ 2 ໜ່ວຍແບບເຊື່ອມຕໍ່ກັນ, ຫຼຸດຄ່າໃຊ້ຈ່າຍກວ່າການໃຊ້ Enterprise Hardware ໄດ້ຫຼາຍເທົ່າຕົວ.
Key Takeaways
- VRAM ແມ່ນຄໍຂວດ (Bottleneck) ທີ່ໃຫຍ່ທີ່ສຸດຂອງ LLM: Quantization ແກ້ບັນຫານີ້ໂດຍການຫຼຸດຄວາມລະອຽດຂໍ້ມູນຈາກ 16-bit ມາເປັນ 8-bit ຫຼື 4-bit.
- QAT ຕ່າງຈາກ PTQ: QAT (Quantization-Aware Training) ແມ່ນການສອນໂມເດວໃຫ້ຮູ້ໂຕວ່າມັນຈະຖືກ Quantize ໃນຂະນະທີ່ກຳລັງ Training ສ່ວນ PTQ ແມ່ນປ່ຽນຫຼັງຈາກຝຶກສອນແລ້ວ (ເຊັ່ນ AWQ, GPTQ).
- NF4 Standard: ກາຍເປັນມາດຕະຖານໂລກສຳລັບການເຮັດ QLoRA (Fine-Tuning) ເພາະມັນຮັກສາຄວາມສາມາດຂອງໂມເດວໄດ້ດີທີ່ສຸດ.
- GGUF Format: ຄືທາງອອກທີ່ດີທີ່ສຸດສຳລັບນັກພັດທະນາ/SME ໃນລາວທີ່ຈະ Deploy ໂມເດວຂະໜາດໃຫຍ່ລົງເທິງ Server ຂະໜາດນ້ອຍ ຫຼື Laptop ເພື່ອເຮັດ Inference.
ບົດສະຫຼຸບ
ເຕັກນິກ Quantization ບໍ່ພຽງແຕ່ເປັນເລື່ອງຂອງການຫຍໍ້ຂະໜາດໂມເດວ, ແຕ່ມັນຄື ການກະຈາຍໂອກາດທາງດ້ານ AI (Democratizing AI). ມັນອະນຸຍາດໃຫ້ນັກຮຽນ, ນັກຄົ້ນຄວ້າ ແລະ ນັກທຸລະກິດໃນປະເທດລາວທີ່ອາດຈະບໍ່ມີທຶນມະຫາສານໃນການເຂົ້າເຖິງ Supercomputer ສາມາດນຳໃຊ້, ທົດລອງ ແລະ ພັດທະນາເຕັກໂນໂລຊີລະດັບໂລກໄດ້. ການປ່ຽນໂມເດວ 70 ຄື Parameter ມາສູ່ໜ້າຈໍແລັບທັອບທົ່ວໄປ ເຮັດໃຫ້ພວກເຮົາສາມາດພັດທະນາ AI ທີ່ເຂົ້າໃຈພາສາ ແລະ ບໍລິບົດທ້ອງຖິ່ນຂອງລາວໄດ້ງ່າຍ ແລະ ປະຢັດຕົ້ນທຶນໄດ້ຢ່າງແທ້ຈິງ.