Hướng dẫn triển khai Tabby trên Docker: Tự host AI gợi ý code cho dev team

AI tutorial - IT technology blog
AI tutorial - IT technology blog

Bối cảnh & Lý do lựa chọn

Việc gửi mã nguồn độc quyền đến các API bên thứ ba là mối lo ngại lớn đối với các đội ngũ chịu sự ràng buộc nghiêm ngặt từ SOC 2, HIPAA hoặc NDA với khách hàng. Mặc dù các công cụ như GitHub Copilot giúp tăng đáng kể năng suất của lập trình viên, các chính sách bảo mật doanh nghiệp thường cấm hoàn toàn việc sử dụng chúng.

Tabby giải quyết triệt để khoảng trống này. Đây là một công cụ lập trình AI mã nguồn mở, self-hosted, hoạt động hoàn toàn bên trong mạng nội bộ của bạn. Bạn có thể vận hành Tabby trên một máy trạm on-premise với card đồ họa RTX 3060, một máy chủ GPU chuyên dụng hoặc một instance AWS EC2 biệt lập (chẳng hạn như g5.xlarge). Tabby cung cấp plugin chính thức cho VS Code, IntelliJ và Vim, đồng thời tự động index các Git repository cục bộ để đưa ra gợi ý code phù hợp với các API nội bộ của bạn.

Triển khai Tabby qua Docker giúp loại bỏ hoàn toàn nguy cơ rò rỉ dữ liệu và cắt giảm khoản phí định kỳ 19$/người dùng mỗi tháng. Trong các thử nghiệm nội bộ của chúng tôi trên 12 microservices, tỷ lệ chấp nhận gợi ý code của các thành viên đạt khoảng 28%—rất sát với các giải pháp thương mại.

Cài đặt

Bạn sẽ cần cài đặt sẵn Docker Engine và Docker Compose trên máy chủ. Suy luận (inference) bằng CPU có thể đáp ứng cho nhu cầu thử nghiệm cơ bản, nhưng một GPU NVIDIA với tối thiểu 8 GB VRAM là yếu tố cốt lõi cho môi trường production. Điều này giúp duy trì độ trễ inline completion dưới 120ms, mang lại trải nghiệm gõ phím tức thì và mượt mà.

1. Kiểm tra NVIDIA Container Toolkit (Dành cho máy chủ GPU)

Xác minh rằng Docker có thể giao tiếp trực tiếp với card đồ họa của bạn:

nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

Nếu kết quả hiển thị thông tin model GPU và phiên bản driver, container runtime đã sẵn sàng hoạt động.

2. Tạo thư mục dự án

Thiết lập cấu trúc thư mục rõ ràng để lưu trữ model weight và dữ liệu repository đã index:

mkdir -p ~/tabby-server/data && cd ~/tabby-server

3. Tạo file docker-compose.yml

Tạo file docker-compose.yml trong thư mục này. Cấu hình bên dưới sử dụng Qwen2.5-Coder-1.5B cho tính năng inline completion (~3 GB VRAM) và Qwen2.5-Coder-7B cho khung chat sidebar (~6 GB VRAM ở định dạng FP16/INT8):

services:
  tabby:
    image: tabml/tabby:latest
    container_name: tabby-server
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
    environment:
      - TABBY_DISABLE_USAGE_COLLECTION=1
    command: serve --model TabbyML/Qwen2.5-Coder-1.5B --chat-model TabbyML/Qwen2.5-Coder-7B --device cuda
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

Nếu bạn thử nghiệm trên máy không có GPU rời? Hãy chuyển sang cấu hình nhẹ dành cho CPU:

services:
  tabby:
    image: tabml/tabby:latest
    container_name: tabby-server-cpu
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
    command: serve --model TabbyML/StarCoder-1B --device cpu

4. Khởi động Server

Khởi chạy container dưới chế độ nền:

docker compose up -d

Trong lần khởi động đầu tiên, Tabby sẽ tải khoảng 4.5 GB model weights trực tiếp vào ./data. Với đường truyền 100 Mbps, quá trình này dự kiến mất khoảng 5 đến 7 phút trước khi cổng dịch vụ sẵn sàng nhận kết nối.

Cấu hình

1. Hoàn tất thiết lập Admin ban đầu

Mở trình duyệt và truy cập:

http://<your-server-ip>:8080

Tạo tài khoản admin chính ở màn hình đầu tiên. Giao diện web console này quản lý access token của nhóm, các tác vụ đồng bộ repository và cấu hình prompt.

2. Tạo Access Token cho Dev Team

Tuyệt đối không cấp thông tin đăng nhập admin cho lập trình viên. Thay vào đó, hãy tạo các client token chuyên dụng:

  1. Đăng nhập vào Tabby Web UI.
  2. Truy cập Settings > Access Tokens.
  3. Nhấn Generate Token, đặt tên theo nhóm hoặc lập trình viên, sau đó sao chép chuỗi token.

3. Kết nối Git Repository để đánh chỉ mục ngữ cảnh

Tabby sử dụng cơ chế đánh chỉ mục code dựa trên Tantivy giúp các gợi ý code hiểu rõ các thư viện nội bộ và hàm tiện ích của bạn:

  1. Truy cập mục Repositories trong trang quản trị.
  2. Thêm URL Git nội bộ (HTTPS hoặc SSH). Đối với repo riêng tư trên GitLab hoặc GitHub, hãy cung cấp deploy token có quyền chỉ đọc (read-only).
  3. Nhấn Sync. Tabby sẽ phân tích cú pháp AST và xây dựng semantic index dưới nền mà không làm gián đoạn các gợi ý code.

4. Cấu hình IDE cho Lập trình viên (Ví dụ với VS Code)

Lập trình viên có thể kết nối editor của mình chỉ trong chưa đầy hai phút:

  1. Cài đặt extension Tabby từ VS Code Marketplace.
  2. Mở Settings (Ctrl+, hoặc Cmd+,) và tìm kiếm Tabby.
  3. Đặt Endpoint thành http://<your-server-ip>:8080 (hoặc domain nội bộ phía sau HTTPS reverse proxy).
  4. Dán token của lập trình viên vào trường Token.

Kiểm tra & Giám sát

1. Kiểm tra tính năng Autocompletion trong Editor

Mở một file mới (ví dụ metrics.py hoặc auth.ts) và viết khai báo hàm:

def calculate_rolling_retention(user_events: list[dict], cohort_days: int = 30) -> float:
    """Tính tỷ lệ retention của cohort theo khoảng thời gian đã chỉ định."""

Đoạn text mờ màu xám (ghost text) sẽ xuất hiện inline trong vòng 80–150ms. Nhấn Tab để chấp nhận gợi ý.

2. Kiểm tra Log của Server

Đảm bảo request đến được backend và quá trình suy luận diễn ra trơn tru:

docker logs -f tabby-server

Một server hoạt động ổn định sẽ in các bản ghi HTTP 200 OK trên /v1/completions kèm thông số độ trễ cho từng prompt.

3. Giám sát mức sử dụng tài nguyên

Theo dõi mức tải phần cứng khi có thêm nhiều thành viên trong nhóm sử dụng đồng thời:

# Kiểm tra phân bổ VRAM GPU và mức tiêu thụ điện
watch -n 2 nvidia-smi

# Kiểm tra mức sử dụng CPU và RAM của container
docker stats tabby-server

4. Khắc phục sự cố thường gặp

  • Độ trễ cao ở prompt đầu tiên: Engine đang khởi tạo KV cache trong bộ nhớ GPU. Các request tiếp theo sẽ trở lại tốc độ bình thường ngay lập tức.
  • CUDA Out of Memory (OOM): Nếu nhiều người dùng gửi yêu cầu chat đồng thời, VRAM có thể tăng đột biến. Khắc phục bằng cách tắt chat model hoặc chuyển model completion sang Qwen2.5-Coder-0.5B.
  • Lỗi Connection Refused: Kiểm tra firewall trên máy chủ bằng sudo ufw allow 8080/tcp, hoặc định tuyến traffic qua Nginx/Caddy để xử lý TLS termination an toàn.
Share: