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.
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
- Token mới nhất
Nhận token đã được chọn ở bước trước.
- Forward với context
Đọc cache lịch sử và tính token này.
- Bổ sung cache
Lưu key và value của token đã forward.
- 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.