要約
nanochatは、Andrej Karpathy氏が開発したオープンソースのLLMトレーニングフレームワークで、GPT-2レベルのチャットボットを50ドル未満、約2時間でトレーニングできます。このプロジェクトは、単一の8xH100 GPUノード、最小限のコード(コアモデルで約500行)、そしてすべてのハイパーパラメーターを自動的に最適化するための1つの設定ダイヤル(`--depth`)を使用します。現在の記録では、トレーニングは1.65時間で完了し、COREスコアは0.2626です。これは、OpenAIが2019年に43,000ドルと168時間を費やしたGPT-2を上回る結果です。
はじめに
かつて大規模言語モデルのトレーニングには数百万ドルと博士号を持つ研究者チームが必要でした。そんな時代は終わりました。
Andrej Karpathy氏は、高価なディナー代よりも安く、有能な対話型AIをトレーニングできるオープンソースプロジェクト「nanochat」をリリースしました。このパイプライン全体は単一の8xH100 GPUノード上で動作し、2時間未満で完了します。
なぜこれが今重要なのか
2026年初頭、AIの状況は劇的に変化しました。2019年にOpenAIが168時間と43,000ドルを要したものが、現在では1.65時間と48ドルで実現できます。これは、アルゴリズムの改善、より良いハードウェア、そしてコミュニティによる最適化によって達成された100倍の高速化です。
API開発者やAI駆動型アプリケーションを構築するチームにとって、これはすべてを変えます。今や、莫大なインフラ予算なしに、カスタムモデルのトレーニングを試したり、アーキテクチャの変更をテストしたり、LLMの内部を理解したりすることができます。
学べること
この記事を読み終えるまでに、以下のことを理解できるでしょう。
- nanochatが従来のLLMトレーニングと比較して100倍のコスト削減をどのように実現しているか
- 完全なアーキテクチャ(GPTモデル、Muonオプティマイザー、データローディング)
- 独自のモデルをトレーニングするためのステップバイステップの手順
- 迅速なLLM研究と実験にnanochatを使用する方法
- 実際の制限と、GPT-2の機能が具体的に何を意味するのか
nanochatとは?
nanochatは、トークン化、事前学習、ファインチューニング、評価、推論、そしてChatGPTのようなWeb UIといった、開発パイプライン全体を網羅する最小限のLLMトレーニングハーネスです。

コードベースは単一のリポジトリに収まっており、設定の複雑さやフレームワークの難解さはありません。Karpathy氏はこれを、読みやすく、ハッキング可能で、フォーク可能な「強力なベースライン」として設計しました。
中核となる主張
GPT-2レベルのモデル(16億パラメータ)を以下のコストでトレーニング:
- オンデマンドで48ドル(8xH100で約24ドル/時間×2時間)
- スポットインスタンスで約15ドル
参考までに、OpenAIのオリジナルのGPT-2トレーニングは2019年に約43,000ドルの費用がかかり、32個のTPU v3チップで7日間を要しました。
nanochatがカバーするもの
| ステージ | スクリプト | 説明 |
|---|---|---|
| トークン化 | scripts.tok_train |
BPEトークナイザーをトレーニング(語彙数32,768) |
| 事前学習 | scripts.base_train |
基本GPTモデルをトレーニング |
| ファインチューニング | scripts.chat_sft |
チャット向け教師ありファインチューニング |
| 評価 | scripts.base_eval |
COREメトリック、ビット/バイト |
| 推論 | 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
深度を設定するだけで、nanochatは他のすべてを自動的に計算します。
- トランスフォーマーの幅(埋め込み次元)
- アテンションヘッドの数
- 各パラメータグループの学習率
- トレーニング期間(合計ステップ数)
- 重み減衰スケジュール
- バッチサイズ
この「1つのダイヤル」哲学により、Karpathy氏が「nanochatミニシリーズ」と呼ぶものが可能になります。これは、異なるサイズの計算最適化モデルのファミリーであり、すべて同じ原則に基づいたアプローチでトレーニングされます。
これが機能する理由
チームは数十回のトレーニング実行を通じてスケーリング則を測定しました。その結果、深度、幅、バッチサイズ、トレーニング期間の間に予測可能な関係性があることを発見しました。nanochatは、これらすべての調整を公開する代わりに、これらの関係性をトレーニングスクリプトに直接エンコードしています。

ディープラーニングの博士号がなくても、計算最適化されたトレーニングが可能です。
リーダーボード:GPT-2を打ち破る競争
nanochatは、「GPT-2レベルまでの時間」を追跡する公開リーダーボードを維持しています。目標は、22の評価タスク(ARC、MMLU、その他DCLMベンチマークスイート由来)において、OpenAIのオリジナルCOREスコア0.256525を上回ることです。
現在の記録
| 実行 | モデル | 時間 | COREスコア | 主要なイノベーション |
|---|---|---|---|---|
| オリジナルGPT-2 | 1.6B | 168時間 | 0.2565 | OpenAI 2019年ベースライン |
| 実行1 | d24 | 3.04時間 | 0.2585 | 初期ベースライン |
| 実行2 | d26 | 2.91時間 | 0.2578 | FP8トレーニング |
| 実行3 | d26 | 2.76時間 | 0.2602 | 1Mトークンバッチサイズ |
| 実行4 | d24 | 2.02時間 | 0.2571 | ClimbMixデータセット |
| 実行5 | d24 | 1.80時間 | 0.2690 | AIが発見した最適化 |
| 実行6 | d24 | 1.65時間 | 0.2626 | smear/backoutの改善 |
AIがどのように最適化を発見したか
実行5と6では、Karpathy氏の「自動研究(autoresearch)」システムからの変更が組み込まれました。AIエージェントは、小さなd12モデル(5分間のトレーニング実行)でアーキテクチャの変更を探求し、成功した変更を完全なd24設定に適用しました。
システムは以下の改善点を発見しました。
- バックアウトメカニズム: 中間層の残差減算の改善
- スミア実装: 以前のトークンからのより効率的なバイグラム混合
これらの変更により、トレーニング時間は2.02時間から1.65時間に短縮され、自律的な実験を通じて19%の改善が発見されました。
nanochatの仕組み
コードベースは、コアモジュール全体で約3,000行です。各コンポーネントを見ていきましょう。
1. GPTモデル(nanochat/gpt.py)
このトランスフォーマーは、いくつかの最適化を伴う最新のベストプラクティスに則っています。
アーキテクチャ機能:
- ロータリー埋め込み(RoPE): 学習された位置埋め込みなしでの相対位置エンコーディング
- QK正規化: 大規模なトレーニングでの安定化
- 分離された重み: 分離されたトークン埋め込みと出力射影層
- ReLU²活性化: GeLUではなくMLPにおける二乗ReLU活性化
- グループ化されたクエリアテンション(GQA): 推論高速化のための、クエリヘッドよりも少ないKVヘッド
- スライディングウィンドウアテンション: 設定可能なパターン(例:”SSSL”は短い/長いコンテキストを交互に使用)
- Flash Attention 3: SDPAフォールバック付きのHopper GPU最適化
値埋め込み(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
これにより、計算オーバーヘッドを大幅に増やすことなく容量が追加されます。
効率化の工夫:
このモデルには、トレーニングのダイナミクスを改善する3つの学習メカニズムが含まれています。
# 1. 層ごとの残差スケーリング
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0
# 2. Smear: バイグラム情報のために前のトークン埋め込みを混合する
gate = self.smear_lambda * torch.sigmoid(self.smear_gate(x[:, :, :24]))
x = x + gate * x_pre_smear
# 3. Backout: 中間層の残差を減算する
x = x - self.backout_lambda * x_backout
2. Muonオプティマイザー(nanochat/optim.py)
nanochatは混合オプティマイザー戦略を使用します。
| パラメータータイプ | オプティマイザー | 目的 |
|---|---|---|
| 埋め込み、lm_head | AdamW | 標準的な適応型最適化 |
| スカラーパラメータ | AdamW | 学習されたスケーリング因子 |
| 2D行列 | Muon | 直交化された更新 |
Muon(ニュートン-シュルツ法で直交化されたモーメンタム):
Muonオプティマイザーは、「Polar Express」と呼ばれる五次ニュートン-シュルツ反復を使用して、重み更新を直交化します。
# Polar Express係数(5反復)
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)
分散トレーニング:
マルチGPUセットアップの場合、オプティマイザーはZeRO-2スタイルのシャーディングを3段階の非同期通信で実装します。
フェーズ1:すべての非同期reduce_scatter操作を開始
フェーズ2:reduceを待ち、更新を計算し、all_gatherを開始
フェーズ3:gatherを待ち、更新されたパラメーターをコピーバック
これにより、通信と計算がオーバーラップし、GPU利用率が最大化されます。
3. 精度管理(nanochat/common.py)
nanochatは、`torch.amp.autocast`を使用する代わりに、精度を明示的に管理します。
| ハードウェア | デフォルトのdtype | 理由 |
|---|---|---|
| CUDA SM 80以上 (A100, H100) | bfloat16 | ネイティブBF16テンソルコア |
| CUDA SM 80未満 (V100, T4) | float32 | BF16非対応 |
| CPU / MPS | float32 | 低精度コアなし |
カスタムの`Linear`層は、順伝播中に重みを計算dtypeに一致するようにキャストします。
class Linear(nn.Linear):
def forward(self, x):
return F.linear(x, self.weight.to(dtype=x.dtype))
マスタウェイトはオプティマイザーの精度を保つためFP32のままです。H100およびBlackwell GPUの場合、`--fp8`を介してFP8トレーニングが利用可能で、ほとんどの層はテンソル単位のスケーリングを持つ`Float8Linear`に変換されます。
4. データローディング(nanochat/dataloader.py)
データローダーはBOSアラインメントのベストフィットパッキングを使用します。
- 各行はBOS(シーケンス開始)トークンで始まります
- 無駄を最小限に抑えるためにベストフィットアルゴリズムを使用してドキュメントをパッキング
- ドキュメントが適合しない場合、1つが正確に埋まるようにクロップされます
- 2048のシーケンス長で約35%のトークンクロッピングにより100%の利用率
これにより、すべてのトークンが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)
bfloat16を使用するHopper GPUではFlash Attention 3を使用します。それ以外の環境ではPyTorchのスケーリングドット積アテンションにフォールバックします。
6. 推論エンジン(nanochat/engine.py)
`Engine`クラスは、以下の効率的な生成を処理します。
- KVキャッシュ: FA3の`flash_attn_with_kvcache`による事前入力されたプロンプトキャッシュ
- ツール利用: 特殊トークンが`eval()`を介してPython計算機をトリガー
- バッチ生成: 並列サンプリングのためにKVキャッシュをクローン
エンジンは、モデルが計算機を呼び出したときにツール出力トークンを強制するなど、会話の流れを調整します。
ステップバイステップ:独自のモデルをトレーニングする
パイプライン全体は`runs/speedrun.sh`にあります。実行方法は次のとおりです。
前提条件
- 8xH100 GPUノード(または類似のもの)
- データセット用に約20 GBのディスクスペース
- 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
# これにより、約100MBのシャードが約170個ダウンロードされます
# 合計:約17 GB(圧縮済み)
このスクリプトは、マルチランク調整を処理するためのファイルロック機能を備えた事前学習データシャードをダウンロードします。
ステップ3:トークナイザーをトレーニングする
# 語彙数32,768のBPEトークナイザーをトレーニング
python -m scripts.tok_train
# 圧縮率を評価
python -m scripts.tok_eval
このトークナイザーは、バイトフォールバックBPEを使用したGPT-4スタイルの分割パターンを使用します。20億文字のトレーニングは、約10分で完了します。
ステップ4:ベースモデルを事前学習する
# d24モデル(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
主要なパラメーター:
- `--depth=24`: GPT-2サイズモデル
- `--target-param-data-ratio=8`: 速度を優先するため、わずかに過学習させていない状態
- `--device-batch-size=16`: GPUごとのバッチサイズ
- `--fp8`: FP8トレーニングを有効にする(H100以降のみ)
予想実行時間:約2時間。
ステップ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を起動
python -m scripts.chat_web
Web UIはポート8000で動作し、ChatGPTのようなインターフェースを提供します。
研究ワークフロー:迅速な実験
新しいアイデアをテストするには、より小さなモデルを使用して反復を高速化します。
クイック実験(約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
これは、最小限のロギングでd12(GPT-1サイズ)モデルをトレーニングします。アーキテクチャの変更をテストするのに最適です。
監視すべきメトリクス
Weights & Biasesでこれらを追跡します。
- `val_bpb`: 検証ビット/バイト(語彙サイズに依存しない損失)
- `core_metric`: DCLM CORE評価スコア
- `train/mfu`: モデルFLOPS利用率(ハードウェア効率)
- `train/tok_per_sec`: トレーニングスループット
テスト要件
どの改善も、すべての深度(d12からd26まで)で機能する必要があります。これにより、単一のモデルサイズへの過学習を防ぎ、原則に基づいた進歩を保証します。
なぜnanochatが重要なのか
コストのアクセシビリティ
| アプローチ | コスト | 時間 | ハードウェア |
|---|---|---|---|
| OpenAI GPT-2 (2019年) | $43,000 | 168時間 | 32 TPU v3 |
| nanochat (2026年) | $48 | 2時間 | 8xH100 |
| nanochat スポットインスタンス | ~$15 | 2時間 | 8xH100スポット |
これにより、LLMトレーニングが以下の人々に手の届くものになります。
- 個人研究者
- 小規模スタートアップ
- 大学のコース
- ホビイスト
教育的価値
このコードベースは学習リソースとして機能します。
- GPTモデルで約500行
- オプティマイザーで約530行
- すべての設計決定に関する明確なコメント
- 隠された設定なし
学生は、完全なLLMパイプラインを読み、修正し、実験することができます。
研究速度
トレーニング期間を数日から数時間へ短縮することで、以下のことが可能になります。
- 仮説検証の高速化
- 週あたりの実験数の増加
- 失敗コストの削減
- リーダーボードを介したコミュニティ連携
透明性
すべての設計選択が文書化されています。
- `dev/LOG.md`におけるスケーリング則
- GitHub Discussionsにおけるアブレーション研究
- リーダーボードのエントリに関する完全な再現詳細
- AI貢献の明確な開示
制限と現実の確認
nanochatは印象的ですが、明確な境界線があります。
ハードウェア要件
48ドルという数字は、8xH100ノードへのアクセスを前提としています。クラウドレンタルの費用は変動します。
- Lambda Labs: 8xH100で約25ドル/時間
- RunPod: スポット価格で約15ドル/時間
- 総実行時間:事前学習+SFTで約2時間
プロバイダーによって、フル実行には約50~100ドル必要になります。
能力の上限
nanochatはGPT-2レベルの性能(2019年の技術)を達成します。これは次のことを意味します。
できること:
- 基本的な会話
- 単純な推論
- 初等的な数学
- 事実の想起(限定的)
できないこと:
- 複雑な多段階推論
- 単純な関数を超えるコード生成
- 微妙な指示の理解と実行
- GPT-4、Claude、Geminiと競合すること
幼稚園児のように考えてください。基本的な会話はできますが、専門的な作業はできません。
データ要件
フルスピードランでは以下がダウンロードされます。
- 約170のデータシャード
- 約17 GB(圧縮済み)
- 合計約20億文字
十分なストレージと帯域幅が必要です。
メトリクスの限界
COREスコアは22のタスクを測定しますが、以下の要素は捉えません。
- 実世界の会話の質
- ドメイン固有の知識
- 指示に従う際のニュアンス
- 安全性とアラインメント
異なるランダムシードはCOREスコアに約0.016のばらつきを生じさせます。結果は異なる場合があります。
よくある質問
nanochatでモデルをトレーニングするのにどのくらい費用がかかりますか?
オンデマンドで約48ドル(24ドル/時間×2時間)またはスポットインスタンスで約15ドルです。これは事前学習のみをカバーします。SFTには約30分追加してください。
どのGPUが必要ですか?
最小:シングルGPU(最新のデータセンターGPUならどれでも)。最適:最速のトレーニングには8xH100または8xA100。コードは1GPUから8GPUまで、自動勾配蓄積でスケーリングします。
トレーニングにはどのくらい時間がかかりますか?
設定とハードウェアによって1.65時間から3時間です。現在のリーダーボードの記録は、d24モデルで1.65時間です。
COREメトリックとは何ですか?
DCLM COREスコアは、ARC(科学の質問)、MMLU(多タスク言語理解)、その他のベンチマークを含む22のタスクでモデルを評価します。GPT-2は0.256525を記録しました。nanochatは定期的に0.26を超えています。
シングルGPUでトレーニングできますか?
はい。`torchrun`を省略すると、コードは自動的に勾配蓄積を使用します。トレーニングは8倍の時間がかかりますが、ほぼ同じ結果が得られます。
nanochatはどのデータセットを使用していますか?
現在の最適なバージョンはClimbMix(NVIDIAのキュレーションされたウェブデータセット)を使用しています。以前のバージョンではFineWeb-EDUを使用しました。トークナイザーは、最初の約8つのシャードから約20億文字でトレーニングされます。
nanochatはApple Siliconで動作しますか?
はい。コードはMPS(Metal Performance Shaders)上でfloat32精度で動作します。トレーニングはCUDAよりも遅いですが、実験用としては機能します。
チェックポイントからトレーニングを再開できますか?
はい。`--resume-from-step=<step>`を使用して、保存されたチェックポイントから続行できます。データローダーの状態も正確な再開のために保存されます。
nanochatとnanoGPTの違いは何ですか?
nanoGPTは事前学習のみをカバーしていました。nanochatは、トークン化、事前学習、SFT、RLHF、評価、推論、Web UIを含むフルパイプラインに拡張されています。
結論
nanochatは、LLMトレーニングがもはや莫大な予算や専門的なインフラを必要としないことを証明しています。2019年に43,000ドルかかったものが、今では50ドル未満で実現できます。
このプロジェクトの影響は、単純なコスト削減を超えています。「1つのダイヤル」インターフェースを持つ最小限で読みやすいコードベースを提供することで、Karpathy氏は研究ツールと教育リソースの両方を生み出しました。
主要なポイント
- **100倍のコスト削減**: GPT-2レベルの機能で43,000ドルから48ドルへ
- **100倍の高速化**: 168時間から1.65時間へ
- **単一の設定ダイヤル**: `depth`がすべてを制御
- **フルパイプライン**: トークン化からWeb UIまで
- **コミュニティ主導**: 継続的な改善を伴う公開リーダーボード
次のステップ
独自のモデルをトレーニングする準備はできましたか?nanochatリポジトリと`runs/speedrun.sh`スクリプトから始めましょう。
AI駆動型アプリケーションを構築するAPI開発者にとって、LLMトレーニングの内部を理解することはかつてないほど容易になりました。参入障壁は「ベンチャー資金のスタートアップ」から「週末プロジェクト」へと下がりました。
