OpenArchLabOpen Architecture — From Models to Systems

3C · Block-Causal Attention Mask

3C · Mặt nạ Block-Causal · Nhân quả trên chữ và hai chiều trong từng khối ảnh

Mặt nạ block-causal cho token i thấy mọi token trước (q_idx ≥ kv_idx) cộng thêm cả khối cùng image_ids; hai ảnh tham chiếu cần image_ids khác nhau và key_valid loại cột đệm phải.

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

1Định nghĩa

Bài 3C là khối luật nhìn nhau của attention: mặt nạ (mask) là bảng boolean kích thước chuỗi × chuỗi, đánh dấu token ở hàng được phép đọc token ở cột nào; ô cấm bị gán âm vô cực trước softmax nên đóng góp bằng 0. DiT 2.1 dùng build_qwenimage21_block_causal_mask theo quy tắc allowed = (q_idx ≥ kv_idx) hoặc same_image_block: trước là nhân quả — token luôn được đọc phần đứng trước — sau là ngoại lệ theo khối: token trong cùng khối ảnh nhìn nhau hai chiều. Ý định này phản ánh bản chất bài toán: chữ đọc theo dòng, còn ảnh đang sinh cần được 'nhìn trọn' theo lưới như một khối.

Về cơ chế, _qwenimage21_prefix_segments cắt phần prefix (đứng trước token ảnh đích) thành các đoạn liên tiếp theo loại — đoạn chữ và từng khối ảnh — dựa trên image_ids của bài 2A. Chi tiết đời sống quan trọng nhất: hai ảnh tham chiếu đứng cạnh nhau bắt buộc có image_ids khác nhau (0 và 1); nếu dùng chung một số, same_image_block đúng chéo giữa hai ảnh, ảnh thứ nhất sẽ nhìn hai chiều cả ảnh thứ hai — kể cả phần 'tương lai' của nó trong chuỗi — khiến hai ảnh mẫu rỉ nội dung cho nhau. Ngoài ra key_valid đánh dấu các cột key có nội dung thật: đoạn chữ được đệm phải để mọi chuỗi cùng độ dài batch, và các cột đệm bị loại hẳn khỏi softmax. Khái niệm nền của mặt nạ nhân quả có trong bài causal mask của llm-inference.

Ví dụ đời thường: 3C giống lớp học chia nhóm: người phát biểu chỉ nghe được người đứng trước mình (nhân quả) nhưng trong cùng nhóm bàn tròn mọi người trao đổi tự do hai chiều (same_image_block); mỗi nhóm đeo mác màu khác (image_ids 0, 1, K) — mác màu lộn khiến hai nhóm nói chéo nhau; ghế trống cuối phòng phủ vải (key_valid False) để không ai lầm là người tham gia. Giới hạn của phép so: token ảnh đích vẫn được phép đọc mọi thứ đứng trước nó — phần 'tương lai' chưa sinh chỉ là không có gì để đọc, không phải bị vùng cấm đặc biệt.

2Luồng

Cách đọc hình (Cột 2, khối 3C ở chân cột, khối cuối trước khi vào Cột 3): nhận chuỗi đồng nhất cùng metadata từ 2A, dựng mặt nạ theo quy tắc allowed = (q_idx ≥ kv_idx) hoặc same_image_block, lọc token đệm bằng key_valid, rồi bảng mặt nạ đi cùng chuỗi vào khối attention 4A của Cột 3; xem bước [3C] 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
3C2 · 3D RoPE, Dual-t AdaLN & Block Mask
allowed(q, kv) = (q_idx >= kv_idx) ∨ (q_img_id == kv_img_id >= 0) · Text: causal · Each Image: bidirectional

3C · Block-Causal Mask (Causal + Bi-Dir)

Quy định ai được nhìn ai trong attention: chữ chỉ đọc phần đứng trước nó (nhân quả), còn các token trong cùng một bức ảnh nhìn nhau hai chiều.

Mục đích
Chữ có thứ tự đọc tự nhiên, còn một bức ảnh cần được nhìn trọn cả lưới. Quan trọng hơn: Prefix không bao giờ nhìn thấy ảnh đích đứng sau nó, nên kết quả tính trên Prefix không phụ thuộc ảnh đích — điều kiện thứ hai để 6A cache được.
Đầu vào
Vị trí của từng token trong chuỗi và nhãn image_ids từ 2A.
Đầu ra
Ma trận mặt nạ boolean [S, S] theo quy tắc allowed = (q ≥ kv) hoặc (cùng image_id ≥ 0); ô bị cấm nhận −∞ trước softmax. Mặt nạ này được dùng ở mọi lớp attention trong 4A.

Ở đáy Cột 2, quy tắc mặt nạ (q_idx >= kv_idx) OR same_image_block cho phép các token văn bản đọc nhân quả từ trái sang phải, trong khi mọi patch thuộc cùng một bức ảnh (cùng image_id >= 0) nhìn thấy nhau hai chiều (ô vuông xanh dương trên hình). Đồng thời, các vị trí ảnh đích ở cuối chuỗi không bao giờ rò rỉ ngược về làm bẩn các token Prefix phía trước.

Sơ đồ luồng (3 bước)
  1. 3C · Đoạn và image_ids

    _qwenimage21_prefix_segments cắt prefix thành các đoạn chữ và từng khối ảnh theo image_ids.

  2. 3C · Quy tắc allowed

    allowed = (q_idx ≥ kv_idx) hoặc same_image_block; ô cấm gán âm vô cực trước softmax.

  3. 3C · key_valid lọc đệm

    Cột key của token đệm phải bị che để không tham gia softmax của bất kỳ hàng nào.

Mã Mermaid
flowchart TD
  step1["3C · Đoạn và image_ids"]
  step2["3C · Quy tắc allowed"]
  step3["3C · key_valid lọc đệm"]
  step1 --> step2
  step2 --> step3

3Giải pháp

Bài toán cần giải: một chuỗi gồm chữ và nhiều khối ảnh cần vừa giữ nhân quả theo dòng (token sau chỉ đọc phần trước) vừa cho phép từng khối ảnh nhìn trọn lưới hai chiều, đồng thời không rỉ chéo giữa các ảnh khác nhau. Sau bài này, bạn cần tự kể được: quy tắc allowed là gì, vì sao image_ids phải khác nhau giữa các ảnh, và cột đệm bị loại thế nào.

Trạng thái đầu vào: chuỗi đồng nhất, image_ids và target_token_mask từ bài 2A. Mặt nạ không có trọng số học được; nó là bảng tính từ cấu trúc chuỗi nên có thể dựng trước một lần cho mỗi prompt.

Các thao tác và lý do: (1) _qwenimage21_prefix_segments nhận diện các đoạn chữ và từng khối ảnh; (2) dựng allowed = (q_idx ≥ kv_idx) hoặc same_image_block, phần cấm gán âm vô cực trước softmax; (3) ghép key_valid để cột đệm của prompt bị loại — buộc cần thiết vì softmax trên cột không nội dung sẽ lẫn chiếm trọng số ảo.

Đầu ra và cách đọc: một bảng boolean kích thước chuỗi × chuỗi. Khi đọc bước 3C của lab, hãy đọc theo tam giác: nửa nhân quả của phần chữ (hàng ≥ cột) cộng các ô vuông hai chiều hoàn chỉnh của từng khối ảnh; so hàng của ảnh tham chiếu thứ nhất với ảnh thứ hai để thấy khối nhau khép kín.

Giới hạn: mặt nạ phụ thuộc metadata — image_ids sai thì mặt nạ sai ngay; bảng này chỉ dùng cho đơn vị chuỗi hiện hành và không phải là luật tổng quát áp cho cả huấn luyện; các phần 'tương lai' của ảnh đích không tồn tại nên không có cột để đọc.

4Profiling

  • Vẽ mặt nạ ở chuỗi nhỏ

    Bước 3C của lab in bảng boolean cho một chuỗi nho như 12 token: đọc hàng của một token chữ (tam giác nhân quả) và hàng của một token ảnh (bao cả khối vuông hai chiều cùng image_ids). So từng hàng với quy tắc allowed khi có nghi ngờ.

  • Kiểm tra không rỉ chéo giữa hai ảnh tham chiếu

    Chọn hai ảnh có image_ids 0 và 1, kiểm tra bảng: ô giữa hai ảnh chỉ mở theo hướng nhân quả (ảnh sau đọc ảnh trước), không mở hai chiều. Nếu cả hai chiều mở, hai ảnh đang mang cùng image_ids hoặc hàm cắt đoạn đang gộp hai dải; sửa metadata trước khi chạy tiếp.

  • Cột đệm bị loại

    Đếm số cột key_valid = False và so với số token đệm mà tokenizer thêm vào; hai số phải bằng nhau. Nếu cột đệm vẫn mở, prompt sẽ được 'nghe' bằng token trống — lỗi rất khó nhận khi nhìn kết quả ảnh, nên phải kiểm ở bước này.

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ụ

Bảng mặt nạ của chuỗi 6 token

Input: chuỗi t1 t2 A1 A2 B1 B2 với image_ids −1, −1, 0, 0, 1, 1 (t là token chữ, A và B là hai ảnh tham chiếu, mỗi ảnh 2 token). Hãy dự đoán hàng A2 và B1 được đọc ai. Kết quả: A2 (q_idx 3) đọc t1, t2, A1, A2 — vì 3 ≥ cột tương ứng hoặc cùng khối A — và không đọc B1, B2; B1 (q_idx 4) đọc t1, t2, A1, A2, B1, còn B2 đọc thêm B2. Cách quan sát: bước 3C 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 bảng này; hãy đối chiếu từng ô với quy tắc allowed. Tự kiểm tra: hàng A1 không và không được đọc B1.

Lỗi điển hình: hai ảnh cùng image_id

Input: cùng chuỗi trên nhưng A và B đều mang image_id 0. Hãy dự đoán ô nào mới mở thêm. Kết quả: same_image_block đúng chéo giữa A và B, nên A1, A2 được đọc B1, B2 hai chiều — hai ảnh mẫu rỉ nội dung cho nhau, trái chủ đích tham chiếu riêng từng ảnh. Tự kiểm tra: chỉ cần sửa image_ids của ảnh B thành 1, bảng về lại đúng như Ví dụ 1. Vấn đề này là dạy lý do trực tiếp cho yêu cầu image_ids phân biệt từng ảnh ở [bài 2A](/courses/qwen-image-2-1/qwen21-architecture/qwen21-slot-expansion-packing/).

6Thuật ngữ

Mặt nạ attention
Bảng boolean chuỗi × chuỗi; các ô cấm bị gán âm vô cực trước softmax nên đóng góp bằng 0.
block-causal
Nhân quả theo thứ tự chuỗi, nới lỏng ngoại lệ cho token trong cùng khối ảnh nhìn nhau hai chiều.
image_ids
Số thứ tự ảnh của mỗi token từ build_token_metadata ở bài 2A: −1 cho chữ, 0..K−1 cho ảnh tham chiếu, K cho ảnh đích.
same_image_block
Điều kiện hai token có cùng image_ids; là cơ sở ngoại lệ hai chiều trong một khối ảnh.
key_valid
Cờ một cột key có nội dung thật; các token đệm phải của chuỗi chữ được loại khỏi softmax bằng cờ False.
Glossary (4)
q_idx, kv_idx
Chỉ số hàng (token hỏi) và cột (token được hỏi) trong bảng mặt nạ.
Token đệm (padding)
Token trống thêm vào để chuỗi các câu hỏi đạt cùng độ dài trong batch; không mang ngữ nghĩa.
Prefix
Phần đứng trước token ảnh đích: chữ và các ảnh tham chiếu.
Leak (rỉ chéo)
Hai dải không chủ đích lại nhìn nhau hai chiều qua mặt nạ quá lỏng.

7Bài liên quan

8Nguồn