nanochatで理解するLLM製造工程
Karpathyの8,000行を1冊で読み切るコードリーディング
nanochat 解説 · LLM 作り方 · Karpathy · $48でGPT-2級を訓練する全工程を読む (Zennで全章無料)
Zenn累計32,000+ views · 4言語で30冊以上出版 · Kindle 6カ国で販売中
📖 無料で読める章
買う前に3章をその場で読めます。気に入ったらKindleで続きを。
01 はじめに
はじめに
2019年、OpenAIがGPT-2を訓練するのにかけた費用はおよそ$43,000でした。2026年のいま、同じGPT-2級のモデル(CORE指標でGPT-2を上回る水準)は8×H100のGPUノードを2時間ほど借りて、$48前後で訓練できます。7年でおよそ900分の1です。この数字はnanochatのREADMEに書かれている実測値で、しかも短縮記録はコミュニティの競技として今も更新され続けています。
$48で手に入るのは、モデルの重みファイルだけではありません。tokenizerの訓練から、事前学習、ファインチューニング、評価、そして自分のモデルと会話するチャットCLIまで、LLMというプロダクトが製造される全工程です。それを実装しているコードベースが、Andrej Karpathyの公開したnanochatです。実装本体(Pythonとシェルスクリプト)でおよそ8,000行。普通のエンジニアが週末に読み切れる分量に、現代のLLM開発の背骨がすべて収まっています。
この本は何をする本か
nanochatのコードを、工程の順番に上から読んでいきます。それだけです。
ただし「それだけ」に価値があると私は考えています。LLMを毎日使っているのに、その中身を工程として説明できるエンジニアは多くありません。論文は重すぎるし、理論書の多くは事前学習の仕組みで終わってしまい、「なぜ素のGPTは会話にならないのか」「チャットモデルはどこで生まれるのか」という、使う側が一番知りたい後半の工程まで届かないからです。
本書はその後半に重心を置きます。読み終えたとき、あなたはLLMを「使う側」から、製造工程を頭の中に持っている側、つまり 工程を所有する 側に渡っています。これが本書のキーワードです。とはいえ大げさな言葉で、要は「次の工程で何が起きるか、コードを見ながら自分の言葉で説明できる」という意味です。
もう1つのキーワードは複雑さのダイヤルは1つ。nanochatは、モデルの規模にまつわるハイパーパラメータ群を --depth(Transformerの層数)という1つのダイヤルに集約し、モデルの幅やヘッド数といった主要パラメータをそこから自動導出する設計になっています。GPU 8枚のspeedrunは24、MacBookのデモは6、と整数を1つ変えるだけで両極をカバーします。この割り切りがコードベース全体をどれだけ読みやすくしているか、各章で繰り返し目にすることになります。
2つのキーワードを短くまとめておきます。読み進めて迷子になったら、ここに戻ってください。
| キーワード | 指すもの |
|---|---|
| 工程を所有する | LLMの製造工程(tokenizer訓練→事前学習→SFT→評価→推論)を、コードの解像度で頭の中に持つこと。本書の到達点 |
| 複雑さのダイヤルは1つ | モデル規模の主要パラメータを --depth 1つから自動導出するnanochatの設計。コードの読みやすさの源泉 |
各章の内容
- 第1章: リポジトリの全体地図。speedrun.shを上から読み、工程の並びを掴みます
- 第2章: Tokenizer。言葉がモデルの入力になるまで
- 第3章: 事前学習。
--depth1つでTransformerが育つ仕組み - 第4章: SFT。文章生成器がチャット相手に変わる瞬間
- 第5章: 強化学習。検証可能な報酬でモデルを鍛える(オプション工程)
- 第6章: 評価。訓練したモデルの賢さをどう測るか
- 第7章: 推論エンジン。KVキャッシュとツール実行の実装
- 第8章: ここから先へ。MacBookでも全工程を一周する方法と、次の一歩
対象読者
AIツールを日常業務で使っているソフトウェアエンジニアを想定しています。PythonとPyTorchのコードが読めれば十分で、モデルを訓練した経験は必要ありません。GPUノードを借りて実際に訓練する必要もありません。本書はコードリーディングの本であり、手元で動かすのは第8章のCPU版デモだけで完結できます。
なぜ今か、そしてこの本の賞味期限
nanochatは2025年10月の公開後も活発に更新されていて、訓練速度のリーダーボードは数ヶ月単位で塗り替わっています。つまり本書が読む対象は「完成した教科書」ではなく、生きて動いている競技場です。だからこそ本書は、リポジトリの特定コミット(92d63d4)にピン留めして書かれています。本文中のコスト・時間・スコアの数字は執筆時点のREADMEとコードから引いたもので、あなたが読む頃には(良い方向に)古くなっているはずです。
数字は古びます。しかし工程の並びと設計判断、つまり「LLMはこういう順番で、こういう理由でこう作られる」という骨格は、この規模のコードで学んでおけば長く使えます。本書は唯一の正解ではなく、その骨格を掴むための補助線として読んでください。
それでは、全体地図から始めましょう。
この続きはKindleで →02 第1章 全体地図: speedrun.shを上から読む
第1章 全体地図: speedrun.shを上から読む
はじめにで挙げた$43,000という数字の出どころから確認します。dev/LEADERBOARD.mdによれば、2019年のOpenAIはGPT-2を32基のTPU v3で168時間訓練し、当時の相場は1時間8ドル、総額はおよそ43,000ドルでした。README.mdは、同じCORE score(0.256525)に達するモデルを8XH100ノードで2時間、48ドルで訓練できると書いています。スポットインスタンスならさらに下がって15ドル程度です。数字を掲げるだけでなく、その計測条件と出典がリポジトリ内のファイルで追えるようになっている。これがnanochatを読む価値の最初の実例です。
そしてこの全工程のレシピは、runs/speedrun.shというたった79行のシェルスクリプト1本に収まっています(wc -lで実測)。このスクリプトを支えるリポジトリ全体も、Pythonとシェルスクリプトを合わせて8,159行(同じく実測)しかありません。使う側から工程を所有する側に立つ最初の一歩は、まずこの地図を頭に入れることです。
この章では中身の解説には踏み込みません。リポジトリ全体がどう部屋分けされているか、そしてspeedrun.shが上から下に向かって何を並べているかだけを一望します。
6つのディレクトリに分かれた8,159行
トップレベルには6つの作業ディレクトリがあります。行数はwc -lで数えた実測値です。
nanochat/(3,414行、14ファイル): GPTモデル本体(gpt.py)、トークナイザ(tokenizer.py)、最適化(optim.py)、推論エンジン(engine.py)など、パイプライン全体が共有する部品置き場です。scripts/(2,592行、9ファイル):tok_train.pyやbase_train.pyのように、実行すると工程を1段階進めるエントリーポイントです。tasks/(581行、6ファイル):gsm8k.pyやmmlu.pyなど、モデルの実力を測る評価用データセットの読み込み処理です。runs/(384行、4ファイル):speedrun.shをはじめ、複数の工程を1本のシェルスクリプトに束ねたレシピ集です。dev/(Python 128行): データ準備の参考実装(repackage_data_reference.py)に加えて、LOG.md(1,089行)やLEADERBOARD.md(202行)といった開発記録が置かれています(Markdownの行数は冒頭の8,159行には含めていません)。tests/(1,060行、6ファイル): トークナイザの往復変換や推論エンジンのKVキャッシュなど、部品単位の動作確認です。
README.mdの「File structure」節には、各ファイルの役割が1行コメントで添えられています。例えばnanochat/engine.pyは「Efficient model inference with KV Cache」、tasks/gsm8k.pyは「8K Grade School Math questions」と書かれていて、ファイル名だけでは分からない粒度まで見取り図が用意されています。
speedrunを上から読む
runs/speedrun.shは上から順に読むと、そのままLLM製造の工程順になっています。
最初の30行ほどは環境構築です。
export OMP_NUM_THREADS=1
export NANOCHAT_BASE_DIR="$HOME/.cache/nanochat"
mkdir -p $NANOCHAT_BASE_DIR
command -v uv &> /dev/null || curl -LsSf https://astral.sh/uv/install.sh | sh
[ -d ".venv" ] || uv venv
uv sync --extra gpu
source .venv/bin/activate
uvで仮想環境を作り、依存関係を入れ、activateする。ここまではLLMの中身とは関係ない準備段階です。中間生成物はNANOCHAT_BASE_DIR(既定で~/.cache/nanochat)に集約される、という置き場所だけ覚えておくと、後の章でチェックポイントやトークナイザの保存先を追うときに迷いません。
続く「Tokenizer」区画では、事前学習データのダウンロードとトークナイザ訓練が並びます。
python -m nanochat.dataset -n 8
python -m nanochat.dataset -n 170 &
DATASET_DOWNLOAD_PID=$!
python -m scripts.tok_train
python -m scripts.tok_eval
コメントによれば、まず8シャード(約20億文字)だけを使ってトークナイザを訓練し、その裏で事前学習用シャードのダウンロードをバックグラウンドで走らせています。GPT-2級に必要なのは約150シャードで、170という数字は余裕を20枚上乗せした値です(これもコメントに明記されています)。データを取りに行く待ち時間と、トークナイザを訓練する時間を重ねる。工程を一直線に並べるのではなく、待ちが発生する場所を見つけて埋めているのがここでわかります。
ダウンロードの完了を待った後、本体の事前学習とSFT(教師ありファインチューニング)が続きます。
wait $DATASET_DOWNLOAD_PID
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=24 --target-param-data-ratio=8 --device-batch-size=16 --fp8 --run=$WANDB_RUN
torchrun --standalone --nproc_per_node=8 -m scripts.base_eval -- --device-batch-size=16
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft -- --run=$WANDB_RUN
torchrun --standalone --nproc_per_node=8 -m scripts.chat_eval -- -i sft
--depth=24が、本書を通して繰り返し出てくる「複雑さのダイヤル」です。層の数を1つ指定するだけで、幅やヘッド数、学習率、学習ステップ数まで自動で決まる設計になっています。スクリプト自身のコメントには「d24 model (slightly undertrained to beat GPT-2 => decrease data
事前学習が終わるとchat_sft.pyが会話用の特殊トークンやツール利用、多肢選択の解き方を教え込み、chat_eval.pyで仕上がりを測ります。スクリプトの中にchat_rl.pyは一度も出てきません。強化学習はspeedrunの外にあるオプション工程で、その位置づけは第5章で扱います。最後に残るコメントアウトされた1行は、chat_cli.pyでCLI越しに会話できるという案内だけです。本文が実際に動くのはそこまでです。

生きた競技場: Time-to-GPT-2
README.mdは「Time-to-GPT-2 Leaderboard」という表を掲げていて、runs/speedrun.shは「常に現時点のstate of the artを反映するスクリプト」だと説明されています。つまり、いま読んだこのスクリプトの数字は、来月には書き換わっているかもしれません。
| # | time | CORE | 内容 | 日付 |
|---|---|---|---|---|
| 0 | 168時間 | 0.2565 | オリジナルのOpenAI GPT-2チェックポイント | 2019 |
| 1 | 3.04時間 | 0.2585 | d24ベースライン、やや過学習 | 2026-01-29 |
| 2 | 2.91時間 | 0.2578 | d26やや未学習 + fp8 | 2026-02-02 |
| 3 | 2.76時間 | 0.2602 | 総バッチサイズを100万トークンに拡大 | 2026-02-05 |
| 4 | 2.02時間 | 0.2571 | データセットをNVIDIA ClimbMixに変更 | 2026-03-04 |
| 5 | 1.80時間 | 0.2690 | autoresearch round 1 | 2026-03-09 |
| 6 | 1.65時間 | 0.2626 | autoresearch round 2 | 2026-03-14 |

168時間から1.65時間まで、記録は100倍以上縮んでいます。しかもこの短縮はどこか1箇所の魔法のパラメータではなく、fp8化、バッチサイズ調整、データセットの入れ替え、探索手法の改良と、工程のあちこちに手を入れた積み重ねです。この本がこれから1章ずつ開けていくのは、この積み重ねが実際に起きている場所そのものです。
読み終わる頃には、この79行のうちどの行がデータ待ちを隠していて、どの行が訓練時間の大半を使い、どこに手を入れれば記録が縮むのかを、行を指さしながら言えるようになっているはずです。……と言えたら格好いいのですが、まずはtokenizerの中身からです。
この続きはKindleで →本書の概要
Andrej Karpathyが公開したnanochat(実装約8,000行)を、工程の順番に上から読み切るコードリーディング本。tokenizer訓練→事前学習→SFT→強化学習(GRPO)→評価(CORE)→推論エンジン(KVキャッシュ)の全工程を、実コードを引用しながら追う。2019年に$43,000だったGPT-2級モデルの訓練が2026年には$48まで下がった、その中身が何なのかをリポジトリ内の出典まで遡って確認する。GPUがなくてもruncpu.shでMacBook/ノートPCだけで全工程を一周する第8章まで、全8章+付録。Zennで全章無料公開。
この本でできるようになること
- speedrun.sh(79行)を地図に、8,159行のリポジトリ全体を工程の順番で説明できる
- なぜ素のGPTは会話にならないのか、チャットモデルがSFTのどの行で生まれるのかをコードで指させる
- GRPO強化学習が算数の精度を押し上げる仕組みを、報酬設計(文字列比較)から説明できる
- 「GPT-2級」の判定基準COREスコア0.256525を、22タスクの束ね方から理解できる
- runcpu.shでMacBook/ノートPCだけでもtokenizer訓練→対話までの全工程を一周できる
対象読者
- 【毎日使う人】ChatGPTやClaudeを日常的に使うのに、中身を工程として説明できないエンジニア
- 【コード派】論文や数式より、動く8,000行を読む方が頭に入る人
- 【後半が知りたい人】事前学習の解説で終わる教材に物足りず、SFT/RL/評価/推論まで見たい人
- 【GPUなし派】GPUノードを借りずに、手元のMacBookで訓練工程を体験してみたい人
- 【入門書迷子】LLM入門書は読んだが、工程同士のつながりが1本の線にならない人
この本で解決できる悩み
- LLMの仕組みを聞かれると「Transformerで次の単語を予測して…」で止まってしまう
- 論文は重すぎ、入門記事は浅すぎて、中間の教材が見つからない
- 事前学習の解説で終わる本が多く、チャットモデルがどこで生まれるのか分からない
- RLHFやGRPOという言葉は知っているが、実装コードを見たことがない
- KVキャッシュがなぜ必要なのか、実装レベルでは説明できない
- GPUを持っていないので、LLM訓練は自分には縁がないと思っている
この本の立ち位置
- コード寄り (数式の導出ではなく、実装8,000行を工程順に読む)
- nanochat特化 (LLM一般論ではなく、Karpathyの1リポジトリを深く)
- 中級者向け (Pythonが読めれば可、ML用語は用語メモで都度補足)
- 全工程網羅 (tokenizer→事前学習→SFT→RL→評価→推論エンジンまで一気通貫)
なぜこの本か
- 理論書が薄くなりがちな後半工程(SFT/強化学習/評価/推論エンジン)に重心を置く
- $43,000→$48という訓練コスト約900分の1の数字を、リポジトリ内の出典ファイルまで遡って確認する
- 「複雑さのダイヤルは1つ(--depth)」というnanochatの設計思想を軸に全章を貫く
- 行数・スコア等の数値はすべてリポジトリでの実測(wc -l)か出典ファイル明記
- 全章無料。まず読み切ってから、有料の実測シリーズに進める
他のAI本との違い
| 比較対象 | 本書の違い |
|---|---|
| ゼロから作る系の理論書 | 理論書は数式の導出と事前学習が中心。本書は動く実コードを工程順に読み、SFT以降の後半工程に重心を置く |
| nanochat公式README / Discussions | 公式は動かし方の説明。本書は「なぜこう実装されているか」を章立てで解説し、日本語で読み通せる形にする |
| LLM入門記事 | 入門記事は仕組みの概観で終わりがち。本書は8,000行を実際に読み、評価指標や推論エンジンまで降りる |
目次
- 01 はじめに 無料公開
- 02 第1章 全体地図: speedrun.shを上から読む 無料公開
- 03 第2章 Tokenizer: 言葉を32768個の部品に刻む 無料公開
- 04 第3章 事前学習: ダイヤル1つでTransformerを育てる 無料公開
- 05 第4章 SFT: 文章生成器がチャット相手になる瞬間 無料公開
- 06 第5章 強化学習: 算数で鍛えるGRPO 無料公開
- 07 第6章 評価: 幼稚園児の賢さをどう測るか 無料公開
- 08 第7章 推論エンジン: 1トークンずつ、それでも速く 無料公開
- 09 第8章 ここから先へ: MacBookで工程を所有する 無料公開
- 10 おわりに 無料公開
- 11 次に読む5冊 無料公開
- 12 付録: nanochatこぼれ話 無料公開
- 13 参考文献 無料公開
- 14 著者紹介 無料公開
- 15 奥付 無料公開
2019年、OpenAIがGPT-2を訓練するのにかけた費用はおよそ$43,000でした。2026年のいま、同じGPT-2級のモデルは8×H100を2時間借りて$48前後で訓練できます。7年で約900分の1。この数字の中身、つまりtokenizer訓練から事前学習、SFT、強化学習、評価、推論エンジンまでの全工程を実装しているのが、Andrej Karpathyの公開したnanochatです。実装本体はおよそ8,000行。週末に読み切れる分量に、現代のLLM開発の背骨が収まっています。
本書はそのnanochatを、工程の順番に上から読んでいくコードリーディング本です。重心は後半に置きました。「なぜ素のGPTは会話にならないのか」「チャットモデルはどこで生まれるのか」という、LLMを使う側が一番知りたいのに多くの教材が届かない工程を、実コードを引用しながら追います。
GPUは要りません。最終章ではruncpu.shを使い、手元のMacBookやノートPCだけでtokenizer訓練から対話までを実際に一周します。全章無料で公開しています。
「LLMを『使う側』から、工程を所有する側へ。」
シリーズ・関連書籍
関連記事で深掘りする
Kindleで購入する
Kindle Unlimited 対象
Kindleで読む (¥250)※ 本ページにはAmazonアソシエイトリンクが含まれます。クリック先での購入により著者に紹介料が入る場合があります。