- 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
Ý 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
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
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
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
đây có ảnh chụp màn hình prompt thực tế