Chạy LLM cục bộ trên macOS

Nội dung

    Sau khi chạy thử tất cả các công cụ này trên máy Mac dùng chip Apple Silicon cho công việc n8n, phát triển phần mềm, đây là bản tóm tắt ngắn gọn và dễ hiểu. Như chúng ta biết rõ lý do tại sao bạn lại cần điều này:

    • Bảo mật — Dữ liệu của bạn không bao giờ rời khỏi máy tính của bạn. Không có lệnh gọi API nào được ghi nhật ký, không có lời nhắc nào được lưu trữ trên máy chủ của người khác.
    • Chi phí — Không tính phí theo từng token. Sau khi có phần cứng, việc suy luận là miễn phí.
    • Độ trễ — Không cần truyền dữ liệu qua mạng. Phản hồi bắt đầu ngay lập tức.
    • Khả năng hoạt động ngoại tuyến — Hoạt động trên máy bay, trong môi trường an ninh, ở bất cứ đâu.
    • Tùy chỉnh — Kiểm soát hoàn toàn các thông số mô hình, lời nhắc hệ thống và lượng tử hóa.
    • Cái giá phải trả là gì? Bạn cần phần cứng mạnh mẽ và bị giới hạn ở những mẫu card đồ họa phù hợp với dung lượng RAM/VRAM của mình.

    Các công cụ

    Dụng cụGiao diệnTốt nhất choMã nguồn mởKhó khăn
    OllamaCLI + API RESTCác nhà phát triển xây dựng ứng dụngCó (MIT)Dễ
    LM StudioGiao diện người dùng đồ họa máy tính để bànNgười dùng khám phá và không chuyên về kỹ thuậtKHÔNGRất dễ
    llama.cppCLIKiểm soát và hiệu suất tối đaCó (MIT)Trung bình
    MLXPython/CLITối ưu hóa Apple SiliconCó (Apple)Trung bình

    Chúng ta hãy cùng phân tích từng phần một.

    Ollama: Sự lựa chọn của nhà phát triển

    Công cụ này là gì: Một công cụ dòng lệnh (CLI) giúp chạy các mô hình cục bộ đơn giản như cách Docker giúp chạy các container.

    Cài đặt:

    brew install ollama
    Cách sử dụng:

    # Pull a model
    ollama pull llama3.2

    # Run interactively
    ollama run llama3.2

    # Or just query via API
    curl //localhost:11434/api/generate -d ‘{
    “model”: “llama3.2”,
    “prompt”: “Explain async/await in C#”
    }’

    khởi động Ollama Server với cấu hình giữ model trong RAM “vĩnh viễn”.

    Bạn mở Terminal và thực hiện các bước sau: nano start_ollama.sh
    Dán nội dung sau vào file

    #!/bin/bash

    # 1. Thiết lập biến môi trường
    # Cho phép n8n/Docker kết nối tới Ollama qua IP nội bộ
    export OLLAMA_HOST=0.0.0.0
    # Giữ model trong RAM vĩnh viễn (không bị unload sau 5 phút)
    export OLLAMA_KEEP_ALIVE=-1

    # 2. Thông báo trạng thái
    echo “— Đang khởi động Ollama Server cho Mac mini M4 —”
    echo “Cấu hình: Chấp nhận mọi kết nối (0.0.0.0) và giữ RAM vĩnh viễn.”

    # 3. Kiểm tra xem ứng dụng Ollama (GUI) có đang chạy không để tránh xung đột
    if pgrep -x “Ollama” > /dev/null
    then
    echo “Phát hiện ứng dụng Ollama đang chạy. Đang tắt để chuyển sang chế độ Serve…”
    pkill -x “Ollama”
    sleep 2
    fi

    # 4. Khởi động server
    # Lệnh ‘serve’ sẽ chạy trực tiếp, ‘run’ sẽ nạp sẵn model gemma4:latest vào RAM
    echo “Đang nạp model gemma4:latest vào RAM…”
    ollama serve & sleep 5 && ollama run gemma4:latest “”
    *Lưu ý: Đoạn `ollama run gemma4:latest “”` ở cuối giúp nạp model ngay lập tức khi chạy script mà không cần đợi bạn đặt câu hỏi đầu tiên.*

    Cấp quyền và chạy

    Sau khi lưu file (**Ctrl+O**, **Enter**, **Ctrl+X**), bạn cần cấp quyền thực thi:
    chmod +x start_ollama.sh
    Bây giờ, mỗi khi bắt đầu làm việc với Odoo hoặc n8n, bạn chỉ cần gõ:
    ./start_ollama.sh hoặc sh thành command

    Để chắc chắn mọi thứ đúng ý bạn, hãy mở một tab Terminal mới và kiểm tra:

    1. **Kiểm tra model đã nằm trong RAM chưa:**
    `ollama ps`
    *(Cột **UNTIL** phải hiện là **Forever**)*.
    2. **Kiểm tra xem n8n có thể kết nối không:**
    Gõ `ifconfig` để lấy IP máy Mac của bạn (thường là `192.168.x.x`). Trong n8n, bạn dùng URL: `//<IP_CUA_BAN>:11434`.

    ### Mẹo nhỏ cho dân Dev:
    Nếu bạn muốn script này **tự động chạy mỗi khi khởi động máy Mac**, bạn có thể thêm nó vào **Login Items** trong System Settings, hoặc chuyên nghiệp hơn là tạo một file `plist` trong `~/Library/LaunchAgents`. Tuy nhiên, chỉ cần chạy thủ công file `.sh` này mỗi khi bắt đầu phiên làm việc là đã rất ổn định cho workflow hiện tại của bạn rồi.

    Vì sao Ollama lại được các nhà phát triển ưa chuộng
    API tương thích với OpenAI — Chỉ cần trỏ mã hiện có của bạn vào //localhost:11434/v1là nó hoạt động. Các thư viện như Semantic Kernel, LangChain và hầu hết các công cụ LLM đều hỗ trợ nó ngay từ đầu.

    Quản lý mô hình rất đơn giản — ollama pull, ollama list, ollama rm. Không cần phải tìm kiếm các tệp GGUF trên HuggingFace.

    Hỗ trợ nhiều mô hình — Giữ nhiều mô hình được tải đồng thời. Ollama sẽ tự động chuyển đổi giữa chúng dựa trên các yêu cầu.

    Thân thiện với kiến ​​trúc không giao diện người dùng — Hoàn hảo cho máy chủ, container và các quy trình CI/CD.

    Những mặt trái
    Số lượng mẫu có hạn so với việc duyệt trực tiếp HuggingFace.
    Khó quan sát hơn những gì đang diễn ra bên trong.
    Sự trừu tượng hóa có thể che giấu những chi tiết quan trọng.
    Tốt nhất cho
    Xây dựng các ứng dụng cần truy cập LLM cục bộ. Nếu bạn đang viết mã giao tiếp với LLM, Ollama có lẽ là giải pháp dành cho bạn.

    LM Studio: Nhà thám hiểm hình ảnh

    Ứng dụng này là gì: Một ứng dụng máy tính để bàn với giao diện người dùng đồ họa (GUI) đẹp mắt để tải xuống, chạy và trò chuyện với các mô hình cục bộ.

    Cài đặt: Tải xuống từ lmstudio.ai và kéo vào thư mục Ứng dụng.

    Vì sao LM Studio tỏa sáng
    Khám phá mô hình — Duyệt qua các mô hình HuggingFace với thông tin về kích thước, lượng tử hóa và hiệu năng được hiển thị rõ ràng. Không cần phải đoán xem nên tải xuống tệp GGUF nào.

    Không cần thao tác dòng lệnh — Các thành viên nhóm không chuyên về kỹ thuật cũng có thể sử dụng được. Rất phù hợp cho các quản lý sản phẩm hoặc nhà thiết kế muốn thử nghiệm với trí tuệ nhân tạo.

    Điều chỉnh thông số trực quan — Điều chỉnh nhiệt độ, độ sáng tối đa, độ dài ngữ cảnh và lời nhắc hệ thống trong khi trò chuyện. Xem hiệu quả ngay lập tức.

    Hỗ trợ MLX — Trên Apple Silicon, LM Studio có thể sử dụng các mô hình được tối ưu hóa cho MLX để có hiệu suất tốt hơn.

    Những mặt trái
    Không phải mã nguồn mở
    Mức tiêu hao bộ nhớ cao hơn (~500MB cho giao diện người dùng đồ họa)
    Chỉ tải một mô hình tại một thời điểm (không tải đồng thời).
    Ít phù hợp hơn cho tự động hóa/lập trình
    Tốt nhất cho
    Khám phá các mô hình mới, tìm hiểu hành vi của LLM, hoặc cấp quyền truy cập AI cho những người không phải là nhà phát triển trong nhóm của bạn.

    llama.cpp: Kiểm soát tối đa

    Đây là gì: Phiên bản gốc. Một bản triển khai hoàn toàn bằng C/C++ của thuật toán suy luận LLaMA, được tối ưu hóa cho CPU và Apple Metal.

    Cài đặt:

    git clone //github.com/ggerganov/llama.cpp
    cd llama.cpp

    Nếu chưa cài đặt CMake (một công cụ hỗ trợ biên dịch mã nguồn). brew install cmake

    cmake –version

    cd llama.cpp
    # Xóa thư mục build cũ nếu có để làm sạch
    rm -rf build

    # Bắt đầu biên dịch lại
    cmake -B build -DGGML_METAL=ON
    cmake –build build –config Release -j

    • Tại sao cần -DGGML_METAL=ON?: Đây là tùy chọn quan trọng nhất để llama.cpp có thể sử dụng sức mạnh GPU trên chip M4 của bạn. Nếu không có nó, AI sẽ chạy hoàn toàn bằng CPU, tốc độ sẽ cực kỳ chậm.
    • Tốc độ biên dịch: Chip M4 với 24GB RAM sẽ biên dịch cái này rất nhanh (chỉ mất khoảng 1-2 phút).
    • Nếu vẫn gặp lỗi: Đảm bảo rằng bạn đã chạy xcode-select –install trước đó.

    Hoặc
    mkdir build && cd build
    cmake .. -DLLAMA_METAL=ON
    cmake –build . –config Release -j$(sysctl -n hw.logicalcpu)

    Khi biên dịch xong, các file thực thi sẽ nằm chính xác tại: ./build/bin/llama-server. Bạn có thể thử chạy nó bằng lệnh: ./build/bin/llama-server –version

    Tải được file model .gguf từ Hugging Face

    Cách khác chạy ổn trên Mac: brew install llama.cpp

    Chạy server với web UI: llama-server -hf Jiunsong/supergemma4-26b-uncensored-gguf-v2 –host 0.0.0.0

    post mặc định 8080, chỉnh cổng khác bị lỗi.

    chạy trên terminal: llama-cli -hf Jiunsong/supergemma4-26b-uncensored-gguf-v2:Q4_K_M

    tham khảo //github.com/ggml-org/llama.cpp

    //huggingface.co/Jiunsong/supergemma4-26b-uncensored-gguf-v2

    Cách sử dụng:

    # Interactive chat
    ./bin/llama-cli -m models/llama-3.2-8b-q4_k_m.gguf -p “Hello” -n 200

    # Run as server
    ./build/bin/llama-server \
    -m models/gemma-4-12b-q5_k_m.gguf \
    -c 8192 \
    -ngl 99 \
    –host 0.0.0.0 \
    –port 11434 \
    –mlock

    Tạo file .sh tối ưu cho llama.cpp: nano start_llama.sh

    #!/bin/bash

    cd ~/llama.cpp ./build/bin/llama-server \

    # Đường dẫn tới file model của bạn (hãy đổi tên file cho đúng thực tế)
    MODEL_PATH=”./models/gemma-4-12b-Q4_K_M.gguf”

    echo “— Đang khởi động llama.cpp Server (M4 Optimized) —”

    # Các tham số tối ưu:
    # -c 8192: Tăng Context window lên 8k (phù hợp cho code Odoo/Logistics)
    # –mlock: Khóa model vào RAM, không cho Mac đẩy vào swap (cực quan trọng)
    # -fa: Flash Attention (tăng tốc độ suy luận trên Apple Silicon)

    ./llama-server \
    -m “$MODEL_PATH” \
    –host 0.0.0.0 \
    –port 11434 \
    -ngl 99 \
    -c 8192 \
    –mlock \
    -fa \
    –cont-batching

    Cấp quyền thực thi: chmod +x start_llama.sh

    Khi server đang chạy, bạn có thể kiểm tra bằng cách mở trình duyệt truy cập:
    //localhost:11434 Bạn sẽ thấy một giao diện web (Chat UI) tích hợp sẵn của llama.cpp. Bạn có thể chat thử ngay tại đó để kiểm tra tốc độ.

    Lưu ý cho n8n: Trong node “AI Agent” hoặc “OpenAI Chat Model” của n8n, bạn chỉ cần chọn “Base URL” là //localhost:11434/v1 và API Key có thể điền bất kỳ (vì llama.cpp không yêu cầu key mặc định).

    Kiểm tra Dùng curl (Kiểm tra nhanh trên Terminal)

    curl //localhost:8080/v1/chat/completions \
    -H “Content-Type: application/json” \
    -d ‘{
    “messages”: [
    {“role”: “system”, “content”: “Bạn là một trợ lý thông minh.”},
    {“role”: “user”, “content”: “Chào bạn, bạn làm được gì?”}
    ],
    “stream”: false
    }’

    Khi bạn chạy server, llama.cpp giả lập API của OpenAI cung cấp các đường dẫn sau:

    /v1/chat/completions: Dùng cho hội thoại (Chat mode) – Phổ biến nhất.
    /completion: Dùng để hoàn thiện văn bản (Text completion mode).
    /health: Kiểm tra xem server có đang sống hay không.

    Vì sao llama.cpp lại quan trọng
    Đó là những gì Ollama sử dụng ở bên dưới — Hiểu về llama.cpp sẽ giúp bạn hiểu rõ tất cả các công cụ này thực sự đang làm gì.

    Kiểm soát hoàn toàn — Mọi tham số đều được hiển thị. Kích thước lô, độ dài ngữ cảnh, lượng tử hóa tức thời.

    Công nghệ tiên tiến nhất — Các tối ưu hóa và hỗ trợ mô hình mới nhất được cập nhật đầu tiên tại đây.

    Mức tiêu hao tài nguyên tối thiểu — ~100MB RAM khi ở trạng thái chờ. Chỉ có mô hình và không có gì khác.

    Những mặt trái
    Tải xuống mô hình thủ công (uốn xoăn từ HuggingFace)
    Đường cong học tập dốc hơn
    Không cần quản lý mô hình — bạn tự xử lý các tệp.
    Tốt nhất cho
    Những người dùng chuyên nghiệp muốn hiệu năng tối đa, các nhà nghiên cứu thử nghiệm lượng tử hóa, hoặc bất kỳ ai muốn hiểu cách suy luận cục bộ thực sự hoạt động.

    MLX: Khung phần mềm gốc của Apple

    Khái niệm: Khung phần mềm học máy mã nguồn mở của Apple, được tối ưu hóa đặc biệt cho kiến ​​trúc bộ nhớ thống nhất của Apple Silicon.

    Cài trên môi trường ảo. Để tránh xung đột thư viện, bạn nên tạo một môi trường riêng:

    python3 -m venv mlx_env
    source mlx_env/bin/activate

    Cài đặt bản core và thư viện hỗ trợ mô hình ngôn ngữ (mlx-lm):

    pip install -U pip
    pip install mlx mlx-lm

    Chạy lệnh này để xem danh sách các gói đã cài đặt:

    python3 -m pip list | grep mlx
    Trên macOS, lệnh python thường trỏ về bản cũ (2.7) hoặc không tồn tại, trong khi python3 mới là bản chính xác. Hãy thử chạy lại bằng lệnh này: python3 -m mlx_lm.generate –model mlx-community/Llama-3-8B-Instruct-4bit –prompt “Chào bạn”

    Nếu bạn thường xuyên sử dụng MLX, hãy thêm dòng này vào file .zshrc để không bao giờ phải gõ python3 hay lo lắng về đường dẫn:

    1. nano ~/.zshrc.

    2. Dán dòng này vào cuối: alias python='python3'.

    3. Nhấn Ctrl + O -> Enter để lưu, Ctrl + X để thoát.

    4. Chạy source ~/.zshrc.

    Bây giờ bạn chỉ cần gõ python -m mlx_lm.generate... là máy sẽ hiểu.

    Cách sử dụng:

    • Chạy trực tiếp từ Terminal:

    python -m mlx_lm.generate –model mlx-community/Llama-3-8B-Instruct-4bit –prompt “Viết một bài thơ về thành phố Hồ Chí Minh.”

    # Run inference
    mlx_lm.generate –model mlx-community/Llama-3.2-3B-Instruct-4bit \\
    –prompt “Write a haiku about coding”

    • Sử dụng trong Code Python:

    from mlx_lm import load, generate

    # Tải mô hình và tokenizer (tự động tải từ Hugging Face nếu chưa có)
    model, tokenizer = load(“mlx-community/Llama-3-8B-Instruct-4bit”)

    # Tạo văn bản
    response = generate(model, tokenizer, prompt=”Giải thích thuyết tương đối hẹp một cách đơn giản”, verbose=True)

    # Chạy bản 26B MoE tối ưu nhất, có tổng 26 tỷ tham số nhưng nó chỉ kích hoạt khoảng 3.8 tỷ tham số cho mỗi token. Hiệu năng trên M4: Cực nhanh. Kiến trúc MoE của Google phối hợp rất tốt với băng thông bộ nhớ của chip M4. Khi dùng định dạng 4-bit (Quantized), mô hình này chiếm khoảng 15-17GB RAM. Với 24GB, bạn vẫn còn dư khoảng 7GB cho macOS và các ứng dụng khác như Chrome hay VS Code mà không lo bị tràn RAM (Swap).

    python -m mlx_lm.generate –model mlx-community/gemma-4-26b-a4b-it-4bit –prompt “Viết code Python để tự động hóa việc gán nhãn dữ liệu trong Odoo.”

    ModelLoạiĐộ thông minhTốc độ trên M4Mức độ phù hợp
    Gemma 4 26B A4BMoERất caoRất nhanhKhuyên dùng
    Gemma 4 E4BSmallKháCực nhanhDùng hàng ngày
    Gemma 4 31BDenseCao nhấtTrung bìnhHơi chật chội
            • Nếu bạn cần một trợ lý phản hồi tức thì (như gõ phím đến đâu chữ ra đến đó) để tích hợp vào các script tự động hóa hoặc làm chatbot nhanh. Chỉ chiếm khoảng 4-6GB RAM. Bạn có thể chạy song song 2-3 mô hình này cùng lúc hoặc dùng nó khi đang gánh các tác vụ nặng khác (như Render video, Docker)

          . Sử dụng: mlx-community/gemma-4-e4b-it-4bit

    • Chạy Server bằng lệnh Terminal

    python -m mlx_lm.server –model mlx-community/Llama-3-8B-Instruct-4bit

    # Or start a server
    mlx_lm.server –model mlx-community/Llama-3.2-3B-Instruct-4bit

    Các tham số quan trọng bạn có thể thêm:

    –host: Mặc định là 127.0.0.1. Nếu muốn cho phép thiết bị khác trong mạng LAN truy cập, hãy dùng 0.0.0.0.

    –port: Mặc định là 8080.

    –trust-remote-code: Cần thiết cho một số mô hình đặc thù.

    Sử dụng mô hình Quantized (4-bit): Luôn ưu tiên các bản 4-bit từ mlx-community. Nó giúp tiết kiệm RAM và tăng tốc độ phản hồi (tokens/sec) đáng kể trên chip M4.

    Giới hạn RAM: Nếu bạn muốn giới hạn dung lượng RAM mà MLX được phép chiếm dụng, bạn có thể đặt biến môi trường trước khi chạy lệnh serve:

    export MLX_MAX_MAX_RECV_BUF_SIZE=1000000 # Ví dụ tùy chỉnh buffer
    (Thực tế MLX quản lý bộ nhớ rất thông minh, nên thường bạn không cần can thiệp trừ khi chạy mô hình cực lớn sát nút dung lượng GB).

    Kiểm tra Server hoạt động
    Sau khi server chạy, bạn sẽ thấy thông báo đại loại như: Starting server on //127.0.0.1:8080. Bạn có thể thử gửi một truy vấn bằng lệnh curl từ một cửa sổ Terminal khác:

    curl //localhost:8080/v1/chat/completions \
    -H “Content-Type: application/json” \
    -d ‘{
    “messages”: [
    {“role”: “user”, “content”: “Xin chào, bạn là ai?”}
    ] }’

    Kết nối với các phần mềm Giao diện (UI)
    Vì MLX Server giả lập API của OpenAI, bạn có thể dùng bất kỳ phần mềm nào hỗ trợ “Custom OpenAI API”:

    Cài đặt một UI: Ví dụ Chatbox AI (rất phổ biến trên Mac).

    Cấu hình Settings:

    Model Provider: Chọn OpenAI hoặc Custom OpenAI.

    API Host: Điền //127.0.0.1:8080.

    API Key: Điền bất kỳ ký tự nào (vì server chạy local không yêu cầu key thực).

    Model Name: Điền tên mô hình bạn đã load (ví dụ: Llama-3-8B-Instruct-4bit).

    Tạo file `.sh` (Shell Script) giúp bạn khởi động server nhanh chóng chỉ bằng một cú nhấp chuột hoặc một lệnh ngắn, thay vì phải gõ lại cả đoạn mã dài và kích hoạt môi trường thủ công.

    ### Bước 1: Tạo file `run_mlx.sh`

    Bạn mở Terminal, di chuyển vào thư mục dự án và gõ:
    nano run_mlx.sh
    ### Bước 2: Dán nội dung sau vào file
    *Lưu ý: Thay đổi đường dẫn `/path/to/your/mlx_env` thành đường dẫn thực tế đến thư mục môi trường ảo của bạn.*

    #!/bin/bash

    # 1. Đường dẫn tới môi trường ảo (Hãy sửa lại cho đúng với máy bạn)
    VENV_PATH=”./mlx_env”

    # 2. Tên mô hình (Gemma 4 là lựa chọn tốt nhất cho M4)
    MODEL=”mlx-community/gemma-4-26b-a4b-it-4bit”

    # 3. Kiểm tra xem môi trường ảo có tồn tại không
    if [ -d “$VENV_PATH” ]; then
    echo “— Đang kích hoạt môi trường ảo $VENV_PATH —”
    source “$VENV_PATH/bin/activate”
    else
    echo “— Không tìm thấy môi trường ảo tại $VENV_PATH. Đang chạy bằng Python hệ thống —”
    fi

    # 4. Chạy MLX Server theo chuẩn OpenAI API
    echo “— Đang khởi động MLX Server với mô hình: $MODEL —”
    python3 -m mlx_lm.server \
    –model “$MODEL” \
    –host 0.0.0.0 \
    –port 8080 \
    –log-level INFO
    “`

    *Nhấn `Ctrl + O` -> `Enter` để lưu, `Ctrl + X` để thoát.*

    ### Bước 3: Cấp quyền thực thi cho file
    Bạn cần cho phép macOS chạy file này như một ứng dụng:
    chmod +x run_mlx.sh
    ### Bước 4: Cách sử dụng

    Từ giờ, mỗi khi muốn chạy server, bạn chỉ cần gõ:
    ./run_mlx.sh

    Nếu bạn muốn chạy script này bằng cách **double-click** từ Finder (như một ứng dụng):
    1. Chuột phải vào file `run_mlx.sh`.
    2. Chọn **Get Info**.
    3. Tại phần **Open with**, chọn **Terminal.app**.
    4. Đổi đuôi file từ `.sh` thành `.command`.

    ### Tại sao nên dùng cấu hình này ?
    * **Host 0.0.0.0:** Cho phép bạn dùng iPhone/iPad trong cùng mạng Wi-Fi truy cập vào mô hình AI đang chạy trên Mac.
    * **Port 8080:** Cổng mặc định phổ biến, dễ kết nối với các UI bên thứ ba.
    * **Tự động hóa:** Script tự lo việc `source activate`, giúp bạn tránh lỗi `ModuleNotFoundError` như lúc nãy.

    Vì sao MLX lại khác biệt?
    Được thiết kế dành cho Apple Silicon — Tận dụng tối đa bộ nhớ hợp nhất, Metal và nay là hỗ trợ Neural Engine trên chip M5.

    Thường nhanh hơn llama.cpp trên máy Mac — Đối với một số kích thước mô hình và lượng tử hóa nhất định, MLX hoạt động tốt hơn llama.cpp trên phần cứng của Apple.

    Hỗ trợ Python gốc — Nếu bạn sử dụng Python, MLX tích hợp một cách tự nhiên hơn so với việc gọi các tệp nhị phân llama.cpp.

    Được Apple hỗ trợ — Phát triển tích cực từ nhóm nghiên cứu học máy của Apple.

    Những mặt trái
    Chỉ dành cho Mac (không tương thích với Linux/Windows)
    Hệ sinh thái mô hình nhỏ hơn so với GGUF
    Công cụ chưa hoàn thiện
    Tốt nhất cho Phát triển ứng dụng dành riêng cho Mac, nơi bạn muốn tận dụng tối đa hiệu năng của Apple Silicon.

    Xem //huggingface.co/mlx-community

    mlx-examples

    Hiệu năng trên Apple Silicon

    Đây là những gì thực sự hoạt động tốt trên các cấu hình Mac phổ biến:

    Cấu hình MacCác mẫu được đề xuấtGhi chú
    M1/M2 (8GB)3B-7B Q4 lượng tử hóaChật chội nhưng vẫn sử dụng được.
    M1/M2 (16GB)7B-13B Q4/Q5Điểm tối ưu cho hầu hết các công việc
    M1/M2 Pro (32GB)13B-34B Q4Có chỗ cho các mô hình lớn hơn
    M3/M4 Max (64GB trở lên)70B Q4, nhiều mẫuKhả thi về mặt sản xuất

    Điểm mấu chốt:Trên Apple Silicon, các mô hình được tải vào bộ nhớ thống nhất được chia sẻ giữa CPU và GPU. Một mô hình 7B Q4 sử dụng khoảng 4GB. Bạn cần lượng RAM trống tương ứng, cộng thêm một lượng RAM dự phòng để đáp ứng nhu cầu.

    Khung Quyết định

    Hãy sử dụng Ollama nếu:

    • Bạn đang xây dựng các ứng dụng (không chỉ là trò chuyện)
    • Bạn cần triển khai không giao diện người dùng/máy chủ.
    • Bạn muốn khả năng tương thích với API của OpenAI
    • Cần phải có nhiều mẫu sản phẩm khác nhau cùng lúc.

    Hãy sử dụng LM Studio nếu:

    • Bạn đang khám phá/đánh giá các mô hình
    • Các thành viên nhóm không chuyên về kỹ thuật cần được cấp quyền truy cập.
    • Bạn muốn điều chỉnh thông số trực quan
    • Bạn đang học về hành vi LLM.

    Hãy sử dụng llama.cpp nếu:

    • Bạn cần kiểm soát tối đa quá trình suy luận.
    • Bạn đang tối ưu hóa cho phần cứng cụ thể.
    • Bạn muốn hiểu công nghệ nền tảng
    • Mỗi MB RAM đều quan trọng.

    Hãy sử dụng MLX nếu:

    • Bạn chỉ dùng máy Mac và muốn có hiệu năng tốt nhất từ ​​Apple Silicon.
    • Ngăn xếp công nghệ của bạn là Python-A-toàn cục.
    • Bạn muốn thử nghiệm với hệ sinh thái học máy của Apple.

    Gộp CPU, GPU và RAM từ nhiều máy để chạy một mô hình.

    Bạn có thể gộp tài nguyên (CPU, GPU, RAM/unified memory) từ nhiều Mac Mini 16GB để chạy mô hình AI lớn hơn khả năng của từng máy riêng lẻ.** Apple Silicon hỗ trợ rất tốt nhờ unified memory và framework MLX của Apple.

    Các cách chính để thực hiện

    1. **MLX Distributed (cách native, mạnh nhất)**
    – MLX (từ Apple) hỗ trợ **distributed inference/training** qua pipeline parallelism hoặc tensor parallelism, chia layers của model ra nhiều máy.
    – Kết nối các Mac Mini qua **Thunderbolt** (tốt nhất, hỗ trợ RDMA/JACCL cho tốc độ cao, ít bottleneck) hoặc Ethernet 10Gb+.
    – Hiệu suất: Có thể chạy model hàng trăm tỷ parameters (ví dụ DeepSeek 236B+ hoặc lớn hơn) mà máy đơn không load nổi.
    – Ưu điểm: Tối ưu unified memory, nhanh, zero-copy.

    2. **Exo (dễ dùng nhất cho người mới)**
    – GitHub: **exo-explore/exo** — framework chuyên cho Apple Silicon cluster.
    – Hỗ trợ MLX + tinygrad backend, chạy model lớn qua network/Thunderbolt.
    – Dùng TUI/API đơn giản, auto shard model, hỗ trợ chat/API.
    – Nhiều người dùng thành công với multi Mac (kể cả Mac Mini).

    Chạy LLM cục bộ trên macOS

    3. **Các tool khác**
    – **LocalAI** hoặc **LM Studio** với MLX backend (có experimental distributed).
    – **Ray + MLX** cho serving scale.
    – dnet (một framework distributed mới) cũng được nhắc đến cho cluster Apple Silicon.

    ### Hướng dẫn thực hiện cơ bản (Mac Mini M4 hoặc tương tự)

    – **Yêu cầu**:
    – Tất cả máy chạy macOS mới nhất (hỗ trợ RDMA nếu dùng Thunderbolt 5).
    – Cùng phiên bản MLX.
    – Kết nối cùng network (Thunderbolt ưu tiên).

    – **Bước setup**:
    1. Trên mỗi máy: Cài Python, MLX (`pip install mlx mlx-lm`).
    2. Clone repo (Exo hoặc MLX examples).
    3. Tạo hostfile liệt kê các máy (IP hoặc hostname).
    4. Chạy distributed command ví dụ:
    “`bash
    mlx.launch –backend jaccl –hostfile hosts.json … mlx_lm.generate –model <large-model>
    “`
    5. Với Exo: Chạy server trên các node, dùng TUI để load model.

    – **Hiệu suất thực tế** (từ các test):
    – Cluster Mac Mini M4: Có thể chạy model lớn hơn, nhưng tốc độ inference có thể chậm hơn single high-end machine do network overhead (Thunderbolt giúp giảm đáng kể).
    – Tốt cho **model quá lớn để fit single 16GB** (ví dụ 70B+ Q4/Q5 hoặc MoE models).

    ### Lưu ý quan trọng

    – **Không phải “pool” hoàn hảo như một máy duy nhất**: Communication overhead (đặc biệt Ethernet) làm giảm tốc độ so với single máy mạnh. Thunderbolt giúp tốt hơn nhiều.
    – **16GB mỗi máy**: Phù hợp offload layers, nhưng hiệu quả cao hơn nếu dùng Mac Mini có RAM cao hơn (24/32GB+). Tổng RAM cluster = sum, nhưng latency tăng.
    – **Nhiệt độ & điện**: Cluster nhiều máy tốn điện và nóng hơn.
    – **Dùng cho inference** dễ hơn training. Training distributed phức tạp hơn.
    – Test nhỏ trước với model 13B-34B để kiểm tra kết nối.

    ### Nguồn tham khảo & bắt đầu
    – MLX docs: Distributed communication (jaccl/RDMA).
    – GitHub: exo-explore/exo, mlx-explore/mlx.
    – Video demo: Tìm “Mac Mini M4 cluster MLX” hoặc “Exo Apple Silicon cluster”.

    Nếu bạn cho biết số lượng Mac Mini, model cụ thể muốn chạy (ví dụ Llama 70B, DeepSeek, v.v.), và kết nối (Thunderbolt hay Ethernet), mình có thể hướng dẫn chi tiết hơn!

    LM Studio Link

    LM Link làm gì?
    – Load model trên **máy remote** (ví dụ: Mac Mini có GPU mạnh hơn hoặc nhiều RAM hơn) và sử dụng từ máy khác (laptop, Mac Mini khác) như mô hình local.
    – Tất cả giao tiếp **end-to-end encrypted**, không mở port ra internet công cộng.
    – Dùng công nghệ **Tailscale mesh VPN** (hợp tác với Tailscale) để kết nối an toàn.
    – Chat/history vẫn giữ local trên máy client, chỉ inference chạy trên remote.

    **Rất phù hợp với nhu cầu của bạn**: Gộp nhiều Mac Mini 16GB để chạy model lớn mà máy đơn không load nổi.

    Ưu điểm so với các cách khác (MLX Distributed, Exo)

    Tiêu chíLM Link (LM Studio)MLX Distributed / Exo
    Dễ dùngRất dễ (GUI + vài click)Phức tạp hơn (command line)
    True distributed (chia layer)Không (chạy full model trên 1 máy)Có (tensor/pipeline parallel)
    Kết nốiTailscale (dễ, an toàn)Thunderbolt/Ethernet trực tiếp
    Hiệu suấtTốt cho remote accessTốt hơn nếu muốn scale thực sự
    Hỗ trợ Mac Mini clusterTốt (dùng nhiều máy)Tốt hơn cho performance cao

    **LM Link không phải là “true clustering”** (không tự động chia model ra nhiều máy như MLX/Exo). Thay vào đó, nó cho phép bạn **chọn chạy model trên máy nào** trong mạng Link của bạn. Ví dụ: Máy A (16GB) không load nổi 70B, nhưng Máy B (32GB+) load được → bạn dùng từ Máy A như local.

    ### Cách dùng với nhiều Mac Mini
    1. Cài LM Studio trên **tất cả** các Mac Mini.
    2. Mở LM Studio → vào phần **LM Link** (sidebar) → Enable và tạo Link.
    3. Thêm các máy khác vào cùng Link (auto discover qua Tailscale).
    4. Trong model loader, bạn sẽ thấy cả model local + model remote.
    5. Chọn model remote để chạy → inference xảy ra trên máy remote, kết quả trả về máy bạn.

    **Miễn phí**: Hiện hỗ trợ tối đa 2 users, 5 devices mỗi user (10 devices tổng).

    ### Lưu ý khi dùng với Mac Mini 16GB
    – **Không thay thế hoàn toàn distributed inference**: Nếu muốn chia 1 model lớn ra nhiều máy 16GB (true pooling RAM), vẫn nên dùng **Exo** hoặc **MLX distributed** + Thunderbolt.
    – LM Link xuất sắc khi bạn có **ít nhất 1 máy mạnh hơn** để host model lớn, và các máy yếu hơn dùng remote.
    – Latency: Thấp nếu cùng mạng LAN/Thunderbolt, cao hơn nếu qua internet (vẫn encrypted).
    – Hỗ trợ API: Vẫn dùng được qua `localhost:1234` như bình thường (các tool khác như SillyTavern, VS Code… vẫn kết nối được).

    Tinh chỉnh LLM với mlx của Apple dành cho người dùng Mac

    **Tinh chỉnh (fine-tuning) LLM với MLX của Apple là cách tuyệt vời dành cho người dùng Mac (Apple Silicon M1/M2/M3/M4/M5).** MLX được Apple tối ưu hóa cho unified memory, chạy hiệu quả trên MacBook mà không cần GPU rời hay cloud.

    ### 1. MLX và mlx-lm là gì?
    – **MLX**: Framework machine learning native của Apple cho Apple Silicon.
    – **mlx-lm**: Package chuyên dùng để chạy inference và **fine-tuning** LLM (hỗ trợ LoRA/QLoRA rất tốt, tiết kiệm bộ nhớ).

    Ưu điểm:
    – Chạy hoàn toàn local, nhanh trên M-series.
    – Hỗ trợ hàng nghìn model từ Hugging Face (đặc biệt mlx-community có bản quantized sẵn).
    – Fine-tune model 7B-8B dễ dàng trên MacBook 16GB+ RAM.

    ### 2. Cài đặt nhanh

    “`bash
    # Tạo môi trường
    python3 -m venv mlx-env
    source mlx-env/bin/activate

    # Cài mlx-lm
    pip install mlx-lm

    # Để fine-tuning (cần thêm dependencies)
    pip install “mlx-lm[train]”
    “`

    Cập nhật MLX nếu cần: `pip install -U mlx mlx-lm`.

    ### 3. Chuẩn bị dữ liệu (Data Preparation)
    Dữ liệu cần ở định dạng **JSONL** với các file:
    – `train.jsonl`
    – `valid.jsonl` (tùy chọn)

    **Định dạng khuyến nghị** (chat/instruct):

    “`json
    {“text”: “<|im_start|>system\nBạn là trợ lý hữu ích.<|im_end|>\n<|im_start|>user\nCâu hỏi của tôi<|im_end|>\n<|im_start|>assistant\nCâu trả lời<|im_end|>”}
    “`

    Hoặc dùng định dạng conversation của model (Mistral, Llama, Qwen, Phi…).

    **Mẹo**: Dùng thư viện `datasets` của Hugging Face để convert dữ liệu. Nhiều tutorial có script sẵn.

    ### 4. Fine-tuning với LoRA (Khuyến nghị)

    Command cơ bản:

    “`bash
    mlx_lm.lora \
    –model mlx-community/Mistral-7B-Instruct-v0.3-4bit \ # hoặc model khác
    –train \
    –data ./data \ # thư mục chứa train.jsonl
    –iters 500 \ # số bước train (500-2000 tùy dataset)
    –batch-size 1 \ # hoặc 4 nếu RAM nhiều
    –learning-rate 1e-5 \
    –lora-layers 16 \ # hoặc 8-32
    –adapter-path ./adapters
    “`

    **Các tham số quan trọng**:
    – `–fine-tune-type lora` (mặc định) hoặc `dora`, `full`.
    – `–num-layers` / `–lora-layers`: Giảm để tiết kiệm RAM.
    – `–grad-checkpoint`: Tiết kiệm bộ nhớ hơn.
    – Dùng config file YAML để dễ quản lý.

    **Ví dụ model nhỏ dễ thử** (chạy tốt trên 16GB):
    – Qwen2.5-3B/7B, Ministral-8B, Phi-3/4, Llama-3.2-3B.

    ### 5. Merge adapter và sử dụng model

    Sau khi train xong (có file adapters):

    “`bash
    mlx_lm.fuse \
    –model mlx-community/Mistral-7B-Instruct-v0.3-4bit \
    –adapter-path ./adapters \
    –save-path ./my-finetuned-model
    “`

    Chạy inference:

    “`bash
    mlx_lm.generate –model ./my-finetuned-model –prompt “Câu hỏi của bạn…”
    “`

    Hoặc export sang GGUF để dùng với Ollama / LM Studio.

    ### 6. Công cụ hỗ trợ (GUI & nâng cao)
    – **mlx-tune**: Thư viện mạnh, hỗ trợ SFT, DPO, nhiều trainer (gần giống Unsloth).
    – **M-Courtyard**: App Mac native GUI cho data prep + fine-tuning.
    – Python API trong `mlx_lm.tuner` nếu muốn code linh hoạt.

    ### Lưu ý khi dùng trên Mac
    – **RAM**: 16GB → model 3-7B LoRA thoải mái. 32GB+ → thoải mái hơn.
    – Quantized 4-bit trước khi train để tiết kiệm memory.
    – Theo dõi nhiệt độ và dùng `powermetrics` nếu cần.
    – Dataset chất lượng cao, sạch sẽ quan trọng hơn số lượng (100-1000 mẫu tốt đã thấy kết quả rõ).

    ### Tài liệu tham khảo chính thức & Tutorial hay
    – GitHub mlx-lm: //github.com/ml-explore/mlx-lm (xem LORA.md).
    – mlx-examples.
    – Các tutorial chi tiết: Heidloff.net, Medium (có hướng dẫn bằng tiếng Việt trên LinkedIn).

    Bạn muốn fine-tune cho mục đích cụ thể nào (chatbot, code, SQL, domain-specific…)? Mình có thể đưa command/config chi tiết hơn hoặc gợi ý dataset/model phù hợp.

    oMLX

    Làm thế nào một mô hình tham số 35 tỷ từ trạng thái “cực kỳ chậm” trở nên “sẵn sàng cho sản xuất” trên máy MacBook. LM Studio rất tốt cho việc quản lý ollama, nhưng tôi không hài lòng lắm với hiệu năng của MLX. Ý tôi là cả tốc độ lẫn bộ nhớ.Tôi không thể chạy các mô hình 27B trên LM Studio, trong khi tôi có thể dễ dàng chạy chúng với oMLX.Tôi không thể chạy các mô hình 9B nhanh chóng với LM Studio nhưng lại có thể với oMLX. Nó hoạt động rất tốt với bộ nhớ đệm thực sự hiệu quả, trái ngược với LMStudio hiện tại chắc chắn không hỗ trợ bộ nhớ đệm ngữ cảnh MLX. Xử lý 100-200k ngữ cảnh cực kỳ nhanh chóng.

    Sau khi tiêu tốn vô số token, Codex đã rất quen thuộc với Hermes trên Mini của tôi. Giờ thì tôi sẽ cho Codex hướng Hermes đến oMLX.Sử dụng oMLX được khoảng một tháng.

    Ưu điểm:

    – Lập trình viên chính có kiến ​​thức chuyên môn và phản hồi nhanh chóng.

    Nhược điểm:

    – Ứng dụng vẫn chưa ổn định (cách đây 2 tuần vẫn gặp lỗi kernel panic/OOM) nhưng đang dần tốt hơn
    – Ứng dụng chắc chắn được lập trình theo phong cách Vibe, nhưng trong lĩnh vực này thì cái gì chẳng vậy.

    sử dụng OMLX với OpenCode và MiniMax 2.5. Nó đã thay đổi hoàn toàn cách tôi làm việc. Trước đây tôi gặp rất nhiều khó khăn với LM Studio, Ollama và các mô hình khác nhau. Tôi gặp đủ loại vấn đề với việc sử dụng công cụ, vòng lặp, phản hồi dưới dạng mã, v.v. Tôi đã tự xây dựng một máy chủ proxy để hỗ trợ thì công cụ này xuất hiện. Dễ cài đặt, dễ sử dụng và giờ tôi đã có một công cụ lập trình đáng tin cậy.

    Tôi đã chuyển từ oMLX sang MLX Studio, hay còn gọi là vMLX://github.com/jjang-ai/mlxstudio

    Đối với tôi, nó có nhiều tính năng hơn và có thể xử lý các lượng tử không đồng nhất (như GGUF). Điều duy nhất mà tôi thấy thiếu so với oMLX là giao diện web.

    apfel

    Máy Mac dùng chip Apple Silicon tích hợp sẵn LLM thông qua Apple FoundationModels . apfel Nó được hiển thị dưới dạng công cụ UNIX và máy chủ cục bộ tương thích với OpenAI. Hoàn toàn trên thiết bị. Không cần khóa API, không cần đám mây. Theo nhà phát triển, apfel tận dụng tham số 3B LLM, một phần của Mô hình Nền tảng Apple (AFM). AFM này được tích hợp sẵn trong macOS Tahoe và được Apple Intelligence sử dụng. Mô hình này mất một chút thời gian để tải xuống vì dung lượng khoảng 3-4 GB, nhưng nếu bạn đã cài đặt Apple Intelligence, bạn có thể truy vấn LLM MIỄN PHÍ trong vòng một phút.

    Yêu cầu macOS 26 Tahoe+, Apple Silicon (M1+), Apple Intelligence đã được kích hoạt .

    brew install apfel
    Cập nhật: brew upgrade apfel

    apfel –model-info

    Công cụ UNIX
    Trích dẫn lời nhắc có !dấu ngoặc đơn (mở rộng lịch sử zsh/bash): apfel ‘Hello, Mac!’.

    # Single prompt để hỏi một câu hỏi đơn giản. Kết quả của câu hỏi sẽ được in ra màn hình.
    apfel “What is the capital of Austria?”

    # Permissive mode – reduces guardrail false positives for creative/long prompts
    apfel –permissive “Write a dramatic opening for a thriller novel”

    --permissivelà một tùy chọn cho phép ứng dụng xử lý các câu hỏi dài và sáng tạo mà không bị chặn bởi các hạn chế bảo mật. Điều này có thể hữu ích khi bạn muốn tạo ra các câu chuyện hoặc văn bản dài.

    # Stream output
    apfel –stream “Write a haiku about code”

    --streamcho phép ứng dụng in kết quả trực tiếp vào đầu ra của shell thay vì in ra màn hình. Điều này có thể hữu ích nếu bạn muốn kết quả được hiển thị trong một môi trường khác.

    # Pipe input
    echo “Summarize: $(cat README.md)” | apfel

    Sử dụngechođể tạo một dòng lệnh chứa nội dung từ tệpREADME.md. Sau đó, kết quả của lệnhcat README.mdđược chuyển qua$(cat README.md)và được in ra đầu ra củaapfel.

    # Attach file content to prompt
    apfel -f README.md “Summarize this project”

    cho phép ứng dụng đọc nội dung từ tệpREADME.mdvà sử dụng nó làm đầu vào cho câu hỏi.

    # Attach multiple files
    apfel -f old.swift -f new.swift “What changed between these two files?”

    Sử dụng-fđể đọc nội dung từ nhiều tệp. Trong trường hợp này,old.swiftnew.swiftsẽ được dùng để so sánh và tìm hiểu sự khác biệt giữa chúng.

    # Combine files with piped input
    git diff HEAD~1 | apfel -f CONVENTIONS.md “Review this diff against our conventions”

    Sử dụnggit diff HEAD~1để lấy bản ghi diff của các tệp được cập nhật gần nhất. Kết quả của lệnhgit diffđược chuyển qua$(git diff HEAD~1)và được sử dụng làm đầu vào choapfel.

    # JSON output for scripting
    apfel -o json “Translate to German: hello” | jq .content

    cho phép ứng dụng tạo ra một tệp JSON từ đầu vào. Đầu ra củaapfelđược chuyển qua$(apfel -o json "Translate to German: hello")và được in ra đầu ra củajq..contentlà một biểu thức tìm kiếm trongjqđược sử dụng để lấy nội dung của tệp JSON.

    # System prompt
    apfel -s “You are a pirate” “What is recursion?”

    -scho phép ứng dụng tạo ra một câu hỏi hệ thống mà người dùng có thể trả lời. Câu hỏi được in ra màn hình và sau đó người dùng được yêu cầu nhập câu trả lời.

    # System prompt from file
    apfel –system-file persona.txt “Explain TCP/IP”

    --system-filecho phép ứng dụng sử dụng một tệp chứa câu hỏi hệ thống. Nội dung của tệppersona.txtsẽ được sử dụng làm đầu vào cho câu hỏi.

    # Quiet mode for shell scripts
    result=$(apfel -q “Capital of France? One word.”)

    -qcho phép ứng dụng hoạt động trong chế độ im lặng, nghĩa là nó sẽ không in ra kết quả vào đầu ra của shell. Kết quả được lưu trữ trong biếnresultvà có thể được sử dụng trong các lệnh shell khác.

    Máy chủ tương thích với OpenAI
    apfel –serve # foreground

    tạo file sh tương tự cho lệnh

    #!/bin/bash
    apfel –serve –host 0.0.0.0

    cấp quyền chạy vào tệp sh bằng lệnh sau: chmod +x /tmp/serve.sh

    Cách khác: brew services start apfel # background (like Ollama)
    brew services stop apfel

    APFEL_TOKEN=$(uuidgen) APFEL_MCP=/path/to/tools.py brew services start apfel
    curl //localhost:11434/v1/chat/completions \
    -H “Content-Type: application/json” \
    -d ‘{“model”:”apple-foundationmodel”,”messages”:[{“role”:”user”,”content”:”Hello”}]}’

    Nó sẽ nạp sẵn id model apple-foundationmodel, trong n8n thì disable use responses API, các phương thức giống OpenAI

    Tính năngTrạng tháiGhi chú
    POST /v1/chat/completionsĐược hỗ trợPhát trực tuyến + không phát trực tuyến
    GET /v1/modelsĐược hỗ trợTrả lạiapple-foundationmodel
    GET /healthĐược hỗ trợTính khả dụng của mô hình, cửa sổ ngữ cảnh, ngôn ngữ
    GET /v1/logs,/v1/logs/statsChỉ gỡ lỗiYêu cầu--debug
    POST /v1/completions501Tính năng tự động hoàn thành văn bản cũ không được hỗ trợ.
    POST /v1/embeddings501Các nội dung nhúng không khả dụng trên thiết bị.
    logprobs=true,n>1,stop,presence_penalty,frequency_penalty400Bị từ chối rõ ràng.n=1logprobs=falseđược chấp nhận là không có tác dụng gì.
    Đa phương thức (hình ảnh)400Bị từ chối với lỗi rõ ràng

    Để lại một bình luận

    Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

    Chat with us
    Hello! How can I help you today?