nanochat

Dự án mã nguồn mở tối giản giúp huấn luyện và vận hành mô hình ChatGPT hoàn chỉnh từ con số không với chi phí thấp.

Giới thiệu

Nanochat là dự án tiếp theo của Andrej Karpathy (tác giả của nanoGPT), ra mắt vào khoảng cuối năm 2025. Khác với nanoGPT chỉ tập trung vào giai đoạn ‘Pre-training’, nanochat cung cấp một giải pháp toàn diện (full-stack) để tạo ra một chatbot giống ChatGPT. Dự án này bao gồm toàn bộ quy trình: từ huấn luyện Tokenizer, Pre-training, Fine-tuning (SFT) đến đánh giá (Evaluation) và giao diện Web UI để chat. Điểm đặc biệt là nó được thiết kế để huấn luyện một mô hình có khả năng tương đương GPT-2 chỉ với chi phí khoảng 100$ (khoảng 4 giờ trên node 8xH100) hoặc rẻ hơn, với mã nguồn cực kỳ gọn nhẹ, dễ đọc và dễ tùy biến cho mục đích giáo dục hoặc nghiên cứu.

Tính năng chính

  • Full-stack Pipeline: Hỗ trợ trọn vẹn vòng đời LLM: Tokenizer training (Rust), Pre-training (trên dataset FineWeb), Mid-training/SFT (trên dataset SmolTalk), và Inference.
  • Chi phí tối ưu: Thiết kế để chạy ‘speedrun’ huấn luyện mô hình trong 4 giờ với chi phí thấp, dân chủ hóa việc tạo LLM.
  • Code ‘Clean & Hackable’: Khoảng 8.000 dòng code, không phụ thuộc vào các framework cồng kềnh, cấu hình đơn giản chỉ qua tham số --depth (độ sâu mô hình), các siêu tham số khác tự động được tính toán.
  • Web UI tích hợp: Đi kèm sẵn server (FastAPI) và giao diện chat web đơn giản (Vanilla JS/HTML) để tương tác trực tiếp với mô hình sau khi train.
  • Hiệu năng cao: Sử dụng các kỹ thuật hiện đại như Flash Attention, RoPE (Rotary Positional Embeddings) và tối ưu hóa kernel.

Hướng dẫn cài đặt Local (macOS)

Để chạy nanochat trên macOS (Apple Silicon), bạn cần Python và Rust (cho tokenizer).

  1. Cài đặt Prerequisites:
    • Cài đặt Rust: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    • Cài đặt Python 3.10+ (khuyến nghị dùng conda hoặc venv).
  2. Clone Repository:
    git clone https://github.com/karpathy/nanochat.git
    cd nanochat
    
  3. Cài đặt Dependencies:
    pip install torch numpy transformers datasets tiktoken fastapi uvicorn
    # Lưu ý: Trên macOS, PyTorch sẽ sử dụng MPS (Metal Performance Shaders) để tăng tốc.
    
  4. Chạy thử (Inference): Nếu bạn muốn chạy chat với mô hình có sẵn hoặc sau khi train nhẹ:
    python sample.py --device=mps
    

    Hoặc khởi chạy Web UI:

    python server.py
    

    (Lưu ý: Việc training full model yêu cầu GPU mạnh, trên macOS bạn nên giảm tham số --depth hoặc chỉ chạy inference).

Hướng dẫn Docker

Nanochat tập trung vào sự đơn giản nên thường chạy trực tiếp, nhưng bạn có thể đóng gói bằng Docker để dễ triển khai. Dưới đây là Dockerfile cơ bản:

# Sử dụng PyTorch image chính chủ
FROM pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime

WORKDIR /app

# Cài đặt các thư viện cần thiết
RUN pip install numpy transformers datasets tiktoken fastapi uvicorn

# Copy source code vào image
COPY . .

# Mở port cho Web UI
EXPOSE 8000

# Lệnh chạy mặc định (ví dụ: chạy server chat)
CMD ["python", "server.py"]

Build và Run:

docker build -t nanochat .
docker run --gpus all -p 8000:8000 nanochat

Ví dụ Code (Example Code)

Dưới đây là một ví dụ giả lập cách sử dụng code của nanochat để load mô hình và sinh văn bản (dựa trên phong cách code của Karpathy):

import torch
from model import GPT, GPTConfig

# 1. Cấu hình mô hình (ví dụ mô hình nhỏ)
config = GPTConfig(
    block_size=1024, # Context window
    vocab_size=50257, # GPT-2 vocab
    n_layer=12,
    n_head=12,
    n_embd=768
)

# 2. Khởi tạo mô hình
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = GPT(config)
model.to(device)

# (Tùy chọn) Load pretrained weights nếu có
# checkpoint = torch.load('out/ckpt.pt')
# model.load_state_dict(checkpoint['model'])

# 3. Inference / Chat
model.eval()
start_text = "Hello, how are you?"
# Giả sử có hàm encode/decode từ tokenizer
input_ids = tokenizer.encode(start_text).to(device)

# Sinh tiếp 50 tokens
with torch.no_grad():
    output_ids = model.generate(input_ids, max_new_tokens=50, temperature=0.8)

print(tokenizer.decode(output_ids[0].tolist()))

Sources

Github Page

https://github.com/karpathy/nanochat

Tags: github
Share: X (Twitter) Facebook LinkedIn