OpenArchLabOpen Architecture — From Models to Systems

5A · Modulated SwiGLU FFN

5A · Mạng SwiGLU có điều biến (3× Ratio) & Cổng Residual Tanh

FFN của khối là SwiGLU 3×: chuẩn hóa theo 1 + scale2, nở 4096 → 12288, nhân nhánh gate qua SiLU rồi thu về 4096, cộng residual qua cổng tanh gate2 và kẹp giá trị trong ±65504 cho FP16.

LESSON ID qwen21-gated-swiglu-ffn GROUP Kiến trúc & Giải phẫu
Mục lục bài học

1Định nghĩa

Bài 5A là FFN đứng sau attention trong từng khối: attention là nơi trao đổi thông tin giữa các token, còn FFN là nơi mỗi token xử lý và tổ hợp đặc trưng của chính mình. Cấu trúc chọn của QwenImage21SwiGLUFeedForward là SwiGLU với tỷ lệ nở 3× (mlp_ratio = 3): từ 4096 chiều nở ra 12288 chiều rồi về lại 4096. Bài toán nó giải quyết: FFN cũng phải 'biết' ảnh đang nặn ở mức nhiễu nào, và cần chạy an toàn trong FP16 — kiểu số 16-bit có giới hạn giá trị 65504, nên mạng phải chống tràn thiết kế từ đầu.

Về cơ chế, một lần qua FFN gồm: (1) img_norm2(x) × (1 + scale2) — chuẩn hóa đầu FFN điều biến theo cùng hàng t của bài 3B; (2) hai nhánh song song: proj là Linear(4096, 12288), gate_layer cũng 4096 → 12288; (3) cổng SiLU áp lên nhánh gate (SiLU(x) = x × sigmoid(x): dương ít đổi, âm bị dập gần 0) rồi nhân elementwise với nhánh proj; (4) out là Linear(12288, 4096) thu hồi chiều; (5) residual x + tanh(gate2) × mlp_out với gate2 cũng của bài 3B; (6) trước khi xuống FP16, giá trị bị kẹp trong [−65504.0, 65504.0] — lệnh kẹp trực tiếp để giá trị không tràn thành vô cực (inf) trong kiểu số 16-bit.

Ví dụ đời thường: 5A giống dây chuyền chế biến: attention ở bài 4A là phòng phối trộn giữa các vựa (trao đổi giữa token), FFN là máy rang xử lý từng túi một; băng rang chính (proj) phanh nở thành 3 lần dung lượng (12288); tay kiểm định (gate) nếm từng cột: phần hợp lý giữ lại, phần qua lọc bị dập (SiLU); máy đóng gói (out) thu về đúng 4096; kho FP16 chỉ chứa được tối đa 65504 đơn vị, hàng phải kẹp lại trước khi nhập kho (clip). Van tanh(gate2) pha sản phẩm vừa chế với phần cũ trước đó trên đường residual. Giới hạn của phép so: máy rang không biết túi này của lô nào — FFN không giao tiếp giữa các token, nhiệm vụ trao đổi thuộc về attention.

2Luồng

Cách đọc hình (Cột 4, khối 5A ở chân cột): nhận hidden sau attention của 4A cùng 4 vùng điệu biến từ hàng t của 3B, chạy chuẩn hóa theo scale2 → SwiGLU 3× → cổng tanh gate2, rồi mũi tên ↑ đẩy kết quả lên khối 6B (đầu ra và vòng Euler) trong cùng Cột 4; kết quả cũng vòng lại các khối 4A của 31 lớp còn lại theo dải lặp; xem bước [5A] trong [Bài Lab tổng hợp Qwen-Image-2.1](/courses/qwen-image-2-1/qwen21-lab/qwen21-end-to-end-lab/).

Sơ đồ luồng dữ liệu 4 cột · 10 thành phần (1A → 6B)

Kiến trúc Qwen-Image-2.1 & Ánh xạ 1:1 với Bài Lab tổng hợp

Bắt đầu từ 1A ở góc dưới Cột 1 đi lên 1B → 2A, sang Cột 2 (3A → 3B → 3C), qua Cột 3 (4A ↔ 6A) và kết thúc ở Cột 4 (5A → 6B). Di chuột hoặc bấm vào từng khối để xem pop-over và đối chiếu với Lab.

Sơ đồ luồng dữ liệu 4 cột của kiến trúc Qwen-Image-2.1 gồm 10 thành phần từ 1A đến 6B
5A4 · Gated SwiGLU & Flow-Match Euler
LN(x)·(1+scale2) → W_out(SiLU(W_gate·x) ⊙ W_proj·x) (4096 → 12288 → 4096) → x + tanh(gate2)·MLP

5A · Modulated SwiGLU FFN (3× Ratio)

Xử lý riêng từng token: sau khi attention trộn thông tin, mạng SwiGLU nở mỗi token từ 4096 lên 12288 chiều rồi thu về 4096 để biến đổi đặc trưng.

Mục đích
Attention (4A) chỉ trao đổi thông tin giữa các token; FFN là nơi mỗi token tự xử lý thông tin vừa nhận. Hệ số scale2/gate2 từ 3B giúp FFN cũng biết mức nhiễu hiện tại.
Đầu vào
Đầu ra của attention 4A trong cùng lớp [B, S, 4096] và hệ số scale2, gate2 từ 3B.
Đầu ra
Chuỗi [B, S, 4096] sau x + tanh(gate2) · MLP(x) — đây là đầu ra của một lớp DiT. Nó quay lại 4A để vào lớp kế tiếp; sau lớp thứ 32 thì đi lên 6B.

Đầu ra từ 4A (Cột 3) đi sang 5A ở nửa dưới Cột 4: mỗi token được chuẩn hóa LayerNorm(x) · (1 + scale2) rồi đi vào mạng QwenImage21SwiGLUFeedForward không có hệ số bias với chiều ẩn mở rộng gấp 3 lần (mlp_ratio = 3, từ 4096 lên 12288). Kết quả nhân cổng SiLU(W_gate · x) ⊙ (W_proj · x) được chiếu về 4096 chiều và cộng vào residual qua cổng tanh(gate2).

Sơ đồ luồng (3 bước)
  1. 5A · Chuẩn hóa có tín hiệu t

    img_norm2(x) × (1 + scale2); scale2 cùng đến từ lớp modulation dùng chung ở bài 5.

  2. 5A · SwiGLU 4096 → 12288 → 4096

    Nhánh proj nở 3×, nhánh gate qua SiLU, nhân elementwise rồi out thu hồi chiều gốc.

  3. 5A · Residual tanh và clip FP16

    x + tanh(gate2) × mlp_out; giá trị được kẹp ±65504 trước khi lưu FP16.

Mã Mermaid
flowchart TD
  step1["5A · Chuẩn hóa có tín hiệu t"]
  step2["5A · SwiGLU 4096 → 12288 → 4096"]
  step3["5A · Residual tanh và clip FP16"]
  step1 --> step2
  step2 --> step3

3Giải pháp

Bài toán cần giải: tổ hợp đặc trưng của từng token trong khi nhận tín hiệu t và chạy ổn định trong FP16. Sau bài này, bạn cần tự kể được: hai nhánh của SwiGLU làm gì, vì sao tỷ lệ nở là 3, cổng tanh thứ hai ở đâu, và vì sao phải kẹp giá trị 65504.

Trạng thái đầu vào: hidden 4096 chiều vừa đi qua attention của bài 4A, cùng 4 vùng điệu biến từ bài 5 (dùng scale2 và gate2). FFN không nhìn thấy token khác: mọi phép tính ở đây theo từng token.

Các thao tác và lý do: (1) chuẩn hóa theo scale2 để độ lớn token thay đổi theo t; (2) nở 3× cho đủ phổ đặc trưng trung gian mà không tốn tới mức 4×; (3) cổng SiLU cho phép chọn mức giữ của từng thành phần một cách trơn nhạt; (4) out thu chiều và cổng tanh(gate2) kiểm soát mức góp; (5) clip ±65504 bảo vệ bước lưu FP16.

Đầu ra và cách đọc: mlp_out 4096 chiều được cộng residual, shape không đổi; phần gốc x vẫn nằm nguyên trên đường residual. Khi đọc bước 5A của lab, hãy in vài giá trị lớn nhất của mlp_out trước và sau khi clip để thấy cơ chế kẹp hiệu lực cụ thể.

Giới hạn: tỷ lệ 3 là của cấu hình này, không phải chuẩn chung; đổi cấu hình khác số tham số FFN đổi theo (tính bằng công thức 2 × 4096 × hidden); SiLU khác ReLU ở chỗ dập âm dần mà không cắt đột ngột; FP16 clip chỉ dùng khi chạy FP16, với FP32 không có áp lực này.

4Profiling

  • Parity SwiGLU ở chuỗi nhỏ

    Bước 5A của lab so output với một phiên bản tính tay cho 1 token 8 chiều (bạn dùng số ngẫu nhiên nhỏ), cùng trọng số; chọn ngưỡng theo độ chính xác của runtime. FP16 sẽ chênh nhẹ hơn FP32; ghi rõ dtype khi báo cáo.

  • Quan sát clip ±65504

    Tạo giá trị cực lớn (ví dụ nhân 1000 lần) đưa vào FFN trong lab chạy FP16: không được thấy inf mà thấy các giá trị chạm mốc 65504. Trong run thật, activation hiếm khi chạm mốc; số này cho thấy lớp bảo vệ hoạt động, không phải đo chất lượng ảnh.

  • Bảng tham số FFN

    Tính tay từ cấu hình: hai lớp 4096 × 12288 ≈ 100.66 triệu tham số một khối, nhân 32 khối cho phần FFN của model. So với phần attention 67.1 triệu một khối ở bài 4A để thấy FFN nặng hơn. Số này từ cấu hình công bố, không phải phép đo thời gian.

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ụ

SiLU với các giá trị mẫu

Input: ba giá trị 1, 0, −3 qua SiLU. Hãy dự đoán: giá trị âm sẽ bị dập về gần 0 hay đảo đầu dấu? Kết quả bằng tay: SiLU(1) = 1 × sigmoid(1) ≈ 0.7311; SiLU(0) = 0; SiLU(−3) = −3 × sigmoid(−3) ≈ −0.1423 — số âm bị dập gần 0, không đảo dấu. Cách quan sát: bước 5A của [Bài Lab tổng hợp Qwen-Image-2.1](/courses/qwen-image-2-1/qwen21-lab/qwen21-end-to-end-lab/) in các giá trị tương tự cho nhánh gate; tự kiểm tra SiLU(−1) ≈ −0.2689 nằm giữa hai cận trên. Giới hạn: FP16 runtime chênh nhẹ so với tính tay FP32.

Dự đoán shape khi đổi mlp_ratio

Input: token 4096 chiều, mlp_ratio = 3. Hãy dự đoán shape của hai nhánh và của out. Kết quả: proj và gate là 4096 → 12288; nhân elementwise cũng 12288; out thu về 4096. Tự kiểm tra: nếu mlp_ratio = 4 thì hidden là 16384 và tham số FFN một khối là 2 × 4096 × 16384 ≈ 134.2 triệu, lớn hơn 100.66 triệu của ratio 3. Cách quan sát: bước 5A in shape; thay đổi cấu hình trong lab nếu script cho phép.

6Thuật ngữ

FFN (feed-forward)
Mạng xử lý từng token riêng lẻ sau attention; không trao đổi giữa các token, chú trọng tổ hợp đặc trưng của chính token đó.
SwiGLU
Kiểu FFN hai nhánh: nhánh proj mang nội dung, nhánh gate qua SiLU làm cổng; nhân hai nhánh rồi chiếu về chiều gốc.
mlp_ratio = 3
Tỷ lệ nở của FFN: 4096 → 12288 (3 × 4096) → 4096, nhỏ hơn tỷ lệ 4× của nhiều mô hình cũ.
img_norm2(x) × (1 + scale2)
Chuẩn hóa trước FFN được điều biến cùng cách như attention, nhưng dùng norm2 và scale2 riêng.
FP16 clip ±65504
Giới hạn lớn nhất của số 16-bit; giá trị vượt ngưỡng bị kẹp lại trước khi nhập bộ nhớ FP16 để không tràn thành vô cực.
Glossary (4)
SiLU
Hàm hoạt hóa x × sigmoid(x): giá trị dương gần giữ nguyên, giá trị âm bị dập về gần 0, trơn tại 0.
Gate layer
Nhánh song song của FFN học cách chọn cái nào giữ trong kết quả ghép của từng thành phần.
Elementwise
Phép nhân chia theo từng cặp số tương ứng hai vector cùng chiều.
FP16
Kiểu số 16-bit (một bit dấu, 5 bit mũ, 10 bit phần định trị); chạy nhanh nhưng giá trị lớn nhất chỉ 65504.

7Bài liên quan

8Nguồn