เลือก Q4_K_M เป็นค่าเริ่มต้น; เปลี่ยนไป Q6_K หรือ Q8_0 เมื่อมี VRAM เหลือและต้องการคุณภาพส่วนท้ายไม่กี่เปอร์เซ็นต์ quantization ของ GGUF ย่อน้ำหนักโมเดลจาก 16 บิตลงมาเหลือน้อยกว่า — Q4_K_M เก็บราว 4.85 บิตต่อน้ำหนัก โมเดล 7B จึงหล่นจาก ~14 GB เหลือ ~4.1 GB โดย perplexity แย่กว่าต้นฉบับไม่ถึง 1% โดยทั่วไป คำถาม “ควรใช้ quantization gguf แบบไหน” มีคำตอบเสถียรจนน่าเบื่อ ที่วงการออนไลน์กลบทับด้วยดราม่า ด้านล่างคือ quantization ทำอะไรกับน้ำหนักจริง ๆ แต่ละระดับเสียคุณภาพเท่าไร วิธีคำนวณขนาดเอง และหนึ่งคำสั่งสำหรับวัดความเสียหายบนฮาร์ดแวร์ของคุณ แทนการเชื่อ benchmark คนแปลกหน้า
quantization ของ GGUF ทำอะไรกันแน่?
โมเดลถูกเทรนด้วย floating point 16 บิต (FP16 หรือ BF16): น้ำหนักแต่ละตัวจากพันล้านตัวคือเลขสองไบต์ quantization บีบน้ำหนักแต่ละตัวลงเหลือบิตน้อยกว่า วิธีดิบ ๆ — ปัดทุกน้ำหนักเป็นจำนวนเต็ม 4 บิต — ทำลายค่าเล็กที่สำคัญ GGUF จึงใช้สองเทคนิค:
- การสเกลแบบบล็อก น้ำหนักถูกจัดกลุ่มเป็นบล็อก (ปกติ 32 ตัว) แต่ละบล็อกมีค่าสเกลของตัวเอง ค่า 4 บิตเป็นแค่ออฟเซตภายในบล็อก พิสัยของขนาดจึงรอดมาได้กว้าง
- k-quants ที่รู้เรื่องความสำคัญ ตัว “K” ใน Q4_K_M หมายถึง super-block ของค่าสเกล บวกกับการปฏิบัติกับ attention layer และ feed-forward layer ไม่เหมือนกัน เพราะทนการบีบอัดไม่เท่ากัน
ตระกูล “I” (IQ4_XS และเพื่อน) ไปไกลกว่านั้นด้วย codebook จากทฤษฎีสารสนเทศยืมมาจากการบีบอัดภาพ ไอเดียเดิม การเข้ารหัสหรูขึ้น: บิตต่อน้ำหนักน้อยลงที่คุณภาพใกล้เคียง แลกกับ inference ช้าลงนิดในบาง backend
ข้อชี้แจงที่กันสับสนส่วนใหญ่: quantization เปลี่ยนเฉพาะน้ำหนักที่เก็บ สถาปัตยกรรม tokenizer และการจัดการ context ไม่ถูกแตะ ไฟล์ Q4 กับไฟล์ Q8 ของโมเดลเดียวกันคือโมเดลตัวเดียวกัน ใส่เสื้อคลุมต่างกัน
Q4 vs Q8: quantization สูงกว่าดีกว่าหรือไม่?
เทคนิคแล้วใช่ แต่ในการรับรู้ไม่ใช่ อ้างอิงผลวัด perplexity ของ llama.cpp เองบนโมเดล Llama: Q8_0 ลงตัวในระยะ ~0.02% ของ FP16 — สำหรับวัตถุประสงค์จริงคือไม่เสียเลย Q6_K แยกแยะแทบไม่ออก Q4_K_M เพิ่ม perplexity ราว 1–2% Q4_0 เพิ่มอีกนิด และ Q2_K คือจุดที่คำตอบที่เชื่อมโยงได้ของโมเดลขนาดเล็กเริ่มแตกสลาย
สองกฎที่ตัวเลขบอกเป็นนัย:
- ขนาดโมเดลซื้อเพดานการ quantize โมเดล 70B รอดจาก Q2/Q3 ดีกว่าโมเดล 7B มาก เพราะโมเดลใหญ่มีส่วนซ้ำซ้อนมากกว่า quantize 7B ลง Q2 คือการตัดแขนขา แต่ quantize 70B ลง Q3 คืองานเย็บเสื้อ
- พื้นคุณภาพขยับตามงาน แชตทน Q4 ได้ การสร้างโค้ดแม่นยำ คณิตศาสตร์ และ RAG กับเอกสารที่ต้องเป๊ะ เปิดเผยสัญญาณรบกวนจาก quantization เร็วกว่า ถ้าโมเดล Q4 เขียนโค้ดผิดแบบลอบ ๆ ไม่หยุด ให้ทดสอบโมเดลตัวเดิมที่ Q6_K ก่อนจะโทษโมเดล
| ระดับ | บิต/น้ำหนัก | ขนาดเทียบ FP16 | คุณภาพที่หายไป | ใช้เมื่อ |
|---|---|---|---|---|
| Q2_K | ~3.4 | ~21% | รุนแรงใต้ 13B | อย่างอื่นไม่ลงตัว โมเดลใหญ่เท่านั้น |
| Q3_K_M | ~3.9 | ~25% | เห็นได้ชัด | VRAM แน่น โมเดล ≥14B |
| Q4_K_S | ~4.6 | ~29% | เล็กน้อย | Q4_K_M ไม่ลงแต่ใกล้เคียง |
| Q4_K_M | ~4.85 | ~30% | ~1% perplexity | ค่าเริ่มต้น คุณภาพ/ขนาดสมดุลที่สุด |
| Q5_K_M | ~5.7 | ~35% | ~0.5% | มี VRAM งานสำคัญกับคุณภาพ |
| Q6_K | ~6.6 | ~41% | แทบเป็นศูนย์ | โค้ด/คณิต ยังลงตัวสบาย |
| Q8_0 | ~8.5 | ~53% | เป็นศูนย์จริง | รอบอ้างอิง ฐาน fine-tune |
| IQ4_XS | ~4.3 | ~27% | ≈Q4_K_M | Q4_K_M ใหญ่ไปนิด backend รองรับ i-quants |
แต่ละระดับต้องใช้ VRAM เท่าไร?
คำนวณขนาดเองแทนการจำตาราง — หนึ่งบรรทัด:
size_GB ≈ (bits_per_weight × params) / 8
# โมเดล 8B @ Q4_K_M: 4.85 × 8 / 8 ≈ 4.9 GB
# โมเดล 8B @ Q8_0: 8.50 × 8 / 8 ≈ 8.5 GB แล้วเติมส่วนที่สูตรลืม: KV cache (โตตามความยาว context — จากร้อย MB ถึงหลาย GB), activation และ compute buffer เผื่อแบบจริงจัง: โมเดล “4.9 GB” อยากได้การ์ด 6 GB ที่ context 4k และใช้ flash-attention กับการ quantize KV-cache เพื่อให้อยู่รอดที่ 16k น้ำหนักคือพาดหัว ไม่ใช่บิลทั้งใบ
ควรใช้ quantization ของ GGUF แบบไหน?
ลำดับการตัดสินใจ ไม่มีข้อยกเว้นที่จำไว้:
- คำนวณงบ context + KV ก่อน แล้วค่อยนึกถึงน้ำหนัก context ที่ไม่ลงตัวแย่กว่าคุณภาพที่วัดไม่ได้
- เริ่มที่ Q4_K_M มันเป็นค่าเริ่มต้นของชุมชนด้วยเหตุผล — perplexity เพิ่มราว 1% ที่ขนาด 70% ทุก registry รวมถึงของ Ollama ส่งมันมาเป็นเส้นฐาน
- ขยับขึ้น Q6_K เมื่องานลงโทษสัญญาณรบกวน: โค้ด คณิต การดึงข้อมูล ทุกอย่างที่ป้อนให้ pipeline โดยไร้คนดูแล
- ใช้ Q8_0 เพื่ออ้างอิงเท่านั้น — ทดสอบ A/B วัดความเสียหายจากการ quantize หรือฐาน fine-tune ในฐานะเครื่องมือรายวัน มันซื้อความอุ่นให้เซ็นเซอร์ VRAM ของคุณเป็นหลัก
- ต่ำกว่า Q4 เฉพาะถูกบังคับ และกับโมเดลใหญ่เท่านั้น ทดสอบด้วยพรอมต์ที่รู้ว่ายากก่อนไว้ใจมัน
ถ้ากำลังเลือกไฟล์ที่จะโหลดจาก Hugging Face เลือก Q4_K_M.gguf ไฟล์เดียวดีกว่าไฟล์แบ่งส่วน เว้นแต่ผู้อัปโหลดมีแต่แบบหลัง — ชิ้นส่วนที่ต้องคอยน้อยกว่า และถ้ากำลังเลือกว่าจะรันที่ไหน การเลือกเอนจินคือเรื่องแยกกัน: ดู llama.cpp vs Ollama สำหรับแกนนั้น
วัดความเสียหายจาก quantization เองอย่างไร?
benchmark ต่างกันไป แต่พรอมต์ของคุณคงที่ build llama.cpp หนึ่งครั้ง โหลดสองระดับของโมเดลเดียวกัน แล้ววัดทั้ง perplexity (ต่ำยิ่งดี) และ tokens/วินาที:
git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
cmake -B build && cmake --build build --config Release -j
huggingface-cli download bartowski/Meta-Llama-3.1-8B-Instruct-GGUF
Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf Meta-Llama-3.1-8B-Instruct-Q8_0.gguf
--local-dir models
# perplexity บนชิ้นส่วน wiki-text (ต่ำ = ใกล้โมเดลต้นฉบับ)
./build/bin/llama-perplexity -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 99
./build/bin/llama-perplexity -m models/Meta-Llama-3.1-8B-Instruct-Q8_0.gguf -ngl 99
# และความเร็วบนฮาร์ดแวร์ชุดเดิม
./build/bin/llama-bench -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 99 ตัวเลข Q4_K_M จะแย่กว่า Q8_0 เพียงเสี้ยวจุด และไฟล์เล็กลง ~40% ถ้างานปลายทางของคุณแยกแยะความต่างไม่ได้ — และส่วนใหญ่ก็แยกไม่ได้ — คุณได้คำตอบโดยไม่ต้องอ่าน leaderboard ของใคร
quantization ทำร้ายความเป็นส่วนตัวหรือข้ออ้างเรื่องใช้เฉพาะท้องถิ่นหรือไม่?
ไม่ — มันคือเรื่องคณิตศาสตร์บนน้ำหนัก ออฟไลน์ทั้งหมด และไฟล์ที่ quantize แล้วคือแค่คอนเทนเนอร์ที่เล็กลงของพารามิเตอร์ชุดเดิม รัน Q4_K_M ในเครื่องรั่วเท่ากับ (หรือเท่ากับไม่รั่วกับ) รันโมเดลเต็มความแม่นยำในเครื่อง: ไม่มีอะไรหลุดออกจากเครื่อง ตัวแปรที่เกี่ยวกับความเป็นส่วนตัวคือที่ที่ inference รัน ไม่ใช่ความกว้างของบิต คำเตือนเรื่องแหล่งที่มาของโมเดลใช้กับทุกระดับ quant เท่ากันหมด: fine-tune “uncensored” จากฐานที่ถูกขโมยใน Q8 ไม่ปลอดภัยกว่าน้ำหนักชุดเดิมใน Q4 ฝั่งฟอร์แมตไฟล์ดู วิธีรันโมเดล GGUF ในเครื่อง
แล้วควรเลือกระดับไหน?
Q4_K_M แล้วเลิกอ่านฟอรัมเรื่องนี้ อัปเกรดเป็น Q6_K กับงานที่กระหายความแม่นยำถ้า VRAM เอื้อ เก็บ Q8_0 หนึ่งตัวไว้เทียบ A/B และถือว่าทุกอย่างใต้ Q4 เป็นเสบียงฉุกเฉินสำหรับโมเดลใหญ่เท่านั้น ความผิดพลาดที่ควรเว้นคือสมมาตรกันทั้งคู่: ห่วงเรื่อง Q4-vs-Q5 แต่ละเลยความยาว context ซึ่งทำเซ็ตอัปในเครื่องพังมากกว่าที่ quant ตัวไหนเคยทำ
— mrsaynothing
— mrsaynothing
บันทึกหน้างานเรื่อง AI, Linux และ self-hosted
คุยต่อโพสต์นี้บน dev.to dev.to ↗
รับวิธีแก้ฉบับถัดไปทางอีเมล
อีเมลหนึ่งฉบับต่อหนึ่งโพสต์ แก้เสร็จแล้วไปต่อ
นี่คืออะไร?Git cherry-pick: หลายคอมมิต หลายบรานช์ และคอนฟลิกต์
ถ้าอ่านแล้วชอบ — ผมสร้างงานแบบนี้เป็นอาชีพ จ้างผม