nanochat(ナノチャット)は、Andrej Karpathy氏が2025年10月13日に公開したLLM学習用のリポジトリです。トークナイザの学習から事前学習、SFT(教師ありファインチューニング)、評価、推論までを1つのGPUノードで通しで実行でき、最後に自分で育てたモデルと会話できます。
公開時の売り文句は「100ドル・約4時間でChatGPTクローン」でした。現在のREADMEは「GPT-2相当を約2時間・48ドルで学習できる」と書いていますが、ミッドトレーニングの工程とWeb UIは削除済みで、公開直後の解説記事の手順をそのまま打つと動きません。本記事は2026年11月8日時点のmasterブランチ(最終コミットは7月3日の 92d63d4)のコードとREADMEを読み、費用の前提、動かし方、学習後の実力、日本語で学習する選択肢を整理します。
まとめ:nanochatの現状と試す前に押さえる点
- nanochatは「LLMの全工程を最小のコードで追える学習ハーネス」です。業務で使うチャットボットの土台ではありません。コードのライセンスはMITです。
- 標準の
runs/speedrun.shは8基のH100を積んだノード1台で約1.5〜2時間回ります。READMEの48ドルは1GPUあたり毎時3ドルの計算で、Lambdaの2026年11月16日適用の公開価格(4.59ドル)なら2時間で約73ドルです。 - 2025年10月版からの主な変更は、ミッドトレーニングの削除(2026年1月31日)、学習データのNVIDIA ClimbMixへの切替(3月4日)、Web UIの削除(7月3日)です。対話は
scripts.chat_cliのCLIだけになりました。 - 出来上がるモデルは事実誤認が多く、利用者によるd24モデルの単発比較ではMMLUが37.32%、GSM8Kが2.35%と報告されています。作者が保証する標準性能ではありません。
- 本家は英語前提です。日本語で学習するなら、東北大学のグループが公開している
tohoku-nlp/nanochat-jpが出発点になります。 - GPUが無くても
runs/runcpu.shでCPUやApple Siliconで縮小版を動かせます(M3 Maxで事前学習約30分)。工程の確認用です。
nanochatの位置づけ:Karpathy氏のLLM学習ハーネス
READMEの冒頭は、nanochatを「LLMを学習するための最もシンプルな実験用ハーネス」と定義しています。1つのGPUノードで動くこと、コードが短く改造しやすいこと、トークナイズ・事前学習・ファインチューニング・評価・推論の主要工程を全部含むことが設計の柱です。
巨大な設定オブジェクトやモデルファクトリはありません。モデル本体は nanochat/gpt.py、学習は scripts/base_train.py のように1工程1ファイルで、上から読めばLLMの作り方を追えます。
nanoGPTとは:nanochatの前身との違い
nanoGPTは、Karpathy氏が2022年に公開した、GPTの事前学習を小さなコードで再現するリポジトリです。nanochatの名前はここから来ています。扱う範囲は事前学習と公開済みGPT-2の重みを使った微調整までで、GPT-2(124M)をOpenWebTextで再現するのに8基のA100(40GB)で約4日かかる構成でした。
| 項目 | nanoGPT | nanochat |
|---|---|---|
| 対象工程 | 事前学習(と微調整) | トークナイザ〜推論の全工程 |
| トークナイザ | GPT-2のものを流用 | rustbpeで自前学習 |
| 成果物 | 文章の続きを書くモデル | 会話できるチャットモデル |
| 現状 | 2025年11月からdeprecated | 開発継続中 |
nanoGPTのREADMEには2025年11月に「探しているのはおそらくnanochatの方だ」という注記が入り、作者自身が古いものとして扱っています。全工程をコードで追いたいなら今から読むべきはnanochatです。事前学習ループだけを約300行で読みたい場合に限り、nanoGPTも教材になります。
「100ドル・4時間」の出どころ
リポジトリの説明文は今も「The best ChatGPT that $100 can buy」です。2025年10月版のREADMEは、8×H100ノードを毎時24ドルで借りて約4時間回すと100ドル前後、という計算でこの数字を出していました。このとき学習した20層のモデルの事前学習COREスコアは0.2219で、GPT-2の0.2565に届いていません。「100ドルでChatGPT」は、同じ形のパイプラインを小さく回せるという意味です。
48ドルの前提と2026年11月の単価
現行READMEの48ドルは「1GPUあたり毎時約3ドル」が前提です。Karpathy氏が使っていると書いているLambdaの料金ページでは、8基構成のHGX H100が1GPUあたり毎時4.59ドル(2026年11月16日0時UTCから適用、税別)と掲載されています。Nebiusの価格表でもHGX H100は4.50ドルで、READMEの3ドルより高い水準です。単純計算は次のとおりです。
| 前提 | ノード毎時 | 1.5時間 | 2時間 |
|---|---|---|---|
| READMEの試算(3ドル) | 24ドル | 36ドル | 48ドル |
| Lambda HGX H100(4.59ドル) | 36.72ドル | 約55ドル | 約73ドル |
どちらも初回の環境構築とデータ取得の時間を含みません。READMEは「スポットなら約15ドル」とも書いていますが、スポットは途中で回収されることがあります。base_train の既定(--save-every=-1)は最後にしか保存しないので、スポットで回すなら --save-every を指定し、再開は --resume-from-step で行います。予算を組むなら、借りる事業者の当日の単価に3時間程度を掛けて見積もってください。
2025年10月版から変わった点
国内の解説記事の多くは公開直後の内容で止まっており、現行のリポジトリとは次の点が食い違います(参照:公式README、変更履歴)。
| 項目 | 2025年10月版 | 2026年11月時点 |
|---|---|---|
| 標準モデル | d20(100ドル枠) | d24(GPT-2級) |
| 所要時間 | 約4時間 | 約1.5〜2時間 |
| 事前学習データ | 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)は7月3日に約1,000行ごと削除され、「UIが欲しければ好きなLLMに足してもらえばいい」という理由が添えられています。古い記事の python -m scripts.chat_web や scripts.mid_train を打つと、モジュールが無いというエラーになります。
masterへのコミットは7月3日で止まっています。一方でIssueやPRは続いており、11月に入って開かれたPRのうち17件が11月8日時点で未マージです。
Time-to-GPT-2リーダーボードの推移
開発の中心は、8×H100ノード1台でGPT-2のCOREスコア(0.256525)を超えるまでの時間の短縮です。COREはDCLM論文で導入された22の評価をまとめた指標で、2019年のGPT-2はTPU v3を32基使って168時間学習され、LEADERBOARD.mdは当時の単価(毎時8ドル)から約43,000ドルと計算しています。
| 日付 | 時間 | 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回目 |
autoresearchの2回は、Claudeが約2日間自律的に実験を回して見つけた改善を取り込んだものだと、コミットメッセージに書かれています。
この時間は total_training_time、つまり事前学習ループだけの時間で、トークナイザの学習や評価、SFTは含みません。README冒頭の「約2時間」と speedrun.sh のコメントの「約1.5時間」も揃っていないので、借りる時間には余裕を持たせてください。
学習パイプラインの構成とスクリプト
runs/speedrun.sh はリーダーボード最新の手順を常に反映する、とLEADERBOARD.mdに書かれています。中身は、データ取得→トークナイザ学習→事前学習→事前学習の評価→SFT→チャット評価の順です。
rustbpeとは:Rust製トークナイザ学習ツールとtiktokenの分担
トークナイザはGPT-4方式のバイトレベルBPEで、語彙数は2の15乗の32,768です。学習にはKarpathy氏がRustで書いた rustbpe を使い、推論時は同じ語彙をOpenAIの tiktoken に読み込ませてエンコードします。rustbpeは2026年1月3日に karpathy/rustbpe として独立し、PyPIの依存パッケージになりました。そのため古い記事にある maturin develop の手動ビルドは現行では不要です。学習には事前学習データの先頭約20億文字(8シャード、約800MB)を使います。BPEの仕組みそのものはBPE・WordPiece・Unigramの比較記事で扱っています。
事前学習:depth起点のモデル規模と学習設定の自動計算
モデルの大きさは --depth(Transformerの層数)1つで指定します。幅、ヘッド数、学習率の調整、学習トークン数、weight decayは自動で計算され、READMEはGPT-2相当の性能を24〜26層あたりと書いています。
speedrunは24層のモデルを --target-param-data-ratio=8 と --fp8 付きで学習します。base_train.py の既定値は12で、speedrun.sh のコメントは「GPT-2をわずかに超えるよう学習量を8まで減らした」と説明しています。FP8はH100以降が前提で、対応しないGPUでは --fp8 を外すと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氏自身が「実際にはずっと単純でREINFORCEに近い」と説明しており、参照モデルへのKL正則化もPPOの比率クリップも使いません。speedrunには含まれていないので、使うならSFTの後に別途実行します。2026年7月のIssue #810は、モデルが実際にサンプルした終了トークンがパディングと同じ扱いになり、「応答を止める」判断が強化されないと報告しており、11月8日時点で未解決です。元のGRPOの目的関数と見比べると差が分かります。
モデル構造:GPT-2から変えた箇所
骨格はデコーダのみのTransformerですが、nanochat/gpt.py の冒頭に列挙されている通り、2019年のGPT-2とは次の点が違います。個々の手法の「動く参照実装」として読む価値があります。
- 位置埋め込みを持たず、RoPE(回転位置埋め込み)で位置を表す
- QK norm、学習パラメータを持たないRMSNorm、バイアス無しの線形層、活性化関数relu²
- 入力の埋め込みと出力層の重みを共有しない
- 推論を軽くするグループ化クエリアテンション(GQA)に対応
- アテンションはFlashAttention 3を使い、使えない環境ではPyTorchのSDPAへ切り替える
- 既定では4層ごとに「短い窓3層+全文脈1層」を繰り返すスライディングウィンドウ注意(SSSL)
オプティマイザは行列パラメータにMuon、それ以外にAdamWを組み合わせた実装です。
動かす手順: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
git checkout 92d63d4
# 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でも動きますが遅くなり、FP8に対応しないので --fp8 は外します。FlashAttention 3が使えずSDPAへ切り替わるGPUでは、実行時の警告が --window-pattern L を勧めます。全層が全文脈注意になるので、標準のspeedrunとはモデル設定が変わります。
時間課金で失敗しないための確認項目
speedrun.sh には set -e がありません。途中のコマンドが失敗しても後続が進むので、GPUの課金が続く間にログを見る必要があります。
特に見落としやすいのがデータ取得です。nanochat.dataset は5回試して取れないシャードがあっても、件数を表示するだけで終了コードは0です(PR #873が修正を提案中で未マージ。接続できない状態で -n 1 を実行すると「Downloaded: 0/2 shards」と表示して終了コード0でした)。学習を始める前に ~/.cache/nanochat/base_data_climbmix のシャード数とログの Downloaded: の行を確かめてください。
GPUが1基だけ、またはVRAMが80GB未満の場合
スクリプト内の torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- (引数) を python -m scripts.base_train (引数) に置き換えると単一GPUで実行でき、READMEによればコードが自動で勾配累積に切り替わり、ほぼ同じ結果が得られます。speedrun.sh には事前学習のほか base_eval、chat_sft、chat_eval にも同じ torchrun があるので、4か所とも置き換えます。時間は約8倍かかります。VRAMが80GB未満のGPUでは --device-batch-size を16、8、4と下げてメモリ不足を避けます。VRAMの使用量はnvidia-smiで確認できます。
CPU・Apple Siliconでの縮小版の実行
runs/runcpu.sh は uv sync --extra cpu で環境を作り、6層・系列長512の小さなモデルを事前学習とSFTまで通します。スクリプトのコメントでは、MacBook Pro M3 Maxでトークナイザ学習が約34秒、事前学習が約30分、SFTが約10分です。READMEも「強い結果は得られない」と明言しています。指定のtorch 2.9.1はmacOS向けのwheelがarm64のみなので、Intel Macでは uv sync --extra cpu が依存解決の段階で止まります。精度の既定はCPUとMPSがfloat32で、最近のmacOSのMPSでは環境変数 NANOCHAT_DTYPE=bfloat16 を指定するとメモリが約25%減ります。
学習したモデルの実力と限界:現行masterの実測値
speedrunのモデルについて、READMEは「幼稚園児と話しているようなもの」と表現しています。挨拶や短い詩は返しますが、「空はなぜ青いのか」には「空気中の青と紫の小さな粒子が光を曲げるから」という誤った説明を自信ありげに返す例が載っています。
数字で見ると、2026年9月のIssue #860に、masterの 92d63d4 を同じd24の事前学習チェックポイントからSFTした利用者の報告があります。1回の比較で、作者が確認した値ではありません。
| タスク(正解率%、ChatCOREは共通5タスクの指標値) | master | 自己紹介・綴りデータを戻した場合 |
|---|---|---|
| ARC-Easy | 62.92 | 63.59 |
| ARC-Challenge | 49.74 | 50.77 |
| MMLU | 37.32 | 36.57 |
| GSM8K | 2.35 | 10.31 |
| HumanEval | 12.80 | 9.15 |
| ChatCORE | 0.2303 | 0.2414 |
差が大きいのはGSM8Kです。7月3日のコミットで自己紹介と綴りの合成データを削ると、算数の成績が1319問中136問正解から31問正解に落ちています。報告者は、GSM8Kの学習量は同じなので、答えを解析できる形式で出す癖が失われたのではないかと見ています。算数の性能を測るなら、この形式の問題を疑ってから数字を読んでください。
「GPT-2超え」も再現が保証された話ではありません。Discussion #846には、8基のRTX PRO 6000で各1回実行した利用者の報告があり、COREはリーダーボード6位の a825e63 が0.2603、現行masterが0.2516でした。後者はGPT-2の0.2565を下回っています。GPUも実行回数も公式の条件とは違うので断定はできませんが、CORE自体が実行ごとにぶれる指標だとLEADERBOARD.mdも認めています。
日本語で学習する:東北大学のnanochat-jpという選択肢
本家の標準構成は日本語を前提にしていません。事前学習のClimbMixもSFTのSmolTalkも英語中心で、トークナイザも英語テキストで学習されます。日本語で学習するなら、Tohoku NLP Groupが2026年8月に公開したnanochat-jpが現実的です。9月28日に更新された学習済みモデルv4の評価結果がREADMEに載っています。
| 項目 | 本家nanochat | nanochat-jp |
|---|---|---|
| トークナイザ | rustbpe(BPE) | SentencePiece Unigram |
| 事前学習データ | ClimbMix(英語) | nanochat-jp-pretrain v4 |
| 想定GPU | H100を8基 | H100(94GB)を4基 |
| 標準の層数 | 24層 | 22層 |
| target-param-data-ratio | 8 | 60 |
| 主な評価 | ARC、MMLU、GSM8Kなど(英語) | JMMLU、JamC-QA、PFGen、YOMI-Bench |
| コードのライセンス | MIT | Apache-2.0(本家由来部分はMIT) |
想定は九州大学の玄界や東京科学大学のTSUBAMEのような、1ノードにH100を4基載せた国内の共用計算機です。比率60は本家speedrunの8の7.5倍で、パラメータあたりの学習トークンがそれだけ多い設定です。READMEに所要時間と費用の記載はありません。本家の「2時間・48ドル」は当てはまらないと考えてください。データセットはv3とv4を合わせて約8,509万行、211GBあります。
性能について、READMEは既定の設定で学習すると「Qwen3.5-0.8Bと同等程度の日本語性能」と書いています。v4はv3に対して5指標中4指標で向上し、YOMI-Genは41.4から52.3に上がりました(比較相手のQwen3.5はthinking無効の設定)。
学習せずに手元で試すなら、Transformers形式に変換済みのnanochat-jp-v4-sft-hf(約10億パラメータ、Apache-2.0)を読み込めます。次はモデルカードのコードの改行を詰めたものです(モデル公開者の動作確認環境はtorch 2.11.0+cu130、transformers 5.13.1、tokenizers 0.22.2)。本家speedrunの仮想環境とは分けて、これらを導入したCUDA環境で実行してください。独自のモデル実装を読み込むので trust_remote_code=True が必要です。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "tohoku-nlp/nanochat-jp-v4-sft-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_id, trust_remote_code=True, torch_dtype=torch.bfloat16,
).to("cuda").eval()
messages = [{"role": "user", "content": "仙台市について教えて"}]
prompt = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True,
)
inputs = tokenizer(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
with torch.inference_mode():
output_ids = model.generate(
**inputs, max_new_tokens=2048, do_sample=True, temperature=0.6, top_p=0.9,
)
new_tokens = output_ids[0, inputs.input_ids.shape[1]:]
print(tokenizer.decode(new_tokens, skip_special_tokens=True))
モデルカードはグリーディかサンプリングで生成するよう指示しています。ビームサーチやキャッシュの切り詰めでは、独自に保持する状態が正しく更新されないためです。
nanochatを選ぶべき場面と選ぶべきでない場面
nanochatが向くのは、LLMの作り方をコードで理解したい人と、事前学習の改善を小さく速く試したい研究者です。READMEは12層(GPT-1程度)のモデルを約5分で事前学習して変更の効果を見る回し方を勧めています。制約付きでモデルをどこまで小さく強くできるかに関心があれば、OpenAIのParameter Golfも近い発想です。
社内の問い合わせ対応や日本語の業務チャットボットを作る目的でnanochatから始めるのはやめるべきです。本家で数十ドルで作れるのは英語で幼い応答をするモデルで、日本語版も既定の設定ではQwen3.5-0.8Bと同等程度です。業務用途なら、公開済みのオープンウェイトモデルをQLoRAで追加学習する方法を候補にしてください。まず既存モデルを業務の評価データで試し、追加学習が必要な場合に、学習費用と回答品質を比較します。業務の要件に合うモデルと学習方法の整理から始める場合は、当社の生成AI導入支援でもご相談いただけます。
学習したモデルを外部に出す場合はデータのライセンスの確認が要ります。本家が取得する karpathy/climbmix-400b-shuffle はMITと表示されていますが、元データのnvidia/Nemotron-ClimbMixのカードはCC BY-NC 4.0(非商用)です。nanochat-jpも、READMEが学習データと評価データ、モデル成果物にはリポジトリのライセンスが適用されないと明記しており、事前学習データは文書ごとに元コーパスの条件(CC BY-SA、ODC-Byなど)を引き継ぎます。コードのライセンスだけで商用可否を判断しないでください。
よくある質問
本当に100ドルでChatGPTのようなAIが作れますか?
会話の形式で応答するモデルは作れますが、GPT-2を上回るという比較は事前学習後のCOREスコアに基づくもので、対話能力全般を示すものではありません。事実誤認が多く、ChatGPTの代わりにはなりません。費用はREADMEの試算で8×H100を約2時間借りて48ドル、Lambdaの2026年11月16日適用の価格なら約73ドルです。「100ドル」はパイプライン全体を自分で回せる費用感を示す言葉と受け取るのが正確です。
nanoGPTとは何ですか?
Karpathy氏が2022年に公開した、GPTの事前学習を小さなコードで実装したリポジトリです。公開済みGPT-2の重みを使った微調整にも対応します。2025年11月からは作者自身がdeprecatedとし、後継のnanochatを案内しています。nanochatはトークナイザの学習、SFT、強化学習、評価、チャット推論まで含みます。
nanochatは日本語で使えますか?
本家は英語のデータとトークナイザで学習するので、日本語の応答は期待できません。Tohoku NLP Groupのnanochat-jpは、日本語コーパス、SentencePieceのトークナイザ、日本語の評価セットに置き換えたフォークで、学習済みモデルもHugging Faceで公開されています。READMEによると既定の設定の日本語性能はQwen3.5-0.8Bと同等程度です。
rustbpeとは何ですか?
Karpathy氏がRustで書いたBPEトークナイザの学習ツールです。GitHubの説明文は「tiktokenに欠けていた学習用コード」で、学習はrustbpe、推論時のエンコードはtiktokenという分担です。2026年1月にnanochatから karpathy/rustbpe として独立し、現在はPyPIの依存パッケージとして入るので、手動のビルドは要りません。
GPUなしで動かせますか?
runs/runcpu.sh でCPUやApple Siliconでも動きます。作者のMacBook Pro M3 Maxでは事前学習が約30分、SFTが約10分です。ただし6層の小さなモデルに縮めて学習するため、応答品質は限られ、工程の流れを確かめる用途に向きます。データの取得とトークナイザ学習も同じスクリプトに含まれています。