TÓM TẮT
nanochat là framework huấn luyện LLM mã nguồn mở của Andrej Karpathy, cho phép bạn huấn luyện chatbot cấp độ GPT-2 với chi phí dưới 50 đô trong khoảng 2 giờ. Dự án tận dụng một nút GPU 8xH100 duy nhất, mã tối giản (~500 dòng cho mô hình cốt lõi), và chỉ một công tắc cấu hình (--depth) để tự tối ưu hóa mọi siêu tham số. Kết quả: huấn luyện hoàn tất trong 1,65 giờ với điểm CORE 0,2626 – vượt GPT-2 năm 2019 của OpenAI (43.000 đô, 168 giờ).
Giới thiệu
Trước đây, huấn luyện một mô hình ngôn ngữ lớn đòi hỏi ngân sách hàng triệu đô và đội ngũ nghiên cứu chuyên sâu. Thời kỳ đó đã thay đổi.
Andrej Karpathy vừa ra mắt nanochat – dự án mã nguồn mở cho phép bạn huấn luyện AI đàm thoại cấp GPT-2 với chi phí chỉ bằng một bữa tối. Toàn bộ quá trình chỉ cần một nút GPU 8xH100 và hoàn thành trong chưa đầy 2 giờ.
Tại sao điều này lại quan trọng lúc này
Năm 2026, AI đã tiến hóa vượt bậc. Việc OpenAI từng mất 168 giờ và 43.000 đô (2019) giờ đây chỉ còn 1,65 giờ và 48 đô. Điều này mở ra cơ hội cho mọi nhà phát triển API, nhóm xây dựng ứng dụng AI: bạn có thể tự huấn luyện, kiểm thử mô hình tùy chỉnh, hiểu cách hoạt động nội bộ của LLM mà không cần hạ tầng đắt đỏ.
💡 Kết hợp với nền tảng phát triển API như Apidog để kiểm thử, tài liệu hóa dịch vụ AI – bạn sẽ có bộ giải pháp hoàn chỉnh cho phát triển ứng dụng AI thực tế.
Bạn sẽ học được gì
- Cách nanochat giảm chi phí huấn luyện LLM gấp 100 lần
- Kiến trúc hoàn chỉnh (mô hình GPT, optimizer Muon, data loader)
- Hướng dẫn từng bước huấn luyện mô hình riêng
- Cách dùng nanochat để nghiên cứu, thử nghiệm LLM nhanh chóng
- Hiểu hạn chế thực tế của GPT-2 và ý nghĩa ứng dụng
nanochat là gì?
nanochat là framework huấn luyện LLM tối giản bao trùm toàn bộ quy trình: mã hóa (tokenization), huấn luyện trước (pretraining), tinh chỉnh (finetuning), đánh giá (evaluation), suy luận (inference) và web UI kiểu ChatGPT.
Codebase gọn trong một repo duy nhất, không config phức tạp. Karpathy thiết kế như một baseline mạnh, dễ đọc, dễ sửa đổi, dễ phân nhánh.
Điểm mạnh cốt lõi
Huấn luyện mô hình GPT-2 (1,6B tham số) với:
- 48 đô theo yêu cầu (2 giờ × 24 đô/giờ trên 8xH100)
- ~15 đô trên spot instance
So sánh: GPT-2 gốc của OpenAI (2019) tốn 43.000 đô, 7 ngày trên 32 TPU v3.
nanochat bao gồm gì?
| Giai đoạn | Tập lệnh | Mô tả |
|---|---|---|
| Tokenization | scripts.tok_train |
Huấn luyện tokenizer BPE (vocab 32.768) |
| Pretraining | scripts.base_train |
Huấn luyện mô hình GPT |
| Finetuning (SFT) | scripts.chat_sft |
Tinh chỉnh có giám sát cho chatbot |
| Evaluation | scripts.base_eval |
Đánh giá CORE, bits-per-byte |
| Inference CLI | scripts.chat_cli |
Chat interface dòng lệnh |
| Web UI | scripts.chat_web |
Chat web kiểu ChatGPT |
Triết lý: Một nút điều khiển mọi thứ
Khác với các framework LLM truyền thống, nanochat chỉ cần một tham số: --depth (số lớp transformer).
# Mô hình GPT-1
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=12
# GPT-2
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=24
# Đẩy mạnh
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26
Chỉ cần đặt depth, các thông số khác (chiều rộng transformer, số attention head, learning rate, epoch, batch size, weight decay...) sẽ tự động tính toán tối ưu.
Triết lý "một nút điều khiển" giúp bạn dễ dàng spawn nhiều mô hình tối ưu hóa, lặp thử nghiệm cực nhanh.
Vì sao cách này hiệu quả?
Nhóm phát triển đo lường scaling laws qua nhiều lần huấn luyện, nhận ra mối quan hệ dự đoán được giữa depth, width, batch size, train time. Các mối quan hệ này được encode trực tiếp vào code – bạn không còn phải tinh chỉnh thủ công hoặc có bằng tiến sĩ.
Bảng xếp hạng: Cuộc đua đánh bại GPT-2
nanochat duy trì bảng xếp hạng công khai tracking khả năng "đánh bại GPT-2". Mục tiêu là vượt điểm CORE 0.256525 của OpenAI trên 22 benchmark DCLM.
| Lần chạy | Mô hình | Thời gian | CORE | Đổi mới chính |
|---|---|---|---|---|
| GPT-2 gốc | 1.6B | 168h | 0.2565 | Baseline OpenAI 2019 |
| Lần chạy 1 | d24 | 3.04h | 0.2585 | Baseline |
| Lần chạy 2 | d26 | 2.91h | 0.2578 | Huấn luyện FP8 |
| Lần chạy 3 | d26 | 2.76h | 0.2602 | Batch size 1M token |
| Lần chạy 4 | d24 | 2.02h | 0.2571 | Dataset ClimbMix |
| Lần chạy 5 | d24 | 1.80h | 0.2690 | AI khám phá tối ưu mới |
| Lần chạy 6 | d24 | 1.65h | 0.2626 | Cải thiện smear/backout |
Hệ thống "autoresearch" – AI tự khám phá tối ưu
Các lần chạy gần nhất ứng dụng hệ thống AI thử nghiệm ý tưởng kiến trúc trên mô hình nhỏ (d12, huấn luyện 5 phút), sau đó áp dụng các thay đổi thắng lên full-scale d24. Các tối ưu như backout, smear được phát hiện tự động, giúp giảm 19% thời gian train.
nanochat hoạt động thế nào?
1. Mô hình GPT (nanochat/gpt.py)
Transformer tích hợp các tối ưu mới nhất:
- Rotary embeddings (RoPE): mã hóa vị trí tương đối
- QK normalization: ổn định train quy mô lớn
- Untied weights: nhúng token và chiếu output tách biệt
- ReLU² activation: MLP dùng ReLU bình phương
- Grouped Query Attention: ít đầu KV hơn, inference nhanh
- Sliding window attention: mẫu SSSL cho ngữ cảnh dài-ngắn
- Flash Attention 3: tận dụng GPU Hopper
Nhúng giá trị (ResFormer):
if ve is not None:
ve = ve.view(B, T, self.n_kv_head, self.head_dim)
gate = 3 * torch.sigmoid(self.ve_gate(x[..., :self.ve_gate_channels]))
v = v + gate.unsqueeze(-1) * ve
Các thủ thuật hiệu quả:
# 1. Residual scaling
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0
# 2. Smear: trộn nhúng token trước đó
gate = self.smear_lambda * torch.sigmoid(self.smear_gate(x[:, :, :24]))
x = x + gate * x_pre_smear
# 3. Backout: trừ phần dư ở lớp giữa
x = x - self.backout_lambda * x_backout
2. Optimizer Muon (nanochat/optim.py)
| Tham số | Optimizer | Mục đích |
|---|---|---|
| Embedding, lm_head | AdamW | Tối ưu thích ứng |
| Scalar param | AdamW | Hệ số học được |
| Matrix 2D | Muon | Update trực giao hóa |
Muon (MomentUm trực giao hóa bằng Newton-Schulz):
polar_express_coeffs = [
(8.156, -22.483, 15.879),
(4.043, -2.809, 0.500),
# ...
]
for a, b, c in polar_express_coeffs[:ns_steps]:
A = X.mT @ X
B = b * A + c * (A @ A)
X = a * X + X @ B
Giảm phương sai NorMuon:
v_mean = g.float().square().mean(dim=red_dim, keepdim=True)
v_norm = v_mean.sum(dim=(-2, -1), keepdim=True).sqrt()
final_scale = step_size * (v_norm / v_norm_new.clamp_min(1e-10))
g = g * final_scale.to(g.dtype)
Huấn luyện phân tán (ZeRO-2):
Pha 1: reduce_scatter không đồng bộ
Pha 2: Chờ giảm, update, all_gathers
Pha 3: Chờ gom, copy lại tham số đã update
3. Quản lý độ chính xác (nanochat/common.py)
| Phần cứng | dtype mặc định | Lý do |
|---|---|---|
| CUDA SM 80+ (A/H100) | bfloat16 | Hỗ trợ BF16 native |
| CUDA < 80 (V100) | float32 | Không có BF16 |
| CPU/MPS | float32 | Không có lõi giảm chính xác |
Lớp Linear tùy chỉnh chuyển trọng số theo dtype input:
class Linear(nn.Linear):
def forward(self, x):
return F.linear(x, self.weight.to(dtype=x.dtype))
Huấn luyện FP8 hỗ trợ trên H100/Blackwell với --fp8.
4. Data loader (nanochat/dataloader.py)
- Đóng gói tài liệu best-fit căn chỉnh BOS
- 100% pack, ~35% token bị cắt ở sequence 2048
- Tối ưu cho mọi token truy cập BOS
best_idx = -1
best_len = 0
for i, doc in enumerate(doc_buffer):
doc_len = len(doc)
if doc_len <= remaining and doc_len > best_len:
best_idx = i
best_len = doc_len
if best_idx >= 0:
doc = doc_buffer.pop(best_idx)
# Thêm tài liệu đầy đủ
else:
# Cắt tài liệu ngắn nhất
5. Flash Attention unification (nanochat/flash_attention.py)
from nanochat.flash_attention import flash_attn
y = flash_attn.flash_attn_func(q, k, v, causal=True, window_size=window_size)
Tự động chuyển FA3 (GPU Hopper + BF16) hoặc fallback PyTorch SDPA.
6. Inference engine (nanochat/engine.py)
- KV Cache: Tận dụng flash_attn_with_kvcache
- Tool Use: Token đặc biệt gọi Python eval()
- Batch Generation: Copy cache, sample song song
Hướng dẫn từng bước: Huấn luyện mô hình của bạn
Tất cả nằm trong runs/speedrun.sh. Dưới đây là các bước triển khai thực tế:
Điều kiện tiên quyết
- 1 nút GPU 8xH100 (hoặc tương tự)
- ~20GB dung lượng ổ cứng
- Python 3.10+
- Trình quản lý gói uv
Bước 1: Thiết lập môi trường
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
source .venv/bin/activate
uv sync --extra gpu
Bước 2: Tải dữ liệu huấn luyện
python -m nanochat.dataset -n 170
# ~17GB nén, 2B ký tự
Bước 3: Huấn luyện tokenizer
python -m scripts.tok_train
python -m scripts.tok_eval
Bước 4: Huấn luyện pretrain mô hình cơ sở
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=24 \
--target-param-data-ratio=8 \
--device-batch-size=16 \
--fp8 \
--run=my-first-model
Bước 5: Tinh chỉnh có giám sát (SFT)
curl -L -o ~/.cache/nanochat/identity_conversations.jsonl \
https://karpathy-public.s3.us-west-2.amazonaws.com/identity_conversations.jsonl
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft -- \
--device-batch-size=16 \
--run=my-sft
Bước 6: Trò chuyện với mô hình
python -m scripts.chat_cli -p "Tại sao bầu trời màu xanh?"
# hoặc
python -m scripts.chat_web
Web UI chạy cổng 8000, giao diện giống ChatGPT.
Quy trình nghiên cứu: Thử nghiệm nhanh
Muốn thử nghiệm ý tưởng mới? Dùng mô hình nhỏ để lặp nhanh.
Thử nghiệm nhanh (~5 phút)
OMP_NUM_THREADS=1 torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=12 \
--run="d12-test" \
--core-metric-every=999999 \
--sample-every=-1 \
--save-every=-1
Theo dõi chỉ số
- val_bpb: bits-per-byte validation
- core_metric: CORE score
- train/mfu: FLOPS utilization
- train/tok_per_sec: throughput
Kiểm thử
Bất kỳ cải tiến nào cũng phải chạy ổn định trên tất cả depth (d12 tới d26).
Tại sao nanochat quan trọng?
Chi phí dễ tiếp cận
| Phương pháp | Chi phí | Thời gian | Phần cứng |
|---|---|---|---|
| GPT-2 OpenAI (2019) | 43.000 đô | 168h | 32 TPU v3 |
| nanochat (2026) | 48 đô | 2h | 8xH100 |
| nanochat spot | ~15 đô | 2h | 8xH100 spot |
Ai cũng có thể tiếp cận: cá nhân, startup nhỏ, sinh viên, người đam mê.
Giá trị giáo dục
- ~500 dòng mô hình GPT
- ~530 dòng optimizer
- Bình luận rõ ràng, không config ẩn
- Đọc, sửa, thử nghiệm quy trình LLM đầy đủ
Tốc độ nghiên cứu
- Thử nghiệm, lặp giả thuyết nhanh
- Nhiều thử nghiệm/tuần, thất bại rẻ
- Cộng đồng cùng đóng góp qua bảng xếp hạng
Tính minh bạch
- Quy luật mở rộng, phân tích chi tiết trong code
- Tài liệu hóa rõ ràng mọi quyết định thiết kế
- Đầy đủ log, tái tạo bảng xếp hạng
Hạn chế và thực tế
Yêu cầu phần cứng
- 48 đô giả định có thuê 8xH100 (~24 đô/giờ hoặc 15 đô/giờ spot)
- Cần 50-100 đô cho một lần train đầy đủ (tuỳ nhà cung cấp)
Giới hạn năng lực
Có thể:
- Chat cơ bản, lý luận đơn giản, toán học cơ bản, ghi nhớ hạn chế
Không thể:
- Lý luận nhiều bước, lập trình phức tạp, tuân thủ chỉ dẫn tinh vi, không cạnh tranh GPT-4/Claude
Yêu cầu dữ liệu
- ~170 mảnh, ~17GB, ~2B ký tự
- Cần băng thông và ổ cứng đủ lớn
Hạn chế chỉ số
- CORE chỉ đo 22 task; không đo chất lượng hội thoại thực tế, kiến thức chuyên ngành, tuân thủ chỉ dẫn, an toàn
- Kết quả dao động ~0.016 tuỳ seed ngẫu nhiên
Câu hỏi thường gặp
Chi phí huấn luyện với nanochat?
Khoảng 48 đô (24 đô/giờ × 2h) hoặc ~15 đô spot. Thêm ~30 phút cho SFT.
Cần GPU gì?
Tối thiểu: 1 GPU (data center bất kỳ). Tối ưu: 8xH100/A100. Hỗ trợ tự động scale từ 1 đến 8 GPU.
Huấn luyện mất bao lâu?
1,65 tới 3 giờ tùy hardware và config.
CORE metric là gì?
Điểm DCLM CORE đánh giá 22 task (ARC, MMLU...). GPT-2: 0.256525; nanochat: ~0.26 trở lên.
Huấn luyện trên 1 GPU duy nhất được không?
Được. Không dùng torchrun, code tự động tích lũy gradient (huấn luyện lâu gấp 8 lần).
nanochat sử dụng bộ dữ liệu nào?
Hiện tại dùng ClimbMix (NVIDIA curate), trước đó FineWeb-EDU. Tokenizer huấn luyện trên ~2B ký tự.
nanochat có chạy trên Apple Silicon không?
Có, trên MPS (float32). Huấn luyện chậm hơn CUDA, phù hợp thử nghiệm nhỏ.
Tiếp tục huấn luyện từ checkpoint được không?
Có, dùng --resume-from-step=<step>.
Khác biệt giữa nanochat và nanoGPT?
nanoGPT chỉ pretrain. nanochat đầy đủ quy trình: tokenization, pretrain, SFT, RLHF, evaluate, inference, web UI.
Kết luận
nanochat cho thấy huấn luyện LLM không còn là đặc quyền của các tập đoàn lớn. Việc từng tốn 43.000 đô (2019) giờ chỉ còn dưới 50 đô.
Quan trọng hơn, code tối giản, dễ đọc, chỉ một tham số cấu hình – giúp mọi nhà phát triển, sinh viên tự nghiên cứu, thử nghiệm ngay trên hạ tầng phổ thông.
Những điểm chính
- Giảm chi phí 100 lần: 43.000 đô → 48 đô cho GPT-2
- Tăng tốc 100 lần: 168 giờ → 1,65 giờ
-
Chỉ một nút cấu hình:
--depth - Quy trình hoàn chỉnh: Từ tokenization tới web UI
- Cộng đồng thúc đẩy: Bảng xếp hạng công khai, cải tiến liên tục
Các bước tiếp theo
Sẵn sàng huấn luyện mô hình riêng? Bắt đầu với repo nanochat và script runs/speedrun.sh.
Với nhà phát triển API xây dựng AI, hiểu rõ nội bộ LLM chưa bao giờ dễ như hiện tại. Rào cản từ "startup được đầu tư mạo hiểm" nay chỉ còn là "dự án cuối tuần".


Top comments (0)