ข้ามไปยังเนื้อหาหลัก

MLX LM บน Apple Silicon

Libre WebUI มีปลั๊กอิน MLX LM (Apple Silicon) สำหรับรันโมเดลภาษารูปแบบ MLX โดยตรงบน Mac ชิปตระกูล M ปลั๊กอินเชื่อมต่อกับ HTTP API ที่เข้ากันได้กับ OpenAI ซึ่งมาพร้อม MLX LM

แนวทางนี้เหมาะเมื่อคุณต้องการอนุมานด้วย Metal แบบ native โดยไม่แปลง MLX checkpoint เป็นโมเดล Ollama หรือ GGUF

สถาปัตยกรรม

Libre WebUI in native development mode
frontend http://localhost:5173
backend http://localhost:3001
|
| OpenAI-compatible chat request
v
mlx_lm.server http://127.0.0.1:8081
|
v
MLX model on Apple Silicon unified memory

ตั้งใจใช้พอร์ต 8081 โดยปกติ MLX LM ใช้ 8080 ซึ่งชนกับเซิร์ฟเวอร์ npx libre-webui แบบแพ็กเกจ

ข้อกำหนด

  • Mac ที่ใช้ Apple Silicon (M1 หรือใหม่กว่า)
  • macOS พร้อมเครื่องมือบรรทัดคำสั่ง Xcode
  • Python 3.10 หรือใหม่กว่า
  • unified memory เพียงพอสำหรับโมเดลที่เลือก KV cache และ macOS
  • Libre WebUI ที่รันแบบ native ขั้นตอนพัฒนาจาก source เป็นวิธีที่ง่ายที่สุด เพราะ backend ทั้งสองใช้ loopback ของ Mac ได้

โมเดล Ternary Bonsai เริ่มต้นใช้พื้นที่ดิสก์ประมาณ 8.5 GB และต้องใช้หน่วยความจำมากกว่านั้นขณะทำงาน Mac ที่มี unified memory 16 GB รองรับบริบทสั้นได้ แต่ 24 GB ขึ้นไปมีพื้นที่เผื่อใช้งานจริงมากกว่า หากหน่วยความจำจำกัด ให้ใช้ MLX checkpoint ที่เล็กลงและเพิ่ม repository ID ลงในสำเนาคำนิยามปลั๊กอิน

ติดตั้ง MLX LM

การใช้ uv ช่วยแยกคำสั่งออกจากแพ็กเกจ Python ของ Homebrew:

brew install uv
uv tool install --upgrade mlx-lm
rehash
mlx_lm.server --help

หากมีเครื่องมือนี้อยู่แล้ว:

uv tool upgrade mlx-lm
rehash

โมเดล Qwen 3.5 ต้องใช้ mlx-lm 0.30.7 หรือใหม่กว่า ตัวอย่างใน repository ต้องใช้ 0.31.3 หรือใหม่กว่า

เริ่มเซิร์ฟเวอร์

สำหรับโมเดล Ternary Bonsai:

mlx_lm.server \
--model "prism-ml/Ternary-Bonsai-27B-mlx-2bit" \
--host 127.0.0.1 \
--port 8081 \
--max-tokens 262144 \
--allowed-origins "http://localhost:5173,http://127.0.0.1:5173"

การรันครั้งแรกจะดาวน์โหลดโมเดลจาก Hugging Face ครั้งต่อไปจะใช้ cache ในเครื่อง Ternary Bonsai ประกาศตำแหน่งสูงสุด 262144 พรอมต์และผลลัพธ์ที่สร้างใช้หน้าต่างบริบทร่วมกัน พรอมต์ยาวจึงลดจำนวน token ที่สร้างได้ แม้ค่าอนุญาตของเซิร์ฟเวอร์จะตั้งไว้ที่ ค่าสูงสุดของโมเดล

สำหรับโมเดลเริ่มต้นที่เล็กกว่า:

mlx_lm.server \
--model "mlx-community/Llama-3.2-3B-Instruct-4bit" \
--host 127.0.0.1 \
--port 8081 \
--max-tokens 2048

repository มีตัวเปิดที่นำกลับมาใช้ซ้ำได้ด้วย:

cd examples/mlx-lm-server
uv run server.py

ตรวจคำสั่งที่แปลงแล้วโดยไม่โหลดโมเดล:

uv run server.py --dry-run

ตรวจสอบ API ที่เข้ากันได้กับ OpenAI

ตรวจสถานะและการค้นหาโมเดล:

curl http://127.0.0.1:8081/health
curl http://127.0.0.1:8081/v1/models

ส่งคำขอแชตแบบไม่สตรีม:

curl http://127.0.0.1:8081/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "prism-ml/Ternary-Bonsai-27B-mlx-2bit",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Reply with: MLX is ready."}
],
"temperature": 0.7,
"top_p": 0.95,
"max_tokens": 64,
"stream": false
}'

เซิร์ฟเวอร์รองรับ Server-Sent Events แบบสตรีมเมื่อกำหนด "stream": true ด้วย

เชื่อมต่อ Libre WebUI

จากราก repository ของ Libre WebUI:

npm install
npm run dev

เปิด http://localhost:5173 แล้วทำดังนี้:

  1. เปิด Settings > Plugins
  2. ค้นหา MLX LM (Apple Silicon)
  3. ยืนยันว่า endpoint คือ http://127.0.0.1:8081/v1/chat/completions
  4. เปิดใช้งานปลั๊กอิน MLX ในเครื่องไม่ต้องใช้คีย์ API
  5. กลับไปที่ Chat แล้วเลือกโมเดล MLX

รายการโมเดลในตัวประกอบด้วย:

  • prism-ml/Ternary-Bonsai-27B-mlx-2bit

โมเดลที่เลือกใน Libre WebUI ต้องตรงกับโมเดลที่เซิร์ฟเวอร์ MLX มี หากต้องการใช้ checkpoint อื่น ให้ส่งออกหรือคัดลอก plugins/mlx-lm.json, เพิ่ม repository ID ลงใน model_map แล้วนำเข้าคำนิยามที่แก้ไขผ่าน Settings > Plugins

การตั้งค่าการสร้าง

คำแนะนำที่เผยแพร่สำหรับ Ternary Bonsai คือ:

การตั้งค่าค่า
Temperature0.7
Top P0.95
Top K20

Libre WebUI ส่ง temperature และ Top P ผ่านปลั๊กอิน หากต้องการใช้คำแนะนำ Top K ให้เริ่มเซิร์ฟเวอร์ด้วย --top-k 20:

mlx_lm.server \
--model "prism-ml/Ternary-Bonsai-27B-mlx-2bit" \
--host 127.0.0.1 \
--port 8081 \
--top-k 20 \
--max-tokens 262144

Work และการเรียกเครื่องมือ

ปลั๊กอิน MLX อาจปรากฏใน Work เพราะใช้รูปแบบแชตที่เข้ากันได้กับ OpenAI เลือกใช้กับ Work เฉพาะเมื่อโมเดลและ chat template รองรับการเรียกเครื่องมือแบบ OpenAI อย่างน่าเชื่อถือ การสร้างข้อความทั่วไปใน Chat ได้ไม่ได้พิสูจน์ว่า checkpoint รองรับเครื่องมือ

ตัวแยกวิเคราะห์เครื่องมือและเทมเพลตโมเดลเปลี่ยนแปลงเร็ว หากรอบ Work ส่งคืนการเรียกเครื่องมือที่ผิดรูปแบบ ให้อัปเดต mlx-lm, ทดสอบคำขอเครื่องมือเดียวกันกับเซิร์ฟเวอร์โดยตรง และลองโมเดลที่ MLX card ระบุการใช้เครื่องมือไว้อย่างชัดเจน

เครือข่าย Docker

แนะนำให้พัฒนา Libre WebUI แบบ native คอนเทนเนอร์เข้าถึง 127.0.0.1 ของ Mac ไม่ได้

หาก Libre WebUI รันใน Docker:

  1. เริ่ม MLX LM ด้วย --host 0.0.0.0
  2. ใช้ที่อยู่ LAN ส่วนตัวของ Mac เช่น http://192.168.1.20:8081/v1/chat/completions เป็น endpoint ของปลั๊กอิน
  3. อนุญาตพอร์ต 8081 เฉพาะบนเครือข่ายท้องถิ่นที่เชื่อถือได้

อย่าเปิด mlx_lm.server ต่ออินเทอร์เน็ตสาธารณะโดยตรง ผู้ดูแลโครงการอธิบายว่าเป็นเซิร์ฟเวอร์ในเครื่องที่มีเพียงการตรวจความปลอดภัยพื้นฐาน สำหรับการติดตั้งนอกเครื่อง ให้ใช้ reverse proxy แบบ HTTPS ที่มีการยืนยันตัวตนไว้ด้านหน้า

การแก้ปัญหา

Model type qwen3_5 not supported

ยังมีการใช้ตัวเปิดรุ่นเก่า:

rehash
which -a mlx_lm.server
uv tool upgrade mlx-lm

Libre WebUI แสดงโมเดลแต่คำขอล้มเหลว

ตรวจว่า model ID เดียวกันทำงานโดยตรง:

curl http://127.0.0.1:8081/v1/models

จากนั้นยืนยันว่า endpoint ของปลั๊กอินมี /v1/chat/completions

มีการใช้ที่อยู่แล้ว

คง Libre WebUI ไว้ที่พอร์ตปกติและย้าย MLX:

mlx_lm.server --model "owner/model" --port 8082

อัปเดต endpoint ของปลั๊กอินเป็น http://127.0.0.1:8082/v1/chat/completions

โมเดลตอบช้าในคำขอแรก

การโหลดเริ่มต้นและการทำ prompt prefill ใช้ทรัพยากรมากกว่าการสร้างทีละ token ดูแรงกดดันหน่วยความจำใน Activity Monitor แล้วเลือกโมเดลเล็กลงหรือบทสนทนาสั้นลง หาก macOS เริ่มใช้ swap

เอกสารที่เกี่ยวข้อง