29 điểm bởi GN⁺ 2025-10-14 | 1 bình luận | Chia sẻ qua WhatsApp
  • nanochat của Andrej karpathy là một dự án mã nguồn mở cho phép tự xây dựng một LLM hội thoại tương tự ChatGPT với ngân sách 100 USD
  • Toàn bộ pipeline (tokenize, pretraining, midtraining, finetuning, đánh giá, suy luận, dịch vụ web) được triển khai ngắn gọn và dễ hack
  • Trên một node GPU 8XH100, quá trình huấn luyện hoàn tất trong vòng 4 giờ chỉ với một script; mô hình d26 nhắm tới hiệu năng cấp GPT-2 mất khoảng 12 giờ với chi phí khoảng 300 USD, còn mức 1.000 USD mất 41,6 giờ
  • Codebase cực kỳ gọn nhẹ gồm 8.300 dòng, 44 tệp với dung lượng 330KB, không có object cấu hình phức tạp hay model factory, mang lại một baseline mạnh mẽ, dễ đọc và dễ fork
  • Dự án đang được phát triển như đồ án capstone của khóa LLM101n từ Eureka Labs, với mục tiêu cải thiện trình độ tiên tiến của các mô hình siêu nhỏ có thể tiếp cận với ngân sách dưới 1.000 USD

Tổng quan dự án nanochat

  • nanochat là dự án mã nguồn mở dành cho các nhà phát triển muốn tạo một LLM hội thoại giống ChatGPT với chi phí 100 USD
  • Toàn bộ codebase được viết theo hướng đơn nhất, dễ đọc, ít phụ thuộc và ngắn gọn, giúp việc chỉnh sửa và thử nghiệm trở nên dễ dàng
  • Cung cấp môi trường để quản lý toàn bộ quy trình từ pretraining, finetuning, đánh giá, suy luận đến web UI trong một nơi
  • Có thể tự động chạy toàn bộ pipeline bằng script speedrun.sh, nên cả người mới bắt đầu cũng dễ tiếp cận
  • Được thiết kế với ít phụ thuộc nhất và cấu trúc dễ hack, tối ưu cho mục đích giáo dục để dễ hiểu và dễ sửa đổi
  • Dự án dự kiến sẽ được dùng làm capstone project cho khóa học LLM101n do Eureka Labs phát triển

Bắt đầu nhanh (Quick Start)

  • Trong môi trường GPU, đặc biệt là node 8XH100, chạy speedrun.sh sẽ thiết lập quá trình huấn luyện và suy luận trong khoảng 4 giờ
    • Với node 8XH100, chi phí là 24 USD mỗi giờ và tổng thời gian là 4 giờ
  • Khuyến nghị chạy trong phiên screen để có thể giám sát ổn định trong các phiên huấn luyện dài
    • Dùng lệnh screen -L -Logfile speedrun.log -S speedrun bash speedrun.sh
    • Tách phiên bằng Ctrl-a d, sau đó kiểm tra tiến độ bằng tail speedrun.log
  • Sau khi huấn luyện xong, bạn có thể tự do đặt câu hỏi cho LLM qua web UI đơn giản và xem kết quả trong cửa sổ hội thoại
    • python -m scripts.chat_web
  • Mô hình ở mức 4e19 FLOPs cung cấp khả năng hội thoại ở trình độ như trẻ mẫu giáo
    • Có thể yêu cầu viết truyện hoặc thơ
    • Có thể quan sát hiện tượng hallucination
    • Có thể trả lời các câu hỏi cơ bản như vì sao bầu trời màu xanh
  • Kết quả huấn luyện và nhiều chỉ số hiệu năng được lưu trong report.md

Báo cáo kết quả huấn luyện

  • Tệp report.md chứa “phiếu điểm” của lần chạy huấn luyện
    • Cung cấp nhiều chỉ số đánh giá và metric
    • Bảng tóm tắt cuối cùng hiển thị hiệu năng theo từng giai đoạn BASE, MID, SFT, RL
  • Thống kê codebase
    • Số ký tự: 333.989
    • Số dòng: 8.304
    • Số tệp: 44
    • Số token (xấp xỉ): 83.497
    • Phụ thuộc (số dòng uv.lock): 2.004
  • Ví dụ hiệu năng benchmark
    • CORE: 0.2219 (BASE)
    • ARC-Challenge: 0.2875 (MID), 0.2807 (SFT)
    • GSM8K: 0.0250 (MID), 0.0455 (SFT), 0.0758 (RL)
    • HumanEval: 0.0671 (MID), 0.0854 (SFT)
    • Tổng thời gian: 3 giờ 51 phút
  • Dù hiệu năng của mô hình thấp hơn ChatGPT, trọng tâm nằm ở trải nghiệm triển khai LLM với ngân sách thấp

Mô hình lớn hơn (Bigger Models)

  • Không thể huấn luyện một bản sao ChatGPT hiệu năng cao chỉ với 100 USD; các LLM thực tế nổi tiếng là cần vốn đầu tư hàng triệu USD
  • Có hai mức mở rộng bổ sung đáng chú ý
    • Mức khoảng 300 USD với mô hình d26 (depth=26): huấn luyện khoảng 12 giờ, điểm CORE nhỉnh hơn GPT-2 một chút
    • Mức 1.000 USD: mất khoảng 41,6 giờ, là một con số tròn đẹp
  • Các chỉnh sửa cho speedrun.sh để huấn luyện mô hình d26
    • Cần tải thêm nhiều shard dữ liệu
      • Tính số token bằng cách nhân số tham số với 20
      • Tính số ký tự bằng cách nhân với 4,8
      • Chia cho 250 triệu để tính số shard (cần khoảng 450 shard)
    • Dùng tùy chọn --depth=26 và giảm một nửa device_batch_size từ 32 xuống 16 để tránh OOM
    • Ở giai đoạn midtraining cũng cần dùng cùng device_batch_size

Yêu cầu môi trường tính toán

  • Có thể chạy trên node GPU 8XA100 nhưng sẽ chậm hơn một chút
  • Cũng có thể chạy trên một GPU đơn
    • Nếu bỏ torchrun thì vẫn tạo ra kết quả gần như tương tự
    • Tự động chuyển sang gradient accumulation
    • Mất thời gian lâu hơn gấp 8 lần
  • Với GPU có VRAM dưới 80GB, cần điều chỉnh hyperparameter
    • Giảm --device_batch_size từ 32 (mặc định) xuống 16, 8, 4, 2, 1 để giải phóng bộ nhớ
    • Nếu muốn đặt nhỏ hơn 1 thì cần cách tiếp cận sáng tạo hơn
  • Vì dựa trên PyTorch thuần, có thể hỗ trợ nhiều môi trường như xpu, mps
    • Không có sẵn mặc định nên cần chỉnh sửa thêm một chút

Mức độ hữu dụng và khả năng tiếp cận

  • Ưu điểm lớn nhất của nanochat là có thể đóng gói toàn bộ tệp cùng lúc để dễ dàng đặt câu hỏi cho các LLM khác, dịch vụ truy xuất tài liệu và hơn thế nữa
  • Ví dụ dùng tiện ích files-to-prompt
    • Bao gồm các tệp py, md, rs, html, toml, sh
    • Loại trừ thư mục rustbpe/target
    • Chọn định dạng đầu ra cxml
    • Đóng gói khoảng 330KB (khoảng dưới 100.000 token), 45 tệp với 8.000 dòng mã
  • Khuyến nghị dùng DeepWiki
    • Thay github.com trong URL GitHub bằng deepwiki.com để đặt câu hỏi về repository
    • Được cung cấp bởi Devin/Cognition

Đóng góp và định hướng dự án

  • nanochat vẫn là một dự án chưa hoàn thiện
  • Mục tiêu là cải thiện trình độ tiên tiến của các mô hình siêu nhỏ có thể chạy trọn quy trình từ đầu đến cuối với ngân sách dưới 1.000 USD
  • Khả năng tiếp cận không chỉ là chi phí mà còn bao gồm độ phức tạp nhận thức
    • Không có object cấu hình khổng lồ, model factory hay đoạn mã quái vật if-then-else
    • Đây không phải một “framework” LLM có thể cấu hình triệt để
  • Một codebase đơn nhất, nhất quán, tối giản, dễ đọc, dễ hack và dễ fork nhất có thể như một “baseline mạnh mẽ”
    • Được thiết kế để chạy trọn từ đầu đến cuối và tạo ra một bản sao ChatGPT cụ thể cùng phiếu điểm tương ứng

1 bình luận

 
GN⁺ 2025-10-14
Ý kiến trên Hacker News
  • Đây là chia sẻ trải nghiệm sử dụng một công cụ code AI khá thú vị
    Tôi từng hỏi Karpathy rằng anh ấy đã tự viết bao nhiêu phần mã
    Karpathy: cảm ơn câu hỏi, thực tế là tôi đã tự tay viết gần như toàn bộ mã (có dùng tự động hoàn thành bằng tab)
    Tôi đã thử agent claude/codex vài lần nhưng độ chính xác còn thấp nên không giúp được nhiều
    Có lẽ vì repo tôi làm quá xa so với phân bố dữ liệu
    Liên kết tới cuộc trao đổi gốc

    • Câu "repo quá xa so với phân bố dữ liệu" giải thích được vì sao mỗi khi tôi dùng mô hình AI thì thường không thấy hữu ích
      Mọi việc tôi làm đều quá đặc thù nên nằm xa khỏi phân bố

    • Thật vui khi một người đáng tin như Karpathy nói điều đó
      Những ai nghĩ AGI sắp đến có lẽ nên hạ kỳ vọng xuống một chút
      Tôi cũng thích Claude Code
      Thỉnh thoảng tôi phải viết mã web, mà phía web có coverage dữ liệu huấn luyện quá tốt nên Claude là một lập trình viên web giỏi hơn tôi rất nhiều
      Nhưng khi cần đào sâu vào phần lõi thuật toán của công cụ tự động hóa tôi đang làm thì Claude có ít thứ để bám vào hơn nên cũng mắc nhiều lỗi hơn
      Dù vậy xét tổng thể vẫn là điểm cộng nên tôi sẵn sàng trả tiền để dùng
      Chỉ riêng vai trò trợ lý phát triển web thôi cũng đã rất hữu ích

    • Tôi nghĩ đây lại là hiện tượng tự nhiên
      Đây là tình huống viết mã mới mẻ và độc đáo
      Nhiều người đang chỉ trích câu trả lời của Karpathy, nhưng việc anh ấy đã thử claude/codex lại cho thấy trước đây các công cụ đó thực sự từng có ích

    • Một liên kết mirror khác cho tweet của Karpathy ở đây

  • Thật ấn tượng khi nanochat được truyền cảm hứng từ modded-nanoGPT
    Phả hệ là nano-GPT của Karpathy → modded-nanoGPT của Keller Jordan (phiên bản huấn luyện mô hình nhanh) → NanoChat
    Điều đáng chú ý ở modded-nanoGPT là khả năng huấn luyện các mô hình GPT nhỏ với tốc độ cực nhanh
    Đặc biệt, nó dùng Muon optimizer (do chính tác giả phát triển) cho linear layer thay vì AdamW
    modded-nanoGPT, Giới thiệu Muon optimizer

    • Muon là bộ tối ưu mà Keller Jordan tạo ra cho cuộc thi huấn luyện nhanh này, và còn được cải tiến thêm bởi người khác
      Chưa đầy một năm mà nó đã được dùng rộng rãi như SOTA trong huấn luyện mô hình

    • Việc chạy một node inference đơn lẻ bằng 8xH100 khá gây sốc
      Không rõ các frontier LLM dùng trong thực tế cũng chạy ở mức này hay còn ngốn nhiều VRAM/tính toán hơn nữa
      Khoảng $8 mỗi giờ, giả sử mỗi request mất 5 giây thì xử lý được cỡ 700 request
      Tức là khoảng 1 xu cho mỗi request
      Không biết tôi có tính sai ở đâu không

  • Hiện tại việc huấn luyện vẫn đang diễn ra thật sự (bắt đầu từ 20 phút trước)
    Log chạy công khai
    Sau 4 giờ nữa khi mô hình hoàn tất thì sẽ được chia sẻ để bất kỳ ai cũng có thể thử inference

    • Đã upload mô hình hoàn thành lên Hugging Face
      Tôi không đạt kết quả tốt như Karpathy (có lẽ seed không đẹp?)
      Nhưng vẫn rất vui để thử nghiệm
      Ví dụ, khi hỏi "chó có mấy chân?" thì
      Assistant: "Đó là một câu hỏi thực sự thú vị và đã được tranh luận suốt nhiều thế kỷ giữa những người yêu chó. Không có một 'đáp án đúng' duy nhất (...)"

    • Trong phần bình luận cạnh biểu đồ đầu tiên
      "Thước đo tiến bộ chính. Bits per byte, như Karpathy nói, là 'một chỉ số tốt hơn rất nhiều so với cross-entropy loss thông thường. Nó chuẩn hóa loss theo số byte trên mỗi token, giúp so sánh được bất kể tokenizer nào'"
      Đây là lời giải thích quá rõ ràng, đến mức tôi thấy ngại vì đã không nghĩ ra điều này khi thử nghiệm tokenizer của mình trên tinystories
      Tôi muốn phân tích lại xem tokenizer của mình thực sự tốt đến mức nào

    • Sẽ rất hay nếu có một 'howto' ngắn về cách chạy repo này để huấn luyện với W&B
      Không biết có thể chia sẻ từng bước cho một lập trình viên chưa từng đi qua quy trình huấn luyện mô hình lần nào hay không

  • Thú vị thật!
    Trình tạo Shakespeare của Karpathy là một trong những dự án đầu tiên tôi thử nghiệm sau ollama
    Mục đích là để hiểu nguyên lý hoạt động của LLM
    Từ tuần trước tôi đã lao vào LLM và đang tự xây dựng từ số 0 một hệ thống huấn luyện/suy luận với hai backend

    • CPU (dựa trên JAX)
    • GPU (dựa trên wgpu-py)
      Tôi khá dị ứng với rocm/pytorch vì quá phiền phức
      Vulkan thì rất ổn. llama-cpp cũng dùng theo hướng đó
      Tuần vừa rồi tôi đã làm cho cả backend CPU/GPU đều chạy được và tập trung sửa bug ở backend GPU
      Tôi đã refactor mã WGSL và tăng hiệu quả của nó
      Trong quá trình này tôi dùng LLM rất tích cực và đó là một bước ngoặt đáng kinh ngạc
      Chỉ cần dùng prompt refactoring là có thể bắt lỗi từng bước và cuối cùng tạo ra mã còn type-check được bằng astral ty
    • Dị ứng với pytorch sao?
      Khó mà chọn được phương án nào kém hiệu quả hơn thế này nữa
  • Cuối tuần này tôi đã thử nanoGPT(liên kết)
    Dù là một dự án khá cũ, đây vẫn là một bài thực hành tuyệt vời để tự tạo và huấn luyện một GPT Shakespeare nhỏ
    Tôi chạy nó trên CPU với khoảng 0.8M tham số
    Kết quả cho ra đại khái là 'không hay' đúng như dự đoán
    Nhưng vẫn mang lại cảm giác như phép màu
    Với những ai không học chuyên sâu về deep learning mà chỉ thích mày mò và hack thử thì đây là điểm khởi đầu tuyệt vời nhất
    Tôi vẫn chưa viết xong bài blog về trải nghiệm nanoGPT cuối tuần này... nếu xong rồi tôi đã gắn vào đây

    • Đây là bài thực hành hữu ích vì cho thấy nghiên cứu ML tốt có thể được kiểm chứng ở quy mô nhỏ
      Ví dụ mới này còn tiến thêm một bước khi bao quát instruction following, tool use SFT, và cả RLVR
      Nhờ đó tạo ra một baseline hữu ích hơn nhiều

    • Chỉ cần tinh chỉnh nhẹ mã Shakespeare để huấn luyện trên dữ liệu khác là có thể tạo bộ bài Magic The Gathering commander khá ổn

  • "nhận được lời khuyên từ Alec Radford, chief LLM whisperer"
    Nếu một podcast giữa Alec và Andrej thật sự ra đời thì chắc sẽ làm rung chuyển cả thế giới
    Từ thời hoàng kim của GPT1 đến giờ chỉ mất 4 tiếng để dựng được GPT3

    • Làm ơn hãy có podcast đó, như vậy sẽ hoàn hảo
  • Eureka Labs: Liên kết Github
    Andrej đúng là một con người làm việc năng suất phi thường và đáng kinh ngạc
    Chỉ riêng việc theo dõi công việc của anh ấy cũng đã là một trải nghiệm tuyệt vời

  • Tôi luôn nghĩ cách đóng góp tốt nhất cho nhân loại
    là tích giữa số người mình giúp được và mức độ mình giúp họ sâu đến đâu
    Công việc mã nguồn mở mà Karpathy đang làm là cách tiếp cận có đòn bẩy lớn nhất theo nghĩa đó
    Thế giới ngày nay cũng được xây dựng trên các dự án mã nguồn mở
    Nhờ sự tự do mà bất kỳ ai trên thế giới cũng có thể học lập trình miễn phí và tạo ra phần mềm
    Tôi mong lĩnh vực AI/LLM cũng sẽ đi theo hướng tích cực như vậy

    • Tôi cũng rất thích truyền thống miễn phí/chia sẻ này trong phần mềm
      Nhưng với LLM thì có vẻ khó duy trì dòng chảy đó vì chi phí huấn luyện quá cao và phần cứng hiệu năng cao quá đắt
      Có lẽ trong tương lai việc phát triển phần mềm cũng sẽ trở thành cấu trúc phải trả 'tiền thuê' cho các dịch vụ host LLM để theo kịp
      Có thể rồi sẽ có cách đưa môi trường suy luận on-prem (local) trở lại mức ai cũng dùng được
      Nhưng hiện tại vẫn khá mờ mịt vì chi phí huấn luyện cao
      Và khi mức độ phụ thuộc vào LLM tăng lên
      tôi lo rằng nội dung 'làm thủ công' như tutorial cho người mới học lập trình sẽ ngày càng ít đi

    • (Hơi dài một chút, nhưng tất cả đều xuất phát từ mong muốn về một thế giới tốt đẹp hơn)
      Góc nhìn này hơi khác với tâm lý 'chống AI' chủ đạo
      Khái niệm sở hữu trí tuệ là một cấu trúc trong đó quyền sở hữu thông tin được tích lũy bởi một số cá nhân nhất định rồi cho toàn nhân loại thuê lại, hơn là đóng góp trực tiếp cho nhân loại
      Nhưng đồng thời cũng nhất thiết phải có môi trường để từng nhà sáng tạo có thể duy trì sinh kế
      Không chỉ công việc của Karpathy, mà tôi còn nghĩ hàng nghìn YouTuber trong các lĩnh vực khác nhau cũng đang đóng góp rất lớn cho xã hội
      Dù vậy, việc nhiều người phải phụ thuộc vào tài trợ vẫn có gì đó hơi chua chát
      Patreon cũng có, nhưng không phải giải pháp lý tưởng
      Tôi đồng ý rằng tất cả những nỗ lực này đều là cách đóng góp lớn cho xã hội
      Gần đây trên Daily Show, Jon Stewart đã gọi việc huấn luyện AI là strip mining của tri thức nhân loại
      Huấn luyện AI đôi khi bị quy kết một chiều như thể là hành vi trộm cắp, nhưng thực ra tồn tại rất nhiều quan điểm khác nhau
      Xu hướng này rốt cuộc có thể sẽ củng cố một cấu trúc sở hữu tri thức siêu tư bản chủ nghĩa
      khiến quyền sở hữu ý tưởng ngày càng tập trung vào thiểu số
      Hiện tượng đó không giúp ích nhiều cho thế giới nói chung mà chỉ có lợi cho một vài nhóm
      Giao dịch quyền sở hữu trí tuệ rồi theo thời gian cũng sẽ càng tập trung vào số ít hơn
      Tôi nghĩ nhất thiết phải có thảo luận và cách diễn giải mới phù hợp với xã hội hiện đại
      Thật đáng tiếc khi tâm lý buông xuôi kiểu 'người ở trên sẽ chặn hết thôi, bàn cũng vô ích' lại cản trở tranh luận
      Điều quan trọng là được tự do thảo luận xem phải làm thế nào mới có thể tạo ra phương án tốt hơn

    • Tôi thường xuyên giới thiệu loạt video ANN/LLM from scratch của anh ấy
      Bài giảng cực kỳ rõ ràng, và phong cách code cũng rất Pythonic, gọn mà vẫn dễ đọc
      (phần vector hóa trong pytorch thì phức tạp, nhưng đó đơn giản là mảng vốn đã khó)
      Việc vừa xem video vừa học luôn cả phong cách như vậy giúp ích rất nhiều cho mọi người

  • Tôi tự hỏi liệu có thể huấn luyện một mô hình bằng toàn bộ sách, tài liệu, báo cáo và bài nghiên cứu tâm lý học mà tôi thực sự sở hữu, rồi chạy suy luận cho các câu hỏi chuyên biệt mỗi khi cần trên một node 1xH100(liên kết) hay không

    • Thực sự là có thể làm vậy, nhưng hiệu năng sẽ cực kỳ kém
      Trong trường hợp này tốt hơn nhiều là lấy một mô hình nhỏ đã pretrained rồi fine-tune trên dữ liệu của tôi
      hoặc dùng quy trình RAG (Retrieval Augmented Generation), hoặc kết hợp cả hai

    • Làm được
      Nhưng dùng một mô hình tổng quát rồi đưa tài liệu của bạn vào ngữ cảnh làm việc bằng nhiều cách khác nhau (ví dụ: RAG, hierarchical memories của Apple, v.v. liên kết bài báo) có thể còn cho kết quả tốt hơn

    • Có thể làm, nhưng vì bản thân dataset của bạn quá nhỏ nên hiệu quả sẽ kém hơn nhiều so với mô hình pretrained + fine-tune, hoặc mô hình nhỏ + RAG

    • Không được đâu

  • Dự án này thật sự rất truyền cảm hứng!
    Sẽ rất hay nếu biết được các ví dụ hiệu năng prompt thực tế hoặc kết quả thử nghiệm

    • Simon.incutio.com có chỉ ra rằng ở
      đây có ảnh chụp màn hình prompt thực tế