OpenArchLabOpen Architecture — From Models to Systems

W3 · Training / inference workflow

Chuẩn bị dữ liệu để huấn luyện dự đoán token kế tiếp

Biến kho văn bản thô thành các lô mã số (token IDs) mà mô hình đọc được: làm sạch, tách tập kiểm định, mã hóa bằng tokenizer rồi đóng gói thành batch.

LESSON ID wf-data GROUP Kiến trúc huấn luyện
Mục lục bài học

1Định nghĩa

Chuẩn bị dữ liệu (data preparation) là chặng đầu của pipeline huấn luyện, nơi văn bản thô trong kho dữ liệu (corpus) được đổi thành các bảng số nguyên mà mô hình đọc được. Mô hình chỉ tính toán trên số, nên văn bản phải đi qua tokenizer: bộ cắt văn bản thành các mảnh nhỏ gọi là token rồi gán cho mỗi mảnh một mã số nguyên (token ID) theo một bảng từ vựng cố định.

Trước khi mã hóa, dữ liệu được làm sạch, loại bản trùng và tách riêng một tập kiểm định (validation set) để sau này đo mô hình trên chữ nó chưa từng học. Sau khi mã hóa, các chuỗi token được cắt hoặc ghép thành khối độ dài cố định, gom thành từng lô (mini-batch) kèm mặt nạ vị trí, rồi đi sang bước tạo đáp án token kế tiếp và lượt forward. Có thêm dữ liệu chỉ làm tăng số bước tính toán, không làm đổi kích thước ma trận hay số tham số của mô hình.

Ví dụ đời thường: Chuẩn bị dữ liệu giống khâu sơ chế trong bếp ăn công nghiệp trước giờ nấu: rau củ thu mua về được nhặt bỏ lá sâu và loại mớ bị trùng (làm sạch), cất riêng một phần để bếp trưởng nếm thử chất lượng (tập kiểm định), rồi thái thành miếng vừa nồi và chia vào từng khay đồng đều có đánh số (token ID và mini-batch). Khác với bếp, nếu lỡ cất nhầm đúng phần rau đã xào vào khay nếm thử thì bếp trưởng sẽ khen món ngon một cách giả tạo.

2Luồng

Đây là ô 1A, điểm bắt đầu của sơ đồ. Mũi tên rời ô này chỉ mang một thứ: các bảng số nguyên token ID cùng mask đi kèm. Các bước sau không đọc lại văn bản gốc.

Sơ đồ kiến trúc huấn luyện · 22 ô (1A → 5C)

Kiến trúc huấn luyện LLM · Ánh xạ với Bài Lab tổng hợp

Thứ tự đọc: 1A → 1B ở cột 1, 2A → 2D ở cột 2, 3A → 3E ở cột 3; mũi tên next batch từ 3E quay về cột 1 và mũi tên load weights đi xuống băng 5 (5A → 5C). Cột 4 không phải bước kế tiếp: 4A, 4B tiết kiệm bộ nhớ, còn 4C–4G là các phương pháp huấn luyện thay thế nhau. Di chuột hoặc bấm vào từng ô để đọc pop-over.

Sơ đồ kiến trúc huấn luyện LLM gồm 22 ô từ 1A đến 5C
1A1 · Data & Targets
văn bản thô → clean/dedup → tokenizer → [12, 87, 5, 40]

1A · Corpus → Token IDs

Điểm bắt đầu: biến kho văn bản thô thành các dãy số nguyên (token ID) mà mô hình đọc được.

Nhận gì
Văn bản thô từ kho dữ liệu (corpus: tập hợp mọi văn bản dùng để dạy mô hình). Đây là ô đầu tiên của sơ đồ, chưa nhận gì từ ô khác.
Làm gì, vì sao
Làm sạch và bỏ các bản trùng để mô hình không học thuộc dữ liệu lặp. Sau đó tokenizer (bộ cắt văn bản thành các mảnh nhỏ gọi là token) đổi mỗi mảnh thành một số nguyên gọi là token ID, vì mô hình chỉ tính trên số.
Ra gì
Các dãy token ID, đóng gói thành batch (nhóm tài liệu xử lý cùng lúc) và đi xuống ô 1B bằng mũi tên đi xuống.
Ví dụ, cách đọc ô
Đọc nhãn trong ô từ trái sang phải: corpus → clean/dedup → tokenizer → [12, 87, 5, 40]. Bốn số cuối là token ID của một đoạn văn; ID 87 chỉ là số thứ tự của một mảnh trong bảng từ vựng.
Lưu ý
Token ID chưa mang ý nghĩa, chỉ là số thứ tự. Đổi tokenizer thì mọi ID đổi theo, nên tokenizer phải được lưu cùng checkpoint.
Sơ đồ luồng (5 bước)
  1. Kho văn bản thô

    Gom tài liệu từ nguồn đã kiểm soát; mỗi tài liệu vẫn là chuỗi ký tự, chưa có mã số.

  2. Làm sạch và chia tập

    Bỏ bản trùng, nội dung hỏng; tách tập kiểm định riêng trước khi mô hình học để điểm đo không bị rò rỉ.

  3. Tách token

    Tokenizer cắt từng tài liệu thành token, tra bảng từ vựng ra token ID và thêm token kết thúc (eos).

  4. Đóng gói batch

    Cắt, ghép hoặc đệm các dãy thành khối cùng độ dài rồi gom thành lô, kèm mask.

  5. Chuyển sang bước sau

    Lô token ID đi tiếp vào ô 1B để tạo đáp án, rồi vào cột 2 để forward.

Mã Mermaid
flowchart TD
  step1["Kho văn bản thô"]
  step2["Làm sạch và chia tập"]
  step3["Tách token"]
  step4["Đóng gói batch"]
  step5["Chuyển sang bước sau"]
  step1 --> step2
  step2 --> step3
  step3 --> step4
  step4 --> step5

3Giải pháp

Vị trí trên sơ đồ: đây là ô 1A "Corpus → token IDs" ở cột 1 · Dữ liệu & mục tiêu của sơ đồ kiến trúc, và là nơi duy nhất trong chu trình huấn luyện còn nhìn thấy chữ. Mũi tên rời ô 1A đi sang ô 1B (tạo đáp án token kế tiếp); từ đó dữ liệu mới chảy sang cột 2 để forward. Bài này trả lời một câu hỏi: làm sao từ những tệp văn bản biến thành các bảng số nguyên mà mô hình ở cột 2 nuốt được, mà vẫn giữ được ranh giới giữa các tài liệu và vẫn đo được chất lượng một cách công bằng.

Khái niệm tối thiểu. Mô hình là một hàm số, đầu vào của nó phải là số. Tokenizer cắt văn bản thành token, mỗi token có một token ID trong bảng từ vựng (vocabulary). Hai ID gần nhau như 17 và 18 không có nghĩa là hai token gần nghĩa nhau; ID chỉ là số thứ tự để tra bảng, và ở cột 2 mỗi ID sẽ được đổi thành một vector học được. Ngoài token chữ, bảng từ vựng thường có token đặc biệt: pad (đệm) và eos (end of sequence, báo hết một tài liệu).

Ví dụ chạy suốt cả khóa (số liệu minh họa do bài tự đặt, tính tay và kiểm tra bằng máy tính, không phải kết quả đo). Kho dữ liệu có 5 tài liệu: A = “mèo ăn cá”, B = “chó ăn cá”, C = “mèo ăn cá” (trùng A), D = “chó ngủ”, E = “mèo ngủ”. Bảng từ vựng nhỏ: 0 = pad, 1 = mèo, 2 = chó, 3 = ăn, 4 = cá, 5 = ngủ, 6 = eos; vậy V = 7.

Thao tác 1, làm sạch và loại trùng. C giống hệt A nên bị bỏ, còn 4 tài liệu. Lý do: nếu A xuất hiện hai lần, mô hình được thưởng thêm cho việc học thuộc một câu; tệ hơn, nếu một bản nằm ở tập huấn luyện còn bản kia nằm ở tập kiểm định thì điểm đo mất ý nghĩa vì mô hình đã thấy đáp án.

Thao tác 2, chia tập trước khi học. Giữ A, B, E để huấn luyện và D để kiểm định (3 train, 1 validation). Chia trước khi tạo bảng từ vựng hay thống kê gì khác để thông tin từ tập kiểm định không lọt sang phía huấn luyện. Trong ví dụ này chữ “chó” có mặt ở B và “ngủ” có mặt ở E nên bảng từ vựng lập từ tập huấn luyện vẫn phủ được D.

Thao tác 3, mã hóa. Mỗi tài liệu thêm eos ở cuối: A = [1, 3, 4, 6], B = [2, 3, 4, 6], E = [1, 5, 6], và D (kiểm định) = [2, 5, 6]. Token eos dạy mô hình biết khi nào một câu kết thúc; thiếu nó, ở bước suy luận mô hình không có dấu hiệu để dừng.

Thao tác 4, đóng gói. Có hai cách. Padding: đệm mọi tài liệu cho dài bằng tài liệu dài nhất (4 token) bằng pad (số 0), được 3 hàng × 4 cột = 12 vị trí trong đó 11 vị trí là token thật và 1 vị trí đệm, tức khoảng 91,7% vị trí hữu ích. Packing: nối A, B, E thành một dòng 11 token [1, 3, 4, 6, 2, 3, 4, 6, 1, 5, 6] rồi cắt thành các khối 5 token (T + 1 với T = 4, vì bước sau cần thêm một token để làm đáp án). Ta được hai khối [1, 3, 4, 6, 2] và [3, 4, 6, 1, 5]; token cuối cùng (số 6) bị bỏ vì không đủ một khối. Packing không tạo vị trí đệm nào, đổi lại phải quyết định chính sách ở ranh giới tài liệu, điều bài kế tiếp giải thích.

Thao tác 5, gom batch. Xếp hai khối thành ma trận 2 hàng × 5 cột, shape (B, T + 1) = (2, 5): mỗi hàng là một khối, mỗi cột là một vị trí, mỗi ô là một token ID. Đó là đầu ra của ô 1A. Cách đọc: hàng 0 là “mèo ăn cá eos chó”, hàng 1 là “ăn cá eos mèo ngủ”; chú ý khối thứ nhất kết thúc bằng chữ đầu của tài liệu kế tiếp, vì packing cắt ngang tài liệu.

Điều có thể kết luận và không thể kết luận. Nếu mã hóa rồi giải mã (decode) lại ra đúng văn bản gốc, tokenizer và bảng từ vựng nhất quán. Nhưng bảng ID đúng không chứng minh dữ liệu tốt: kho dữ liệu nhiều rác, thiên lệch hay thiếu miền ứng dụng vẫn cho ra những bảng ID hoàn toàn hợp lệ. Cũng không nên đọc tỉ lệ token hữu ích như một thước đo chất lượng mô hình; nó chỉ nói về độ lãng phí tính toán.

Thực tế sản xuất. Pipeline đọc dữ liệu theo dòng, chia phần việc cho nhiều tiến trình phụ (workers) và chuẩn bị sẵn batch kế tiếp trong lúc bộ tăng tốc đang tính batch hiện tại, nhờ đó thiết bị ít phải chờ. Với packing phải chọn một trong hai chính sách: cho phép ngữ cảnh đi qua dấu phân cách giữa các tài liệu, hoặc cô lập từng tài liệu bằng attention mask; đừng mặc định rằng nối list token là đủ. Dữ liệu hội thoại cần chat template và response mask, phần được dạy ở phương pháp fine-tuning. Khi dùng lại một checkpoint có sẵn thì phải dùng đúng tokenizer của checkpoint đó; đổi tokenizer là đổi nghĩa của mọi ID.

Để tự thao tác với các bước trên, mở giai đoạn 1 · Dữ liệu → token IDs của Bài Lab tổng hợp. Trước khi chạy, hãy tự đoán số token và số hàng của batch đầu rồi đối chiếu với kết quả in ra; chú ý ranh giới giữa các tài liệu và vị trí token đệm hoặc eos.

4Profiling

  • Tỷ lệ token hữu ích

    Kiểm tra tính đúng trước: mã hóa rồi giải mã một số tài liệu phải ra đúng văn bản, và ranh giới giữa các tài liệu được giữ theo chính sách đã chọn. Sau đó đếm số vị trí tham gia tính loss chia tổng số vị trí được tính toán, trước và sau khi chuyển từ padding sang packing, trên cùng tập dữ liệu và cùng độ dài khối. Trong ví dụ 3 tài liệu, padding cho 11 trên 12 vị trí là token thật; con số này chỉ có ý nghĩa so sánh khi dữ liệu thật có độ dài rất khác nhau. Không kết luận một cách đóng gói tốt hơn nếu chưa đo thời gian một bước (step time) với cả hai.

  • Thời gian chờ dữ liệu

    Ghi riêng thời gian đọc, tokenize, đóng gói và chuyển batch sang thiết bị cho mỗi bước, cùng thời gian thiết bị phải chờ batch. Nếu bộ tăng tốc có khoảng trống giữa hai bước, hãy xem kho lưu trữ và CPU trước khi nghĩ tới tối ưu mô hình. Lưu ý đo trên cùng điều kiện (cùng số workers, cùng bộ nhớ đệm đĩa) trước và sau khi thay đổi, và đừng suy ra tốc độ trên dữ liệu thật từ ví dụ vài câu.

  • Rò rỉ và chất lượng dữ liệu

    Lấy một batch nhỏ và kiểm tra bằng mắt: token đệm không góp vào loss, nhãn đúng vị trí, ranh giới tài liệu đúng chính sách. Với toàn bộ tập, tìm tài liệu trùng hoặc gần trùng giữa training và validation. Một tập kiểm định bị rò rỉ cho loss thấp giả tạo, và lỗi này không hiện ra ở bất kỳ chỉ số tốc độ nào.

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ụ

Huấn luyện trên tài liệu dài

Một cuốn sách 1 triệu token, khối T + 1 = 4.097 token, sẽ được cắt thành khoảng 244 khối (1.000.000 / 4.097 làm tròn xuống), phần dư bị bỏ hoặc giữ cho epoch sau. Hãy dự đoán điều gì xảy ra nếu một khối rơi đúng giữa hai chương. Đáp án: khối chứa phần cuối chương trước và phần đầu chương sau; mô hình sẽ phải đoán token đầu của chương sau từ ngữ cảnh chương trước. Có thể chấp nhận (nếu tài liệu liên quan) hoặc cô lập bằng mask, nhưng phải chọn có chủ ý và dùng nhất quán.

Nhiều tin nhắn ngắn

Một nghìn tin nhắn, đa số 20 token nhưng vài tin dài 500 token. Nếu đệm tất cả cho bằng tin dài nhất, gần như mọi hàng đều chủ yếu là pad và phần lớn phép tính bị lãng phí. Gom các tin có độ dài gần nhau, hoặc đóng gói rồi dùng mask để cô lập từng tin, giúp giảm phần này; nhưng cần kiểm tra mask đúng trên một batch nhỏ trước, rồi mới đo step time.

Tự kiểm tra: từ chưa có trong bảng từ vựng

Câu hỏi: thêm tài liệu kiểm định F = “gấu ăn cá”, nhưng bảng từ vựng lập từ tập huấn luyện không có “gấu”. Điều gì xảy ra với tokenizer mức từ như ví dụ này? Đáp án: không có ID để tra nên phải báo lỗi hoặc dùng token chưa biết (unknown); bịa một ID là sai vì sẽ trùng nghĩa với token khác. Tokenizer BPE thật tránh được tình huống này bằng cách tách “gấu” thành các mảnh nhỏ hơn đã có trong bảng, nên không bao giờ gặp từ hoàn toàn lạ.

6Thuật ngữ

Corpus
Kho văn bản dùng để huấn luyện; mỗi tài liệu trong đó là một chuỗi ký tự chưa có mã số.
Token và token ID
Token là mảnh văn bản nhỏ do tokenizer cắt ra (một từ, một phần từ hoặc một ký tự); token ID là số nguyên xác định mảnh đó trong bảng từ vựng. ID chỉ là nhãn tra bảng, không mang nghĩa số học.
Vocabulary
Bảng từ vựng: danh sách mọi token mà tokenizer biết cùng mã số của chúng; kích thước thường ký hiệu V.
Byte Pair Encoding (BPE)
Thuật toán tokenizer ghép dần các cặp đơn vị hay đứng cạnh nhau thành token mới; nhờ vậy từ lạ vẫn được tách thành các mảnh quen thay vì bị bỏ.
Validation set
Tập kiểm định: phần dữ liệu để đo mô hình, không dùng để sửa trọng số. Nếu tài liệu trùng với tập huấn luyện, điểm đo sẽ đẹp giả.
Mini-batch
Nhóm B khối token được xử lý cùng lúc trong một lần forward/backward; ma trận đầu vào có B hàng.
Padding và packing
Padding là chèn token đệm (pad) để các chuỗi dài bằng nhau, token này không phải dữ liệu cần học. Packing là nối nhiều tài liệu liên tiếp rồi cắt thành khối đủ dài để không lãng phí vị trí.
Attention mask / loss mask
Hai quy tắc khác nhau: attention mask cho biết vị trí nào được nhìn vị trí nào; loss mask cho biết vị trí nào được tính vào hàm mất mát.
Glossary (5)
Tensor
Mảng số nhiều chiều: vector là mảng 1 chiều, ma trận là mảng 2 chiều, một lô token ID là ma trận B hàng, T cột.
Tensor shape
Bộ kích thước các chiều của tensor, ví dụ (2, 5) là 2 hàng 5 cột; nhìn shape là biết dữ liệu được xếp thế nào.
Context
Các token đứng trước một vị trí mà mô hình được phép đọc khi dự đoán token kế tiếp.
Epoch
Một lượt đi qua toàn bộ dữ liệu huấn luyện; nhiều epoch nghĩa là mô hình thấy lại cùng dữ liệu.
Checkpoint
Bản lưu trạng thái mô hình; bài wf-loop giải thích những gì cần lưu để phục vụ hay để huấn luyện tiếp.

7Bài liên quan

8Nguồn