microgpt
(karpathy.github.io)- 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
Valuetheo 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đếntrain5.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
Ý 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
Có thể tham khảo hướng dẫn PyTorch char_rnn
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
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 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 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
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
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”
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
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
Dự án Docco cũng là một công cụ tuyệt vời do cùng tác giả tạo ra
Cũng có phiên bản mã HTML
blog microgpt
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
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
Chủ đề liên quan: liên kết 1, liên kết 2
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
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
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