Chạy LLM cục bộ trên máy Mac
Hướng dẫn này hướng dẫn bạn cách chạy máy chủ LLM cục bộ trên macOS với API tương thích với OpenAI. Bạn có được toàn bộ quyền riêng tư, chi phí API bằng 0 và hiệu suất tốt đến mức đáng kinh ngạc trên Apple Silicon.
Chúng tôi bao gồm hai phần phụ trợ:
| Phần cuối | Cài đặt | Tốt nhất tại | Định dạng |
|---|---|---|---|
| llama.cpp | brew cài đặt llama.cpp | Bộ nhớ đệm KV được lượng tử hóa, có thời gian tạo mã thông báo đầu tiên nhanh nhất dành cho bộ nhớ thấp | GGUF |
| omlx | omlx.ai | Tạo mã thông báo nhanh nhất, tối ưu hóa kim loại gốc | MLX (bộ an toàn) |
Cả hai đều hiển thị điểm cuối /v1/chat/completions tương thích với OpenAI. Hermes hoạt động với một trong hai — chỉ cần trỏ nó vào http://localhost:8080 hoặc http://localhost:8000.
Hướng dẫn này nhắm đến các máy Mac có Apple Silicon (M1 trở lên). Máy Mac Intel sẽ hoạt động với llama.cpp nhưng không có khả năng tăng tốc GPU - hiệu năng sẽ chậm hơn đáng kể.
Chọn mẫu
Để bắt đầu, chúng tôi khuyên dùng Qwen3.5-9B — đây là một mô hình suy luận mạnh mẽ, vừa vặn thoải mái với bộ nhớ hợp nhất 8GB+ có khả năng lượng tử hóa.
| Biến thể | Kích thước trên đĩa | Cần RAM (ngữ cảnh 128K) | Phần cuối |
|---|---|---|---|
| Qwen3.5-9B-Q4_K_M (GGUF) | 5,3 GB | ~10 GB với bộ đệm KV được lượng tử hóa | llama.cpp |
| Qwen3.5-9B-mlx-lm-mxfp4 (MLX) | ~5 GB | ~12GB | ôi trời |
Quy tắc chung về bộ nhớ: kích thước model + bộ đệm KV. Model 9B Q4 có dung lượng ~5 GB. Bộ đệm KV ở ngữ cảnh 128K với lượng tử hóa Q4 thêm ~ 4-5 GB. Với bộ đệm KV mặc định (f16), con số đó sẽ tăng lên ~ 16 GB. Cờ bộ đệm KV được lượng tử hóa trong llama.cpp là thủ thuật chính cho các hệ thống bị hạn chế về bộ nhớ.
Đối với các kiểu máy lớn hơn (27B, 35B), bạn sẽ cần bộ nhớ hợp nhất trên 32 GB. 9B là lựa chọn phù hợp cho máy 8-16 GB.
Tùy chọn A: llama.cpp
llama.cpp là thời gian chạy LLM cục bộ di động nhất. Trên macOS, nó sử dụng Metal để tăng tốc GPU ngay lập tức.
Cài đặt
brew install llama.cpp
Điều này cung cấp cho bạn lệnh llama-server trên toàn cầu.
Tải mô hình xuống
Bạn cần một mô hình có định dạng GGUF. Nguồn dễ nhất là Ôm mặt thông qua huggingface-cli:
brew install huggingface-cli
Sau đó tải xuống:
huggingface-cli download unsloth/Qwen3.5-9B-GGUF Qwen3.5-9B-Q4_K_M.gguf --local-dir ~/models
Một số người mẫu trên Ôm Mặt yêu cầu xác thực. Trước tiên hãy chạy huggingface-cli login nếu bạn gặp lỗi 401 hoặc 404.
Khởi động máy chủ
llama-server -m ~/models/Qwen3.5-9B-Q4_K_M.gguf \
-ngl 99 \
-c 131072 \
-np 1 \
-fa on \
--cache-type-k q4_0 \
--cache-type-v q4_0 \
--host 0.0.0.0
Đây là những gì mỗi lá cờ làm:
| Cờ | Mục đích |
|---|---|
-ngl 99 | Giảm tải tất cả các lớp sang GPU (Kim loại). Sử dụng số cao để đảm bảo không có gì lưu lại trên CPU. |
-c 131072 | Kích thước cửa sổ ngữ cảnh (128K mã thông báo). Giảm điều này nếu bạn sắp hết bộ nhớ. |
-np 1 | Số lượng khe song song. Giữ ở mức 1 cho mục đích sử dụng của một người dùng — nhiều khe cắm hơn sẽ chia nhỏ ngân sách bộ nhớ của bạn. |
-fa on | Chú ý chớp nhoáng. Giảm mức sử dụng bộ nhớ và tăng tốc độ suy luận theo ngữ cảnh dài. |
--cache-type-k q4_0 | Số hóa bộ nhớ đệm chính thành 4-bit. Đây là trình tiết kiệm bộ nhớ lớn. |
--cache-type-v q4_0 | Số hóa bộ đệm giá trị thành 4 bit. Cùng với những điều trên, điều này làm giảm bộ nhớ đệm KV ~ 75% so với f16. |
--host 0.0.0.0 | Nghe trên tất cả các giao diện. Sử dụng 127.0.0.1 nếu bạn không cần truy cập mạng. |
Máy chủ đã sẵn sàng khi bạn thấy:
main: server is listening on http://0.0.0.0:8080
srv update_slots: all slots are idle
Tối ưu hóa bộ nhớ cho các hệ thống bị hạn chế
Cờ --cache-type-k q4_0 --cache-type-v q4_0 là sự tối ưu hóa quan trọng nhất cho các hệ thống có bộ nhớ hạn chế. Đây là tác động ở bối cảnh 128K:
| Loại bộ đệm KV | Bộ nhớ đệm KV (128K ctx, kiểu 9B) |
|---|---|
| f16 (mặc định) | ~16 GB |
| q8_0 | ~8GB |
| q4_0 | *4GB |
Trên máy Mac 8 GB, hãy sử dụng bộ đệm q4_0 KV và giảm ngữ cảnh xuống -c 32768 (32K). Trên 16 GB, bạn có thể thoải mái làm bối cảnh 128K. Trên 32 GB+, bạn có thể chạy các model lớn hơn hoặc nhiều khe cắm song song.
Nếu bạn vẫn hết bộ nhớ, trước tiên hãy giảm kích thước ngữ cảnh (-c), sau đó thử lượng tử hóa nhỏ hơn (Q3_K_M thay vì Q4_K_M).
Kiểm tra nó
curl -s http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3.5-9B-Q4_K_M.gguf",
"messages": [{"role": "user", "content": "Hello!"}],
"max_tokens": 50
}' | jq .choices[0].message.content
Lấy tên model
Nếu bạn quên tên mô hình, hãy truy vấn điểm cuối của mô hình:
curl -s http://localhost:8080/v1/models | jq '.data[].id'
Tùy chọn B: MLX qua omlx
omlx là một ứng dụng gốc macOS quản lý và phục vụ các mô hình MLX. MLX là khung học máy của riêng Apple, được tối ưu hóa đặc biệt cho kiến trúc bộ nhớ hợp nhất của Apple Silicon.
Cài đặt
Tải xuống và cài đặt từ omlx.ai. Nó cung cấp GUI để quản lý mô hình và máy chủ tích hợp.
Tải mô hình xuống
Sử dụng ứng dụng omlx để duyệt và tải xuống các mô hình. Tìm kiếm Qwen3.5-9B-mlx-lm-mxfp4 và tải xuống. Các mô hình được lưu trữ cục bộ (thường là trong ~/.omlx/models/).
Khởi động máy chủ
omlx phục vụ các mô hình trên http://127.0.0.1:8000 theo mặc định. Bắt đầu phân phát từ giao diện người dùng ứng dụng hoặc sử dụng CLI nếu có.
Kiểm tra nó
curl -s http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3.5-9B-mlx-lm-mxfp4",
"messages": [{"role": "user", "content": "Hello!"}],
"max_tokens": 50
}' | jq .choices[0].message.content
Liệt kê các model có sẵn
omlx có thể phục vụ nhiều mô hình cùng một lúc:
curl -s http://127.0.0.1:8000/v1/models | jq '.data[].id'
Điểm chuẩn: llama.cpp so với MLX
Cả hai phần phụ trợ được thử nghiệm trên cùng một máy (Apple M5 Max, bộ nhớ hợp nhất 128 GB) chạy cùng một kiểu máy (Qwen3.5-9B) ở mức lượng tử hóa tương đương (Q4_K_M cho GGUF, mxfp4 cho MLX). Năm lời nhắc đa dạng, mỗi lời nhắc có ba lần chạy, các phần phụ trợ được kiểm tra tuần tự để tránh tranh chấp tài nguyên.
Kết quả
| Số liệu | llama.cpp (Q4_K_M) | MLX (mxfp4) | Người chiến thắng |
|---|---|---|---|
| TTFT (trung bình) | 67 mili giây | 289 mili giây | llama.cpp (nhanh hơn 4,3 lần) |
| TTFT (tr50) | 66 mili giây | 286 mili giây | llama.cpp (nhanh hơn 4,3 lần) |
| Thế hệ (trung bình) | 70 tok/s | 96 tok/giây | MLX (nhanh hơn 37%) |
| Thế hệ (tr50) | 70 tok/s | 96 tok/giây | MLX (nhanh hơn 37%) |
| Tổng thời gian (512 token) | 7,3 giây | 5,5 giây | MLX (nhanh hơn 25%) |
Điều này có nghĩa là gì
-
llama.cpp vượt trội trong việc xử lý nhanh chóng — sự chú ý nhanh chóng của nó + đường dẫn bộ nhớ đệm KV được lượng tử hóa sẽ mang lại cho bạn mã thông báo đầu tiên sau ~66 mili giây. Nếu bạn đang xây dựng các ứng dụng tương tác trong đó khả năng phản hồi được nhận thức là quan trọng (chatbot, tự động hoàn thành), thì đây là một lợi thế có ý nghĩa.
-
MLX tạo mã thông báo nhanh hơn ~37% sau khi hoạt động. Đối với khối lượng công việc hàng loạt, tạo biểu mẫu dài hoặc bất kỳ nhiệm vụ nào mà tổng thời gian hoàn thành quan trọng hơn độ trễ ban đầu, MLX sẽ kết thúc sớm hơn.
-
Cả hai phần phụ trợ đều cực kỳ nhất quán — phương sai giữa các lần chạy là không đáng kể. Bạn có thể dựa vào những con số này.
Bạn nên chọn cái nào?
| Trường hợp sử dụng | Khuyến nghị |
|---|---|
| Trò chuyện tương tác, công cụ có độ trễ thấp | llama.cpp |
| Tạo dạng dài, xử lý hàng loạt | MLX (omlx) |
| Hạn chế về bộ nhớ (8-16 GB) | llama.cpp (bộ đệm KV lượng tử hóa chưa từng có) |
| Phục vụ đồng thời nhiều mô hình | omlx (hỗ trợ đa mô hình tích hợp) |
| Khả năng tương thích tối đa (Linux nữa) | llama.cpp |
Kết nối với Hermes
Khi máy chủ cục bộ của bạn đang chạy:
hermes model
Chọn Điểm cuối tùy chỉnh và làm theo lời nhắc. Nó sẽ yêu cầu URL cơ sở và tên mô hình - sử dụng các giá trị từ bất kỳ chương trình phụ trợ nào bạn thiết lập ở trên.