- Mô hình ngôn ngữ siêu nhỏ chỉ có khoảng 9 triệu tham số, có cấu trúc cho phép huấn luyện trong vòng 5 phút chỉ với một notebook Colab
- Thực hiện toàn bộ quy trình từ tạo dữ liệu, tokenizer, huấn luyện mô hình đến suy luận trong một môi trường duy nhất, hỗ trợ trình duyệt, Colab và máy cục bộ
- Được thiết kế với nhân vật “Guppy” tưởng tượng về môi trường dưới nước, trò chuyện bằng các câu ngắn và đơn giản, tập trung vào tính minh bạch phục vụ giáo dục
- Sử dụng kiến trúc Transformer cơ bản, cho thấy rõ cấu trúc cốt lõi của mô hình ngôn ngữ mà không cần các kỹ thuật phức tạp
- Dự án mã nguồn mở với dataset công khai trên HuggingFace và giấy phép MIT, để bất kỳ ai cũng có thể thử nghiệm và học tập
Tổng quan về GuppyLM
- GuppyLM là mô hình ngôn ngữ siêu nhỏ với khoảng 9 triệu tham số, được xây dựng để trò chuyện như chú cá “Guppy”
- Được thiết kế với mục tiêu trở thành LLM có thể tự huấn luyện trong chưa đầy 5 phút chỉ bằng một notebook Colab, cho phép thực hiện toàn bộ quy trình từ tạo dữ liệu, tokenizer, kiến trúc mô hình, vòng lặp huấn luyện đến suy luận trong một môi trường duy nhất
- Được tạo ra để người dùng có thể trực tiếp trải nghiệm nguyên lý hoạt động bên trong của mô hình ngôn ngữ mà không cần cụm GPU lớn hay kiến thức chuyên sâu
- Dù không tạo được văn bản dài như các mô hình lớn, đây là mô hình phục vụ giáo dục cho thấy minh bạch toàn bộ quá trình từ đầu vào, học trọng số đến tạo đầu ra
- Có thể chạy trên trình duyệt, Colab và môi trường cục bộ, đồng thời dataset và mô hình được công khai qua HuggingFace
Đặc tính mô hình
- GuppyLM là nhân vật suy nghĩ xoay quanh môi trường dưới nước như nước, nhiệt độ, ánh sáng, rung động, thức ăn
- Sử dụng các câu ngắn viết thường, và không hiểu các khái niệm trừu tượng của con người như tiền bạc hay chính trị
- Có tính cách thân thiện, tò mò và đơn giản
- Dữ liệu huấn luyện gồm 60 chủ đề, 60.000 mẫu hội thoại tổng hợp, có thể huấn luyện trong khoảng 5 phút trên một GPU đơn
- Nhờ kích thước nhỏ, mô hình còn hỗ trợ suy luận trong trình duyệt dựa trên WebAssembly
Kiến trúc
- Số tham số: 8.7M
- Số lớp: 6
- Chiều ẩn: 384
- Số đầu attention: 6
- Chiều FFN: 768 (ReLU)
- Kích thước từ vựng: 4,096 (BPE)
- Độ dài chuỗi tối đa: 128 token
- Chuẩn hóa: LayerNorm
- Position embedding: dạng học được
- LM head: chia sẻ trọng số với embedding
- Không sử dụng các kỹ thuật phức tạp như GQA, RoPE, SwiGLU, early exit, mà dùng cấu trúc Transformer cơ bản
Tính cách và chủ đề hội thoại
- Guppy trò chuyện bằng câu ngắn, biểu đạt chữ thường và lối suy nghĩ thiên về cảm giác
- Phản hồi về nhiều chủ đề như thức ăn, nước, ánh sáng, bể cá, bong bóng, phản chiếu, mặt nước, thế giới bên ngoài
- 60 chủ đề chính bao gồm chào hỏi, cảm xúc, nhiệt độ, thức ăn, ánh sáng, nước, bể cá, tiếng ồn, cô đơn, giấc mơ, mùa, trò đùa, tình yêu, sức khỏe, TV v.v.
Cách chạy và sử dụng
-
Chạy trên trình duyệt
- Thực hiện suy luận cục bộ dựa trên WebAssembly
- Tải về mô hình ONNX đã lượng tử hóa khoảng 10MB để chạy mà không cần máy chủ hay API key
-
Trò chuyện trên Colab
- Tải mô hình đã huấn luyện sẵn từ HuggingFace và dùng qua giao diện tương tác hội thoại
- Chỉ cần chạy tất cả các cell là có thể bắt đầu trò chuyện ngay
-
Huấn luyện trên Colab
- Đặt runtime thành T4 GPU rồi chạy toàn bộ các cell
- Tự động thực hiện tải dataset, huấn luyện tokenizer, huấn luyện mô hình và kiểm thử
- Có thể tải mô hình kết quả lên HuggingFace hoặc lưu cục bộ
-
Trò chuyện trên máy cục bộ
- Cài
pip install torch tokenizers rồi chạy lệnh python -m guppylm chat
- Nếu hội thoại kéo dài, chất lượng sẽ giảm do giới hạn 128 token
- Cũng hỗ trợ chế độ nhập một prompt duy nhất, nhận phản hồi rồi thoát
Dataset
- Sử dụng dataset arman-bd/guppylm-60k-generic trên HuggingFace
- Số mẫu: 60.000 (huấn luyện 57K / kiểm thử 3K)
- Định dạng:
{"input": "...", "output": "...", "category": "..."}
- Số lượng danh mục: 60
- Cách tạo: dữ liệu tổng hợp dựa trên template
- Với khoảng 60 template, 30 đối tượng trong bể cá, 17 loại thức ăn và 25 tổ hợp hoạt động, tạo ra khoảng 16.000 đầu ra độc nhất
Cấu trúc dự án
-
guppylm/
config.py: siêu tham số cho mô hình và huấn luyện
model.py: mô hình Transformer cơ bản
dataset.py: tải dữ liệu và xử lý batch
train.py: vòng lặp huấn luyện (cosine LR, AMP)
generate_data.py: tạo dữ liệu hội thoại cho 60 chủ đề
eval_cases.py: các ca kiểm thử
prepare_data.py: chuẩn bị dữ liệu và huấn luyện tokenizer
inference.py: giao diện trò chuyện
-
tools/
make_colab.py: tạo notebook Colab
export_onnx.py: xuất sang mô hình ONNX (lượng tử hóa uint8)
export_dataset.py: tải dataset lên HuggingFace
dataset_card.md: mô tả dataset dùng cho HuggingFace
-
docs/
index.html: bản demo trên trình duyệt (ONNX + WASM)
download.sh: tải mô hình và tokenizer
model.onnx: mô hình đã lượng tử hóa (~10MB)
tokenizer.json: tokenizer BPE
guppy.png: ảnh logo
Quyết định thiết kế
-
Loại bỏ system prompt:Mô hình 9M khó tuân theo chỉ dẫn có điều kiện, nên thay vì dùng cùng một prompt cho mọi mẫu, tính cách được nhúng trực tiếp vào trọng số
- Nhờ vậy tiết kiệm khoảng 60 token khi suy luận
- Hội thoại một lượt: do giới hạn 128 token, chất lượng giảm sau 3–4 lượt
- Điều này cũng phù hợp với ý tưởng Guppy có “trí nhớ cá vàng”, nhưng một lượt vẫn là ổn định nhất
- Giữ Transformer cơ bản: các kỹ thuật như GQA, SwiGLU, RoPE, early exit không cải thiện chất lượng ở quy mô 9M mà chỉ làm tăng độ phức tạp
- Tổ hợp attention tiêu chuẩn + ReLU FFN + LayerNorm là đủ để đạt hiệu năng tốt
- Dùng dữ liệu tổng hợp: để duy trì tính cách nhân vật nhất quán, dự án chọn cách tạo dữ liệu dựa trên template
Giấy phép
1 bình luận
Ý kiến trên Hacker News
Tôi tự hỏi liệu có tài liệu hóa nào cho dự án này không
Bản thân mã nguồn có vẻ là một trong những triển khai đơn giản nhất của (Not So) Large Language Model, nhưng với các lập trình viên chưa quen với multi-head attention, ReLU FFN, LayerNorm, positional embedding, v.v. thì vẫn không dễ hiểu
Dự án này mang tính giáo dục tương tự Minix. Giống như Minix được dùng để học thiết kế hệ điều hành, để sinh viên bổ sung tính năng cho GuppyLM trong khi học thiết kế LLM cũng là một cách tiếp cận hay
Tôi tò mò dự án này khác gì với microgpt hay minGPT của Andrej Karpathy
Ở bbycroft.net/llm có một ví dụ trực quan hóa 3D các lớp của một LLM nhỏ. Nó rất hữu ích để hiểu cách hoạt động bên trong
Có thể xem thảo luận liên quan tại đây
Thật sự rất tuyệt vời để nhập môn LLM
Trước đây tôi từng thử tạo một mô hình của riêng mình dựa trên Paradise Lost của Milton
Tham khảo: wvrk.org/works/milton
Chắc đây là hiện tượng xảy ra vì dữ liệu huấn luyện toàn là chữ thường
Dù vậy phản ứng của nhân vật vẫn còn nguyên
Điều này khiến tôi tự hỏi liệu có thể tạo một LLM chỉ được huấn luyện bằng Toki Pona hay không
Tham khảo wiki về Toki Pona
Tôi đang làm một dự án trong đó nhiều tác nhân LLM cùng chia sẻ một thế giới ảo và tự động tương tác với nhau
Điều đáng ngạc nhiên là sự tồn tại của “thế giới” ảnh hưởng rất lớn đến hành vi của mô hình
Cùng một mô hình, cùng một prompt, nhưng nếu các yếu tố môi trường như giới hạn tài nguyên, tác nhân khác, hay bộ nhớ duy trì thay đổi thì kết quả cũng hoàn toàn khác
Chúng ta chỉ tập trung vào tối ưu hóa bản thân mô hình, và suy nghĩ quá ít về môi trường vận hành của nó
Cuối cùng cũng có cảm giác một LLM trung thực về thế giới đã xuất hiện
Câu trả lời “ý nghĩa của cuộc sống là thức ăn” có vẻ ít sai hơn những gì các mô hình lớn hơn nó 10.000 lần thường đưa ra
Ý tưởng thì hay, nhưng các ví dụ có vẻ như được sao chép nguyên từ dữ liệu huấn luyện
Tôi tò mò nó phản ứng thế nào với các truy vấn chưa biết
Mục đích của dự án này là trình diễn nguyên lý hoạt động của LLM
Làm rất đẹp. Cảm ơn vì đã chia sẻ
Nhưng giờ tôi tò mò liệu LLM có thật sự mang lại cảm giác ‘không còn thần bí nữa’ hay không
Việc chỉ với thống kê đơn giản và lượng tính toán khổng lồ mà vẫn tạo ra được kết quả như vậy vẫn rất đáng kinh ngạc