ChatGPTを50ドルで独自にトレーニングする方法

Ashley Innocent

Ashley Innocent

19 3月 2026

ChatGPTを50ドルで独自にトレーニングする方法

要約

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の内部を理解したりすることができます。

💡
これをApidogのようなAPI開発プラットフォームと組み合わせることで、AIサービスのテストとドキュメント化を行い、本番AIアプリケーションを構築するための完全なスタックが手に入ります。
button

学べること

この記事を読み終えるまでに、以下のことを理解できるでしょう。

nanochatとは?

nanochatは、トークン化、事前学習、ファインチューニング、評価、推論、そしてChatGPTのようなWeb UIといった、開発パイプライン全体を網羅する最小限のLLMトレーニングハーネスです。

コードベースは単一のリポジトリに収まっており、設定の複雑さやフレームワークの難解さはありません。Karpathy氏はこれを、読みやすく、ハッキング可能で、フォーク可能な「強力なベースライン」として設計しました。

中核となる主張

GPT-2レベルのモデル(16億パラメータ)を以下のコストでトレーニング:

参考までに、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

このトランスフォーマーは、いくつかの最適化を伴う最新のベストプラクティスに則っています。

アーキテクチャ機能:

値埋め込み(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を参照し、完全なドキュメントコンテキストを見ることができます。

# 全体に適合する最大のドキュメントを見つける
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`クラスは、以下の効率的な生成を処理します。

エンジンは、モデルが計算機を呼び出したときにツール出力トークンを強制するなど、会話の流れを調整します。

ステップバイステップ:独自のモデルをトレーニングする

パイプライン全体は`runs/speedrun.sh`にあります。実行方法は次のとおりです。

前提条件

ステップ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

主要なパラメーター:

予想実行時間:約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でこれらを追跡します。

  1. `val_bpb`: 検証ビット/バイト(語彙サイズに依存しない損失)
  2. `core_metric`: DCLM CORE評価スコア
  3. `train/mfu`: モデルFLOPS利用率(ハードウェア効率)
  4. `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トレーニングが以下の人々に手の届くものになります。

教育的価値

このコードベースは学習リソースとして機能します。

学生は、完全なLLMパイプラインを読み、修正し、実験することができます。

研究速度

トレーニング期間を数日から数時間へ短縮することで、以下のことが可能になります。

透明性

すべての設計選択が文書化されています。

制限と現実の確認

nanochatは印象的ですが、明確な境界線があります。

ハードウェア要件

48ドルという数字は、8xH100ノードへのアクセスを前提としています。クラウドレンタルの費用は変動します。

プロバイダーによって、フル実行には約50~100ドル必要になります。

能力の上限

nanochatはGPT-2レベルの性能(2019年の技術)を達成します。これは次のことを意味します。

できること:

できないこと:

幼稚園児のように考えてください。基本的な会話はできますが、専門的な作業はできません。

データ要件

フルスピードランでは以下がダウンロードされます。

十分なストレージと帯域幅が必要です。

メトリクスの限界

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氏は研究ツールと教育リソースの両方を生み出しました。

主要なポイント

次のステップ

独自のモデルをトレーニングする準備はできましたか?nanochatリポジトリと`runs/speedrun.sh`スクリプトから始めましょう。

AI駆動型アプリケーションを構築するAPI開発者にとって、LLMトレーニングの内部を理解することはかつてないほど容易になりました。参入障壁は「ベンチャー資金のスタートアップ」から「週末プロジェクト」へと下がりました。

button

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる