要約
nanochatは、Andrej Karpathy氏によるオープンソースのLLMトレーニングフレームワークです。GPT-2レベルのチャットボットを50ドル未満、約2時間でトレーニングでき、単一の8xH100 GPUノード、約500行のコアコード、パラメータ最適化を自動化する--depthダイヤル一つで動作します。現時点の最速記録は1.65時間・COREスコア0.2626です。これはOpenAIが2019年に43,000ドル・168時間を要したGPT-2を上回ります。
はじめに
以前は大規模言語モデルのトレーニングに数百万ドルや博士号を持つ研究者チームが必要でしたが、その時代は終わりました。
nanochatを使えば、手頃なコストで対話型AIをトレーニング可能です。2時間未満、8xH100ノード1台でパイプラインが完結します。
なぜこれが今重要なのか
AIのトレーニングは劇的に高速化されました。2019年にOpenAIが168時間・43,000ドルかけたものを、今は1.65時間・48ドルで達成可能です。アルゴリズム・ハードウェア・コミュニティ最適化の進展が決定的です。
API開発者やAIアプリ構築チームでも、巨額のインフラ投資なしでカスタムモデルのトレーニングや実験ができます。
💡ヒント
ApidogのようなAPI開発サービスと組み合わせれば、AIサービスのテスト・ドキュメント作成から本番アプリ構築まで、完全なスタックを揃えられます。
学べること
この記事から以下を実践的に習得できます。
- nanochatが従来比100倍コスト削減を実現する仕組み
- GPTモデル/オプティマイザー/データローディングの全アーキテクチャ
- 独自モデルをトレーニングする手順
- 迅速なLLM研究・実験のためのnanochat活用法
- GPT-2の実性能・制限
nanochatとは?
nanochatは、トークン化・事前学習・ファインチューニング・評価・推論・Web UI(ChatGPT風)など、LLM開発パイプライン全体を最小限で実装したハーネスです。
単一リポジトリで完結し、複雑な設定ファイルや難解なフレームワークは不要。Karpathy氏は「読みやすく、ハックしやすい、フォークしやすいベースライン」として設計しています。
中核となる主張
- GPT-2(16億パラメータ)を48ドル(8xH100×2時間)でトレーニング
- スポットインスタンスなら約15ドル
- 参考: OpenAI GPT-2は43,000ドル・7日間(32TPU v3)
nanochatがカバーするもの
| ステージ | スクリプト | 説明 |
|---|---|---|
| トークン化 | scripts.tok_train |
BPEトークナイザー(語彙数32,768) |
| 事前学習 | scripts.base_train |
GPT基本モデルの事前学習 |
| ファインチューニング | scripts.chat_sft |
チャット向け教師ありファインチューニング |
| 評価 | scripts.base_eval |
CORE・bits/byte(損失) |
| 推論 | scripts.chat_cli |
CLIチャット |
| Web UI | scripts.chat_web |
ChatGPT風Webインターフェース |
哲学:「すべてを制御する1つのダイヤル」
従来のLLMフレームワークは膨大な設定項目が悩みの種ですが、nanochatは1パラメータ「--depth」に集約しています。
この値(トランスフォーマー層の数)を指定するだけで、他のパラメータは自動計算されます。
# 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
# さらに大型化
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26
--depthを指定すれば、トランスフォーマー幅・アテンションヘッド数・学習率・トレーニング期間・重み減衰・バッチサイズなど全て最適値を自動設定します。
この「1ダイヤル」アプローチにより、異なるサイズのモデルを同じ原理で簡単にトレーニング可能です。
これが機能する理由
チームは多数の実験から、深度・幅・バッチサイズ・トレーニング期間に予測可能なスケーリング則があることを確認。nanochatではこれをスクリプト内に直接エンコードし、パラメータ調整地獄を回避しています。
リーダーボード:GPT-2超えの競争
nanochatは「GPT-2水準を超えるまでの時間」で競うリーダーボードを公開。目標は22タスクのCOREスコアでOpenAI GPT-2(0.2565)を超えること。
| 実行 | モデル | 時間 | CORE | 主要イノベーション |
|---|---|---|---|---|
| オリジナルGPT-2 | 1.6B | 168h | 0.2565 | OpenAI 2019年 |
| 実行1 | d24 | 3.04h | 0.2585 | 初期ベースライン |
| 実行2 | d26 | 2.91h | 0.2578 | FP8トレーニング |
| 実行3 | d26 | 2.76h | 0.2602 | 1Mトークンバッチ |
| 実行4 | d24 | 2.02h | 0.2571 | ClimbMixデータセット |
| 実行5 | d24 | 1.80h | 0.2690 | AIによる最適化 |
| 実行6 | d24 | 1.65h | 0.2626 | smear/backoutの改良 |
AIによる自動最適化
実行5・6では、Karpathy氏の「autoresearch」AIエージェントが小規模モデルで設計変更を探り、成功した変更を本番d24に適用。
- バックアウト: 中間層残差の減算改善
- スミア: 効率的なバイグラム混合
これにより2.02→1.65時間へトレーニング時間短縮、19%向上を自動発見しています。
nanochatの仕組み
コードベースはコア約3,000行。主要モジュールを解説します。
1. GPTモデル(nanochat/gpt.py)
トランスフォーマーは現代的な最適化を多数搭載。
アーキテクチャ要素
- ロータリー埋め込み(RoPE)
- QK正規化
- 分離トークン埋め込み・出力射影
- ReLU²活性化
- GQA(グループ化クエリアテンション)
- スライディングウィンドウアテンション
- Flash Attention 3対応
値埋め込み(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
効率化メカニズム例:
# 層ごとの残差スケーリング
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0
# Smear: バイグラム情報混合
gate = self.smear_lambda * torch.sigmoid(self.smear_gate(x[:, :, :24]))
x = x + gate * x_pre_smear
# Backout: 中間残差減算
x = x - self.backout_lambda * x_backout
2. Muonオプティマイザー(nanochat/optim.py)
パラメータタイプごとに最適なオプティマイザーを選択。
| パラメータ | オプティマイザー | 目的 |
|---|---|---|
| 埋め込み/lm_head | AdamW | 標準的適応最適化 |
| スカラーパラメータ | AdamW | 学習スケーリング因子 |
| 2D行列 | Muon | 直交化された更新 |
Muon(ニュートン-シュルツ直交化)例:
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
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)
分散トレーニング:
ZeRO-2シャーディングを非同期3フェーズ通信で実装し、GPU効率を最大化。
3. 精度管理(nanochat/common.py)
torch.amp.autocastを使わず、明示的にdtype管理。
| ハードウェア | デフォルトdtype | 理由 |
|---|---|---|
| CUDA SM 80以上 | bfloat16 | ネイティブBF16 |
| CUDA SM 80未満 | float32 | BF16非対応 |
| CPU/MPS | float32 | 低精度コアなし |
カスタムLinear例:
class Linear(nn.Linear):
def forward(self, x):
return F.linear(x, self.weight.to(dtype=x.dtype))
FP8トレーニング(H100/Blackwell)にも対応。
4. データローディング(nanochat/dataloader.py)
BOSアラインメントのベストフィットパッキング
- 各行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)
# 完全なドキュメントを追加
else:
# クロップして埋める
5. Flash Attention統合(nanochat/flash_attention.py)
FA3とPyTorch SDPAを自動切り替え。
from nanochat.flash_attention import flash_attn
y = flash_attn.flash_attn_func(q, k, v, causal=True, window_size=window_size)
6. 推論エンジン(nanochat/engine.py)
- KVキャッシュ: 高速生成
-
ツール利用:
eval()経由の計算 - バッチ生成: 並列サンプリング
会話フロー調整も可能。
ステップバイステップ:独自モデルをトレーニングする
パイプライン全体はruns/speedrun.shにまとまっています。各ステップを実践しましょう。
前提条件
- 8xH100 GPUノードまたは同等環境
- データセット20GB程度
- Python 3.10+
- uvパッケージマネージャー
ステップ1:環境セットアップ
# uvインストール
curl -LsSf https://astral.sh/uv/install.sh | sh
# 仮想環境作成&有効化
uv venv
source .venv/bin/activate
# 依存パッケージインストール
uv sync --extra gpu
ステップ2:トレーニングデータを取得
# ClimbMixデータセット約20億文字をダウンロード
python -m nanochat.dataset -n 170
ステップ3:トークナイザーをトレーニング
# BPEトークナイザーを訓練
python -m scripts.tok_train
# 圧縮率を評価
python -m scripts.tok_eval
ステップ4:ベースモデル事前学習
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
-
--depth=24: GPT-2相当 -
--fp8: FP8有効(H100以降)
ステップ5:教師ありファインチューニング
# アイデンティティ会話データ取得
curl -L -o ~/.cache/nanochat/identity_conversations.jsonl \
https://karpathy-public.s3.us-west-2.amazonaws.com/identity_conversations.jsonl
# SFT実行
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft -- \
--device-batch-size=16 \
--run=my-sft
ステップ6:モデルとチャット
# CLIチャット
python -m scripts.chat_cli -p "Why is the sky blue?"
# Web UI(ポート8000)
python -m scripts.chat_web
研究ワークフロー:迅速な実験
小型モデルでアイデア検証→本番投入が可能です。
クイック実験(約5分)
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
監視メトリクス
-
val_bpb(bits/byte損失) -
core_metric(DCLM COREスコア) -
train/mfu(FLOPS利用率) -
train/tok_per_sec(トークンスループット)
テスト要件
すべての深度(d12~d26)での動作を確認し、過学習を防ぐ。
なぜnanochatが重要なのか
コストのアクセシビリティ
| アプローチ | コスト | 時間 | ハードウェア |
|---|---|---|---|
| OpenAI GPT-2 (2019) | $43,000 | 168h | 32 TPU v3 |
| nanochat (2026) | $48 | 2h | 8xH100 |
| nanochatスポット | ~$15 | 2h | 8xH100スポット |
LLMトレーニングが個人や小規模チームにも手が届く時代に。
教育的価値
- GPTモデル約500行
- オプティマイザー約530行
- 全設計に明快なコメント
- 隠し設定なし
学生やエンジニアが全パイプラインを読んで改造・実験可能。
研究速度
- 仮説検証サイクルの高速化
- 実験数増加
- 失敗コスト低減
- コミュニティ主導リーダーボード
透明性
- 設計選択がすべて文書化
- スケーリング則・アブレーションも公開
- AI貢献も明示
制限と現実確認
ハードウェア要件
8xH100ノードのクラウド費用は25~50ドル/時間程度(スポットで15ドル)。
フルパイプライン実行には50~100ドル程度が目安。
性能の上限
nanochatはGPT-2水準(2019年相当)
できること:
- 基本会話
- 単純推論
- 初歩的な数学
- 限定的な事実想起
できないこと:
- 多段階推論
- 高度なコード生成
- 微妙な指示解釈
- GPT-4/Claude/Gemini級には非競合
データ・ストレージ要件
- 約170シャード
- 圧縮17GB
- 20億文字
- 十分なストレージ/帯域幅が必要
メトリクスの限界
COREスコアは22タスクのみカバー。
- 実際の会話品質や安全性・ニュアンスは未評価
- ランダムシードで0.016程度のばらつきあり
よくある質問
モデル学習にかかる費用は?
オンデマンド約48ドル(2時間)、スポットなら15ドル。SFTは+30分程度。
必要なGPUは?
- 最低:シングルGPU(現行データセンターGPU推奨)
- 最適:8xH100または8xA100
- 1~8GPU自動スケール
トレーニング時間は?
1.65~3時間(d24モデルで最速1.65h)。
COREメトリクスとは?
22タスク(ARC,MMLU等)のDCLM COREスコア。GPT-2は0.2565、nanochatは0.26超え。
シングルGPUで動作する?
はい。torchrun省略で自動勾配蓄積・8倍時間で同等精度。
使用データセットは?
ClimbMix(NVIDIA curated webデータ)、旧版はFineWeb-EDU。トークナイザー訓練は8シャード(20億文字)。
Apple Siliconで動く?
はい。MPS(Metal)上でfloat32精度で動作、実験用に最適。
チェックポイント再開は?
--resume-from-step=<step>で再開可。データローダー状態も保存。
nanochatとnanoGPTの違いは?
nanoGPTは事前学習のみ。nanochatはトークン化~Web UIまでフルパイプライン。
結論
nanochatは、LLMトレーニングのコスト・専門性障壁を劇的に下げます。2019年に43,000ドルかかったことが今や50ドル未満で実現可能です。
この「1ダイヤル」最小コードベースは、研究者・エンジニア・学生すべての学習と実験を加速します。
主要ポイント
- 100倍コスト削減: 43,000→48ドル
- 100倍高速化: 168→1.65時間
-
単一設定ダイヤル:
depthのみ - フルパイプライン: トークン化~Web UI
- コミュニティ主導: 公開リーダーボードで継続改善
次のステップ
実際にモデルをトレーニングしたい場合は、nanochatリポジトリとruns/speedrun.shから始めましょう。
AIアプリ構築のためのAPI開発者も、LLMトレーニングの内部を容易に理解できます。
週末プロジェクトから始めてみてください。


Top comments (0)