Deploy Unsloth Quantized Models on AWS

ภาพประกอบ Unsloth Quantization บน AWS
ภาพประกอบ Unsloth Quantization บน AWS

รันโมเดล AI ให้ถูกลงด้วย Unsloth Quantization บน AWS: เลือกไฟล์ให้ถูกก่อนเลือกเครื่อง

โมเดลเก่งๆ มักมีปัญหาเดียวกันคือ "ใหญ่เกิน"

เอาโมเดลไป serve แบบ BF16 หรือ FP16 ตรงๆ ก็ต้องใช้ GPU ใหญ่ ค่าเครื่องสูง เปิด endpoint นาน แถมลองผิดลองถูกทีหนึ่งก็เสียเงินไปเรื่อยๆ

ทางออกที่น่าสนใจคือ quantization

พูดง่ายๆ คือย่อขนาดน้ำหนักของโมเดล เช่น จาก 16-bit เหลือ 4-bit เพื่อให้ใช้ RAM หรือ VRAM น้อยลงมาก

แต่ก็มีจุดที่ต้องระวัง ถ้าย่อแรงเกินไป คุณภาพโมเดลก็ดรอปได้

Unsloth เลยมีแนวทางที่เรียกว่า Dynamic Quantization ซึ่งไม่ลด precision ทุก layer เท่ากันแบบเหมาๆ แต่เก็บส่วนสำคัญของโมเดลไว้ที่ precision สูงกว่า แล้วบีบเฉพาะส่วนที่ทนต่อการลด precision ได้

ผลคือโมเดลเล็กลง แต่พยายามรักษาคุณภาพคำตอบไว้ให้ใกล้ต้นฉบับที่สุด

มันลดได้เยอะแค่ไหน?

โมเดล BF16 ใช้ 16 บิตต่อพารามิเตอร์

ถ้าทำเป็น 4-bit ในทางทฤษฎีขนาดจะลดลงราว 75%

ตัวอย่างโมเดลขนาด 8B parameters ที่เดิมกิน memory ประมาณ 16 GB อาจลงมาอยู่แถว 5 GB ได้ หลังรวม metadata สำหรับ quantization แล้ว

ตรงนี้สำคัญมาก เพราะบางงานจากเดิมต้องใช้หลาย GPU อาจพอดีกับ GPU เดียว หรือบางงานเล็กพอจะวิ่งบน CPU ได้เลย

แต่ไม่ได้แปลว่า 4-bit เหมาะกับทุกงาน

ถ้าคุณทำงานที่ต้องการความแม่นสูงมาก เช่น extraction, reasoning เฉพาะทาง หรือ multimodal ที่มีภาพซับซ้อน ต้อง benchmark กับข้อมูลจริงของตัวเองก่อนเสมอ

หลักคิดที่ AWS และ Unsloth แนะนำ: เลือกไฟล์ก่อนเลือก infrastructure

หลายคนเริ่มจากคำถามว่า "ต้องเปิด SageMaker instance เบอร์ไหนดี?"

แต่ลำดับที่ใช้งานจริงควรกลับกัน

  1. จะ export โมเดลเป็นไฟล์อะไร

  2. ไฟล์นั้นใช้กับ runtime ไหน

  3. แล้วค่อยเลือกว่า EC2, SageMaker, EKS หรือ ECS เหมาะกับทีมเรา

มี 2 ทางหลักที่จำง่ายๆ

1. GGUF: ทางเล็ก เบา ลองไว

GGUF เป็นไฟล์โมเดลแบบรวม weights, tokenizer และ metadata ไว้ด้วยกัน

เหมาะกับ runtime สายเบา เช่น llama.cpp, llama-server, Ollama และ Unsloth

เหมาะเมื่อ:

  • อยากลอง quantization หลายระดับไวๆ

  • อยากรันโมเดลให้พอดีกับเครื่องเล็กลง

  • งานยังเป็น internal tool, POC หรือ pilot

  • throughput ไม่ใช่โจทย์หลัก

ตัวเลือก quantization ที่เจอบ่อย:

  • q4_k_xl: เน้นประหยัด memory และ storage

  • q8_0: ไฟล์ใหญ่ขึ้นประมาณเท่าตัว แต่คุณภาพมักใกล้ต้นฉบับกว่า

  • f16: เก็บ precision เต็มในรูป GGUF แทบไม่มี loss จาก quantization

2. Merged safetensors: ทาง production ที่เน้น throughput

ถ้าคุณ fine-tune LoRA แล้วอยากรวม adapter เข้ากับ base model เพื่อ serve จริงจัง ให้ดู merged weights ในรูป safetensors

ไฟล์กลุ่มนี้เหมาะกับ vLLM, SGLang และ SageMaker LMI containers

เหมาะเมื่อ:

  • มี concurrent users เยอะ

  • ต้องการ batching

  • ต้องการ token throughput สูง

  • โมเดลใหญ่จนต้องกระจายหลาย GPU

  • มี autoscaling และ production SLA ที่ต้องดูแล

สรุปสั้นๆ:

  • เน้นให้โมเดล "พอดีเครื่อง" และ deploy ง่าย: GGUF + llama.cpp

  • เน้นให้โมเดล "รับโหลดได้เยอะ": merged weights + vLLM/SGLang/LMI

4 แบบในการ deploy บน AWS

แบบที่ 1: GGUF บน EC2

นี่คือจุดเริ่มที่แอดชอบสุด เพราะเห็นทุกอย่างชัดและ debug ง่าย

เอา GGUF ไปเปิดด้วย llama.cpp หรือ Unsloth บน EC2 แล้วลองเทียบ q4, q8 และ full precision กับ prompt จริงของเรา

สิ่งที่ควรเช็ก:

  • คุณภาพคำตอบต่างกันแค่ไหน

  • RAM/VRAM peak ตอน generate จริง

  • context ยาวขึ้นแล้ว latency กับ memory พุ่งแค่ไหน

  • chat template ตรงกับตอน train หรือไม่

อย่าดูแค่ขนาดไฟล์นะครับ

โมเดลไฟล์ 128 GB ควรมี RAM หรือ VRAM ว่างมากกว่า 128 GB ไม่งั้นตอน inference จริงอาจพังได้ โดยเฉพาะเมื่อมี context ยาวหรือ concurrent request

ถ้าเปิด API บน EC2 เพื่อทดสอบ อย่าเปิด public ทิ้งไว้

⚠️ จำกัด Security Group ให้เฉพาะ CIDR ที่เชื่อถือได้, bind ที่ private interface และวางไว้หลัง authenticated API gateway หรือ load balancer ก่อนเอาไปใช้จริง

แบบที่ 2: GGUF บน SageMaker AI ด้วย custom container

พอโมเดลผ่านการทดสอบแล้ว แต่ไม่อยากดูแล server เอง SageMaker AI inference endpoint จะเริ่มน่าสนใจ

SageMaker ให้ autoscaling, monitoring, IAM และ endpoint ที่จัดการเป็นระบบมากกว่า EC2

สำหรับ GGUF ปกติจะห่อ llama.cpp เข้า custom container

container ต้องทำตามสัญญาของ SageMaker:

  • ฟังที่ port 8080

  • มี /ping สำหรับ health check

  • มี /invocations สำหรับรับ inference request

ในตัวอย่างของ AWS มีการวาง nginx เป็นตัวแปลง path จาก SageMaker ไปหา llama-server ภายใน container

จุดนี้ฟังดูเหมือนงานเพิ่ม แต่เป็นส่วนที่ทำให้ runtime เบาๆ อย่าง llama.cpp ไปอยู่บน managed endpoint ได้

AWS ยกตัวอย่าง Qwen3-VL-8B-Instruct แบบ Q4_K_XL GGUF บน ml.g5.xlarge ราคาประมาณ $1.41/ชั่วโมง เทียบกับ BF16 ที่ใช้ vLLM บน ml.g5.12xlarge ประมาณ $7.09/ชั่วโมง

ตัวเลขเป็นราคา ณ มิถุนายน 2026 และควรเช็กราคาปัจจุบันก่อนเปิดใช้งานจริง

แบบที่ 3: merged weights บน SageMaker AI + vLLM/LMI

ถ้า GGUF คือทางประหยัดและเบา ทางนี้คือทางที่เน้น serve ให้คุ้มตอน traffic มาเยอะ

SageMaker LMI containers เปิดทางให้ใช้ vLLM ได้โดยไม่ต้องเขียน custom container เองทั้งหมด

จุดที่ได้คือ:

  • continuous batching

  • รองรับ concurrent request ได้ดีขึ้น

  • tensor parallelism ข้ามหลาย GPU

  • autoscaling และ monitoring ผ่าน managed endpoint

ถ้างานเริ่มมีผู้ใช้จริงหรือ API ถูกเรียกพร้อมกันเยอะๆ การจ่ายเพิ่มกับ runtime ที่ serve เก่งกว่า อาจคุ้มกว่าการฝืนใช้ GGUF แล้ว latency ร่วง

แบบที่ 4: EKS หรือ ECS

ถ้าทีมคุณมี Kubernetes หรือ ECS อยู่แล้ว และระบบ inference ต้องอยู่ใน network, observability และ deployment flow เดียวกับ service อื่น ก็ไม่จำเป็นต้องสร้างโลกใหม่บน SageMaker

แพ็ก runtime ที่เลือกไว้ลง container แล้ว deploy ไปกับ platform เดิมได้เลย

โจทย์ในแบบนี้ไม่ใช่ "ต้องใช้ SageMaker ไหม"

แต่คือ "ไฟล์จาก Unsloth แบบไหนเข้ากับ runtime ที่เราจะ containerize มากที่สุด"

จุดที่คน deploy โมเดลพลาดกันบ่อย

Chat template ไม่ตรง

บางทีโมเดลทำงานดีใน environment ตอน train แต่พอ deploy แล้วตอบแปลก คนก็มักโทษ quantization ก่อน

ความจริงอาจเป็น chat template, EOS token หรือรูปแบบ prompt ไม่ตรงกับตอน train

ให้เช็กส่วนนี้ก่อนครับ โดยเฉพาะโมเดล instruction-tuned

Benchmark แค่ระดับ quantization

อย่าทดสอบแค่ q4 vs q8 แล้วจบ

ของจริงต้องดูพร้อมกันทั้ง:

  • context length

  • จำนวนผู้ใช้พร้อมกัน

  • request mix

  • streaming

  • cold start

  • runtime ที่เลือก

  • ราคาของ instance

ไฟล์เล็กสุดไม่ได้แปลว่าระบบถูกสุดเสมอ

ถ้า context ยาวมาก หรือ traffic พุ่งเป็นช่วงๆ โมเดลที่เล็กกว่าอาจกลายเป็น bottleneck ได้

โหลดโมเดลจากภายนอกทุกครั้งที่ start

พอ finalize โมเดลแล้ว ควรเก็บ artifact ใน S3 ให้ path ชัดเจนและ promote เป็นลำดับ

การโหลดจาก Hugging Face หรือแหล่งภายนอกทุกครั้งที่ endpoint start ทำให้ cold start คาดเดายาก และลำบากขึ้นใน VPC ที่จำกัด network

วัดแค่คุณภาพโมเดล ไม่วัด service

production ไม่ได้มีแค่คำตอบดีหรือไม่ดี

ต้องดู startup time, tail latency, concurrency, scaling behavior และเวลาโหลดโมเดลด้วย

บน SageMaker ดู metric ผ่าน CloudWatch ได้เลย ส่วน EC2 ก็ควร expose metric เทียบเท่ากัน

สรุปแบบคนจะเอาไปทำจริง

ถ้าเพิ่งเริ่ม:

  1. export โมเดลเป็น GGUF

  2. ลองบน EC2 ด้วย llama.cpp หรือ Unsloth

  3. เปรียบเทียบ q4, q8 และ model เต็มกับชุดทดสอบของเรา

  4. ตรวจ chat template และ memory peak

  5. ถ้าต้องการ managed endpoint ค่อยย้าย GGUF ไป SageMaker custom container

ถ้า traffic เริ่มมา หรือ throughput คือโจทย์หลัก:

  1. merge weights เป็น safetensors

  2. ใช้ vLLM, SGLang หรือ SageMaker LMI

  3. ทดสอบ batching, concurrency และ tensor parallelism

  4. ตัดสินใจด้วย cost ต่อ request และ latency จริง ไม่ใช่แค่ราคา instance

Unsloth ทำให้เรื่องนี้สนุกขึ้น เพราะเราไม่ได้ถูกบังคับให้เอาโมเดลไฟล์เดียวไปใช้กับทุก environment

งานที่ต้องประหยัดก็ใช้ quantized GGUF

งานที่ต้องรับโหลดก็ใช้ merged weights กับ runtime ที่เหมาะกว่า

สุดท้ายแล้ว เลือก model artifact ให้ตรงกับงานก่อน แล้ว infrastructure จะเลือกง่ายขึ้นมากๆ

แหล่งอ้างอิง

บทความนี้เรียบเรียงและสรุปจากบทความ AWS Machine Learning Blog เผยแพร่วันที่ 10 กรกฎาคม 2026 ไม่ใช่คำแปลตรงตัว และราคา AWS เปลี่ยนแปลงได้เสมอ