3 điểm bởi GN⁺ 2026-03-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • Cấu trúc mô hình ngôn ngữ tối giản triển khai toàn bộ quá trình huấn luyện và suy luận của mô hình GPT chỉ bằng một file Python thuần duy nhất dài 200 dòng
  • Bao gồm đầy đủ dataset, tokenizer, engine autodiff, mạng nơ-ron tương tự GPT-2, optimizer Adam, cùng vòng lặp huấn luyện và suy luận
  • Huấn luyện trên dataset tên gọi để tạo ra các tên mới, đồng thời phơi bày các nguyên lý cốt lõi của GPT thông qua autograd tự cài đặt và kiến trúc Transformer
  • Khác với các LLM quy mô lớn, nó chạy bằng Python thuần không cần dependency, chỉ giữ lại phần bản chất thuật toán
  • Hiểu được microgpt sẽ giúp nắm được cấu trúc thuật toán nền tảng của các mô hình lớn như ChatGPT

Tổng quan về microgpt

  • microgpt là một bản triển khai GPT tối giản được viết bằng 200 dòng mã Python, không phụ thuộc vào thư viện bên ngoài
    • Bao gồm đầy đủ dataset, tokenizer, autodiff, cấu trúc tương tự GPT-2, optimizer Adam, cùng vòng lặp huấn luyện và suy luận
  • Đây là một dự án mang tính nghệ thuật do Karpathy tạo ra nhằm đơn giản hóa LLM xuống mức bản chất, nằm trên cùng mạch phát triển với micrograd, makemore, nanogpt
  • Toàn bộ mã nguồn được cung cấp qua GitHub Gist, trang web và Google Colab

Dataset

  • Sử dụng một file văn bản chứa khoảng 32.000 cái tên, mỗi dòng là một tên
  • Mỗi tên được xem là một tài liệu, và mô hình học mẫu hình này để tạo ra tên mới
  • Ví dụ sinh ra sau huấn luyện: kamon, ann, karai, jaire, vialan v.v.

Tokenizer

  • Một tokenizer đơn giản dựa trên ký tự, gán ID số nguyên cho mỗi ký tự duy nhất
  • Gồm tổng cộng 27 token, bao gồm các chữ cái a–z và token BOS (beginning of sequence)
  • Mỗi tài liệu được bọc theo dạng [BOS, e, m, m, a, BOS] để huấn luyện

Tự động vi phân (Autograd)

  • Lớp Value theo dõi giá trị vô hướng và gradient, đồng thời xây dựng đồ thị tính toán
  • Lưu đạo hàm cục bộ (local gradient) của các phép toán cơ bản như cộng, nhân, lũy thừa, log, exp, ReLU
  • Phương thức backward() thực hiện lan truyền ngược bằng cách áp dụng chain rule
  • Cùng thuật toán với .backward() của PyTorch nhưng được tự cài đặt trực tiếp ở mức scalar

Khởi tạo tham số

  • Mô hình có khoảng 4.192 tham số
  • Bao gồm bảng embedding, trọng số attention, trọng số MLP, phép chiếu đầu ra v.v.
  • Mỗi tham số được khởi tạo bằng số ngẫu nhiên theo phân phối Gaussian

Kiến trúc mô hình

  • Là dạng đơn giản hóa từ cấu trúc GPT-2, sử dụng RMSNorm, ReLU, kết nối tắt (residual connection)
  • Thành phần chính:
    • Bước embedding: cộng embedding token và embedding vị trí
    • Multi-head attention: tính các vector Q, K, V rồi dùng KV cache để khai thác thông tin token trước đó
    • Khối MLP: mạng feedforward 2 tầng để thực hiện tính toán cục bộ
    • Bước đầu ra: tạo logit cho kích thước từ vựng (27)
  • KV cache vẫn được kích hoạt trong lúc huấn luyện, và lan truyền ngược đi qua cả cache

Vòng lặp huấn luyện

  • Ở mỗi bước, chọn một tài liệu rồi tokenize thành dạng [BOS, ... , BOS]
  • Mô hình dự đoán xác suất token kế tiếp và tính cross-entropy loss
  • Sau khi tính gradient bằng loss.backward(), tham số được cập nhật bằng optimizer Adam
  • Learning rate dùng cách giảm tuyến tính (linear decay)
  • Trong 1.000 bước, loss giảm từ khoảng 3.3 → 2.37

Suy luận (Inference)

  • Sau khi huấn luyện xong, mô hình bắt đầu từ token BOS để sinh tên mới
  • Ở mỗi bước, token tiếp theo được lấy mẫu theo phân phối xác suất softmax
  • Giá trị temperature dùng để điều chỉnh độ sáng tạo (thấp thì bảo thủ hơn, cao thì đa dạng hơn)
  • Ví dụ đầu ra: kamon, ann, karai, jaire, vialan, karia, yeran, anna v.v.

Cách chạy

  • Chỉ cần Python là có thể chạy (python train.py)
  • Huấn luyện hoàn tất trong khoảng 1 phút, giá trị loss được in ra theo từng bước
  • Cũng có thể chạy y hệt trong notebook Colab

Các giai đoạn phát triển mã nguồn

  • Mở rộng theo từng bước từ train0.py đến train5.py
    • Bigram → MLP → Autograd → Attention → Multi-head → Adam
  • Mỗi giai đoạn có thể xem trong các revision của build_microgpt.py trên Gist

Khác biệt so với LLM thực tế

  • Dữ liệu: microgpt dùng 32K tên, còn LLM thực tế dùng hàng nghìn tỷ token
  • Tokenizer: mức ký tự vs. subword dựa trên BPE
  • Autograd: Python ở mức scalar vs. phép toán tensor trên GPU
  • Kiến trúc: 4K tham số vs. hàng trăm tỷ tham số
  • Huấn luyện: lặp trên một tài liệu đơn vs. batch quy mô lớn và mixed-precision training
  • Tối ưu hóa: Adam đơn giản vs. hyperparameter và scheduling được tinh chỉnh kỹ
  • Hậu xử lý: đi qua các giai đoạn SFT và RL để phát triển thành dạng ChatGPT
  • Hạ tầng suy luận: phân tán GPU, quản lý KV cache, lượng tử hóa, speculative decoding v.v.

Tóm tắt FAQ

  • Mô hình là một hàm toán học, biến đổi token đầu vào thành xác suất của token tiếp theo
  • Nó không có “sự hiểu”, mà chỉ dự đoán thông qua học các quy luật thống kê
  • Cùng một vòng lặp dự đoán token như ChatGPT, nhưng ở dạng thu gọn
  • “Hallucination” là kết quả tự nhiên của việc lấy mẫu xác suất
  • Dù chậm, nó vẫn tái hiện đầy đủ các thuật toán cốt lõi của LLM
  • Có thể điều chỉnh số bước huấn luyện, kích thước mô hình, dataset để có kết quả tốt hơn
  • Nếu thay dataset, mô hình có thể học nhiều mẫu khác nhau như tên thành phố, tên Pokémon, thơ v.v.

microgpt là một mô hình mang tính giáo dục và thử nghiệm, triển khai mọi thuật toán cốt lõi của LLM ở mức tối thiểu, qua đó phơi bày trọn vẹn nguyên lý hoạt động của mô hình ngôn ngữ quy mô lớn.

1 bình luận

 
GN⁺ 2026-03-02
Ý kiến trên Hacker News
  • Có người đã chỉnh sửa microgpt để tạo ra một GPT nhỏ sinh tên tiếng Hàn
    Cũng có một trang web trực quan hóa toàn bộ quá trình — có thể khám phá toàn bộ pipeline từ tokenization đến suy luận
    Có thể tự trải nghiệm tại English GPT lab

    • Mấy thứ như thế này hoàn toàn có thể được triển khai dễ dàng bằng một mô hình nhẹ hơn nhiều
      Có thể tham khảo hướng dẫn PyTorch char_rnn
    • Tôi không liên quan đến người làm ra trang này, nhưng đây là một trang cực kỳ hữu ích để học cấu trúc bên trong của LLM
      Trang giải thích rất tốt về tokenization, embedding, attention, loss·gradient, training, inference, và so sánh với Real GPT
    • Nói là “đã chỉnh sửa” thì thực ra gần như chỉ là thay danh sách tên tiếng Anh bằng tên tiếng Hàn
      Bản thân trang này gần với một dạng trực quan hóa do AI tạo ra dựa trên bài blog gốc hơn
  • Tôi đã port microgpt sang C++
    Liên kết mã nguồn
    Số dòng code gấp đôi nhưng tốc độ nhanh hơn 10 lần
    Phần khó nhất là biểu diễn lớp Value trong C++, và cuối cùng tôi đã dùng shared_ptr

    • Tôi đã triển khai backpropagation tường minh không dùng autodiff, và nó nhanh hơn Python 8 lần
  • Tôi từng thắc mắc “hallucination” thực chất là gì
    Mô hình chỉ đơn giản lấy mẫu token từ phân phối xác suất, chứ không có khái niệm về chân lý
    Vì vậy tôi tự hỏi liệu LLM có thể có điểm số độ tin cậy cho chính câu trả lời của nó hay không

    • Mô hình có thể báo cáo confidence của phân phối đầu ra, nhưng điều đó không có nghĩa là nó thực sự được hiệu chỉnh chính xác (calibrated)
      Mô hình tiền huấn luyện thì được hiệu chỉnh, nhưng sau làm theo chỉ dẫn (post-training) thì điều đó bị phá vỡ
      Nghiên cứu liên quan: bài báo 1, bài báo 2
    • Điểm số độ tin cậy không có ý nghĩa nếu không biết cách dữ liệu huấn luyện được lấy mẫu
      Giống như khoảng tin cậy trong thống kê khi không biết tổng thể, xác suất của LLM cũng không có kết nối với thế giới thực
      Cuối cùng thì LLM giống như một người chỉ đọc sách mà không có trải nghiệm về thế giới
    • Trên thực tế, LLM trả về một phân phối xác suất, rồi lấy mẫu từ đó để sinh token
      Nhưng xác suất này không phải là “xác suất đúng sự thật”, mà là “xác suất tôi sẽ phát ra token này trong tình huống này”
    • Nó có thể tạo sinh, nhưng vì không biết ‘phân phối thật’, nên độ tin cậy đó không có ý nghĩa
    • Những câu như “tôi không chắc, nhưng có lẽ là thế này” không xuất hiện trong đầu ra, nhưng lại tồn tại trong quá trình suy luận nội bộ
  • Tôi đã chuyển microgpt sang Rust để học tập
    microgpt-rs
    Phần khó nhất là biểu diễn cấu trúc đồ thị autograd bằng kiểu dữ liệu Rust
    Hiện tôi đang sửa nó để có thể chạy trong trình duyệt bằng WebAssembly, và sẽ đăng lên blog
    Mã của Karpathy thực sự có thiết kế giàu tính thơ và ngắn gọn

    • Việc lưu giá trị đạo hàm trong cấu trúc trọng số khá mang tính hack, nhưng hầu hết mọi người đều làm vậy
    • Tôi cũng muốn thử tự triển khai nó bằng một ngôn ngữ khác
  • Mã đẹp và dễ đọc, nhưng sẽ tốt hơn nếu có phần giải thích kèm chú thích từng dòng như backbone.js
    Tham khảo tài liệu Backbone

    • Mã nguồn có chú thích của Backbone được tạo bằng Docco
      Dự án Docco cũng là một công cụ tuyệt vời do cùng tác giả tạo ra
    • Đây là một ví dụ lập trình văn chương (literate programming) thực sự đẹp
      Cũng có phiên bản mã HTML
    • Cũng có blog walkthrough của Karpathy
      blog microgpt
    • Cũng có đề xuất là cứ bảo một LLM hiệu năng cao giải thích nó
  • Nhờ video và code của Karpathy mà tôi có cảm giác lần đầu tiên thực sự hiểu được gradient descent, backpropagation, và chain rule
    Chỉ nhìn toán học thì rất rối, nhưng khi xem cùng code thì nó trở nên rõ ràng
    Cá nhân tôi thấy đây giống như một cảm giác thành tựu của đời người

    • Tôi cũng định thử giải thích nó một cách trực quan
      Như Karpathy đã nói, để hiểu thật sự thì điều quan trọng là thử dạy lại cho người khác
  • Thật ngạc nhiên là dự án này đến giờ mới được đưa lên HN
    Tôi đã tạo một bản JS 35 dòng tên PicoGPT cùng với bản Python,
    và có thể chạy trực tiếp trên web
    Đây thậm chí còn là một LLM siêu nhỏ có thể chạy bằng mã QR

    • Tôi cũng ngạc nhiên. Một dự án hay như thế này mà phải sau 2 tuần mới lên trang chủ HN thì thật bất ngờ
      Chủ đề liên quan: liên kết 1, liên kết 2
    • Thực ra nó đã từng được đăng trước đây rồi — bài đăng trước
  • Tôi đã biến mã microgpt thành một bài blog trực quan hóa
    Liên kết blog
    Nó cho thấy luồng thực thi của mã một cách tương tác khi lần theo từng bước

    • Họ nói rằng sau khi học xong thì nó sinh ra các tên như “kamon”, “karai”, “anna”, “anton”, nhưng thực ra cả bốn cái tên này đều đã có trong tập dữ liệu
    • Bài này xứng đáng được đăng thành bài riêng trên HN
    • Thường thì tôi khá phê phán các blog có LLM hỗ trợ viết, nhưng đây là một ví dụ thực sự xuất sắc
    • Ngay cả với một người mới ML như tôi, đây cũng là tài liệu hữu ích ngang với bản gốc của Karpathy
    • Thật sự là một công trình tuyệt vời
  • Xu hướng ‘micro’ trong AI dạo này khá thú vị
    Thay vì chỉ tăng kích thước mô hình, hiệu quả đang tăng mạnh hơn ở các mô hình nhỏ và tập trung
    Tôi thực sự dùng Gemini Flash để phân tích theo miền, và tỷ lệ tốc độ/chi phí tốt hơn nhiều
    Chỉ riêng khác biệt về độ trễ (latency) cũng đã làm thay đổi loại sản phẩm có thể xây dựng

    • Nhưng đây là một mô hình micro mang tính giáo dục hơn là ứng dụng thực tế
  • Vì nó còn nhỏ hơn nanogpt nên tôi nghĩ gọi là picogpt sẽ hợp hơn là microgpt
    Dù vậy đây vẫn là một dự án rất hay