Tăng tốc độ LLM cục bộ: Hướng dẫn thực hành Speculative Decoding

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

Nút thắt cổ chai: Tại sao LLM cục bộ của bạn lại chậm như rùa

Việc chờ đợi model Llama-3-70B hay Mixtral 8x7B nhả chữ với tốc độ 2 token/giây thật chẳng khác nào ngồi chờ sơn khô. Ngay cả khi bạn sở hữu RTX 4090, các con số vẫn không ủng hộ bạn. Vấn đề không nằm ở việc GPU yếu, mà bởi vì các LLM hoạt động theo cơ chế auto-regressive (tự hồi quy). Chúng tạo văn bản từng phần một, đòi hỏi phải duyệt qua hàng tỷ tham số cho mỗi từ duy nhất.

Về bản chất, inference (suy luận) là một cuộc chơi về băng thông bộ nhớ. GPU của bạn dành 95% thời gian để di chuyển các model weight khổng lồ từ VRAM đến các lõi xử lý và chỉ 5% thời gian thực sự tính toán. Để tạo ra một token trên model 70B, bạn phải đọc khoảng 40GB dữ liệu (với định dạng quantization 4-bit). Việc lặp đi lặp lại quá trình này chính là một cơn ác mộng về hiệu suất.

Giải pháp: Decoding với một “trợ lý tư duy nhanh”

Speculative decoding (giải mã suy đoán) thay đổi hoàn toàn cuộc chơi. Thay vì bắt “Target Model” (mô hình đích) to lớn và chậm chạp thực hiện mọi công việc nặng nhọc, chúng ta thuê một “Draft Model” (mô hình nháp) nhỏ gọn, linh hoạt để làm nhiệm vụ trinh sát.

Dưới đây là cách thức chuyển giao công việc:

  • Dự đoán (Speculation): Một model 1B hoặc 3B tham số — nằm gọn trong một góc nhỏ của VRAM — sẽ nhanh chóng dự đoán từ 5 đến 8 token tiếp theo. Nó nhanh vì nó nhỏ.
  • Kiểm tra (Verification): Target Model 70B sẽ xem xét toàn bộ chuỗi văn bản dự đoán đó trong một lần duyệt song song duy nhất. Nó sẽ tự hỏi: “Liệu mình có nói giống như vậy không?”

Nếu “trinh sát” đoán đúng 4 trên 5 từ, “chuyên gia” sẽ chấp nhận chúng ngay lập tức. Bạn vừa nhận được 4 token với “giá” của một lần duyệt model lớn. Nếu trinh sát đoán sai, chuyên gia sẽ sửa lỗi đầu tiên và tiếp quản công việc. Trong thử nghiệm của tôi, ngay cả một model trinh sát trung bình cũng mang lại sự gia tăng tốc độ gần như “miễn phí” mà không làm giảm chất lượng đầu ra.

Thiết lập môi trường

Để phương pháp này hoạt động, các model phải dùng chung từ điển (vocabulary). Nếu bạn đang chạy Llama 3 70B, hãy dùng Llama 3 8B hoặc model Llama-3-distilled 1B làm bản nháp. Việc kết hợp các dòng khác nhau — như dùng draft Gemma cho target Llama — thường sẽ thất bại vì chúng “nói” các ngôn ngữ nội bộ khác nhau.

Chúng ta sẽ tập trung vào hai “ông lớn”: llama.cpp (tiêu chuẩn vàng cho GGUF và phần cứng người dùng) và vLLM (lựa chọn hàng đầu cho việc cung cấp API tốc độ cao).

Yêu cầu phần cứng

  • OS: Ưu tiên Linux hoặc macOS; người dùng Windows nên sử dụng WSL2 để đạt hiệu suất tốt hơn.
  • VRAM: Bạn cần đủ không gian cho cả hai model. Với model 70B Q4_K_M (~42GB) và draft 8B Q4 (~5GB), cấu hình 48GB (hai card 3090/4090) là lựa chọn lý tưởng.

Cấu hình llama.cpp để tăng tốc

llama.cpp giúp việc suy đoán trở nên dễ dàng với cờ --draft. Hãy đảm bảo cả target model và draft model của bạn đều ở định dạng GGUF trước khi bắt đầu.

# Tăng tốc Llama-3-70B với bản nháp 8B
./llama-cli -m models/llama-3-70b-q4.gguf \
    --draft 5 \
    -md models/llama-3-8b-q4.gguf \
    -p "Viết một script Python để thu thập tiêu đề tin tức." \
    -n 512 \
    --n-gpu-layers 81

Các tham số chính cần điều chỉnh:

  • -md: Trỏ đến model draft nhỏ của bạn.
  • --draft 5: Yêu cầu trinh sát nhìn trước 5 token. Nếu trinh sát của bạn thông minh, hãy thử 8. Nếu nó dự đoán kém, hãy giảm xuống 4.

Hãy giữ cả hai model trên GPU. Nếu bạn đẩy model draft sang CPU trong khi target model nằm trên GPU, độ trễ PCIe sẽ ngốn sạch mọi lợi ích về tốc độ mà bạn đạt được.

Triển khai vLLM để cung cấp API

vLLM là lựa chọn tốt hơn để xây dựng giao diện web. Nó xử lý speculative decoding một cách linh hoạt và hỗ trợ các kiến trúc nâng cao như Medusa.

# Khởi chạy server vLLM với tính năng suy đoán
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-70B-Instruct \
    --tensor-parallel-size 2 \
    --speculative-model meta-llama/Meta-Llama-3-8B-Instruct \
    --num-speculative-tokens 5 \
    --gpu-memory-utilization 0.95

Nếu bạn sở hữu các cấu hình cao cấp, hãy tìm hiểu về các đầu (heads) “Medusa” hoặc “Eagle”. Đây là các thành phần chuyên biệt được tích hợp sẵn vào chính model, có thể giúp tăng tốc từ 2 đến 3 lần mà không cần file model draft riêng biệt.

Đo lường thành công: Tỷ lệ chấp nhận (Acceptance Rate)

Khi đã chạy xong, đừng chỉ tin vào mắt mình. Hãy quan sát các số liệu thống kê ở cuối quá trình tạo văn bản.

  • Tokens per Second (TPS): Chỉ số cốt yếu của bạn. Nếu bạn tăng từ 3 TPS lên 7 TPS, bạn đã thành công.
  • Acceptance Rate: Đây là tỷ lệ phần trăm các dự đoán của trinh sát mà chuyên gia giữ lại.

Tỷ lệ chấp nhận 70-80% là tiêu chuẩn vàng cho các cuộc hội thoại thông thường. Nếu bạn thấy tỷ lệ này giảm xuống dưới 40%, trinh sát của bạn về cơ bản là đang đoán mò. Điều này thường xảy ra khi model draft quá nhỏ hoặc không được huấn luyện trên dữ liệu tương tự như target model.

Mẹo khắc phục sự cố

Vẫn không thấy tốc độ tăng lên? Hãy kiểm tra ba điều sau:

  1. Quá tải VRAM: Nếu hệ điều hành bắt đầu chuyển dữ liệu sang RAM hệ thống (swap), hiệu suất của bạn sẽ giảm xuống gần bằng không. Hãy quantize các model của bạn sâu hơn nếu cần.
  2. Không khớp Tokenizer: Nếu trinh sát sử dụng tokenizer khác, chuyên gia sẽ từ chối mọi dự đoán. Hãy trung thành với cùng một dòng model.
  3. Độ sâu nhìn trước (Lookahead Depth): Đừng quá tham lam. Đặt --draft 15 nghe có vẻ nhanh, nhưng mỗi dự đoán sai sẽ buộc chuyên gia phải tính toán lại, điều này thực tế có thể làm tốc độ chậm hơn cả inference thông thường.

Bằng cách làm chủ các cấu hình này, bạn có thể biến một hệ thống cục bộ chậm chạp thành một trợ lý phản hồi nhanh nhạy, cạnh tranh với các API thương mại — trong khi vẫn giữ dữ liệu riêng tư trên chính phần cứng của mình.

Share: