โมเดล
- weights (ก้อนตัวเลขความรู้),
- สถาปัตยกรรม (กี่ layer/attention/hidden dimension แบบไหน)
- tokenizer (แปลงข้อความ ⇄ token)
ไฟล์โมเดลเปิดขึ้นมาเอง “ทำอะไรไม่ได้” ต้องมี engine มารัน
Number types
ความละเอียดตัวเลขกำหนดทั้งขนาดไฟล์ ความเร็ว และคุณภาพ:
- fp32 (32 bit/4 ไบต์) → fp16/bf16 (16 bit/2 ไบต์) → fp8/int8 (8 bit/1 ไบต์) → int4/NVFP4 (4 bit/0.5 ไบต์)
- หลักคือ bit น้อย → ไฟล์เล็ก → อ่านเร็ว แต่เสี่ยงคุณภาพ
- int กับ float ต่างกันที่ช่วงค่า (dynamic range)
NVFP4 คือ FP4 ที่ NVIDIA ออกแบบสำหรับ Tensor Core รุ่นที่ 5 บน Blackwell (ชิป GB10 ของ DGX Spark ซึ่งสเปกระบุ “1 PFLOP ที่ FP4”)
ไฟล์โมเดล:
- safetensors / GGUF — safetensors (Hugging Face) แยก weight/config/tokenizer เป็นหลายไฟล์ และโหลดปลอดภัยกว่า pickle;
- GGUF (llama.cpp) รวมทุกอย่างในไฟล์เดียว ฝัง metadata และชื่อ quant (เช่น
Q4_K_M) ไว้ในตัว
แปลงด้วย convert_hf_to_gguf.py แล้ว quant ด้วย llama-quantize (มีตัวเลือก --imatrix, --leave-output-tensor, --pure)
ภาพรวม engine
- llama.cpp/ollama เน้นง่าย ยืดหยุ่น รันได้ทั้ง CPU+GPU,
- vLLM/SGLang เน้น throughput สูงและ OpenAI-compatible API (vLLM เป็นสถาปัตยกรรม multi-process + PagedAttention),
- TRT-LLM ปลดพลัง FP4/NVFP4 ได้เต็มที่ (แลกกับเวลา setup ที่เยอะ),
- ds4 คือแนวคิด model-specific engine ที่เขียน CUDA สำหรับโมเดลเดียว (DeepSeek V4 Flash) ได้ prefill ~3 เท่า / decode ~1.5 เท่า
inference มีสองเฟส:
- prefill (อ่าน prompt พร้อมกัน เรียกว่า compute-bound) และ
- decode (ปล่อยทีละ token แบบ autoregressive เรียกว่า bandwidth-bound) เพราะ decode ต้องดึง weight ทั้งโมเดลจากหน่วยความจำต่อ token —
สูตรคือ tok/s ≈ bandwidth ÷ ขนาดโมเดล (เช่น 27B 4-bit ≈ 18 GB บน Spark 273 GB/s → ~15 tok/s) และ KV cache โตตามความยาว context แต่เทคนิค attention สมัยใหม่ (CSA/HCA ของ DeepSeek V4 Flash) บีบ KV cache เหลือ ~7% ที่ context 1M