OpenArchLabOpen Architecture — From Models to Systems

W3 · Training / inference workflow

Bước training: forward từ token đến điểm số

Lượt chạy tiến: đưa cả lô token ID qua bảng nhúng, các lớp Transformer và đầu ra LM head để có bảng điểm logits cho mọi vị trí cùng lúc.

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

1Định nghĩa

Forward pass (lượt chạy tiến) trong huấn luyện là phép tính đi từ đầu vào đến đầu ra của mô hình theo các trọng số hiện tại: nó biến lô token ID từ khâu chuẩn bị dữ liệu thành một bảng điểm (logits) tại mọi vị trí, cho biết mô hình đang chấm token nào trong bảng từ vựng cao hay thấp cho vị trí kế tiếp. Token ID lần lượt đi qua bảng nhúng (embedding), một chuỗi lớp Transformer và cuối cùng là ma trận đầu ra (LM head).

Mỗi lớp Transformer gồm chuẩn hóa và residual, khối attention để trộn thông tin giữa các vị trí và khối MLP để biến đổi riêng từng vị trí. Khác với suy luận chỉ cần trạng thái của bước hiện tại, forward trong huấn luyện phải giữ lại các giá trị trung gian (hoặc điểm mốc để tính lại) cho bước backward ngay sau khi hàm mất mát chấm điểm xong.

Ví dụ đời thường: Forward giống như lúc học sinh ngồi làm bài kiểm tra bằng đúng những gì mình đang nhớ (trọng số hiện tại): đọc đề, nháp từng bước ở nhiều tầng lập luận rồi viết ra phương án trả lời cuối (bảng điểm logits). Học sinh giữ lại tờ giấy nháp trên bàn để lát nữa thầy chấm xong còn dựa vào đó chỉ ra bước nào sai (backward); điểm khác là người học này viết ra điểm số cho mọi đáp án có thể, không chỉ một đáp án.

2Luồng

Cột 2 gồm bốn ô 2A (embedding và attention), 2B (MLP), 2C (norm và residual), 2D (logits). Thứ tự xếp từ trên xuống chỉ để tra cứu; thứ tự chạy thực tế là embedding, rồi lặp lớp [norm, attention, cộng residual, norm, MLP, cộng residual], rồi norm cuối và ô 2D.

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
2D2 · Forward through the Transformer
[T, V] scores · V = số token trong từ vựng

2D · Logits

Đổi vector cuối thành một điểm số cho từng token trong từ vựng; đây là kết quả của forward.

Nhận gì
Ma trận vector [T, d] ra từ lớp Transformer cuối (ô 2C): mỗi hàng là một vị trí token, mỗi cột là một chiều của vector biểu diễn.
Làm gì, vì sao
Một phép nhân ma trận (đầu LM head) đổi mỗi vector thành một điểm số cho từng token trong từ vựng V. Bảng điểm đó gọi là logits.
Ra gì
Logits shape [T, V]. Khi huấn luyện, mũi tên sang phải đưa chúng tới ô 3A để chấm điểm; khi suy luận, chúng đi tới bước chọn token (ô 5C).
Ví dụ, cách đọc ô
Mỗi cột trong biểu đồ là điểm của một token; cột cao nhất là token mô hình đang nghiêng tới. Sau softmax các điểm thành xác suất tổng bằng 1. Với T = 10 vị trí và V = 23 token, logits có 10 × 23 điểm.
Lưu ý
Logits chưa phải xác suất và chưa phải câu trả lời. Khi mô hình chưa học, các điểm chưa ưu tiên token nào rõ rệt.
Sơ đồ luồng (5 bước)
  1. Token ID từ ô 1A/1B

    Ma trận inputs shape (B, T): mỗi ô là một mã token.

  2. Tra bảng embedding

    Mỗi ID đổi thành một vector d số; kết quả shape (B, T, d).

  3. Lặp qua L lớp Transformer

    Mỗi lớp: chuẩn hóa, attention, cộng residual, chuẩn hóa, MLP, cộng residual.

  4. Chuẩn hóa cuối và LM head

    Chiếu vector d của từng vị trí thành V điểm số; ra logits shape (B, T, V).

  5. Dùng theo mục đích

    Huấn luyện đưa logits vào hàm mất mát; suy luận lấy logits ở vị trí cuối để chọn token.

Mã Mermaid
flowchart TD
  step1["Token ID từ ô 1A/1B"]
  step2["Tra bảng embedding"]
  step3["Lặp qua L lớp Transformer"]
  step4["Chuẩn hóa cuối và LM head"]
  step5["Dùng theo mục đích"]
  step1 --> step2
  step2 --> step3
  step3 --> step4
  step4 --> step5

3Giải pháp

Vị trí trên sơ đồ: cột 2 · Forward qua Transformer gồm bốn ô: 2A Embedding + Attention, 2B MLP/FFN, 2C Norm & residual và 2D Logits. Bài này nói về toàn cột và đi sâu vào ô 2D; ba bài attention (2A), MLP (2B) và norm (2C) mở rộng từng ô. Lưu ý thứ tự trên sơ đồ là thứ tự tra cứu, không phải thứ tự chạy: ô 2C (chuẩn hóa) thực sự chạy trước attention và trước MLP trong mỗi lớp.

Vấn đề cần giải. Sau ô 1B ta có một ma trận số nguyên inputs shape (B, T). Cần một hàm có trọng số học được, nhận ma trận đó và với mỗi vị trí cho ra một điểm số cho mọi token có thể xuất hiện kế tiếp. Điểm số này sẽ được so với đáp án ở cột 3.

Khái niệm tối thiểu và cách đọc shape. B là số khối trong batch (hàng), T là số vị trí trong mỗi khối (cột), d là chiều rộng của vector biểu diễn một token, V là số token trong bảng từ vựng. Embedding là bảng E shape (V, d): hàng thứ k là vector của token ID k. LM head là ma trận U shape (d, V). Các lớp Transformer giữ nguyên shape (B, T, d) từ vào đến ra; chỉ ô 2D đổi chiều cuối từ d thành V.

Thứ tự chạy với các lý do. (1) Tra embedding: ID chỉ là nhãn, nên phải đổi thành vector học được thì mô hình mới tính toán được. (2) Lặp L lớp, mỗi lớp gồm norm rồi attention rồi cộng residual, tiếp theo norm rồi MLP rồi cộng residual; attention cho các vị trí trao đổi thông tin, MLP biến đổi từng vị trí, norm giữ biên độ ổn định, residual giữ đường đi cho thông tin và gradient. (3) Norm cuối đưa vector về biên độ ổn định. (4) LM head nhân vector d của từng vị trí với U để có V điểm số.

Ví dụ có số, chỉ xét ô 2D (số minh họa, tính tay). Bảng từ vựng như bài trước (V = 7) và d = 2. Giả sử sau lớp cuối, vector tại vị trí của chữ “ăn” là h = [1, 2]. Ma trận U có 2 hàng, 7 cột ứng với các token [pad, mèo, chó, ăn, cá, ngủ, eos]: hàng 0 là [0,2; 0,1; −0,3; 0,0; 0,4; 0,5; −0,1], hàng 1 là [0,0; 0,3; 0,2; 0,1; 0,1; −0,2; 0,4]. Logit của mỗi token là 1 × (hàng 0) + 2 × (hàng 1): pad = 0,2; mèo = 0,7; chó = 0,1; ăn = 0,2; cá = 0,6; ngủ = 0,1; eos = 0,7.

Cách đọc kết quả. Hai token có điểm cao nhất là mèo và eos (0,7); đáp án đúng sau “mèo ăn” là “cá”, nhận 0,6, đứng sau hai token kia nên ở vị trí này mô hình đang đoán chưa tốt (đây là mô hình chưa được học, và vector h, ma trận U ở đây là số tự chọn, không phải trọng số của mô hình thật). Các số này có thể âm hoặc lớn hơn 1 và không cộng lại bằng 1, nên chưa phải xác suất; bài kế tiếp dùng softmax để chuẩn hóa thành xác suất và chấm điểm.

Output của toàn bước forward là logits shape (B, T, V). Với B = 1, T = 4, V = 7 là 28 số: mỗi hàng nhỏ là bảng điểm của đúng một vị trí. Nhờ causal mask, logits ở vị trí t chỉ phụ thuộc vào các token từ 0 đến t. Điều có thể kết luận: ta có điểm số cho mọi vị trí cùng lúc. Điều không thể kết luận: logits cao ở một token không có nghĩa mô hình 'hiểu' câu; và chưa thể nói mô hình tốt hay xấu cho đến khi so với labels ở ô 3A.

Số tham số. Khối công thức ở cuối mục này hướng dẫn cách đếm tham số của một mô hình thu nhỏ: đếm số phần tử của từng tensor riêng biệt rồi cộng lại, không cộng gradient, moment hay activation. Số tham số khác với số byte để lưu trọng số (còn phụ thuộc kiểu số) và khác với bộ nhớ khi huấn luyện (phải cộng thêm gradient, trạng thái bộ tối ưu và activation).

Tách hiểu kiến trúc khỏi cách engine thực thi. Cùng một checkpoint có thể chạy qua các kernel khác nhau nhưng phải cho kết quả trong sai số cho phép. Ghép phép toán, attention tiết kiệm đọc ghi và chia trọng số trên nhiều thiết bị là các giải pháp thực thi; còn đổi cấu trúc đầu attention hay số expert đòi một mô hình tương ứng, không chỉ đổi cờ runtime. Khi huấn luyện, forward còn phải giữ activation cho backward hoặc chấp nhận tính lại. Khi suy luận, cùng đường tính này chạy qua pha prefill và decode.

Để tự chạy forward và quan sát hình dạng các tensor, mở giai đoạn 3 · Forward của Bài Lab tổng hợp. Hãy dự đoán trước shape của logits từ B, T, V rồi đối chiếu.

Độ sâu, chiều rộng và công thức đếm tham số

Quy tắc chính xác: đếm số phần tử của từng tensor tham số riêng biệt rồi cộng lại. Một ma trận a × b chứa a × b tham số; một vector dài a chứa a tham số. Nếu hai phép toán dùng chung một tensor, chỉ đếm tensor đó một lần. Không cộng gradients, moment tensors, cache hoặc activations.

Trong công thức dưới: n là kích thước bảng từ vựng, d là chiều rộng vector token, L là số lớp decoder và m là chiều rộng trung gian của mạng SwiGLU. Mô hình thu nhỏ trong công thức này không có bias; normalization không có scale học được; vị trí sinusoidal cố định không có tham số. Embedding đầu vào và phép chiếu output là hai ma trận riêng.

Mỗi lớp của mô hình thu nhỏ có bốn ma trận attention d × d và ba ma trận SwiGLU gồm d × m, d × m, m × d. Công thức rút gọn dưới đây chỉ áp dụng cho L = 1, m = 2d. Công thức nhiều lớp là phép mở rộng để học cách đếm, không mô tả một mô hình cụ thể nào.

P = Σ (tích các chiều của mỗi tensor tham số riêng biệt)

P_demo = 2nd + L(4d² + 3dm)
L = 1, m = 2d ⇒ P_demo = 2nd + 10d²

Ví dụ minh họa A (n = 13, d = 6):  2 × 13 × 6  + 10 × 6²  = 516
Ví dụ minh họa B (n = 77, d = 16): 2 × 77 × 16 + 10 × 16² = 5.024
Thành phầnKích thước tensorSố tham số
Embedding đầu vào En × dnd
Attention Q, K, V, O / lớp4 ma trận d × d4d²
SwiGLU G, Z, F / lớpd × m; d × m; m × d3dm
Phép chiếu output Ud × ndn
Normalization, vị trí, bias trong mô hình thu nhỏKhông có trọng số học được0
Cách điều chỉnh công thức cho Llama và Mixture of Experts

Với decoder kiểu Llama có hai normalization học được mỗi lớp, một normalization cuối, SwiGLU, không bias và embedding/output không chia sẻ: P = 2nd + L(2d² + 2d·d_kv + 3dm + 2d) + d. Ở đây d_kv = số key/value heads × chiều rộng mỗi head; giả định tổng chiều rộng query bằng d. Grouped-Query Attention — nhiều query heads dùng chung key/value heads — làm d_kv có thể nhỏ hơn d. Nếu embedding và output chia sẻ trọng số, thay 2nd bằng nd. Công thức này cần điều chỉnh nếu kiến trúc có bias, vị trí học được hoặc thành phần khác.

Với Mixture of Experts — hỗn hợp chuyên gia — tổng tham số gồm tất cả experts; tham số hoạt động mỗi token chỉ gồm các experts được chọn và các thành phần dùng chung. Ví dụ lớp có N experts, chọn k experts và mỗi expert có 3dm tham số thì phần expert tổng là N·3dm, phần expert hoạt động là k·3dm; còn phải cộng router, shared experts, attention và các thành phần khác. Đó là lý do không thể suy tổng tham số chỉ từ số lớp và chiều rộng.

Tham số hoạt động/token trong bảng model dùng quy ước công bố ở cấp model; model dense thường được ghi gần bằng tổng tham số. Điều đó không có nghĩa mọi phần tử embedding được đọc tại mỗi vị trí: ở bước tra bảng, mỗi vị trí chỉ lấy đúng một hàng dài d trong bảng n × d. Vì vậy cần tách quy ước tham số hoạt động khỏi lượng phép tính và lượng dữ liệu thực sự được đọc cho một vị trí để tránh nhầm.

Một số kiến trúc LLM có thông số công khai

ModelSố lớpChiều rộngTổng tham sốHoạt động/token
Llama 3.1 8B324.096≈8B≈8B
Llama 3.1 70B808.192≈70B≈70B
Llama 3.1 405B12616.384≈405B≈405B
Qwen3-235B-A22B944.096≈235B≈22B
Qwen3.5-397B-A17B604.096≈397B≈17B
DeepSeek-V3 · model chính617.168≈671B≈37B

B = một tỷ tham số. Đây là ví dụ kiến trúc công khai, không phải danh sách model mới nhất hoặc xếp hạng chất lượng. Qwen3.5 ghi phần ngôn ngữ; DeepSeek-V3 ghi model chính, chưa cộng module dự đoán nhiều token bổ sung. Thông số được đối chiếu ngày 06/10/2026. Chiều rộng ở đây là vector token, không phải chiều rộng trung gian của mạng truyền thẳng.

4Profiling

  • Shape và tính đúng

    Kiểm tra trước: shape của logits phải là (B, T, V) và đổi thứ tự trong batch không làm đổi kết quả từng khối. Ghi số chuỗi, số vị trí và chiều vector, rồi so logits với một cài đặt tham chiếu đơn giản trên cùng đầu vào và cùng trọng số, cho phép sai số số học nhỏ. Khớp tham chiếu chứng minh phép tính đúng, không chứng minh mô hình đã học tốt.

  • Chi phí từng lớp

    Đo riêng thời gian và bộ nhớ của attention, của các phép nhân ma trận và của phần chuẩn hóa thay vì chỉ đo tổng thời gian mô hình. Giữ nguyên kích thước batch, độ dài và kiểu số khi so sánh, và ghi chú phần cứng. Đừng suy ra cấu hình tối ưu cho model lớn từ một lần đo trên model nhỏ.

  • Đếm tham số theo tensor

    Liệt kê shape của mọi tensor trọng số rồi nhân các chiều của từng tensor và cộng lại. Với mô hình thu nhỏ ở bảng cuối mục Giải pháp (L = 1, m = 2d), kết quả là 2nd + 10d². Hãy đối chiếu tổng này với số phần tử thật của checkpoint đang nạp thay vì suy từ tên dữ liệu. Số tham số khác số byte lưu trọng số, và bộ nhớ huấn luyện phải cộng thêm bộ tối ưu, gradient và activation.

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 mô hình nhỏ

Với batch 1 khối [mèo, ăn, cá, eos], forward tính logits cho cả 4 vị trí trong một lượt. Dự đoán: nếu đổi token cuối từ eos thành ngủ thì logits ở vị trí 0 có đổi không? Đáp án: không, vì causal mask không cho vị trí 0 nhìn sang vị trí 3; chỉ logits tại vị trí 3 (và các vị trí sau nó, nếu có) đổi.

Cùng trọng số, đi đường suy luận

Sau khi huấn luyện xong, chính các trọng số này xử lý prompt trong suy luận: pha prefill chạy forward giống hệt trên cả prompt, rồi pha decode chỉ forward một token mới và tái dùng cache key/value của các token cũ. Khác biệt không nằm ở kiến trúc mà ở chỗ suy luận không cần giữ activation cho backward, và chỉ lấy logits ở vị trí cuối để chọn token.

Tự kiểm tra: đọc logits

Một vị trí có logits [0,2; 0,7; 0,1; 0,2; 0,6; 0,1; 0,7] và đáp án là cá (chỉ số 4). Hỏi: token nào đang có điểm cao nhất, và mô hình đoán đúng chưa? Đáp án: mèo và eos cùng 0,7; cá chỉ có 0,6 nên chưa đúng. Hỏi thêm: các số này có cộng lại bằng 1 không? Không (tổng bằng 2,6), vì chúng là điểm chưa chuẩn hóa.

6Thuật ngữ

Embedding
Bảng E gồm V hàng, mỗi hàng là một vector d số học được cho một token; tra hàng thứ ID để đổi token thành vector.
Residual connection
Đường cộng đầu vào của một khối vào kết quả của khối đó, giữ lại thông tin gốc và cho phép gradient đi thẳng về lớp trước.
LM head
Ma trận cuối (d × V) nhân vector của vị trí để ra V điểm số, mỗi điểm cho một token trong bảng từ vựng.
Logits
V điểm số chưa chuẩn hóa ở mỗi vị trí. Có thể âm, không cộng lại bằng 1; chỉ sau softmax mới thành xác suất.
Activation
Giá trị trung gian sinh ra trong forward (đầu ra của từng lớp). Backward cần chúng, nên huấn luyện phải giữ hoặc tính lại.
Glossary (6)
Tensor
Mảng số nhiều chiều. Trong bài này: inputs là ma trận (B, T), activations là khối (B, T, d), logits là khối (B, T, V).
Tensor shape
Kích thước từng chiều của tensor; đọc shape để biết tensor có bao nhiêu hàng, cột và 'lớp' dữ liệu.
Model weights
Các số học được (ma trận E, các ma trận trong từng lớp, LM head) lưu trong checkpoint; forward chỉ đọc chúng, backward mới sinh gradient cho chúng.
Batch
Nhóm B khối token xử lý trong một lượt; mọi khối dùng chung trọng số.
Context
Các token đứng trước một vị trí; logits ở vị trí t chỉ được phụ thuộc vào context của t.
Vocabulary size (V)
Số token trong bảng từ vựng; quyết định số cột của logits và số hàng của bảng embedding.

7Bài liên quan

8Nguồn