- Andrej Karpathyのnanochatは、100ドルの予算でChatGPTに似た対話型LLMを自分で構築できるオープンソースプロジェクト
- 全体のパイプライン(トークナイズ、事前学習、ミッドトレーニング、ファインチューニング、評価、推論、Webサービス)が簡潔でハッカブルに実装されている
- 8xH100 GPUノード1台で1本のスクリプトだけで4時間以内に学習完了し、GPT-2レベルの性能を目標とするd26モデルは約300ドルで12時間、1000ドルティアは41.6時間を要する
- 330KBサイズの8,300行・44ファイルで構成された極めて簡潔なコードベースで、複雑な設定オブジェクトやモデルファクトリなしに読みやすくフォークしやすい強力なベースラインを提供
- Eureka LabsのLLM101nコースのキャップストーンプロジェクトとして開発中で、1000ドル未満の予算で到達可能なマイクロモデルの最先端水準を改善することが目標
nanochatプロジェクト概要
- nanochatは、ChatGPTに似た対話型LLMを100ドルのコストで実装したい開発者のために作られたオープンソースプロジェクト
- コードベース全体が単一で、読みやすく、依存が少なく、簡潔に書かれており、修正や実験がしやすい
- pretraining、finetuning、評価、推論、Web UIまで、すべての工程を一括で管理できる環境を提供
- speedrun.shスクリプトで全パイプラインを自動実行できるため、初心者でも簡単に始められる
- 最小限の依存関係とハックしやすい構造で設計されており、理解しやすく改変しやすい教育目的に最適化されている
- このプロジェクトは、Eureka Labsで開発中のLLM101n講義のキャップストーンプロジェクトとして活用される予定
クイックスタート
- GPU環境(特に8xH100ノード)でspeedrun.shを実行すると、約4時間で学習と推論の工程が構成される
- 8xH100ノード基準で1時間24ドル、合計4時間
- screenセッション内での実行を推奨しており、長時間の学習中でも安定して監視できる
screen -L -Logfile speedrun.log -S speedrun bash speedrun.sh コマンドを使用
Ctrl-a dでデタッチし、tail speedrun.logで進行状況を確認
- 学習が終わると、シンプルなWeb UIを通じてLLMに自由に質問し、結果を会話ウィンドウで確認できる
python -m scripts.chat_web
- 4e19 FLOPs規模のモデルで、幼稚園児レベルの会話能力を提供
- ストーリーや詩の作成を依頼できる
- ハルシネーション現象を確認できる
- 空がなぜ青いのかといった基本的な質問に答えられる
- 学習結果と各種性能指標はreport.mdに保存される
学習結果レポート
- report.mdファイルに学習実行の「成績表」が含まれる
- 各種評価指標とメトリクスを提供
- 最終要約テーブルにBASE、MID、SFT、RL各段階の性能を表示
- コードベース統計
- 文字数: 333,989
- 行数: 8,304行
- ファイル数: 44
- トークン数(概算): 83,497
- 依存関係(uv.lockの行数): 2,004行
- ベンチマーク性能の例
- CORE: 0.2219 (BASE)
- ARC-Challenge: 0.2875 (MID), 0.2807 (SFT)
- GSM8K: 0.0250 (MID), 0.0455 (SFT), 0.0758 (RL)
- HumanEval: 0.0671 (MID), 0.0854 (SFT)
- 総所要時間: 3時間51分
- モデル性能はChatGPTに比べると低いが、低予算LLM実装の経験を重視している
より大きなモデル
- 100ドルでは高性能なChatGPTクローンは学習できず、実際のLLMは数百万ドル規模の設備投資で知られている
- 注目すべき追加スケールは2つある
- 約300ドルティアのd26モデル(depth=26): 約12時間学習し、GPT-2のCOREスコアをやや上回る
- 1000ドルティア: 約41.6時間を要し、きりの良い数字
- d26モデル学習のためのspeedrun.sh変更点
- より多くのデータシャードのダウンロードが必要
- パラメータ数に20を掛けてトークン数を計算
- 4.8を掛けて文字数を計算
- 2億5000万で割ってシャード数を計算(約450個必要)
- --depth=26オプションを使用し、OOM回避のためdevice_batch_sizeを32から16へ半減
- ミッドトレーニング段階でも同じdevice_batch_sizeを使う必要がある
計算環境の要件
- 8xA100 GPUノードでも実行可能だが、やや遅い
- 単一GPUでも実行可能
- torchrunを省略してもほぼ同じ結果を生成
- 自動的にgradient accumulationへ切り替わる
- 時間は8倍長くかかる
- 80GB未満のVRAMを持つGPUではハイパーパラメータ調整が必要
- --device_batch_sizeを32(デフォルト)から16、8、4、2、1へ下げてメモリを確保
- 1未満に設定するには、より工夫が必要
- 素のPyTorchベースなので、xpuやmpsなどさまざまな環境もサポート可能
活用度とアクセシビリティ
- nanochatの最大の利点は、すべてのファイルを一度にパッケージ化して、他のLLMや文書検索サービスに対して簡単に質問できること
- files-to-promptユーティリティの使用例
- py、md、rs、html、toml、shファイルを含む
- rustbpe/targetフォルダを除外
- cxml出力形式を選択
- 約330KB(約10万トークン未満)、45ファイル・8千行のコードとしてパッケージ化
- DeepWikiの利用を推奨
- GitHub URLのgithub.comをdeepwiki.comに変えることで、リポジトリについて質問できる
- Devin/Cognitionが提供
貢献とプロジェクトの方向性
- nanochatはまだ完成していないプロジェクト
- 1000ドル未満の予算で最初から最後まで扱えるマイクロモデルの最先端水準を改善することが目標
- アクセシビリティにはコストだけでなく、認知的複雑さも含まれる
- 巨大な設定オブジェクト、モデルファクトリ、if-then-elseの怪物コードはない
- 徹底的に設定可能なLLM「フレームワーク」ではない
- **単一で一貫しており、最小限で、読みやすく、ハック可能で、できるだけフォークしやすい「強力なベースライン」**コードベース
- 最初から最後まで実行され、具体的なChatGPTクローンと成績表を生成するよう設計されている
1件のコメント
Hacker Newsの意見
興味深いAIコーディングツールの使用体験の共有。
どの程度コードを自分で書いたのか気になって、Karpathyに聞いたことがある。
Karpathy: 質問ありがとう。実際のところ、コードの大半は自分で書いた(tab自動補完は使用)。
claude/codexエージェントも何度か使ってみたが、精度が低く、あまり役に立たなかった。
おそらく自分の作ったリポジトリがデータ分布からあまりに外れているからかもしれない。
元の会話へのリンク
「リポジトリがデータ分布から離れすぎている」という言葉で、なぜ自分がAIモデルを使ってもいつも助けにならなかったのか説明がつく。
自分のやっている作業はどれも独特すぎて、分布から離れている。
Karpathyのような信頼できる人がそう言ってくれるのはうれしい。
AGIがすぐ来ると思っている人たちは、少し期待を下げた方がいい気がする。
自分もClaude Codeは好きだ。
定期的にWebコードを書く必要があるが、Web分野は学習データのcoverageが非常に良いので、Claudeは自分よりずっと優秀なWeb開発者だ。
でも自分の自動化ツールのアルゴリズムのコア部分に踏み込もうとすると、Claudeが使える材料は少なくなり、そのぶんミスも増える。
それでも全体としてはプラスなので、喜んでお金を払って使っている。
Web開発の補助にとどまるとしても十分大きな助けだ。
これはむしろ自然な現象だと思う。
新しく独創的にコードを書く状況なのだから。
多くの人がKarpathyの返答を批判しているが、むしろ彼がclaude/codexを試したという点から、過去にはそれらのツールが実際に役立ったことがあったと分かる。
Karpathyのツイートの別ミラーリンクはこちら
nanochatがmodded-nanoGPTに着想を得ている点が印象的。
系譜はKarpathyのnano-GPT → Keller Jordanのmodded-nanoGPT(モデルを高速に学習する版)→ NanoChat。
modded-nanoGPTは、小さなGPTモデルを驚くほど高速に学習させる点が注目に値する。
特にAdamWの代わりに、linear layerにMuon optimizer(著者が自作)を使っている。
modded-nanoGPT, Muon optimizer紹介
MuonはKeller Jordanがこの高速学習コンテストのために作った最適化手法で、他の人たちの改善も加わっている。
1年もたたないうちに、すでにモデル学習のSOTAとして広く使われている。
8xH100で単一のinferenceノードを回しているというのはかなり衝撃的だ。
実運用のフロンティアLLMもこの程度で動かしているのか、それとももっと多くのVRAMや計算資源を食うのか気になる。
1時間あたり約$8、1リクエストに5秒かかると仮定すると、およそ700件ほどのリクエストを処理できる。
つまり1リクエストあたり約1セントということになる。
自分の計算が間違っていないか気になる。
今も実際に学習が進行中(20分前に開始)。
実行ログを公開
4時間後にモデルが完成したら、誰でもinferenceを試せるよう共有する予定。
完成したモデルをHugging Faceにアップロードした。
Karpathyほど良い結果は出せなかったが(seed運が悪かったのかも?)、
それでも試してみるのは面白い。
例えば「犬の足は何本ですか?」と聞くと、
アシスタント: 「とても興味深い質問で、何世紀にもわたって犬好きの間で議論されてきた問いです。『正解』というものは特になく(...)」と答える。
最初のチャート横のコメントで、
「進捗の主な指標。Bits per byteはKarpathyの言う通り『通常のcross-entropy lossよりはるかに優れた指標だ。各トークンについて、バイト数でlossを正規化することで、トークナイザーに依存せず比較できるようになる』」
これはあまりにも明快な説明で、tinystoriesで自分のトークナイザー実験をしていたときにこれを思いつかなかったのが恥ずかしい。
自分のトークナイザーが実際どれほど良かったのか、改めて分析してみたくなった。
このリポジトリをW&Bで学習しながら回す方法について、簡単なhowtoがあるといい。
モデル学習の流れを一度もやったことがないプログラマ向けに、ステップごとに共有してもらえるだろうか。
面白い!
Karpathyのシェイクスピア生成器は、ollamaの後で自分が初めて試したプロジェクトだった。
LLMの仕組みを理解したかったからだ。
先週からLLMに没頭していて、ゼロベースの学習・推論システムを2つのバックエンドで作っている。
rocm/pytorchは煩雑なのでかなり抵抗感がある。
Vulkanは良い。llama-cppでもそう使っている。
先週はCPU/GPUの両バックエンドを動くようにし、GPUバックエンドにバグがあったので修正に集中した。
WGSLコードをリファクタリングして効率も高めた。
この過程でLLMを積極的に活用したが、驚くほど大きな転換点だった。
リファクタリング用プロンプトを使うと、一段ずつエラーを潰していき、最終的にはastral tyで型チェックまで通るコードにできる。
これ以上に非効率な選択はないように思う。
今週末にnanoGPT(リンク)を使ってみた。
かなり前のプロジェクトだが、自分で小さなシェイクスピアGPTを作って学習させてみる素晴らしい実習だ。
約0.8MパラメータでCPU上で動かした。
出来上がりはだいたい予想通り「いまいち」だ。
それでも魔法のような感覚は味わえた。
ディープラーニング専攻ではなく、ただ試したりハックしたりするのが好きな人には最高の入門になる。
週末のnanoGPT体験記をまだブログに書き切れていない……全部書き終えていたらここに貼れたのに残念。
小規模で良いML研究が検証されるという点で有益な実習だ。
この新しい例はさらに発展したもので、instruction following、tool use SFT、RLVRまで扱っている。
そのおかげで、より実用的なbaselineが生まれている。
シェイクスピアのコードを少し調整して別のデータで学習させると、Magic The Gatheringのcommanderデッキ生成がかなりうまくいく。
「chief LLM whisperer Alec Radfordに助言をもらった」
AlecとAndrejのポッドキャストがもし実現したら、世界を揺るがすと思う。
GPT1の栄光の時代から、今や4時間でGPT3相当まで作るとは。
Eureka Labs: Githubリンク
Andrejは本当に多作で、驚くべき人物だ。
彼の仕事を追うこと自体がすばらしい体験だ。
人類に対して最大の貢献をする方法は、
自分がどれだけ多くの人を、どれだけ深く助けられるかの掛け算だといつも考えてきた。
Karpathyのオープンソースの仕事は、その意味で最高レベルのレバレッジを持つアプローチだ。
今日の世界もオープンソースプロジェクトの上に成り立っている。
世界中の誰もが無料でコーディングを学び、ソフトウェアを作れる自由があるおかげだ。
AI/LLM分野もこうした前向きな方向に進んでほしい。
ソフトウェアにおけるこの無料・共有の伝統は本当に好きだが、
LLMでは学習コストが高すぎることと高性能ハードウェアの必要性のために、この流れを維持するのは難しそうだ。
今後はソフトウェア開発も、LLMホストに「家賃」を払って追従していく構造になる気がする。
オンプレミス(local)の推論環境を再び誰でも使えるようにする方法が出てくるかもしれないが、
まだ高いトレーニングコストのせいで不透明に見える。
そしてLLMへの依存度が高まるほど、
プログラミング初心者向けチュートリアルのような「手作業」のコンテンツ制作がだんだん減っていくのではないかと心配だ。
(少し長くなるが、すべてより良い世界を願う気持ちから出ている)
この見方は、主流の「反AI」感情とは少し違う。
知的財産権という概念は、人類への直接的な貢献というより、情報の所有を特定の個人が蓄積し、人類全体に貸し出す構造だ。
だが同時に、個々の創作者が生計を立てられる環境も絶対に必要だ。
Karpathyのような仕事だけでなく、何千人ものYouTube制作者たちもそれぞれの分野で社会に大きく貢献していると思う。
ただ、多くの人がスポンサーシップに依存しなければならないのは少しほろ苦い。
Patreonもあるが、理想的とは言えない。
こうしたすべての努力が社会に大きく貢献しているという点には同意する。
最近Daily ShowでJon Stewartが、AI学習を人類の知識のstrip miningだと言っていた。
AI学習が盗みのようなものだと一方的に片づけられることもあるが、実際には非常に多様な見方がある。
こうした流れは最終的に超資本主義的な知識所有構造を固定化し、
アイデアの所有権がますます少数に集中する結果につながりかねない。
この現象は世界全体にはあまり役立たず、一部の集団だけが得をする構造だ。
知的財産権の取引も、時間がたてば結局さらに少数へ集中していく。
現代社会に合った議論と新しい解釈がぜひ必要だと思う。
いつも「上が止めるだろうし、議論しても無駄だ」という敗北主義が議論を妨げるのは残念だ。
どうすればより良い案を生み出せるのか、自由に議論することが大切だ。
彼のANN/LLM from scratch動画シリーズはよく勧めている。
講義がとても明快で、コーディングスタイルもPythonicで簡潔なのに読みやすいので、
(pytorchのベクトル化部分は複雑だが、それは単に難しい領域だからだ)
動画を見ながらスタイルまで学べるという意味で、誰にとっても大きな助けになる。
自分が実際に所有している心理学の本、資料、レポート、論文を全部使ってモデルを学習させ、
1xH100ノード(リンク)で必要なときに専門的な質問に対して推論できるようにできるだろうか。
実際にそうすることはできるが、性能は極端に低くなるはずだ。
こういう場合は、事前学習済みの小さなモデルを持ってきて自分のデータでファインチューニングするか、
RAGワークフロー(Retrieval Augmented Generation)、あるいはその両方を組み合わせる方がずっと良い。
それはできる。
ただし、汎用モデルを使い、自分の文書を作業コンテキストに入れるさまざまな方法(たとえばRAGやAppleのhierarchical memoriesなど。論文リンク)の方が、むしろ良い結果をもたらすかもしれない。
できなくはないが、自分のデータセット自体があまりに小さいので、事前学習済みモデル+ファインチューニング、あるいは小さなモデル+RAGよりかなり劣る性能になる。
無理。
このプロジェクトは本当に刺激的だ!
実際のプロンプト性能の例やテスト結果が分かるとうれしい。
こちらに実際のプロンプトのスクリーンショットがあると教えてくれている。