DEV Community

Cover image for Hướng Dẫn Tự Huấn Luyện ChatGPT Với Chi Phí Chỉ 50 Đô
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Hướng Dẫn Tự Huấn Luyện ChatGPT Với Chi Phí Chỉ 50 Đô

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ờ).

Dùng thử Apidog ngay hôm nay

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.

nanochat pipeline

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
Enter fullscreen mode Exit fullscreen mode

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ĩ.

scaling laws

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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))
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Bước 2: Tải dữ liệu huấn luyện

python -m nanochat.dataset -n 170
# ~17GB nén, 2B ký tự
Enter fullscreen mode Exit fullscreen mode

Bước 3: Huấn luyện tokenizer

python -m scripts.tok_train
python -m scripts.tok_eval
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)