nanochat: tự train GPT-2 chỉ với khoảng $48
nanochat là bộ khung tối giản của Andrej Karpathy để train một mô hình chat kiểu GPT-2 trên một node GPU duy nhất, đóng gói trọn pipeline trong một codebase dễ đọc thay vì một framework cồng kềnh. Không có mê cung config ở đây: một núm vặn `--depth` duy nhất thay đổi kích thước cả mô hình. Sự tập trung đó khiến nanochat trở thành công cụ học tập và nghịch code thực sự tốt, chứ không phải một serving stack cho production.
nanochat là gì
nanochat là một codebase viết từ đầu để train một mô hình ngôn ngữ nhỏ kiểu ChatGPT trên một node GPU duy nhất, bao gồm tokenization, pretraining, finetuning, evaluation và inference trong cùng một chỗ. Một núm vặn duy nhất, `--depth`, quy định kích thước transformer và tự suy ra phần còn lại của hyperparameter. Script tham chiếu `runs/speedrun.sh` chạy trọn pipeline đó trên một node 8xH100 và đưa cho bạn một CLI để chat khi xong.
nanochat phủ những gì từ đầu đến cuối
- ✓Pipeline đầy đủ trong một repo: train tokenizer (BPE kiểu GPT-4), pretraining, supervised finetuning, RL, evaluation và inference đều nằm trong `nanochat/` và `scripts/`.
- ✓Một núm vặn độ phức tạp duy nhất: đặt `--depth` cho transformer sẽ tự suy ra độ rộng, số attention head, lịch learning rate, thời lượng train và weight decay cho một mô hình compute-optimal ở kích thước đó.
- ✓Kiểm soát precision tường minh thay vì `torch.amp.autocast` — một biến global `COMPUTE_DTYPE` duy nhất (bfloat16, float32 hoặc float16) tự nhận diện phần cứng và có thể ghi đè bằng biến môi trường `NANOCHAT_DTYPE`.
- ✓Các tác vụ evaluation dựng sẵn — ARC, GSM8K, HumanEval, MMLU và SmolTalk — nằm trong `tasks/` để chấm điểm mô hình chat, cộng với một bộ đánh giá DCLM CORE score cho base model.
- ✓Một inference engine dùng KV cache (`nanochat/engine.py`) và một module thực thi công cụ (`nanochat/execution.py`) cho phép mô hình đã train chạy code Python như một tool.
- ✓Một bảng xếp hạng GPT-2 speedrun công khai, theo dõi thời gian wall-clock và DCLM CORE score để tái lập năng lực GPT-2, kèm commit và người đóng góp cho từng mục.
Cài đặt với uv
nanochat dùng uv để quản lý dependency thay vì một requirements.txt thuần hay môi trường Conda. Chạy `uv sync --extra gpu` trên máy CUDA (A100, H100, v.v.) hoặc `uv sync --extra cpu` cho CPU-only hay Apple Silicon, sau đó `source .venv/bin/activate`. Nếu định sửa code, thêm `--group dev` vào lệnh sync gpu để cài thêm pytest, matplotlib, ipykernel và transformers phục vụ development. Không có package pip riêng để cài — bạn clone repo và làm việc ngay bên trong đó.
Chạy script speedrun GPT-2
Toàn bộ workflow tái lập GPT-2 nằm trong một file, `runs/speedrun.sh`, thiết kế để chạy trên node 8xH100 — thuê một node GPU từ nhà cung cấp cloud, chạy `bash runs/speedrun.sh` trong một screen session, rồi chờ khoảng 1,5 giờ. Xong thì activate lại venv và chạy `python -m scripts.chat_cli` để chat với mô hình qua một CLI đơn giản. Cùng đoạn code đó chạy được trên một GPU đơn bằng cách bỏ `torchrun`, chuyển sang gradient accumulation, nhưng bạn sẽ phải chờ lâu gấp khoảng tám lần. Nếu GPU có dưới 80GB VRAM, bạn cần giảm `--device-batch-size` từ mặc định 32 xuống 16, 8, 4, 2 hoặc 1 cho tới khi hết out-of-memory.
Điểm mạnh
- ✓Một file duy nhất (`runs/speedrun.sh`) đưa bạn từ một máy GPU trắng tinh đến một mô hình chat được ngay — không cần tự ráp data pipeline, train tokenizer hay dựng eval harness riêng.
- ✓Núm vặn `--depth` loại bỏ cả một mảng đoán mò hyperparameter: chọn kích thước mô hình, còn độ rộng, số head, learning rate và weight decay đều được suy ra sẵn.
- ✓Precision tường minh và dễ kiểm tra (`COMPUTE_DTYPE` trong `nanochat/common.py`) thay vì giấu trong `autocast`, điều này quan trọng khi bạn debug số liệu trên phần cứng lạ.
- ✓Codebase đủ nhỏ để đọc trọn từ đầu đến cuối, đúng trọng tâm nếu mục tiêu của bạn là hiểu cách pretraining, SFT và RL thực sự hoạt động thay vì coi chúng như hộp đen.
Những gì nanochat chưa làm được (ít nhất là chưa)
- △Chính README cũng nói phần lớn code chưa được thử nghiệm trên phần cứng ngoài CUDA — xpu và các backend không phải NVIDIA/Apple chưa được kiểm chứng và có thể còn lỗi vặt.
- △Train float16 được hỗ trợ GradScaler tự động cho giai đoạn SFT, nhưng README nói RL training hiện chưa có — bạn chỉ dùng được bfloat16 hoặc float32 ở đó.
- △Chạy trên CPU hay Apple Silicon (`runs/runcpu.sh`) thu nhỏ mô hình rất nhiều, đến mức README cảnh báo bạn sẽ không có kết quả tốt. Đây chỉ là smoke test, không phải một hướng train thật sự.
- △Đây là codebase nghiên cứu của một cá nhân, thiết kế cố tình chống framework: không có config object, không có model factory, nên muốn mở rộng thì phải sửa thẳng script chứ không truyền vào một config.
Lựa chọn thay thế để train LLM quy mô nhỏ
Câu hỏi thường gặp
Workflow tham chiếu của nanochat, `runs/speedrun.sh`, được thiết kế cho một node 8xH100 thuê từ nhà cung cấp cloud; README ghi rằng nó cũng chạy được trên node 8xA100, chỉ chậm hơn. Bạn cũng chạy được trên một GPU đơn, nhưng train sẽ lâu gấp khoảng tám lần vì tính song song của torchrun chính là thứ giúp lượt chạy 8 GPU nhanh hơn.
Train một mô hình GPT-2 class bằng script speedrun của nanochat mất khoảng 1,5 giờ trên node 8xH100, theo README, vốn cũng ghi con số này đã giảm từ khoảng 3 giờ ở các bản script trước đó. Với giá GPU cloud hiện tại, README tính chi phí compute cho lượt chạy đó vào khoảng $48.
nanochat được phát hành theo license MIT, nên bạn được tự do dùng, sửa và phân phối lại, kể cả cho mục đích thương mại. README có yêu cầu pull request công khai phần nào được viết với sự hỗ trợ đáng kể từ LLM, nhưng đó là quy định đóng góp, không phải giới hạn khi sử dụng code.
Được — README nói toàn bộ code chạy trên một GPU đơn chỉ bằng cách bỏ `torchrun`, cho kết quả gần như giống hệt nhờ gradient accumulation thay vì chạy song song, dù bạn sẽ phải chờ lâu hơn nhiều lần. Cũng có sẵn script `runs/runcpu.sh` riêng cho CPU hoặc Apple Silicon, nhưng README cảnh báo nó thu nhỏ mô hình đến mức kết quả sẽ không mạnh.
nanochat là dự án nối tiếp nanoGPT của Andrej Karpathy, và README mô tả nanoGPT chỉ phủ phần pretraining. nanochat mở rộng ra trọn pipeline — tokenization, pretraining, supervised finetuning, reinforcement learning, evaluation và inference — nên bạn có được một mô hình chat nói chuyện được, chứ không chỉ một checkpoint base model.
Có — thư mục `scripts/` của nanochat gồm `chat_sft.py` cho supervised finetuning và `chat_rl.py` cho reinforcement learning trên nền base model đã pretrain. README lưu ý một điểm về precision: train float16 được hỗ trợ GradScaler tự động cho SFT, nhưng chưa có cho RL training.
Vấn đề mà nanochat giải quyết
Phần lớn code train LLM công khai hiện nay hoặc là script đồ chơi train một mô hình tí hon trong notebook, hoặc là một framework production như những hệ thống đứng sau các sản phẩm ChatGPT thực thụ, được bọc trong nhiều lớp config dành cho cả team chứ không phải một người dùng GPU đi thuê. nanochat nằm ở khoảng giữa: nó chạy trọn pipeline từ tokenize đến chat, cho ra một mô hình GPT-2 class thật sự nói chuyện được, trên phần cứng mà một người có thể thuê trong vài giờ, mà không giấu giai đoạn nào sau lớp trừu tượng.
Trường hợp sử dụng tốt nhất
- •Học cách một mô hình kiểu ChatGPT thực sự được xây dựng, từng giai đoạn một, bằng cách đọc và chạy code train thật thay vì xem sơ đồ hay đọc blog post.
- •Chạy vòng lặp thử nghiệm nhanh tại chỗ — ví dụ trong README train một mô hình 12 layer, cỡ GPT-1, trong khoảng 5 phút để test một thay đổi code trước khi chạy full GPT-2 class.
- •Tái lập một điểm cụ thể trên đường cong compute-optimal scaling cho nghiên cứu, dùng `runs/scaling_laws.sh` hoặc `runs/miniseries.sh` để quét `--depth` qua một dải kích thước mô hình.
- •Có một mô hình ngôn ngữ nhỏ, chat được thật sự, với chi phí khoảng $48 tiền GPU cloud, mà không cần license một mô hình hosted hay xin API access.
Ai nên thử — và ai nên bỏ qua
nanochat hợp với developer và researcher muốn tự tay chạy mọi giai đoạn train LLM — tokenizer, pretraining, SFT, RL và inference — và không ngại thuê một node 8xH100 hoặc chờ một lượt train chậm hơn trên GPU đơn. Đây là lựa chọn tốt nếu bạn học bằng cách đọc code chạy thật, dày đặc, thay vì đọc documentation, và không phiền vì không có hệ thống config để dựa vào. Bỏ qua nếu bạn cần một mô hình chạy production ngay ngày mai, cần hỗ trợ multi-node hay phần cứng không phải NVIDIA mà README không hề nhắc tới, hoặc thà finetune một checkpoint có sẵn qua thư viện như transformers hay unsloth còn hơn train từ đầu.
Repo liên quan
Chưa chắc nanochat có hợp với bạn?
Để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm bên dưới và xem AI nói gì về nanochat.
