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

Ashley Innocent

Ashley Innocent

19 tháng 3 2026

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

TÓM TẮT

nanochat là khung huấn luyện LLM mã nguồn mở của Andrej Karpathy cho phép bạn huấn luyện một chatbot cấp độ GPT-2 với chi phí dưới 50 đô la trong khoảng 2 giờ. Dự án sử 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à một công tắc cấu hình (--depth) để tự động tối ưu hóa tất cả các siêu tham số. Các kỷ lục hiện tại cho thấy việc huấn luyện hoàn thành trong 1,65 giờ với điểm CORE là 0,2626, đánh bại GPT-2 năm 2019 của OpenAI, vốn tiêu tốn 43.000 đô la và mất 168 giờ.

Giới thiệu

Huấn luyện một mô hình ngôn ngữ lớn từng đòi hỏi hàng triệu đô la và một nhóm các nhà nghiên cứu có bằng tiến sĩ. Những ngày đó đã qua.

Andrej Karpathy vừa phát hành nanochat, một dự án mã nguồn mở huấn luyện một AI đàm thoại có khả năng với chi phí ít hơn một bữa tối ngon miệng. Toàn bộ quy trình chạy trên một nút GPU 8xH100 duy nhất và hoàn thành trong vòng chưa đầy 2 giờ.

Tại sao điều này lại quan trọng lúc này

Bức tranh AI đã thay đổi đáng kể vào đầu năm 2026. Những gì OpenAI đã mất 168 giờ và 43.000 đô la vào năm 2019 giờ đây chỉ mất 1,65 giờ và 48 đô la. Đó là một sự tăng tốc gấp 100 lần nhờ những cải tiến về thuật toán, phần cứng tốt hơn và tối ưu hóa cộng đồng.

Đối với các nhà phát triển API và các nhóm xây dựng ứng dụng hỗ trợ AI, điều này thay đổi mọi thứ. Giờ đây, bạn có thể thử nghiệm với việc huấn luyện mô hình tùy chỉnh, kiểm tra các thay đổi kiến trúc và hiểu rõ hơn về nội bộ LLM mà không cần ngân sách cơ sở hạ tầng khổng lồ.

💡
Kết hợp điều này với các nền tảng phát triển API như Apidog để kiểm thử và tài liệu hóa các dịch vụ AI của bạn, và bạn sẽ có một bộ giải pháp hoàn chỉnh để xây dựng các ứng dụng AI sản xuất.
button

Những gì bạn sẽ học

Sau khi đọc bài viết này, bạn sẽ hiểu:

nanochat là gì?

nanochat là một bộ khung huấn luyện LLM tối giản bao gồm toàn bộ quy trình phát triển: mã hóa (tokenization), huấn luyện trước (pretraining), tinh chỉnh (finetuning), đánh giá (evaluation), suy luận (inference) và giao diện người dùng web giống ChatGPT.

Cơ sở mã nằm gọn trong một kho lưu trữ duy nhất không có cấu hình phức tạp hay sự phức tạp của khung công tác. Karpathy thiết kế nó như một "baseline mạnh mẽ" có thể đọc được, dễ sửa đổi và phân nhánh.

Khẳng định cốt lõi

Huấn luyện một mô hình có khả năng GPT-2 (1,6 tỷ tham số) với:

Để so sánh, việc huấn luyện GPT-2 gốc của OpenAI vào năm 2019 có chi phí khoảng 43.000 đô la và mất 7 ngày trên 32 chip TPU v3.

Những gì nanochat bao gồm

Giai đoạn Tập lệnh Mô tả
Mã hóa (Tokenization) scripts.tok_train Huấn luyện bộ mã hóa BPE (từ vựng 32.768)
Huấn luyện trước (Pretraining) scripts.base_train Huấn luyện mô hình GPT cơ sở
Tinh chỉnh (Finetuning) scripts.chat_sft Tinh chỉnh có giám sát cho chatbot
Đánh giá (Evaluation) scripts.base_eval Chỉ số CORE, bits-per-byte
Suy luận (Inference) scripts.chat_cli Giao diện trò chuyện CLI
Giao diện Web (Web UI) scripts.chat_web Giao diện web giống ChatGPT

Triết lý: Một nút điều khiển mọi thứ

Hầu hết các khung LLM đều khiến bạn ngập trong các tệp cấu hình. nanochat đi theo hướng ngược lại.

Toàn bộ hệ thống xoay quanh một tham số: --depth (số lượng lớp transformer).

# Mô hình kích thước GPT-1
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=12

# Mô hình có khả năng GPT-2
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=24

# Đẩy mạnh giới hạn
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26

Đặt độ sâu, và nanochat tự động tính toán mọi thứ khác:

Triết lý "một nút điều khiển" này cho phép điều mà Karpathy gọi là chuỗi nanochat miniseries: một họ các mô hình tối ưu về tính toán với các kích thước khác nhau, tất cả đều được huấn luyện bằng cùng một phương pháp nguyên tắc.

Tại sao điều này hiệu quả

Nhóm đã đo lường các quy luật mở rộng (scaling laws) trên hàng chục lần huấn luyện. Họ tìm thấy mối quan hệ có thể dự đoán giữa độ sâu, chiều rộng, kích thước lô và thời gian huấn luyện. Thay vì phơi bày tất cả các nút điều khiển này, nanochat mã hóa trực tiếp các mối quan hệ này vào tập lệnh huấn luyện.

Bạn có được quá trình huấn luyện tối ưu về tính toán mà không cần phải có bằng tiến sĩ về học sâu.

Bảng xếp hạng: Cuộc đua đánh bại GPT-2

nanochat duy trì một bảng xếp hạng công khai theo dõi khả năng "thời gian đạt được GPT-2". Mục tiêu là đánh bại điểm CORE gốc của OpenAI là 0.256525 trên 22 tác vụ đánh giá (ARC, MMLU và các tác vụ khác từ bộ benchmark DCLM).

Kỷ lục hiện tại

Lần chạy Mô hình Thời gian Điểm CORE Đổi mới chính
GPT-2 gốc 1.6B 168 giờ 0.2565 Baseline của OpenAI 2019
Lần chạy 1 d24 3.04 giờ 0.2585 Baseline ban đầu
Lần chạy 2 d26 2.91 giờ 0.2578 Huấn luyện FP8
Lần chạy 3 d26 2.76 giờ 0.2602 Kích thước lô 1M token
Lần chạy 4 d24 2.02 giờ 0.2571 Bộ dữ liệu ClimbMix
Lần chạy 5 d24 1.80 giờ 0.2690 Các tối ưu hóa do AI khám phá
Lần chạy 6 d24 1.65 giờ 0.2626 Cải thiện smear/backout

Cách AI khám phá các tối ưu hóa

Các lần chạy 5 và 6 đã kết hợp các thay đổi từ hệ thống "autoresearch" của Karpathy. Một tác nhân AI đã khám phá các sửa đổi kiến trúc trên các mô hình d12 nhỏ (chạy huấn luyện 5 phút), sau đó chuyển các thay đổi chiến thắng sang thiết lập d24 đầy đủ.

Hệ thống đã tìm thấy những cải tiến cho:

Những thay đổi này đã giảm thời gian huấn luyện từ 2,02 giờ xuống còn 1,65 giờ, một cải tiến 19% được khám phá thông qua thử nghiệm tự động.

nanochat hoạt động như thế nào

Cơ sở mã bao gồm khoảng 3.000 dòng trên các mô-đun cốt lõi. Hãy cùng xem xét từng thành phần.

1. Mô hình GPT (nanochat/gpt.py)

Transformer tuân theo các thực hành tốt nhất hiện đại với một số tối ưu hóa:

Tính năng kiến trúc:

Nhúng giá trị (ResFormer): Các lớp xen kẽ bao gồm các nhúng giá trị có thể học được trộn lẫn thông qua cơ chế cổng phụ thuộc đầu vào:

# Phần dư giá trị: trộn nhúng giá trị với cổng theo từng đầu
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

Điều này bổ sung khả năng mà không tốn nhiều chi phí tính toán.

Các thủ thuật hiệu quả:

Mô hình bao gồm ba cơ chế học được giúp cải thiện động lực huấn luyện:

# 1. Chia tỷ lệ phần dư theo từng lớp
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0

# 2. Smear: trộn nhúng token trước đó để có thông tin bigram
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. Trình tối ưu hóa Muon (nanochat/optim.py)

nanochat sử dụng chiến lược trình tối ưu hóa hỗn hợp:

Loại tham số Trình tối ưu hóa Mục đích
Nhúng, lm_head AdamW Tối ưu hóa thích ứng tiêu chuẩn
Tham số vô hướng AdamW Hệ số chia tỷ lệ được học
Ma trận 2D Muon Cập nhật được trực giao hóa

Muon (MomentUm được trực giao hóa bởi Newton-Schulz):

Trình tối ưu hóa Muon trực giao hóa các cập nhật trọng số bằng cách sử dụng phương pháp lặp Newton-Schulz bậc năm gọi là "Polar Express":

# Hệ số Polar Express (5 lần lặp)
polar_express_coeffs = [
    (8.156, -22.483, 15.879),
    (4.043, -2.809, 0.500),
    # ... các hệ số khác
]

# Vòng lặp trực giao hóa
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:

Sau khi trực giao hóa, các cập nhật được chuẩn hóa theo từng nơ-ron để ngăn chặn sự sụp đổ thang đo:

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:

Đối với các thiết lập đa GPU, trình tối ưu hóa triển khai phân chia kiểu ZeRO-2 với giao tiếp không đồng bộ ba pha:

Pha 1: Khởi chạy tất cả các thao tác reduce_scatter không đồng bộ
Pha 2: Chờ giảm, tính toán cập nhật, khởi chạy all_gathers
Pha 3: Chờ gom, sao chép lại các tham số đã cập nhật

Điều này chồng chéo giao tiếp với tính toán, tối đa hóa việc sử dụng GPU.

3. Quản lý độ chính xác (nanochat/common.py)

nanochat quản lý độ chính xác một cách rõ ràng thay vì sử dụng torch.amp.autocast:

Phần cứng Kiểu dữ liệu mặc định Lý do
CUDA SM 80+ (A100, H100) bfloat16 Các lõi tensor BF16 gốc
CUDA SM < 80 (V100, T4) float32 Không hỗ trợ BF16
CPU / MPS float32 Không có lõi độ chính xác giảm

Lớp Linear tùy chỉnh chuyển đổi trọng số để khớp với kiểu dữ liệu tính toán trong quá trình chuyển tiếp:

class Linear(nn.Linear):
    def forward(self, x):
        return F.linear(x, self.weight.to(dtype=x.dtype))

Trọng số chính vẫn ở FP32 để trình tối ưu hóa có độ chính xác cao. Đối với GPU H100 và Blackwell, huấn luyện FP8 có sẵn thông qua --fp8, chuyển đổi hầu hết các lớp sang Float8Linear với chia tỷ lệ tensorwise.

4. Tải dữ liệu (nanochat/dataloader.py)

Bộ tải dữ liệu sử dụng đóng gói tốt nhất căn chỉnh BOS:

Điều này đảm bảo mọi token có thể chú ý ngược lại đến BOS và xem toàn bộ ngữ cảnh tài liệu.

# Tìm tài liệu lớn nhất vừa vặn hoàn toàn
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 để lấp đầy không gian còn lại

5. Hợp nhất Flash Attention (nanochat/flash_attention.py)

Dự án cung cấp một giao diện hợp nhất tự động chuyển đổi giữa FA3 và PyTorch SDPA:

from nanochat.flash_attention import flash_attn

# Hoạt động trên mọi phần cứng - tự động chọn backend tốt nhất
y = flash_attn.flash_attn_func(q, k, v, causal=True, window_size=window_size)

Trên GPU Hopper với bfloat16, nó sử dụng Flash Attention 3. Ở những nơi khác, nó sẽ chuyển sang sử dụng scaled dot-product attention của PyTorch.

6. Công cụ suy luận (nanochat/engine.py)

Lớp Engine xử lý việc tạo hiệu quả với:

Công cụ điều phối luồng hội thoại, bao gồm cả việc ép buộc các token đầu ra công cụ khi mô hình gọi máy tính.

Hướng dẫn từng bước: Huấn luyện mô hình của riêng bạn

Toàn bộ quy trình nằm trong runs/speedrun.sh. Đây là cách chạy nó.

Điều kiện tiên quyết

Bước 1: Thiết lập môi trường

# Cài đặt uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Tạo và kích hoạt môi trường ảo
uv venv
source .venv/bin/activate

# Cài đặt các phần phụ thuộc
uv sync --extra gpu

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

# Tải xuống ~2B ký tự từ bộ dữ liệu ClimbMix
python -m nanochat.dataset -n 170

# Điều này tải xuống ~170 mảnh với mỗi mảnh ~100MB
# Tổng cộng: ~17 GB đã nén

Tập lệnh tải xuống các mảnh dữ liệu huấn luyện trước với khóa tệp để xử lý phối hợp đa cấp.

Bước 3: Huấn luyện bộ mã hóa (Tokenizer)

# Huấn luyện bộ mã hóa BPE với 32.768 từ vựng
python -m scripts.tok_train

# Đánh giá tỷ lệ nén
python -m scripts.tok_eval

Bộ mã hóa sử dụng mẫu chia tách kiểu GPT-4 với BPE dự phòng byte. Huấn luyện hoàn thành trong khoảng 10 phút trên 2 tỷ ký tự.

Bước 4: Huấn luyện trước mô hình cơ sở

# Huấn luyện mô hình d24 (khả năng GPT-2)
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

Các tham số chính:

Thời gian chạy dự kiến: ~2 giờ.

Bước 5: Tinh chỉnh có giám sát

# Tải xuống các cuộc hội thoại danh tính
curl -L -o ~/.cache/nanochat/identity_conversations.jsonl \
    https://karpathy-public.s3.us-west-2.amazonaws.com/identity_conversations.jsonl

# Chạy SFT cho khả năng trò chuyện
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft -- \
    --device-batch-size=16 \
    --run=my-sft

Điều này dạy mô hình định dạng hội thoại, các token đặc biệt và cách sử dụng công cụ.

Bước 6: Trò chuyện với mô hình của bạn

# Trò chuyện CLI
python -m scripts.chat_cli -p "Tại sao bầu trời màu xanh?"

# Hoặc khởi chạy giao diện web
python -m scripts.chat_web

Giao diện web chạy trên cổng 8000 và cung cấp giao diện giống ChatGPT.

Quy trình nghiên cứu: Thử nghiệm nhanh chóng

Để thử nghiệm các ý tưởng mới, hãy sử dụng các mô hình nhỏ hơn để lặp lại nhanh hơn.

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

Điều này huấn luyện một mô hình d12 (kích thước GPT-1) với việc ghi nhật ký tối thiểu. Hoàn hảo để thử nghiệm các thay đổi kiến trúc.

Các chỉ số cần theo dõi

Theo dõi các chỉ số này trong Weights & Biases:

  1. val_bpb: Validation bits-per-byte (mất mát độc lập với kích thước từ vựng)
  2. core_metric: Điểm đánh giá DCLM CORE
  3. train/mfu: Sử dụng FLOPS của mô hình (hiệu quả phần cứng)
  4. train/tok_per_sec: Thông lượng huấn luyện

Yêu cầu kiểm thử

Bất kỳ cải tiến nào cũng phải hoạt động trên tất cả các độ sâu (từ d12 đến d26). Điều này ngăn chặn việc quá khớp với một kích thước mô hình duy nhất và đảm bảo các tiến bộ có nguyên tắc.

Tại sao nanochat lại quan trọng

Khả năng tiếp cận về chi phí

Phương pháp Chi phí Thời gian Phần cứng
OpenAI GPT-2 (2019) 43.000 đô la 168 giờ 32 TPU v3
nanochat (2026) 48 đô la 2 giờ 8xH100
nanochat spot ~15 đô la 2 giờ 8xH100 spot

Điều này đưa việc huấn luyện LLM trong tầm tay của:

Giá trị giáo dục

Cơ sở mã đóng vai trò là một tài nguyên học tập:

Sinh viên có thể đọc, sửa đổi và thử nghiệm với một quy trình LLM hoàn chỉnh.

Tốc độ nghiên cứu

Giảm thời gian huấn luyện từ vài ngày xuống vài giờ cho phép:

Tính minh bạch

Mọi lựa chọn thiết kế đều được tài liệu hóa:

Hạn chế và thực tế

nanochat rất ấn tượng nhưng có những giới hạn rõ ràng.

Yêu cầu phần cứng

Con số 48 đô la giả định có quyền truy cập vào một nút 8xH100. Chi phí thuê đám mây khác nhau:

Bạn sẽ cần khoảng 50-100 đô la cho một lần chạy đầy đủ tùy thuộc vào nhà cung cấp.

Giới hạn khả năng

nanochat đạt được hiệu suất cấp độ GPT-2 (công nghệ năm 2019). Điều này có nghĩa là:

Những gì nó có thể làm:

Những gì nó không thể làm:

Hãy nghĩ về nó như một đứa trẻ mẫu giáo: có khả năng trò chuyện cơ bản nhưng không phải là công việc cấp chuyên gia.

Yêu cầu dữ liệu

Toàn bộ quá trình speedrun tải xuống:

Bạn sẽ cần đủ dung lượng lưu trữ và băng thông.

Hạn chế của chỉ số

Điểm CORE đo lường 22 tác vụ nhưng không nắm bắt được:

Các hạt giống ngẫu nhiên khác nhau tạo ra phương sai CORE ~0,016. Kết quả của bạn có thể khác nhau.

Câu hỏi thường gặp

Chi phí để huấn luyện mô hình với nanochat là bao nhiêu?

Khoảng 48 đô la theo yêu cầu (24 đô la/giờ × 2 giờ) hoặc ~15 đô la trên các phiên bản spot. Điều này chỉ bao gồm huấn luyện trước. Thêm khoảng 30 phút cho SFT.

Tôi cần GPU nào?

Tối thiểu: Một GPU duy nhất (bất kỳ GPU trung tâm dữ liệu hiện đại nào). Tối ưu: 8xH100 hoặc 8xA100 để huấn luyện nhanh nhất. Mã này mở rộng từ 1 GPU lên 8 GPU với việc tích lũy gradient tự động.

Thời gian huấn luyện mất bao lâu?

1,65 đến 3 giờ tùy thuộc vào cấu hình và phần cứng. Kỷ lục bảng xếp hạng hiện tại là 1,65 giờ cho một mô hình d24.

Chỉ số CORE là gì?

Điểm DCLM CORE đánh giá các mô hình trên 22 tác vụ bao gồm ARC (câu hỏi khoa học), MMLU (hiểu ngôn ngữ đa tác vụ) và các benchmark khác. GPT-2 đạt 0,256525. nanochat thường xuyên vượt quá 0,26.

Tôi có thể huấn luyện trên một GPU duy nhất không?

Có. Bỏ qua torchrun và mã sẽ tự động sử dụng tích lũy gradient. Huấn luyện sẽ mất thời gian gấp 8 lần nhưng tạo ra kết quả gần như giống hệt nhau.

nanochat sử dụng bộ dữ liệu nào?

Phiên bản tốt nhất hiện tại sử dụng ClimbMix (bộ dữ liệu web được NVIDIA tuyển chọn). Các phiên bản trước sử dụng FineWeb-EDU. Bộ mã hóa huấn luyện trên ~2 tỷ ký tự từ khoảng 8 mảnh đầu tiên.

nanochat có hoạt động trên Apple Silicon không?

Có. Mã này chạy trên MPS (Metal Performance Shaders) với độ chính xác float32. Huấn luyện chậm hơn CUDA nhưng hoạt động được để thử nghiệm.

Tôi có thể tiếp tục huấn luyện từ một checkpoint không?

Có. Sử dụng --resume-from-step=<step> để tiếp tục từ một checkpoint đã lưu. Trạng thái bộ tải dữ liệu cũng được lưu để tiếp tục chính xác.

Sự khác biệt giữa nanochat và nanoGPT là gì?

nanoGPT chỉ bao gồm huấn luyện trước. nanochat mở rộng ra toàn bộ quy trình: mã hóa (tokenization), huấn luyện trước (pretraining), SFT, RLHF, đánh giá (evaluation), suy luận (inference) và giao diện người dùng web.

Kết luận

nanochat chứng minh rằng việc huấn luyện LLM không còn đòi hỏi ngân sách khổng lồ hay cơ sở hạ tầng chuyên biệt. Những gì tốn 43.000 đô la vào năm 2019 giờ đây chỉ tốn dưới 50 đô la.

Tác động của dự án vượt xa việc giảm chi phí thô. Bằng cách cung cấp một cơ sở mã tối giản, dễ đọc với giao diện "một nút điều khiển", Karpathy đã tạo ra cả một công cụ nghiên cứu và một tài nguyên giáo dục.

Những điểm chính

Các bước tiếp theo

Bạn đã sẵn sàng huấn luyện mô hình của riêng mình chưa? Bắt đầu với kho lưu trữ nanochat và tập lệnh runs/speedrun.sh.

Đối với các nhà phát triển API xây dựng ứng dụng hỗ trợ AI, việc hiểu rõ nội bộ huấn luyện LLM chưa bao giờ dễ tiếp cận đến thế. Rào cản gia nhập đã giảm từ "startup được đầu tư mạo hiểm" xuống "dự án cuối tuần."

button

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API