W3 · Training / inference workflow
Bước inference: chuyển prompt thành mã token
Dùng đúng tokenizer lưu cùng checkpoint để đổi prompt (cùng mẫu hội thoại) thành mảng token ID giống lúc huấn luyện, rồi báo độ dài thật cho bộ lập lịch.
1Định nghĩa
Tách token khi suy luận là bước đổi văn bản của yêu cầu đã tiếp nhận thành mảng số nguyên (token ID), bằng đúng tokenizer của phiên bản mô hình đang phục vụ. Với mô hình chat, bước này còn xếp các tin nhắn theo mẫu hội thoại, chèn thẻ đánh dấu vai trò và thẻ mở đầu lượt trả lời của trợ lý ở cuối chuỗi, để mô hình biết rằng token tiếp theo là phần của nó.
Độ dài thật của mảng token ID là con số chính xác để bộ lập lịch kiểm tra ngân sách ngữ cảnh, tra xem phần đầu chuỗi có đã nằm sẵn trong KV cache hay không và đặt trước vùng nhớ cho pha prefill. Đây là phiên bản phục vụ của bước chuẩn bị dữ liệu trong huấn luyện: cùng bảng từ vựng, cùng quy tắc cắt.
Ví dụ đời thường: Tách token giống quầy lễ tân đóng khung phiếu gọi món theo mẫu chuẩn (dòng nào là lời dặn của khách, dòng nào để trống chờ bếp điền món) rồi bấm thành dãy mã món để màn hình trong bếp đọc ngay. Nếu quầy lễ tân dùng bảng mã món khác với bảng mã của bếp, phiếu vẫn in ra được nhưng bếp sẽ nấu nhầm món mà không ai báo lỗi.
2Luồng
Đây là nửa sau của ô 5A. Mũi tên vào mang văn bản, mũi tên ra mang một dãy số nguyên và độ dài của nó. Cột 1 của sơ đồ làm việc tương tự cho dữ liệu huấn luyện; điểm khác là ở đây không có bước đáp án và không thêm eos vào cuối prompt.
- Yêu cầu đã hợp lệ
Nhận tin nhắn dạng văn bản và cấu hình sinh từ bước tiếp nhận.
- Áp mẫu hội thoại
Xếp tin nhắn theo đúng mẫu đã dùng khi huấn luyện, kết thúc bằng thẻ mở lượt trả lời.
- Tách token và tra mã
Cắt chuỗi thành token rồi tra token ID; mảng này thay thế văn bản từ đây về sau.
- Báo độ dài và chuyển đi
Độ dài thật được gửi cho bộ lập lịch rồi mảng ID đi vào pha prefill.
Mã Mermaid
flowchart TD
step1["Yêu cầu đã hợp lệ"]
step2["Áp mẫu hội thoại"]
step3["Tách token và tra mã"]
step4["Báo độ dài và chuyển đi"]
step1 --> step2
step2 --> step3
step3 --> step4 3Giải pháp
Vị trí trên sơ đồ: nửa sau của ô 5A "Prompt → token IDs" trong băng "Checkpoint → Inference". Nó nối tiếp nhận yêu cầu với prefill (ô 5B). Nó phản chiếu ô 1A của cột 1, nhưng dùng lại tokenizer đã lưu thay vì xây mới.
Vấn đề cần giải. Mô hình chỉ đọc số, và những con số đó chỉ có nghĩa với đúng bảng từ vựng đã dùng khi học. Nếu ở lúc phục vụ ID 1 nghĩa là “chó” mà lúc huấn luyện ID 1 nghĩa là “mèo”, mô hình sẽ trả lời cho một câu khác hẳn mà không có thông báo lỗi nào.
Khái niệm tối thiểu. Tokenizer gồm bảng từ vựng và quy tắc cắt. Chat template là quy tắc xếp tin nhắn thành chuỗi. Token đặc biệt như eos có ID riêng. Độ dài N là số ID sau khi tách.
Ví dụ có số (minh họa, dùng bảng từ vựng nhỏ của bài chuẩn bị dữ liệu: 0 = pad, 1 = mèo, 2 = chó, 3 = ăn, 4 = cá, 5 = ngủ, 6 = eos). Prompt “mèo ăn” đổi thành [1, 3], N = 2. Khi huấn luyện, token “mèo” cũng có ID 1 và “ăn” cũng là 3, nên mô hình nhận ra chuỗi này. Với max_tokens = 8, bộ lập lịch cần đặt trước chỗ cho tối đa N + 8 = 10 vị trí.
Hai chi tiết dễ sai. (1) Không thêm eos vào cuối prompt: ở dữ liệu huấn luyện eos đánh dấu hết một tài liệu, nên prompt kết thúc bằng eos nói với mô hình rằng câu đã xong và token kế tiếp sẽ thuộc một tài liệu khác. (2) Từ chưa có trong bảng: tokenizer mức từ như ví dụ này phải báo lỗi chứ không được tự bịa ID; tokenizer BPE thật tách từ lạ thành các mảnh nhỏ đã có trong bảng nên không gặp tình huống này.
Chat template. Giả sử mô hình được fine-tune với mẫu: dòng “User:” theo sau là câu hỏi, rồi dòng “Assistant:” để mô hình viết câu trả lời. Khi phục vụ, chuỗi phải được dựng đúng mẫu đó và dừng sau thẻ “Assistant:” (để mô hình viết tiếp), vì mô hình chỉ học trả lời ở vị trí ấy. Dùng mẫu khác lúc fine-tune là một nguyên nhân phổ biến của câu trả lời kém dù trọng số không sai (xem phương pháp fine-tuning).
Cách đọc đầu ra. Kết quả là một hàng token ID cùng độ dài N (shape (1, N), 1 là số yêu cầu, N là số vị trí), không còn chữ nào. Điều có thể kết luận: nếu giải mã (decode) mảng này ra đúng văn bản đã gửi (cộng thẻ mẫu), tokenizer và mẫu nhất quán. Điều không thể kết luận: số từ không bằng số token; một từ tiếng Việt có thể thành nhiều token, nên không ước tính ngân sách ngữ cảnh bằng số từ.
Dùng lại checkpoint và cầu nối sang Inference Engineering. Tokenizer được phát hành cùng mô hình và phải ghim vào manifest triển khai cùng trọng số. Chuẩn bị đầu vào thường chạy trên CPU rồi chuyển tensor sang thiết bị; có thể gộp hoặc chạy song song khi nó thành điểm nghẽn. Phần chuyển văn bản thành đơn vị mà mô hình hiểu giải thích sâu hơn về BPE và chat template, còn bộ lập lịch cho thấy vì sao độ dài chính xác lại quan trọng với việc đặt bộ nhớ.
Để thấy một prompt được đổi thành ID bằng đúng bảng từ vựng của checkpoint (ký tự ngoài bảng báo lỗi), mở giai đoạn 13 · Từ checkpoint sang suy luận của Bài Lab tổng hợp. Hãy tự dự đoán N của một prompt ngắn trước khi chạy.
4Profiling
- Thời gian chuẩn bị đầu vào
Kiểm tra tính đúng trước (mã hóa rồi giải mã ra lại văn bản, mẫu hội thoại giống lúc huấn luyện). Sau đó đo riêng thời gian dựng mẫu, tách token, đóng gói và chuyển dữ liệu sang thiết bị. Nếu phần này đáng kể so với prefill, mới đáng cân nhắc tối ưu.
- Độ dài sau khi tách token
Ghi phân phối số token thật (p50, p95, lớn nhất) và kiểm tra giới hạn dựa trên token chứ không dựa trên số từ hay số ký tự. Độ dài này quyết định bộ nhớ và thời gian prefill nên phải khớp với số bộ lập lịch dùng.
- Khớp với lúc huấn luyện
Lấy vài mẫu từ tập huấn luyện, dựng prompt bằng đường phục vụ và so từng ID với đường chuẩn bị dữ liệu. Chúng phải trùng nhau. Nếu khác ở thẻ vai trò hay khoảng trắng, mô hình đang nhận một đầu vào khác với đã học.
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ụ
Prompt tiếng Việt
Một từ tiếng Việt có thể được tách thành nhiều token. Không dùng số từ để ước tính chính xác bộ nhớ context. Tự kiểm tra: một câu 10 từ chắc chắn dùng 10 token đúng không? Không; có thể hơn hoặc ít hơn, tùy bảng từ vựng; cần đếm bằng chính tokenizer của checkpoint.
Tích hợp checkpoint mới
Chạy cùng tập tin nhắn qua tokenizer cũ và mới rồi so sánh ID; nếu khác thì không được dùng lại KV cache hay cấu hình cũ. Sau đó ghim đúng phiên bản trong manifest triển khai. Dự đoán: hai prompt trông giống nhau trên màn hình (khác khoảng trắng đầu) có cùng ID không? Thường không, và khi đó phần tái sử dụng prefix cũng không áp dụng.
Tự kiểm tra: ID lệch bảng
Dịch vụ dùng bảng mà ‘chó’ = 1 và ‘mèo’ = 2 trong khi mô hình học với ‘mèo’ = 1. Người dùng gửi “mèo ăn”, tokenizer ra [2, 3]. Mô hình hiểu đó là chuỗi gì? Với bảng lúc học, 2 là “chó”, nên nó hiểu “chó ăn” và trả lời cho câu đó, không báo lỗi. Đây là lý do bảng từ vựng phải đi cùng checkpoint.
6Thuật ngữ
- Tokenizer của checkpoint
- Bảng từ vựng và quy tắc cắt token đã dùng khi huấn luyện, lưu cùng trọng số; đổi nó là đổi nghĩa của mọi token ID.
- Chat template
- Quy tắc xếp các lượt hội thoại thành một chuỗi có ký hiệu vai trò và thẻ mở lượt trả lời của trợ lý; phải giống lúc fine-tune.
- Token ID
- Số nguyên xác định token trong bảng từ vựng; cùng một chữ có thể ra ID khác nếu dùng tokenizer khác.
- Độ dài prompt (N)
- Số token thật sau khi tách. Bộ lập lịch dùng N cộng max_tokens để đặt trước bộ nhớ.
- Token đặc biệt
- Token như eos (hết chuỗi) hoặc thẻ vai trò; không phải chữ người dùng nhập và cần được chèn đúng chỗ.
Glossary (6)
- Tensor
- Mảng số nhiều chiều; mảng token ID shape (1, N) là một tensor.
- Vector
- Danh sách số; ở bước sau mỗi token ID sẽ được đổi thành một vector.
- Model weights
- Các số học được; chỉ đúng khi dùng cùng tokenizer với lúc học.
- Checkpoint
- Bản lưu gồm trọng số, cấu hình và tokenizer.
- Prefix
- Phần đầu chuỗi token; nếu hai prompt có cùng prefix token, phần tính toán cho prefix có thể dùng lại.
- Forward pass
- Lượt tính xuôi sẽ nhận mảng token ID này.
