OpenArchLabOpen Architecture — From Models to Systems

L2 · Model execution

Sinh câu trả lời theo vòng lặp token

Vòng lặp sinh từng token tiếp theo của câu trả lời bằng cách đọc lại KV cache lịch sử và nối thêm token mới.

LESSON ID decode GROUP Kiến trúc Inference
Mục lục bài học

1Định nghĩa

Decode là vòng lặp sinh câu trả lời nối tiếp ngay sau pha prefill. Ở cấu hình tự hồi quy (autoregressive) tiêu chuẩn, mỗi vòng lặp chỉ nhận 1 token vừa sinh ở bước trước làm đầu vào để tính ra token kế tiếp, lặp lại cho tới khi gặp ký hiệu kết thúc (EOS) hoặc chạm giới hạn độ dài.

Trong mỗi bước decode, mô hình không tính lại phần câu hỏi cũ mà đọc ngữ cảnh từ KV cache, tính thêm cặp Key/Value của token hiện tại rồi xuất điểm số cho bước sampling. Vì mỗi bước chỉ xử lý 1 token mỗi request nhưng vẫn phải đọc toàn bộ trọng số mô hình và KV cache từ HBM, decode thường bị nghẽn ở băng thông bộ nhớ (memory-bandwidth bound) và quyết định tốc độ xuất chữ trên màn hình người dùng.

Ví dụ đời thường: Decode giống như lúc người đầu bếp vừa nhìn tờ phiếu ghi chú trước mặt vừa viết tay từng chữ của công thức nấu ăn. Cứ viết xong một từ, người viết lại nhìn tổng thể câu văn từ đầu tới từ vừa viết để chọn từ hợp lý tiếp theo, lặp lại từng chữ một cho tới khi đặt dấu chấm hết bài.

2Luồng

Sơ đồ luồng (4 bước)
  1. Token mới nhất

    Nhận token đã được chọn ở bước trước.

  2. Forward với context

    Đọc cache lịch sử và tính token này.

  3. Bổ sung cache

    Lưu key và value của token đã forward.

  4. Chọn tiếp hoặc dừng

    Token được chọn đi vào vòng kế tiếp nếu chưa kết thúc.

Mã Mermaid
flowchart TD
  step1["Token mới nhất"]
  step2["Forward với context"]
  step3["Bổ sung cache"]
  step4["Chọn tiếp hoặc dừng"]
  step1 --> step2
  step2 --> step3
  step3 --> step4

3Giải pháp

Khi nhóm request nhỏ, đọc weights và cache từ bộ nhớ có thể tốn phần lớn thời gian. Gộp nhiều chuỗi, kernel phù hợp và giảm dữ liệu đọc bằng precision thấp hơn là các hướng cần thử.

Speculative decoding cho phép xác minh nhiều token được đề xuất trong một lần target chạy, nhưng có thêm chi phí và không bảo đảm nhanh hơn mọi workload.

Để đếm số vị trí phải tính khi decode dùng cache so với tính lại cả lịch sử, hãy chạy khối 7 (Decode) trong Bài Lab tổng hợp.

4Profiling

  • Thời gian mỗi output token

    Đo khoảng giữa các token sau token đầu; phân loại theo context và số request đồng thời.

  • Thời gian đọc bộ nhớ

    Dùng timeline và counters để xem kernels có chờ dữ liệu hoặc launch từ host không.

Mẹo đo lường: ghim số liệu trên workload thật, ghi cả p50/p95/p99 thay vì chỉ trung bình, và luôn ghi lại điều kiện chạy (batch, cache, đồng thời, phần cứng) trước và sau khi tối ưu. Số đo thiếu điều kiện chạy thì không so sánh được.

5Ví dụ

Chatbot trả lời ngắn

Ưu tiên token đến đều và nhanh; không tăng nhóm xử lý quá mức chỉ để đạt tổng token mỗi giây cao.

Sinh báo cáo dài

Cache tiếp tục lớn theo context. Đo thời gian token ở đầu và cuối response để thấy chi phí context tăng.

6Thuật ngữ

Autoregressive generation
Sinh tự hồi quy: kết quả vừa tạo trở thành một phần đầu vào của bước tiếp theo.
Inter-token latency
Khoảng thời gian người dùng chờ giữa hai token output liên tiếp.
Glossary (7)
Model weights
Các tham số số học được học và lưu trong checkpoint.
Cache
Bộ nhớ giữ kết quả có thể dùng lại; trong attention thường giữ key/value vectors.
Logits
Điểm số chưa chuẩn hóa cho các token ứng viên trước khi chọn token.
Kernel
Hàm tính toán chạy trên thiết bị; thường xử lý nhiều phần tử song song.
Host
Phần chương trình điều khiển thiết bị, thường chạy trên bộ xử lý trung tâm.
Forward pass
Tính kết quả model từ đầu vào theo weights hiện tại.
Context
Chuỗi token trước vị trí hiện tại mà model được phép sử dụng.

7Bài liên quan

8Nguồn