nanoGPT: Huấn Luyện GPT Tối Giản Bằng PyTorch
nanoGPT là repo PyTorch tối giản, xây từ đầu của Andrej Karpathy để huấn luyện và finetune các mô hình ngôn ngữ cỡ GPT-2, và chính README hiện gọi nó là dự án cũ, đã ngừng phát triển, hướng sang một dự án mới hơn tên nanochat. Hãy dùng nanoGPT nếu bạn muốn đọc và chỉnh sửa một training loop GPT hoàn chỉnh trong vài trăm dòng code; bỏ qua nếu bạn cần một dự án đang được duy trì tích cực, vì nanochat mới là thứ tác giả hiện khuyên dùng.
nanoGPT là gì trong phát triển mô hình ngôn ngữ?
nanoGPT là một repo PyTorch gọn nhẹ để huấn luyện và finetune các mô hình GPT cỡ trung bình, được viết lại từ dự án minGPT trước đó của Karpathy, đánh đổi bớt phần rõ ràng mang tính giảng dạy của minGPT để lấy tốc độ huấn luyện. Toàn bộ mô hình nằm trong file model.py khoảng 300 dòng, còn training loop nằm trong train.py cũng khoảng 300 dòng, và cả hai đều có thể tuỳ chọn nạp trọng số GPT-2 đã huấn luyện sẵn do OpenAI phát hành.
Tính năng cốt lõi của nanoGPT
- ✓train.py là một training loop dạng boilerplate khoảng 300 dòng, còn model.py định nghĩa kiến trúc GPT với độ dài tương tự, theo README.
- ✓Tái tạo lại GPT-2 (124M) trên tập dữ liệu OpenWebText, đạt loss khoảng 2.85 sau khoảng 4 ngày huấn luyện trên một node 8xA100 40GB, theo số liệu chính README đưa ra.
- ✓Nạp trực tiếp các checkpoint GPT-2 do OpenAI phát hành, gồm cả bốn kích thước công khai 'gpt2', 'gpt2-medium', 'gpt2-large', và 'gpt2-xl', nên việc finetune không cần huấn luyện từ mô hình trắng.
- ✓Đi kèm sẵn các file cấu hình cho nhiều kịch bản khác nhau, từ chạy demo cấp ký tự chỉ dùng CPU đến tái tạo GPT-2 đầy đủ trên nhiều node qua torchrun.
- ✓Mặc định dùng torch.compile của PyTorch 2.0, theo README giúp giảm thời gian mỗi iteration từ khoảng 250ms xuống 135ms trên cấu hình tham chiếu của họ.
- ✓bench.py tách riêng phần tính toán cốt lõi của training loop để benchmark và profiling mà không kèm theo độ phức tạp còn lại của quá trình huấn luyện.
- ✓sample.py sinh văn bản từ checkpoint bạn tự huấn luyện hoặc từ mô hình GPT-2 do OpenAI phát hành, kể cả gpt2-xl, ngay từ command line.
Cài đặt nanoGPT để dùng cục bộ
Cài các thư viện phụ thuộc chỉ với một lệnh pip: `pip install torch numpy transformers datasets tiktoken wandb tqdm`. Theo README, transformers chỉ cần khi nạp checkpoint GPT-2 từ Hugging Face, datasets chỉ cần nếu bạn muốn tải và tiền xử lý OpenWebText, wandb là logging tuỳ chọn, còn tqdm chỉ để hiển thị thanh tiến trình. README không mô tả bước setup.py riêng nào ngoài dòng pip install đó; bạn clone repo về rồi chạy thẳng các script như train.py.
Ví dụ huấn luyện GPT cấp ký tự
Cách nhanh nhất để bắt đầu, theo README, là huấn luyện một GPT cấp ký tự trên các tác phẩm của Shakespeare. Chạy `python data/shakespeare_char/prepare.py` để tải một file text 1MB và biến nó thành train.bin và val.bin. Với GPU, `python train.py config/train_shakespeare_char.py` huấn luyện một Transformer 6 lớp, 6 head, ngữ cảnh 256 ký tự, 384 kênh đặc trưng; trên một GPU A100, README báo cáo việc này mất khoảng 3 phút và đạt validation loss tốt nhất là 1.4697. Lấy mẫu kết quả bằng `python sample.py --out_dir=out-shakespeare-char`. Trên MacBook hoặc máy chỉ có CPU, README đưa ra lệnh thu nhỏ quy mô (`--device=cpu --compile=False --block_size=64 --batch_size=12 --n_layer=4 --n_head=4 --n_embd=128 --max_iters=2000`) cũng chạy trong khoảng 3 phút nhưng cho loss 1.88; người dùng Apple Silicon có thể thêm `--device=mps` để tăng tốc khoảng 2-3 lần theo README. Để tái tạo GPT-2 (124M) trên OpenWebText, chạy `python data/openwebtext/prepare.py` để tokenize dữ liệu, rồi chạy `torchrun --standalone --nproc_per_node=8 train.py config/train_gpt2.py` trên một node 8xA100 40GB; README nói việc này mất khoảng 4 ngày và đạt loss gần 2.85. Việc finetune một checkpoint có sẵn dùng lại cùng điểm vào train.py với learning rate nhỏ hơn, ví dụ `python train.py config/finetune_shakespeare.py`, mà README nói có thể xong chỉ trong vài phút trên một GPU vì tập dữ liệu Shakespeare nhỏ được tokenize trong vài giây thay vì phải tải OpenWebText.
Điểm mạnh
- ✓Toàn bộ mô hình và training loop đủ ngắn để đọc trọn trong một lần: model.py và train.py mỗi file khoảng 300 dòng, theo README.
- ✓Nạp trực tiếp checkpoint GPT-2 chính thức của OpenAI để finetune, lên đến kích thước 1.3B tham số gpt2-xl, nên bạn không bị giới hạn phải huấn luyện từ đầu.
- ✓Các file cấu hình có sẵn và hoạt động thật, bao trùm nhiều loại phần cứng, từ demo 3 phút trên CPU/MacBook đến tái tạo GPT-2 đầy đủ trên nhiều node 8xA100.
- ✓Giấy phép MIT, nên không có ràng buộc nào khi tái sử dụng trong code huấn luyện của riêng bạn.
- ✓torch.compile được bật mặc định và README báo cáo nó giảm gần một nửa thời gian mỗi iteration trên benchmark tham chiếu của họ, một mức tăng tốc thật chứ không chỉ là lời quảng cáo.
Những điều cần lưu ý và tình trạng dự án
- △Hạn chế lớn nhất theo chính README là bản thân dự án: kể từ bản cập nhật tháng 11/2025, nanoGPT được gọi là 'rất cũ và đã ngừng phát triển', được giữ lại 'cho mục đích lưu trữ' thay vì phát triển tích cực, với nanochat được nêu tên là dự án thay thế.
- △torch.compile, thứ cấu hình mặc định dựa vào để tăng tốc, được README mô tả là 'khá mới và mang tính thử nghiệm', và README cũng nói riêng rằng nó chưa khả dụng trên mọi nền tảng, kể cả Windows; cách khắc phục là thêm --compile=False, việc này theo README sẽ làm chậm quá trình huấn luyện.
- △Để tái tạo GPT-2 (124M) từ đầu cần một node 8xA100 40GB theo README, đây không phải phần cứng mà đa số nhà phát triển cá nhân có sẵn.
- △Danh sách todo trong chính README, gồm hỗ trợ FSDP, đánh giá zero-shot perplexity, cải thiện siêu tham số cho finetuning, và embedding rotary/alibi, chưa từng được đánh dấu hoàn thành, và khi dự án đã ngừng phát triển thì không có dấu hiệu nào cho thấy chúng sẽ được làm tiếp.
- △Huấn luyện multi-node được ghi nhận là hoạt động được nhưng chính README cảnh báo nó 'nhiều khả năng sẽ rất chậm' nếu không có Infiniband, nên việc thiết lập mạng quan trọng hơn những gì tài liệu thể hiện thoáng qua.
Các lựa chọn thay thế nanoGPT được khuyên dùng
Câu hỏi thường gặp về nanoGPT
nanoGPT không còn được duy trì tích cực nữa. README nói rằng kể từ bản cập nhật tháng 11/2025, dự án 'rất cũ và đã ngừng phát triển', được giữ lại 'cho mục đích lưu trữ' trong khi việc phát triển đã chuyển sang một dự án mới có tên nanochat.
README của nanoGPT hướng người đọc sang nanochat, gọi đây là 'người anh em họ mới và cải tiến hơn', và nói rằng đây rất có thể là thứ người tìm đến nanoGPT thực sự đang cần.
nanoGPT có thể tái tạo GPT-2 (124M) trên OpenWebText qua train.py. README báo cáo loss đạt được là khoảng 2.85, khớp với một checkpoint GPT-2 chính thức đã finetune trên cùng tập dữ liệu do có khoảng cách domain giữa OpenWebText và WebText gốc.
Yêu cầu phần cứng của nanoGPT thay đổi theo mục tiêu. Demo GPT cấp ký tự trên Shakespeare chạy khoảng 3 phút trên một GPU A100, hoặc chạy được ở quy mô nhỏ hơn trên CPU/Apple Silicon, còn tái tạo GPT-2 (124M) trên OpenWebText cần ít nhất một node 8xA100 40GB theo README.
nanoGPT được phát hành theo giấy phép MIT, theo thông tin trên trang GitHub của repo.
Huấn luyện GPT-2 (124M) để tái tạo kết quả trong paper gốc mất khoảng 4 ngày trên một node 8xA100 40GB dùng PyTorch Distributed Data Parallel, theo README của nanoGPT.
Vấn đề nanoGPT giải quyết
Phần lớn repo hướng đến việc dạy cơ chế bên trong của GPT phải đánh đổi tốc độ để lấy sự rõ ràng, còn phần lớn repo xây cho tốc độ huấn luyện thật lại giấu mô hình sau nhiều lớp trừu tượng mà bạn phải bóc tách mới thấy được điều đang thực sự diễn ra. README của nanoGPT đóng khung lý do tồn tại của chính nó quanh khoảng trống đó: đây là bản viết lại từ dự án minGPT trước đó của Karpathy, đánh đổi bớt sự rõ ràng mang tính giảng dạy của minGPT để lấy tốc độ huấn luyện, giữ cho cả mô hình và training loop mỗi phần chỉ khoảng 300 dòng trong khi vẫn có thể tái tạo một lượt huấn luyện GPT-2 đầy đủ.
Trường hợp sử dụng tốt nhất
- •Học cách một training loop GPT thực sự hoạt động từ đầu đến cuối, vì model.py và train.py theo README đều đủ ngắn để đọc trọn trong một lần.
- •Huấn luyện một mô hình ngôn ngữ nhỏ cấp ký tự trên kho văn bản của riêng bạn, dùng quy trình Shakespeare làm mẫu, trên GPU, CPU, hoặc Mac Apple Silicon.
- •Finetune một checkpoint GPT-2 có sẵn của OpenAI (lên đến kích thước 1.3B gpt2-xl, theo README) trên một tập dữ liệu hẹp chỉ với vài phút thời gian GPU.
- •Tìm hiểu thiết kế của nanoGPT như bối cảnh lịch sử trước khi chuyển sang dự án nanochat mới hơn của Karpathy, vì chính README đã đóng khung nanoGPT là dự án đã bị thay thế.
Ai nên dùng — và ai nên bỏ qua
Hãy thử nanoGPT nếu bạn muốn một codebase gọn để đọc, chỉnh sửa, hoặc fork cho các thử nghiệm huấn luyện GPT của riêng mình, đặc biệt nếu bạn coi trọng việc lần theo được từng dòng code thay vì import một thư viện đóng hộp. Bỏ qua nếu bạn đang bắt đầu một dự án mới hôm nay: chính README nói nanoGPT đã ngừng phát triển và khuyên nhìn sang nanochat, và cũng bỏ qua nếu bạn không có GPU, vì demo cấp ký tự là con đường duy nhất chạy thoải mái trên CPU hay Mac Apple Silicon.
Chưa chắc nanoGPT 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ề nanoGPT.
