สารบัญ — บทที่ ๕ / ๑๖
PART 1 · รู้จัก
๑ · BOMLLM คืออะไร
๒ · สถาปัตยกรรม 4 เครื่อง
๓ · ฮาร์ดแวร์ที่ต้องมี
PART 2 · ติดตั้ง
๔ · เตรียมเครือข่าย
▸ ๕ · Mac Mini = สมอง
๖ · VPS = หน้าบ้าน
๗ · .env และ litellm.yaml
๘ · Virtual keys และงบประมาณ
PART 3 · ใช้งาน
๙ · Open WebUI ครั้งแรก
๑๐ · ลงโมเดลเพิ่มและส่วนเสริม
๑๑ · ภาพและเสียง (optional)
๑๒ · สูตรภาษาไทย
PART 4 · ต่อช่องทาง
๑๓ · LINE และ Telegram bot
๑๔ · MT5 EA อ่านอย่างเดียว และ content pipeline
PART 5 · ดูแล
๑๕ · ความปลอดภัยและ monitoring
๑๖ · อัปเกรดและแก้ปัญหา
PART 2 · ติดตั้ง

05Mac Mini = สมอง

Mac Mini: Ollama MLX + 27B model

TL;DR — สรุปใน 30 วินาทีtldr

เป้าหมายของบทนี้: ทำให้ Mac กลายเป็น "สมอง" — ติดตั้ง Ollama กับ backend ที่เร็วที่สุดของ Apple Silicon คือ MLX แล้วโหลดโมเดล 27B ให้พร้อมตอบ 30 tok/s ตลอด 24 ชม.

สิ่งที่ได้ตอนจบบท: โมเดลหลัก resident 23GB + embeddings bge-m3 อุ่นอยู่ พร้อม alias 5 ตัว (chat / think / code / deep / fast) ที่สลับกันได้ฟรี

เมื่อไหร่ควรใช้ / When to usewhen to use

ทำบทนี้เมื่อซื้อ/เตรียม Mac เสร็จและผ่านบทที่ ๔ (เครือข่าย) แล้ว — Mac ควรต่อไฟตลอด ปิด sleep (หรือตั้ง wake-on-network) เพราะเป็นสมองกลาง 24 ชม.

  • เวอร์ชันที่เราใช้จริงและยึดตาม: Ollama 0.33.3 (backend MLX) — อย่าใช้ latest แบบไม่ระบุเวอร์ชัน (บทที่ ๑๖)
  • โมเดลที่ใช้จริง: กลุ่ม 27B Qwen fine-tune ชุด TURBO-Fable (โดย DavidAU) แบบ nvfp4 — ดึงจาก Hugging Face ของผู้สร้างโดยตรง

วิธีทำ / How-tohow to

ขั้น 1 — ติดตั้ง Ollama แบบ service

# ติดตั้งผ่าน Homebrew (macOS)
brew install ollama

# ให้รันเป็น service เปิดตลอด
brew services start ollama

# ตรวจเวอร์ชัน ต้องได้ ~0.33.x
ollama --version

ถ้าอยากเก็บโมเดลบน external SSD: ตั้งค่า OLLAMA_MODELS ชี้ไปที่ volume นั้นก่อน pull แรก

ขั้น 2 — โหลดน้ำหนักโมเดลจาก Hugging Face

# ดึงน้ำหนัก 27B แบบ MLX nvfp4 จาก repo ของผู้สร้าง (~18GB)
ollama pull hf.co/<ผู้สร้าง>/<ชุดโมเดล>:<แท็ก nvfp4>

# สร้าง manifest หลักจากไฟล์ตัวอย่างของ repo (แก้ FROM ให้ชี้แท็กที่ pull มา)
ollama create qwen38-chat -f configs/ollama-modelfile.example

# สร้าง alias ที่แชร์ manifest เดียวกัน (สลับได้ฟรี ไม่ reload)
ollama cp qwen38-chat qwen38-think
ollama cp qwen38-chat qwen38-code
ollama cp qwen38-chat qwen38-deep
ollama cp qwen38-chat qwen38-fast

น้ำหนักโมเดลไม่ได้แจกใน repo — ดึงจาก HF ของผู้สร้างเสมอ (เรื่องลิขสิทธิ์)

ขั้น 3 — ตรวจว่าสมองพร้อม

ollama ps
# NAME                  SIZE      PROCESSOR   UNTIL
# qwen38-chat:latest    23 GB     100% GPU    23 hours from now
# bge-m3:latest         1.1 GB    100% GPU    3 hours from now

curl http://100.x.y.z:11434/api/tags   # จากเครื่องอื่นใน mesh ต้องเห็นรายชื่อโมเดล

ถ้า SIZE ไม่ขึ้น ~23GB หรือ PROCESSOR ไม่เป็น 100% GPU ให้ย้อนดู backend MLX ก่อน

ถ้าติดตรงไหน → บทที่ ๑๖

ตัวอย่างการตั้งค่า / Config exampleconfig example

ไฟล์ configs/ollama-modelfile.example ฉบับเต็ม (จาก repo) พร้อมคำอธิบายไทยรายบรรทัด:

# FROM = ชี้ไปที่แท็กน้ำหนักที่คุณ pull มา (เปลี่ยนเป็นของคุณ)
FROM turbo-fable-nvfp4

# พื้นระบับ context สำหรับ alias ทุกตัว — ห้ามตั้งต่ำกว่านี้
# [บทเรียนจริง] พลาดบรรทัดนี้ครั้งหนึ่ง ผู้เรียกตรง (ไม่ผ่าน proxy) จะหล่นไป 8192 เงียบ ๆ
PARAMETER num_ctx 32768

# sampling ตั้งน้อยๆ ที่นี่ — ค่าจริงใช้ route ของ LiteLLM กำหนดทับได้ทุก request
PARAMETER temperature 0.7
PARAMETER top_p 0.8
PARAMETER top_k 20
PARAMETER repeat_penalty 1.05

# persona ขั้นต่ำสำหรับผู้เรียกตรง (สูตรเต็ม Config G อยู่บทที่ ๑๒ และใช้ที่ route ไม่ใช่ที่นี่)
SYSTEM """You are a helpful assistant. Answer in the language of the user's
most recent message unless instructed otherwise. Never emit Chinese characters
unless the user asks about Chinese. Be concise; admit uncertainty."""

กฎสำคัญ: หนึ่ง manifest ต่อโมเดล — พฤติกรรมต่างกันไปตั้งที่ route ของ LiteLLM ไม่ใช่แยก Modelfile กันคนละไฟล์

Pro tip — เคล็ดลับจากสนามจริงpro tip

★ PROD LESSON
กับดัก alias ของ MLX — backend MLX ไม่แชร์ runner ระหว่าง alias ที่ "manifest ต่างกัน" — สลับ alias จะเสีย ~1.2 วินาที reload ต่อครั้ง (ครั้งแรกหลังจัด context ใหม่ 16 วินาที) แต่ถ้าเป็น manifest เดียวกัน (ทำด้วย ollama cp) สลับฟรี ~0.8 วิ — นี่คือเหตุผลที่คู่มือยืนยันให้ใช้ ollama cp สร้าง alias ทั้งหมด
★ PRO TIP
อย่าให้ health check ปลุกโมเดลที่ไล่ออก — เราเคยโดน /health sweep ของ LiteLLM โหลดโมเดล 16GB ที่เพิ่งไล่ออกกลับมาเอง ~24 ชม. จน swap thrash — ทางแก้คือปิด background health check บน route เย็น ๆ (ตั้งใน litellm.yaml บทที่ ๗)

คำถามที่พบบ่อย / FAQfaq

ถาม: ทำไมต้อง 27B ทำไมไม่ใช้ตัวเล็กกว่า? — เล็กกว่านี้คุณภาพภาษาไทยตกชัดเจนในการทดสอบของเรา ส่วนใหญ่กว่านี้ (32B+) จะกิน RAM จนเสี่ยง swap — 27B บน 48GB คือจุดสมดุลที่วัดแล้ว

ถาม: TURBO-Fable คืออะไร ปลอดภัยไหม? — เป็นชุด fine-tune ของผู้พัฒนาอิสระ (DavidAU) บนน้ำหนักเดิมของ Qwen เราทดสอบสถิติแล้วว่าภาษาไทยไม่ถดถอย (CI รวมศูนย์) และตัวอักษรจีนหลุดน้อยกว่าต้นฉบับซะอีก

คำถามอื่น ๆ ดูที่ FAQ

ดูเพิ่ม / See alsosee also

ภาพประกอบ / Figuresfigures

เส้นทาง request จากเว็บแชทถึงสมอง Mac
VPS ไม่เคยเรียก Mac ตรง ๆ นอก mesh

วิดีโอ / Videovideo

🎬
วิดีโอกำลังผลิต — ติดตามที่ YouTube @icafefx
คลิปสาธิตทีละขั้นของบทนี้จะอัปโหลดที่ youtube.com/@icafefx เร็ว ๆ นี้