46 điểm bởi GN⁺ 17 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • 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ị
  • 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ườnglố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

  • Giấy phép MIT

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

    • Có lẽ một cách hay nữa là đưa mã nguồn vào LLM rồi trò chuyện với nó về phần đó
  • Tôi tò mò dự án này khác gì với microgpt hay minGPT của Andrej Karpathy

    • Tôi vẫn chưa so sánh, nhưng cảm ơn vì gợi ý. Tôi sẽ xem qua hai dự án đó
    • So sánh không phải điều quan trọng. Đây không phải sản phẩm mà là một dự án thử nghiệm rất thú vị
  • 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

    • Khá tuyệt! Tôi sẽ tìm hiểu sâu hơn một chút
    • Không liên quan trực tiếp, nhưng dự án thực sự rất hay. Có lẽ nên thêm UI một chút nữa
    • Một kiểu trực quan hóa thú vị
  • 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

    You> hello
    Guppy> hi. did you bring micro pellets.
    You> HELLO
    Guppy> i don't know what it means but it's mine.
    
    • Phát hiện hay đấy! Có vẻ tokenizer hoàn toàn không có token chữ in hoa
      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

    • Nhưng không có đủ dữ liệu huấn luyện. Cốt lõi của LLM là khối lượng dữ liệu và tài nguyên tính toán khổng lồ
  • 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

    • Thậm chí có thể đó còn là một cách diễn giải tốt hơn câu trả lời nổi tiếng kia
    • Mục đích của sự sống là sinh sản. Thức ăn chỉ là phương tiện cho mục đích đó, và mọi nguồn lực cùng đặc tính đều tồn tại để hỗ trợ việc giao phối
  • Ý 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

    • Gần như không phản ứng được. Với 9M tham số thì dung lượng rất hạn chế
      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