บทที่ 4 จาก 9 · AI 101 — คู่มือเริ่มต้นสำหรับคนที่จะเอา AI ไปใช้งานจริง
ตัวรันโมเดล มีแบบไหนบ้าง
ชั้นของ stack ตั้งแต่ไดรเวอร์ถึงหน้าจอผู้ใช้ ตัวรันหลักแต่ละตัวเหมาะกับงานแบบไหน พร้อมคำสั่งจริงของ Ollama, llama.cpp, vLLM และ SGLang รวมถึงเหตุผลที่ควรออกแบบให้แอปพูดกับ API มาตรฐานตั้งแต่วันแรก
4.1 ชั้นของ stack
[6] หน้าตาที่ผู้ใช้เห็น Open WebUI, LM Studio, ComfyUI, แอปของคุณเอง
↑ พูดกันด้วย HTTP มักเป็น OpenAI-compatible API
[5] เซิร์ฟเวอร์ Ollama serve, vLLM serve, llama-server, Triton
↑
[4] ตัวรัน (engine) llama.cpp, vLLM, SGLang, TensorRT-LLM, ExLlamaV3, MLX
↑
[3] เฟรมเวิร์ก PyTorch, JAX, GGML
↑
[2] ไลบรารีคำนวณ CUDA / cuDNN / cuBLAS, ROCm, Metal, Vulkan
↑
[1] ไดรเวอร์และฮาร์ดแวร์ NVIDIA driver, GPU
ปัญหาที่คนเจอบ่อยที่สุดตอนเริ่มต้นอยู่ที่ชั้น 1–2 ไม่ใช่ชั้น 4–5 เช่น เวอร์ชัน CUDA ไม่ตรงกับ PyTorch หรือไดรเวอร์เก่าเกินกว่าที่การ์ดรุ่นใหม่ต้องการ เวลาติดปัญหา ให้ไล่จากล่างขึ้นบนเสมอ
4.2 ตัวรันหลักและควรใช้เมื่อไหร่
| ตัวรัน | รูปแบบไฟล์ | จุดแข็ง | ควรใช้เมื่อ |
|---|---|---|---|
| Ollama | GGUF | ติดตั้งคำสั่งเดียว จัดการ VRAM เอง มี API แบบ OpenAI | เริ่มต้น, ใช้คนเดียวบนเครื่องตัวเอง, ทำต้นแบบ |
| LM Studio | GGUF, MLX | มีหน้าต่างให้คลิก ไม่ต้องใช้เทอร์มินัล | คนที่ไม่ถนัดบรรทัดคำสั่ง อยากลองหลายโมเดล |
| llama.cpp | GGUF | ยืดหยุ่นสุด รันได้แทบทุกฮาร์ดแวร์ แบ่งภาระ GPU/CPU ได้ | ฮาร์ดแวร์จำกัด, การ์ดผสมรุ่น, ต้องการควบคุมละเอียด |
| vLLM | safetensors, AWQ, FP8 | throughput สูง, continuous batching, prefix caching | ให้บริการหลายคนพร้อมกัน, งานที่รันเป็นระบบจริง |
| SGLang | safetensors | latency ต่ำ, structured output, เก่งงาน prompt ซ้ำ ๆ | งาน agent, บังคับให้ตอบเป็น JSON, prompt มีส่วนซ้ำเยอะ |
| TensorRT-LLM | engine ที่คอมไพล์ | เร็วที่สุดบน NVIDIA | ปริมาณงานสูงมากและยอมแลกกับความยุ่งยากในการคอมไพล์ |
| ExLlamaV3 | EXL3 | เร็วมากบนการ์ดผู้บริโภคใบเดียว | ผู้ใช้ที่ต้องการรีดความเร็วสูงสุดจากการ์ดที่มี |
| MLX | MLX | เร็วที่สุดบน Apple Silicon | ใช้ Mac เป็นเครื่องหลัก |
| ONNX Runtime | ONNX | ข้ามแพลตฟอร์ม ดีบน CPU และอุปกรณ์ฝังตัว | โมเดลเล็กบนเครื่องลูกค้า, มือถือ, edge |
สถานะที่เปลี่ยนไปในปี 2026
Hugging Face TGI ซึ่งเคยเป็นตัวเลือกยอดนิยมสำหรับ production ถูกจัดเป็นสถานะดูแลรักษาตั้งแต่เดือนมีนาคม 2026 โดยหยุดพัฒนาฟีเจอร์ใหม่ ระบบเดิมยังทำงานได้ แต่ไม่ใช่จุดเริ่มต้นที่แนะนำสำหรับโปรเจกต์ใหม่แล้ว ประเด็นทั่วไปที่ควรจำคือ ระบบนิเวศนี้เปลี่ยนเร็ว ให้ออกแบบระบบโดยพูดกับ API มาตรฐาน เพื่อที่จะเปลี่ยนตัวรันได้โดยไม่ต้องแก้แอป
4.3 ตัวอย่างการรันจริง
Ollama — ง่ายที่สุด เหมาะกับการเริ่มต้น
# ติดตั้ง (Linux/macOS)
curl -fsSL https://ollama.com/install.sh | sh
# ดึงและคุยทันที
ollama run qwen3:8b
# ดูว่ามีโมเดลอะไรอยู่ และแต่ละตัวใช้ VRAM เท่าไรตอนรัน
ollama list
ollama ps
เรียกผ่าน API แบบ OpenAI ที่พอร์ต 11434:
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3:8b",
"messages": [{"role":"user","content":"สรุปย่อหน้านี้ให้สั้นที่สุด: ..."}],
"temperature": 0.3
}'
ปรับค่าเริ่มต้นด้วย Modelfile:
cat > Modelfile <<'EOF'
FROM qwen3:8b
PARAMETER num_ctx 8192 # ความยาว context
PARAMETER temperature 0.3
PARAMETER num_gpu 999 # จำนวนชั้นที่ให้อยู่บน GPU (999 = ทั้งหมด)
SYSTEM "ตอบเป็นภาษาไทย กระชับ ตรงประเด็น"
EOF
ollama create my-assistant -f Modelfile
llama.cpp — ควบคุมได้ละเอียดที่สุด
# ติดตั้งแบบคอมไพล์เองพร้อมรองรับ CUDA
git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
cmake -B build -DGGML_CUDA=ON && cmake --build build -j --config Release
# ดาวน์โหลดโมเดลจาก Hugging Face
huggingface-cli download Qwen/Qwen3-8B-GGUF Qwen3-8B-Q4_K_M.gguf \
--local-dir ./models
รันเป็นเซิร์ฟเวอร์ โดยเปิด API แบบ OpenAI ที่พอร์ต 8080:
./build/bin/llama-server \
-m ./models/Qwen3-8B-Q4_K_M.gguf \
-ngl 99 \ # จำนวนชั้นที่โยนขึ้น GPU ลดลงถ้า VRAM ไม่พอ
-c 8192 \ # ความยาว context
-np 4 \ # จำนวน slot ที่รับพร้อมกัน
--host 0.0.0.0 --port 8080 \
--flash-attn \ # ประหยัด VRAM ของ attention
-ctk q8_0 -ctv q8_0 # quantize KV cache ประหยัดได้มากตอน context ยาว
# วัดความเร็วจริงของเครื่องตัวเอง
./build/bin/llama-bench -m ./models/Qwen3-8B-Q4_K_M.gguf -p 512 -n 128
vLLM — สำหรับให้บริการหลายคนพร้อมกัน
uv pip install vllm
vllm serve Qwen/Qwen3-8B \
--port 8000 \
--max-model-len 16384 \
--gpu-memory-utilization 0.90 \ # ใช้ VRAM ได้ถึง 90% ที่เหลือกันไว้
--kv-cache-dtype fp8 \ # ลด VRAM ของ KV cache ราวครึ่ง
--enable-prefix-caching \ # ใช้ซ้ำส่วนต้นของ prompt ที่เหมือนกัน
--tensor-parallel-size 1 # จำนวนการ์ดที่แบ่งกันคำนวณ
# ดูเมตริกแบบ Prometheus
curl http://localhost:8000/metrics | grep -E "num_requests|gpu_cache_usage"
SGLang — งาน agent และ JSON
uv pip install "sglang[all]"
python -m sglang.launch_server \
--model-path Qwen/Qwen3-8B \
--port 30000 \
--context-length 16384 \
--enable-torch-compile
บังคับให้ตอบตาม schema:
curl localhost:30000/v1/chat/completions \
-d '{
"model":"default",
"messages":[{"role":"user","content":"สกัดชื่อและยอดจากใบเสร็จนี้"}],
"response_format":{
"type":"json_schema",
"json_schema":{"schema":{
"type":"object",
"properties":{
"vendor":{"type":"string"},
"total":{"type":"number"}},
"required":["vendor","total"]}}}
}'
งานภาพและเสียง
สร้างภาพด้วย diffusers:
import torch
from diffusers import AutoPipelineForText2Image
pipe = AutoPipelineForText2Image.from_pretrained(
"stabilityai/sdxl-turbo",
torch_dtype=torch.float16,
use_safetensors=True) # บังคับรูปแบบปลอดภัย
pipe.to("cuda")
pipe.enable_model_cpu_offload() # ประหยัด VRAM
img = pipe("a cat in a library", num_inference_steps=4).images[0]
img.save("out.png")
ถอดเสียงด้วย faster-whisper:
from faster_whisper import WhisperModel
m = WhisperModel("large-v3", device="cuda", compute_type="float16")
segs, info = m.transcribe("meeting.mp3", language="th")
for s in segs:
print(f"[{s.start:.1f}s] {s.text}")
4.4 มาตรฐานกลางที่ทำให้เปลี่ยนตัวรันได้ง่าย
ตัวรันเกือบทุกตัวเปิด API หน้าตาเหมือน OpenAI ที่ /v1/chat/completions ถ้าแอปของคุณเรียกผ่านมาตรฐานนี้ การเปลี่ยนจาก Ollama ตอนต้นแบบไปเป็น vLLM ตอนขึ้นจริง จะเป็นแค่การเปลี่ยน base URL ไม่ต้องเขียนโค้ดใหม่ ให้ออกแบบแบบนี้ตั้งแต่วันแรกเสมอ
from openai import OpenAI
# เปลี่ยนแค่สองบรรทัดนี้เวลาย้ายตัวรัน
client = OpenAI(
base_url="http://localhost:11434/v1", # Ollama
# base_url="http://localhost:8000/v1", # vLLM
# base_url="http://localhost:8080/v1", # llama.cpp
# base_url="http://localhost:30000/v1", # SGLang
api_key="not-needed-for-local",
)
resp = client.chat.completions.create(
model="qwen3:8b",
messages=[{"role": "user", "content": "อธิบาย RAG ใน 3 บรรทัด"}],
temperature=0.3,
max_tokens=512,
)
print(resp.choices[0].message.content)
สรุปบทนี้
เลือกตัวรันตามงาน ไม่ใช่ตามความนิยม Ollama สำหรับเริ่มต้นและงานคนเดียว llama.cpp เมื่อฮาร์ดแวร์จำกัด vLLM เมื่อต้องรับหลายคน SGLang เมื่อต้องบังคับรูปแบบคำตอบ และไม่ว่าจะเลือกตัวไหน ให้แอปพูดกับ API มาตรฐาน เพื่อให้ย้ายตัวรันได้โดยไม่ต้องรื้อโค้ด
บทถัดไปว่าด้วยการวัดว่าโมเดลกินทรัพยากรเท่าไรจริง ๆ ซึ่งเป็นจุดที่ระบบจริงพังบ่อยที่สุด