nanochat(ナノチャット)は、Andrej Karpathy氏が2025年10月13日に公開したLLM学習用のリポジトリです。トークナイザの学習から事前学習、SFT(教師ありファインチューニング)、評価、推論までを1つのGPUノードで通しで実行でき、最後に自分で育てたモデルと会話できます。
公開時の売り文句は「100ドル・約4時間でChatGPTクローン」でした。その後の改良で、2026年9月時点のREADMEは「GPT-2相当の性能を約2時間・48ドルで学習できる」と書いています。一方で、ミッドトレーニングの工程とWeb UIはリポジトリから削除されました。公開直後の解説記事の手順をそのまま打つと動きません。本記事は現行のmasterブランチ(最終コミット2026年7月3日)のコードとREADMEを読み、何が変わったか、どう動かすか、どこで使うべきかを整理します。
まとめ:nanochatの現状と試す前に押さえる点
- nanochatは「LLMの全工程を最小のコードで追える学習ハーネス」です。業務で使うチャットボットの土台ではありません。ライセンスはMITです。
- 標準の
runs/speedrun.shは8基のH100を積んだノード1台で約1.5〜2時間回り、GPT-2(2019年、15億パラメータ級)のCOREスコア0.256525を上回るモデルを作ります。1GPUあたり毎時3ドル換算で約48ドルです。 - 2025年10月版からの主な変更は、ミッドトレーニングの削除(2026年1月31日)、学習データのFineWeb-EduからNVIDIA ClimbMixへの切替(2026年3月4日)、Web UIの削除(2026年7月3日)の3つです。対話は
scripts.chat_cliのCLIだけになりました。 - GPUが無くても
runs/runcpu.shでCPUやApple Siliconで縮小版を動かせます(M3 Maxで事前学習約30分)。ただし出来上がるモデルは実用になりません。 - 事前学習データの元である
nvidia/Nemotron-ClimbMixは英語データで、Hugging FaceのカードはCC BY-NC 4.0(非商用)です。日本語対応や商用利用が要件なら、既存のオープンウェイトモデルを微調整する方が現実的です。
nanochatの位置づけ:Karpathy氏のLLM学習ハーネス
READMEの冒頭は、nanochatを「LLMを学習するための最もシンプルな実験用ハーネス」と定義しています。1つのGPUノードで動くこと、コードが短く改造しやすいこと、トークナイズ・事前学習・ファインチューニング・評価・推論の主要工程を全部含むことの3点が設計の柱です。
リポジトリには巨大な設定オブジェクトやモデルファクトリがありません。モデル本体は nanochat/gpt.py、学習は scripts/base_train.py のように1工程1ファイルで、上から読めばLLMの作り方が一通り追えます。READMEの貢献方針にある「最大限フォークしやすい強力なベースライン」という言葉が、この作りをよく表しています。
nanoGPTとの違い:対象工程と成果物
名前はKarpathy氏が2022年に公開したnanoGPTに由来します。nanoGPTが扱うのは事前学習と、公開済みGPT-2の重みを使った微調整までで、GPT-2(124M)をOpenWebTextで再現するのに8基のA100(40GB)で約4日かかる、という構成でした。nanochatはそこに独自トークナイザの学習、対話形式を教えるSFT、強化学習、評価タスク、チャット推論を加えた「フルスタック」版です。
| 項目 | nanoGPT | nanochat |
|---|---|---|
| 対象工程 | 事前学習(と微調整) | トークナイザ〜推論の全工程 |
| トークナイザ | GPT-2のものを流用 | rustbpeで自前学習 |
| 成果物 | 文章の続きを書くモデル | 会話できるチャットモデル |
| 現状 | 2025年11月からdeprecated | 開発継続中 |
nanoGPTのREADMEには2025年11月に「新しく改良された後継のnanochatがある。探しているのはおそらくnanochatの方だ」という注記が入り、nanoGPT自体は古いものとして残されています。LLMの全工程をコードで追いたいなら、今から読むべきはnanochatです。事前学習ループだけを約300行で読みたい場合に限り、nanoGPTも教材として役に立ちます。
「100ドル・4時間」の出どころ
リポジトリの説明文は今も「The best ChatGPT that $100 can buy」です。2025年10月版のREADMEは、8×H100ノードを毎時24ドルで借りて speedrun.sh を約4時間回すと100ドル前後、という計算でこの数字を出していました。同じREADMEには、32層(d32)・19億パラメータのモデルを380億トークンで約33時間・約800ドルかけて学習した上位版も載っていました。
ただし、このとき学習したモデル(20層のd20)の事前学習COREスコアは0.2219で、GPT-2の0.2565に届いていませんでした。「100ドルでChatGPT」は、あくまで同じ形のパイプラインを小さく回せるという意味です。
2025年10月版から変わった点
国内の解説記事の多くは公開直後の内容で止まっており、現行のリポジトリとは次の点が食い違います。コミット履歴と現行READMEで確認した差分です(参照:公式README、変更履歴)。
| 項目 | 2025年10月版 | 2026年9月時点 |
|---|---|---|
| 標準モデル | d20(100ドル枠) | d24(GPT-2級) |
| 所要時間 | 約4時間 | 約1.5〜2時間 |
| 費用の目安 | 約100ドル | 約48ドル(スポットで約15ドル) |
| 事前学習データ | FineWeb-Edu | NVIDIA ClimbMix |
| 工程 | BASE→MID→SFT(RLは任意) | BASE→SFT(RLは任意) |
| 対話の方法 | Web UI(chat_web)とCLI | CLIのみ |
| スクリプトの場所 | リポジトリ直下 | runs/ 配下 |
| rustbpe | リポジトリ内に同梱 | 別リポジトリ・PyPIに分離 |
ミッドトレーニングは2026年1月31日のコミットで削除されました。コミットメッセージによると、文書の先頭をBOSトークンに揃えるデータローダを入れたことで、事前学習とSFTの間に独立した工程を置く必要が薄れたためです。Web UI(scripts/chat_web.py と ui.html)は2026年7月3日に約1,000行ごと削除され、「UIが欲しければ好きなLLMに足してもらえばいい」という理由が添えられています。古い記事の python -m scripts.chat_web や scripts.mid_train を打つと、ファイルが無いというエラーになります。
Time-to-GPT-2リーダーボードの推移
現在の開発の中心は、8×H100ノード1台でGPT-2のCOREスコア(0.256525)を超えるまでの時間を縮めることです。COREはDCLM論文で導入された、ARCやMMLUなど22の評価をまとめた指標です。2019年のGPT-2はTPU v3を32基使って168時間、約43,000ドルかけて学習されました(LEADERBOARD.md)。
| 日付 | 時間 | CORE | 主な変更 |
|---|---|---|---|
| 2019年 | 168時間 | 0.2565 | OpenAIのGPT-2 |
| 2026-01-29 | 3.04時間 | 0.2585 | d24のベースライン |
| 2026-02-02 | 2.91時間 | 0.2578 | d26+FP8学習 |
| 2026-02-05 | 2.76時間 | 0.2602 | バッチを100万トークンへ |
| 2026-03-04 | 2.02時間 | 0.2571 | データをClimbMixへ |
| 2026-03-09 | 1.80時間 | 0.2690 | autoresearch 1回目 |
| 2026-03-14 | 1.65時間 | 0.2626 | autoresearch 2回目 |
ここでの時間は total_training_time、つまり事前学習ループだけの時間で、トークナイザの学習や評価、SFTは含みません。README冒頭の「約2時間・48ドル」、speedrun.sh のコメントの「約1.5時間」、表の1.65時間と、資料によって数字が揃っていません。いずれも初回の依存導入やデータ取得を含めた総時間・総費用の上限ではないので、借りる時間はその分を別に見込んでください。隣接する記録の間で最も大きく縮んだのはデータをClimbMixへ切り替えた回(2.76→2.02時間)ですが、この回は他の学習設定も同時に変わっており、データだけの効果とは切り分けられません。
学習パイプラインの構成とスクリプト
runs/speedrun.sh がリーダーボード最新の手順を常に反映する、とLEADERBOARD.mdに書かれています。中身は、データ取得→トークナイザ学習→事前学習→事前学習の評価→SFT→チャット評価の順です。
トークナイザ:rustbpeで学習しtiktokenで推論
トークナイザはGPT-4方式のバイトレベルBPEで、語彙数は2の15乗の32,768です。学習にはKarpathy氏がRustで書いた rustbpe を使い、推論時は同じ語彙をOpenAIの tiktoken に読み込ませて高速にエンコードします。rustbpeは当初nanochatの中にありましたが、2026年1月3日に karpathy/rustbpe として独立し、PyPIの依存パッケージになりました。GitHubの説明文は「tiktokenに欠けていた学習用コード」です。
分割用の正規表現はGPT-4とほぼ同じですが、数字を最大3桁ではなく2桁ずつに区切る点だけ変えています。学習には事前学習データの先頭約20億文字(8シャード、約800MB)を使います。BPEの仕組みそのものはトークナイザーとは?BPE・WordPiece・Unigramの違いと日本語での実装判断を解説【2026年版】で扱っています。
事前学習:depth起点のモデル規模と学習設定の自動計算
nanochatの設計で最も特徴的なのが、モデルの大きさを --depth(Transformerの層数)1つで指定する点です。幅は層数×64(--aspect-ratio の既定値)をヘッド次元(既定128)の倍数に切り上げた値で決まり、ヘッド数、学習率の調整、学習トークン数、weight decayは自動で計算されます。speedrunのように、学習比率やバッチサイズを引数で明示的に上書きすることもできます。READMEは、GPT-2相当の性能は現状24〜26層あたりで得られると書いています。
speedrunは24層のモデルを --target-param-data-ratio=8 と --fp8 付きで学習します。この比率は「Transformerブロックの行列と出力層のパラメータ数の何倍のトークンで学習するか」で、計算量最適の値より小さい8に下げて学習時間を詰めています。FP8学習はH100以降が前提で、対応しないGPUではこのフラグを外すとbf16で学習します。データは約170シャードをバックグラウンドで先に取得し、トークナイザの学習と並行させます。
SFT:会話形式・選択問題・ツール使用の学習
事前学習モデルは文章の続きを書くだけなので、SFTで会話用の特殊トークンと応答の形を教えます。scripts/chat_sft.py の学習データは、一般会話のSmolTalk(46万行)、多肢選択を教えるMMLUの補助訓練セット(10万行を3周)、算数とPython実行ツールの使い方を教えるGSM8K(8千行を4周)の混合です。旧版でミッドトレーニングが担っていた選択問題とツール使用の学習は、このSFTに吸収されています。
強化学習:REINFORCEに近い簡略版GRPOの実装
scripts/chat_rl.py はGSM8Kを使って強化学習を行います。docstringでKarpathy氏自身が「GRPOとカッコ付きで呼ぶのは、実際にはずっと単純でREINFORCEに近いものになったから」と説明しています。参照モデルへのKL正則化を外し、オンポリシーなのでPPOの比率クリップも使わず、アドバンテージは平均との差だけで標準偏差で割りません。speedrunでは初版からコメントアウトされており、現行版にも含まれていないので、使うならSFTの後に別途実行します。元のアルゴリズムとの差はGRPOとは?DeepSeekの強化学習アルゴリズムの公式・仕組みとPPOとの違いと見比べると分かりやすいです。
モデル構造:GPT-2から変えた箇所
骨格はGPT型のデコーダのみのTransformerですが、nanochat/gpt.py の冒頭に列挙されている通り、2019年のGPT-2とは多くの部分が違います。
- 位置埋め込みを持たず、RoPE(回転位置埋め込み)で位置を表す
- QueryとKeyを正規化するQK norm、学習パラメータを持たないRMSNorm、バイアス無しの線形層
- MLPの活性化関数はReLUの2乗(relu²)
- 入力の埋め込みと出力層の重みを共有しない
- 推論を軽くするグループ化クエリアテンション(GQA)に対応
- アテンションはFlashAttention 3を使い、使えない環境ではPyTorchのSDPAに切り替える
- 既定では4層ごとに「短い窓3層+全文脈1層」を繰り返すスライディングウィンドウ注意(SSSL)
オプティマイザは行列パラメータにMuon、それ以外にAdamWを組み合わせた実装です。どれもmodded-nanogptなど高速学習コミュニティで効果が確かめられた手法で、個々の手法を理解するための「動く参照実装」として読む価値があります。
動かす手順:8×H100でのspeedrunとGPUが無い場合
8×H100ノードでのspeedrun実行手順
依存管理はuvです。speedrun.sh がuvの導入から仮想環境の作成、uv sync --extra gpu までを自動で行うので、GPUノードを借りたらクローンして実行するだけです。PyTorchは2.9.1をCUDA 12.8向けのインデックスから入れます。
git clone https://github.com/karpathy/nanochat.git
cd nanochat
# 1.5〜2時間かかるのでscreen内で実行し、ログをファイルに残す
screen -L -Logfile runs/speedrun.log -S speedrun bash runs/speedrun.sh
# 終了後、仮想環境を有効にしてCLIで会話する
source .venv/bin/activate
python -m scripts.chat_cli
# 1問だけ聞くなら
python -m scripts.chat_cli -p "Why is the sky blue?"
学習曲線をWeights & Biasesに記録したい場合は、先に wandb login を済ませ、WANDB_RUN=speedrun を付けて起動します。中間生成物は既定で ~/.cache/nanochat に保存されます。8基のA100でも動きますが、H100より遅くなります。A100はFP8に対応しないので、--fp8 は外して実行します。
GPUが1基だけ、またはVRAMが80GB未満の場合
スクリプト内の torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- (引数) を python -m scripts.base_train (引数) に置き換え、区切りの -- も外して単一GPUで実行すると、コードが自動で勾配累積に切り替わり、ほぼ同じ結果が得られます。同じGPUを8基から1基に減らすので、時間は約8倍かかります。VRAMが80GB未満のGPUでは --device-batch-size を既定から16、8、4と2の累乗で下げてメモリ不足を避けます。累積の段数はスクリプトが計算するので、実効のバッチサイズは変わりません。
CPU・Apple Siliconでの縮小版の実行
runs/runcpu.sh は uv sync --extra cpu で環境を作り、6層・系列長512の小さなモデルを事前学習とSFTまで通します。スクリプトのコメントでは、MacBook Pro M3 Maxでトークナイザ学習が約34秒、事前学習が約30分、SFTが約10分です。READMEも「強い結果は得られない」と明言しています。パイプラインの流れをノートPCで確かめる用途です。
| ハードウェア | 既定の計算精度 |
|---|---|
| A100・H100など(SM 80以上) | bfloat16 |
| V100・T4など(SM 80未満) | float32(float16も可) |
| CPU・Apple SiliconのMPS | float32 |
精度は環境変数 NANOCHAT_DTYPE で上書きできます。READMEによると、最近のmacOSのMPSでは bfloat16 を指定するとメモリが約25%減り、速度はほぼ同じです。
学習したモデルの実力と限界
speedrunで作るモデルの学習計算量は約4×10の19乗FLOPsで、READMEは「幼稚園児と話しているようなもの」と表現しています。挨拶や短い詩は返しますが、「空はなぜ青いのか」には「空気中の青と紫の小さな粒子が光を曲げるから」という誤った説明を自信ありげに返す例が載っています。雑談らしい受け答えの形はできても、事実の正しさは期待できない水準です。
2025年10月版のREADMEに載っていた成績表(約3時間51分の実行)では、SFT後のMMLUが0.3151、ARC-Easyが0.3876、GSM8Kは強化学習後でも0.0758でした。現行版は事前学習の性能がGPT-2を超えていますが、GPT-5のような現代のLLMとは比較になりません。
標準構成は日本語用途を前提にしていません。事前学習データのNemotron-ClimbMixもSFTのSmolTalkも英語中心で、トークナイザも英語テキストで学習されるためです。
nanochatを選ぶべき場面と選ぶべきでない場面
nanochatが向くのは、LLMの作り方をコードで理解したい人と、事前学習の改善を小さく速く試したい研究者です。READMEは研究用途として、12層(GPT-1程度)のモデルを約5分で事前学習して変更の効果を見る回し方を勧めています。社内勉強会で「トークナイザから会話まで」を1日で通す教材にもなります。制約付きでモデルをどこまで小さく強くできるかを競う取り組みに関心があれば、Parameter Golf(パラメーターゴルフ)とは?OpenAIの16MB圧縮チャレンジの結果と勝ち筋も近い発想です。
一方、社内の問い合わせ対応や日本語の業務チャットボットを作る目的でnanochatから始めるのはやめるべきです。数十ドルで作れるのは英語で幼い応答をするモデルで、品質も言語も業務の要件に届きません。この目的なら、公開済みのオープンウェイトモデルをQLoRAなどで追加学習する方が、費用も品質もはるかに現実的です。
学習したモデルを外部に出す場合はデータのライセンスも確認が要ります。nanochatが取得する karpathy/climbmix-400b-shuffle はMITと表示されていますが、その元データである nvidia/Nemotron-ClimbMix のHugging FaceのカードはCC BY-NC 4.0です。コード自体はMITでも、学習済みモデルの商用利用が許されるかは元データの条件を含めて判断してください。
よくある質問
nanochatは無料で使えますか?
コードはMITライセンスで無料です。費用がかかるのはGPUのレンタル代で、READMEの試算では8×H100ノードを約2時間借りて約48ドル、スポットインスタンスなら約15ドルです。CPU版の runcpu.sh はノートPCやMacでも動きます。
nanoGPTとnanochatは何が違いますか?
nanoGPTは事前学習と既存モデルの微調整を扱う2022年のリポジトリで、2025年11月からは作者自身がdeprecatedとしています。nanochatはトークナイザの学習、SFT、強化学習、評価、チャット推論までを含み、学習後に会話できるモデルを作れます。
本当に100ドルでChatGPTのようなAIが作れますか?
会話の形式で応答するモデルは作れますが、性能は2019年のGPT-2を少し上回る程度です。事実誤認が多く、ChatGPTの代わりにはなりません。「100ドル」はパイプライン全体を自分で回せる費用感を示す言葉と受け取るのが正確です。
GPUなしで動かせますか?
runs/runcpu.sh でCPUやApple Siliconでも動きます。作者のMacBook Pro M3 Maxでは事前学習が約30分、SFTが約10分です。ただし6層の小さなモデルに縮めて学習するため、応答品質は限定的で、工程の流れを確認する用途に向きます。
speedrunとは何ですか?
runs/speedrun.sh のことで、データ取得からSFT後の評価までを1本で実行するスクリプトです。同時に、GPT-2のCOREスコアを超えるまでの学習時間を競うリーダーボードの名前でもあり、2026年3月14日時点の最速記録は1.65時間です。