Ngày 18/9, hai tờ báo Trung Quốc đăng gần như cùng một tin: buổi học đầu tiên môn “Advanced Machine Learning” của Tang Jie ở Thanh Hoa đông nghẹt người, phải kê thêm ghế. Tencent News dùng chữ 挤爆了 — “chật cứng muốn vỡ phòng.” Bình thường đề cương môn học không gây hiệu ứng kiểu đó.

Rồi mọi người đọc kỹ đề cương, và phản ứng bắt đầu có lý. Sinh viên môn này phải tự viết tokenizer và Transformer từ đầu, rồi dùng nó train một model 0,1 tỷ tham số. Tự viết kernel attention bằng Triton, tự benchmark train/inference trên nhiều GPU. Tự làm sạch dữ liệu thô, tự đi tìm scaling law, và phải đoán được model to hơn sẽ hành xử ra sao trước khi thật sự train nó. Trên cùng một base model, họ chạy SFT, DPO và RLVR song song để xem từng cách thật sự thay đổi hành vi model ra sao. Cuối cùng, dựng environment, train một agent context dài bên trong đó, và bắt agent đó tự chấm điểm chính mình.

Đây không phải đồ án cuối kỳ. Đây gần như là roadmap nửa năm của một lab nghiên cứu nhỏ, được giao dưới dạng bài tập.

Ai đủ gan giao bài tập kiểu này

Tang Jie không phải một ông giáo sư nổi hứng. Ông là giảng viên khoa Khoa học Máy tính Thanh Hoa, phụ trách mảng AI trong nhóm nghiên cứu Knowledge Engineering, là IEEE Fellow, ACM Fellow, AAAI Fellow, và là người dựng AMiner từ năm 2006 — công cụ đồ thị trích dẫn mà khối người từng dùng mà chẳng biết ai làm ra. Ông còn là đồng sáng lập kiêm chief scientist của Zhipu AI (Z.AI), công ty đứng sau dòng model GLM, được ông và Li Juanzi tách ra từ chính lab Thanh Hoa đó năm 2019. Nên khi ông bảo một phòng học viên cao học tự viết kernel Triton, đó không phải bài tập ông đọc đâu đó rồi bắt chước — đó là việc chính đội ngũ ông làm trước bữa sáng.

Hai chi tiết đang lan truyền — nhóm 2-3 người, và báo cáo tiếng Anh theo format NeurIPS kèm demo trực tiếp — mình không tìm thấy trong hai bài báo Thanh Hoa mình đọc được. Mình không gạt bỏ chúng, vì chúng khớp quá vừa vặn với phần còn lại của đề cương để là bịa, và trang đề cương môn học kiểu này hiếm khi lên báo đầy đủ. Chỉ là đừng coi hai chi tiết đó chắc chắn như phần nội dung kỹ thuật.

Tang cũng nhân dịp này nói rõ hơn ông nghĩ ngành đang đi đâu, và phần này có ghi nhận đàng hoàng. Tại AGI-Next Summit ở Bắc Kinh hồi tháng 1, ông nói thẳng trước cả hội trường: paradigm chatbot “基本已经探索完了” — về cơ bản đã khai thác cạn. Không phải “đã giải xong,” cũng không phải “nhàm chán” — chỉ là đường cong này phẳng rồi, và Zhipu đang dồn ngân sách sang coding, agent và reasoning. Bức tranh kế tiếp theo ông là đa phương thức, bộ nhớ và tự cải thiện — model giữ được trạng thái qua nhiều phiên và tự giỏi hơn ở một việc mà không cần người ngồi train lại. Còn khung “kiến thức → lập trình → thế giới số → thế giới vật lý” đang lan truyền, và chuyện AI có thể tự vận hành cả máy tính cá nhân trong 1-2 năm nữa — mình không lần ra được câu nói gốc nào khớp hai ý đó. Nó đọc như một suy diễn hợp lý từ những gì ông thật sự nói, được khoác áo thành lời ông nói. Biết ranh giới đó trước khi kể lại cho người khác cũng đáng.

Nhưng phần đáng chú ý nhất vẫn là cái đề cương. Nếu một giáo sư đang trực tiếp làm foundation model nghĩ đây là cách đúng để dạy người ta về LLM năm 2026, thì đáng để hỏi: nếu không có phòng lab, mình tự làm được tới đâu?

Nếu tự làm một mình thì thực tế phải làm sao

Bạn không có cluster GPU của Thanh Hoa, không có trợ giảng, không có điểm số ép mình phải hoàn thành. Nhưng bạn có buổi tối, cuối tuần, và cái thẻ tín dụng thuê được GPU theo giờ. Đây là phiên bản mình sẽ tự chạy cho chính mình, từng mốc một, kèm phần mình sẽ cắt nếu làm một mình thay vì có team.

1. Tokenizer và Transformer từ đầu. Đừng bắt đầu từ file trắng — bắt đầu từ minbpe của Karpathy cho tokenizer và nanoGPT (hoặc bản mới hơn build-nanogpt) cho model, đọc từng dòng, rồi tự viết lại không mở tab tham khảo. Train tokenizer BPE của riêng bạn trên vài trăm MB text trước; vòng lặp merge BPE từ đầu ngắn đủ để hiểu trọn vẹn:

def get_pair_counts(ids):
    counts = {}
    for pair in zip(ids, ids[1:]):
        counts[pair] = counts.get(pair, 0) + 1
    return counts

def merge(ids, pair, new_id):
    out, i = [], 0
    while i < len(ids):
        if i < len(ids) - 1 and (ids[i], ids[i+1]) == pair:
            out.append(new_id); i += 2
        else:
            out.append(ids[i]); i += 1
    return out

Chạy được cái này trước khi đụng vào attention. Sau đó mới scale model lên khoảng 0,1B tham số — mức này nằm trong tầm một GPU A100/H100 thuê cuối tuần, không cần cả cluster.

2. Kernel Triton và benchmark đa GPU. Đừng viết attention từ CUDA thô — bắt đầu từ tutorial fused-attention chính thức trong repo Triton, khớp số với SDPA của PyTorch, rồi benchmark so với SDPA và FlashAttention-2 ở vài độ dài sequence khác nhau. Phần đa GPU không cần tám card — thuê hai GPU, chạy torchrun --nproc_per_node=2 với data-parallel là đủ để ra một đường cong scaling thật, buộc bạn phải hiểu gradient sync chứ không chỉ tưởng tượng ra nó.

3. Làm sạch dữ liệu và scaling law. Lấy một phần FineWeb-Edu thay vì tự crawl — bài toán làm sạch vẫn y hệt, còn bài toán crawl thì không đáng tốn thời gian. Vẫn làm đủ phần nhàm chán: dedup bằng MinHash, lọc bằng một classifier chất lượng nhỏ, xem thử cái gì bị loại ra. Sau đó train ba bốn kích cỡ model (10M, 30M, 100M, có thể 300M tham số) trên cùng công thức dữ liệu, vẽ loss theo compute, fit power law kiểu bài Chinchilla. Điểm mấu chốt không phải con số exponent bạn ra — mà là nhận ra một đường cong fit trên model tí hon thật sự đoán được model cỡ lớn hơn kế tiếp.

4. SFT, DPO và RLVR trên cùng một base model. Dùng TRL cho cả ba để so sánh nằm ở phương pháp, không phải ở tooling. SFT trên một tập instruction nhỏ như một phần UltraChat đã lọc. DPO trên tập cặp preference. RLVR trên việc có đáp án kiểm được — toán tiểu học hoặc bài chạy code — để “reward” nghĩa là “test pass,” không phải “một model giám khảo thấy thích.” Chạy cả ba từ đúng một checkpoint và so trên cùng bộ eval. Đây là mốc dạy bạn điều mà ba mốc kia không dạy được: SFT, DPO và RL thay đổi hành vi model theo cách thật sự khác nhau, và bạn sẽ không tin điều đó cho tới khi tự mắt thấy nó xảy ra trên model của mình.

5. Agent harness kèm tự chấm điểm. Dựng vòng lặp đơn giản nhất — lên kế hoạch, gọi tool, quan sát, lặp lại — quanh model của bạn hoặc một model mở nhỏ, kéo dài context dùng được bằng scratchpad hoặc bước retrieval, rồi thêm một bước tự phê bình nơi model chấm điểm chính đường đi của nó theo một rubric trước khi dừng. Đo xem tự chấm có thật sự bắt được run tệ hay chỉ đóng dấu cho qua. Mình đoán — và cũng là lý do mốc này nằm trong đề cương — bạn sẽ thấy nó làm cả hai việc, không nhất quán. Đó chính là hiện trạng thật của lĩnh vực này bây giờ, không phải lỗi trong code bạn viết.

6. Viết báo cáo như thể nó thật. Dù làm một mình, ép bản thân viết một báo cáo ngắn có cấu trúc — vấn đề, phương pháp, biểu đồ, cái gì không chạy được — và quay một demo hai phút. Không ai chấm điểm cả, nhưng một báo cáo là thứ biến sáu cuối tuần thuê GPU thành thứ bạn có thể chỉ vào sau này.

Ngân sách và thời gian, nói thật: một kỹ sư đi làm full-time có thể hoàn thành bản rút gọn của cả sáu mốc trong mười đến mười hai tuần làm buổi tối, tốn khoảng 300-600 USD tiền thuê GPU nếu chịu khó tắt máy đúng lúc. Làm cặp thì chia việc — một người phụ trách pretrain và kernel, người kia phụ trách dữ liệu, alignment và agent — nhanh hơn mà không ai hiểu nông hơn. Mốc mình sẽ không cắt dù gấp cỡ nào: mốc số 4. Đọc về khác biệt giữa SFT và RL không giống việc tự mắt thấy model của mình hành xử khác đi sau từng bước.

Mình cũng đang muốn tự thử làm hết đống này. Nếu làm, bạn sẽ đọc được bản GPU yếu hơn, không trợ giảng — nhưng vẫn đủ sáu mốc như vậy.

Xuất nội dung

Bình luận