กลับไปที่บล็อก

Quantization ของ GGUF: ควรเลือกระดับไหน

13 กันยายน 2569

เลือก 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 จึงใช้สองเทคนิค:

  1. การสเกลแบบบล็อก น้ำหนักถูกจัดกลุ่มเป็นบล็อก (ปกติ 32 ตัว) แต่ละบล็อกมีค่าสเกลของตัวเอง ค่า 4 บิตเป็นแค่ออฟเซตภายในบล็อก พิสัยของขนาดจึงรอดมาได้กว้าง
  2. 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_MQ4_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 แบบไหน?

ลำดับการตัดสินใจ ไม่มีข้อยกเว้นที่จำไว้:

  1. คำนวณงบ context + KV ก่อน แล้วค่อยนึกถึงน้ำหนัก context ที่ไม่ลงตัวแย่กว่าคุณภาพที่วัดไม่ได้
  2. เริ่มที่ Q4_K_M มันเป็นค่าเริ่มต้นของชุมชนด้วยเหตุผล — perplexity เพิ่มราว 1% ที่ขนาด 70% ทุก registry รวมถึงของ Ollama ส่งมันมาเป็นเส้นฐาน
  3. ขยับขึ้น Q6_K เมื่องานลงโทษสัญญาณรบกวน: โค้ด คณิต การดึงข้อมูล ทุกอย่างที่ป้อนให้ pipeline โดยไร้คนดูแล
  4. ใช้ Q8_0 เพื่ออ้างอิงเท่านั้น — ทดสอบ A/B วัดความเสียหายจากการ quantize หรือฐาน fine-tune ในฐานะเครื่องมือรายวัน มันซื้อความอุ่นให้เซ็นเซอร์ VRAM ของคุณเป็นหลัก
  5. ต่ำกว่า 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 ↗

รับวิธีแก้ฉบับถัดไปทางอีเมล

อีเมลหนึ่งฉบับต่อหนึ่งโพสต์ แก้เสร็จแล้วไปต่อ

self-hosted · ไม่มีบุคคลที่สาม · ยกเลิกได้ในคลิกเดียว

นี่คืออะไร?

Git cherry-pick: หลายคอมมิต หลายบรานช์ และคอนฟลิกต์

ถ้าอ่านแล้วชอบ — ผมสร้างงานแบบนี้เป็นอาชีพ จ้างผม