DEV Community

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

Posted on • Originally published at apidog.com

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

要約

nanochatは、Andrej Karpathy氏によるオープンソースのLLMトレーニングフレームワークです。GPT-2レベルのチャットボットを50ドル未満、約2時間でトレーニングでき、単一の8xH100 GPUノード、約500行のコアコード、パラメータ最適化を自動化する--depthダイヤル一つで動作します。現時点の最速記録は1.65時間・COREスコア0.2626です。これはOpenAIが2019年に43,000ドル・168時間を要したGPT-2を上回ります。

Apidog を今すぐ試してみよう

はじめに

以前は大規模言語モデルのトレーニングに数百万ドルや博士号を持つ研究者チームが必要でしたが、その時代は終わりました。

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開発パイプライン全体を最小限で実装したハーネスです。

nanochat構成

単一リポジトリで完結し、複雑な設定ファイルや難解なフレームワークは不要。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
Enter fullscreen mode Exit fullscreen mode

--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
Enter fullscreen mode Exit fullscreen mode

効率化メカニズム例:

# 層ごとの残差スケーリング
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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

分散トレーニング:

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))
Enter fullscreen mode Exit fullscreen mode

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:
    # クロップして埋める
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

ステップ2:トレーニングデータを取得

# ClimbMixデータセット約20億文字をダウンロード
python -m nanochat.dataset -n 170
Enter fullscreen mode Exit fullscreen mode

ステップ3:トークナイザーをトレーニング

# BPEトークナイザーを訓練
python -m scripts.tok_train

# 圧縮率を評価
python -m scripts.tok_eval
Enter fullscreen mode Exit fullscreen mode

ステップ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
Enter fullscreen mode Exit fullscreen mode
  • --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
Enter fullscreen mode Exit fullscreen mode

ステップ6:モデルとチャット

# CLIチャット
python -m scripts.chat_cli -p "Why is the sky blue?"

# Web UI(ポート8000)
python -m scripts.chat_web
Enter fullscreen mode Exit fullscreen mode

研究ワークフロー:迅速な実験

小型モデルでアイデア検証→本番投入が可能です。

クイック実験(約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
Enter fullscreen mode Exit fullscreen mode

監視メトリクス

  • 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)