← Về trang Blog

🤖 Chạy Local LLM với OpenClaw

Hướng dẫn setup llama.cpp server trên Docker + cấu hình OpenClaw — hoàn toàn offline, không cần API key


Bài này hướng dẫn bạn chạy một LLM local (Qwen3.6 35B) trên máy chủ (Ubuntu) bằng Docker llama.cpp, sau đó kết nối vào OpenClaw để dùng như một AI assistant cá nhân.

📊 Benchmark hiệu năng

💻 Thiết bị test: RTX 3090 (24GB VRAM), Ubuntu PC
📈 Model: Qwen3.6-35B-A3B-MTP-GGUF (UD-Q3_K_XL)
Loại task Decode TPS TTFT Mô tả
📝 Narrative ~134 tok/s ~68ms Tạo văn bản tự nhiên, trả lời câu hỏi
💻 Code ~177 tok/s ~83ms Sinh code, script

GPU usage: ~21GB/24GB VRAM, utilization ~88%, công suất ~289W


Cấu trúc hệ thống:

🖥️ Bước 1: Setup máy chủ Ubuntu

1.1 Tạo file docker-compose.yml

services:
  llama-cpp-qwen36-35b-a3b-mtp:
    image: docker.io/eav782021/llama-cpp:mtp-cuda
    container_name: llama-cpp-qwen36-35b-a3b-mtp
    restart: unless-stopped
    runtime: nvidia
    ports:
      - "8020:8080"
    volumes:
      - /path/to/models-cache:/models
    environment:
      LLAMA_CACHE: /models/llama-cache
    entrypoint:
      - bash
      - -c
      - |
        set -e
        EXTRA_ARGS=()
        if [ "$${DISABLE_THINKING:-0}" = "1" ]; then
          EXTRA_ARGS+=("--chat-template-kwargs" '{"enable_thinking":false}')
          echo "[entrypoint] DISABLE_THINKING=1"
        fi
        exec /app/llama-server "$$@" "$${EXTRA_ARGS[@]}"
      - --
    command:
      - --host
      - 0.0.0.0
      - --port
      - "8080"
      - -hf
      - unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q3_K_XL
      - -c
      - "229376"
      - -b
      - "2048"
      - -ub
      - "512"
      - -ngl
      - "99"
      - -fa
      - "on"
      - --cache-type-k
      - q4_0
      - --cache-type-v
      - q4_0
      - -np
      - "1"
      - --spec-type
      - draft-mtp
      - --spec-draft-n-max
      - "3"
      - --jinja
      - --reasoning-format
      - none
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["0"]
              capabilities: [compute, utility]

1.2 Chạy container

cd /path/to/folder/
docker compose pull
docker compose up -d

1.3 Kiểm tra server

curl http://localhost:8020/health
# Phản hồi: {"status": "ok"}

💻 Bước 2: Cấu hình OpenClaw trên client

2.1 Thêm llama.cpp provider

Thêm vào file openclaw.json để OpenClaw kết nối tới server llama.cpp:

"models": {
  "providers": {
    "llama-cpp": {
      "baseUrl": "http://IP_MAY_CHU:8020/v1",
      "api": "openai-completions",
      "apiKey": "sk-not-needed",  // llama.cpp không cần API key
      "request": {
        "allowPrivateNetwork": true
      },
      "models": [
        {
          "id": "unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q3_K_XL",
          "name": "unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q3_K_XL",
          "reasoning": false,
          "input": ["text"],
          "contextWindow": 229376,
          "maxTokens": 32768
        }
      ]
    }
  }
}

2.2 Set model default

openclaw config set agents.defaults.model.primary "llama-cpp/unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q3_K_XL"
openclaw gateway restart

✅ Bước 3: Kiểm tra

Trong Telegram:

/status
# Phải thấy: Model: unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q3_K_XL

Gửi thử tin nhắn: "Xin chào" — nếu server phản hồi, bạn đã thành công! 🎉

🔧 Lưu ý quan trọng

💡 GPU: Đảm bảo máy chủ đã cài nvidia-container-toolkit: sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker
💡 Model size: Model Qwen3.6 35B cần ~20GB VRAM. Đảm bảo GPU của máy chủ đủ dung lượng.
💡 Network: Máy client phải truy cập được IP của máy chủ qua port 8020. Kiểm tra firewall nếu cần.
💡 Auto-start: Đặt restart: unless-stopped trong docker-compose để container tự động chạy lại khi server reboot.
💡 Performance: Với RTX 3090, model chạy ở ~134 tok/s (narrative) và ~177 tok/s (code). Sử dụng MTP (Multi-Token Prediction) giúp tăng tốc đáng kể so với vanilla llama.cpp.
💻 LLM 🚀 Local AI 📝 Tutorial ⚡ GPU