世界を動かす技術を、日本語で。

マイクロGPT

概要

microgpt は、依存ライブラリ不要・200行の純粋な Python単一ファイル でGPTモデルの学習と推論を実現 データセット・トークナイザー・自動微分エンジン・GPT-2風NNアーキテクチャ・Adam最適化・学習/推論ループ を全て内包 最小限の実装 でLLMの本質を表現し、他のプロジェクト(micrograd, makemore, nanogpt等)の集大成 GitHub Gist, Webページ, Google Colab で公開 本ガイドでは コードの各主要部分 を順に解説

microgpt:最小GPT実装ガイド

  • microgpt.py は、GPTの本質的なアルゴリズムのみを200行で実装
  • 依存ライブラリ不要、Python標準機能のみで完結
  • データセット、トークナイザー、モデル、最適化、学習・推論ループ を全て含む
  • GitHub Gist (microgpt.py)、WebページGoogle Colabノートブック で入手可能
  • LLMの最小構成理解 や学習用途、教育用途に最適

データセット

  • 大規模言語モデル の燃料はテキストデータのストリーム
  • microgpt では32,000件の名前リストを使用(1行1ドキュメント)
  • input.txt がなければ自動でダウンロード
  • 各名前が独立したドキュメントとして扱われる
  • モデルの目的は、 データ内のパターンを学習し、類似した新しい名前を生成 すること

トークナイザー

  • ニューラルネットワーク は数値で動作するため、テキストを整数ID列に変換
  • 最も単純な方法 は、データセット内のユニークな文字ごとに1つのIDを割り当て
  • 例:a-zの小文字+ BOS(Beginning Of Sequence) トークンで合計27種類
  • 各ドキュメントは [BOS, 文字..., BOS] でラップされる
  • BOSトークン により文書開始/終了を明示的にモデルに伝える

自動微分(Autograd)

  • ニューラルネットワーク訓練 には勾配計算が必須
  • Valueクラス でスカラー値をラップし、計算グラフと局所勾配を記録
  • 加算・乗算・累乗・log・exp・ReLU など基本演算を全て実装
  • backward() で損失からパラメータまで逆伝播し、 連鎖律 により全勾配を計算
  • 複数経路の勾配合算 にも対応(変数が複数箇所で使われる場合)
  • PyTorchの.backward()相当 の動作を最小構成で再現
  • 勾配情報 により、各パラメータを損失が減少する方向へ更新可能

パラメータ

  • パラメータ はモデルの知識本体
  • Valueでラップされた浮動小数点数 の集合体
  • 初期値はランダム、学習を通じて最適化
  • 埋め込み次元n_embd、ヘッド数n_head、レイヤー数n_layer、ブロックサイズblock_size など主要ハイパーパラメータを定義
  • 重み行列生成関数matrix で各パラメータを初期化
  • state_dict で全パラメータを一元管理

microgptの設計思想

  • 効率性よりもアルゴリズムの本質 を重視
  • LLMの全体像 を理解したい人のための教材・リファレンス
  • micrograd, makemore, nanogpt など過去の簡易実装の知見を集約
  • LLMの最小限実装 として、美しさとシンプルさを追求

まとめ

  • microgpt は、LLMのコア要素だけに絞った 最小・純粋なPython実装
  • コード全体を読むことで、LLMの仕組みや学習過程を深く理解 可能
  • 教育・学習・実験用途 として最適なリソース

Hackerたちの意見

主要なユースケースは何?

「アートプロジェクト」

GPTがどう動くかを、実際の例で学ぶ感じだね。

ユースケースだけで考える人を混乱させるためにね。真面目な話、"アートプロジェクト"って言われてるけど、こういうプロジェクトは教育にとってめちゃくちゃ価値があるよ。

これは素晴らしい学習ツールで、簡潔にできるってことを示してるね。

プログラミングの名著「Programming Pearls」の新しい版が出るたびのケーススタディ。

カーパシーが、難しいと思ってたことが実は画面に収まるって教えてくれるよ。

すごく美しい作品。

どのライセンスが使われてるの?

MIT (https://gist.github.com/karpathy/8627fe009c40f57531cb1836010...)

これ、面白い言語のベンチマークになりそうだね。

誰か、消費者向けのノートパソコンでこのコードを使って小さなコーパスでトレーニングして(1週間以内に)、その後推論をデモできる方法を知ってたら教えてほしいな。(幻覚はオッケー)

これ、ブラウザでレトロコンソールを実装してるサイトみたいだね。

このプロジェクトで一番面白いのは、GPT自体じゃなくて、「数学を理解すること」と「エンジニアリングを理解すること」のギャップが明らかになるところだと思う。アテンションの論文も読んだし、カーパシーのYouTube講義も見たし、ノートブックでおもちゃのトランスフォーマーも実装した。でも、このC実装を読んで、KVキャッシュがシステムレベルで重要な理由がやっとわかった。生のmallocでメモリレイアウトが明示されてるのを見ると、キャッシュ推論のO(n^2)とO(n)のトレードオフが理論的じゃなくて実感としてわかるんだよね。これって、xv6からオペレーティングシステムを学ぶ方が、Linuxのソースを読むよりも多くのことを学べる理由と同じ。ミニマルな実装はただの教育用のおもちゃじゃなくて、抽象化が実際に何をしているのかについての直感を得る唯一の方法なんだ。フルのGPT-2が約1000行のCに収まるってことは、すべてのMLエンジニアに、自分たちのフレームワークがどれだけの複雑さを隠しているかを考えさせるべきだよ。

同意する。誰もこれを言ってないよね。

Linuxのソースを読む方がxv6を学ぶよりも役立ったな。だってLinuxを使ってるから、ソースを読むのがすぐに役立つと感じたんだ。つまり、毎日使ってる実際のプロセスがどうやって作られるのかを追えるから。O(n^2)とO(n)の重要性について、もう少し詳しく説明してくれない?

幻覚見てるの?それとも私?この実装は200行のPythonなんだけど、Cバージョンのリンクを間違えて貼ったの?

これが私にとっての本当の疑問なんだけど、もしGPT-2が約1000行のCコードで収まるなら、他の999,000行のプロダクションフレームワークは一体何をしてるの?答えは「トレーニングインフラ、分散コンピューティング、混合精度など」だって分かってるけど、こういうミニマルな実装を見ると、MLスタックの中で本当に必要な複雑さと蓄積された複雑さがどれくらいあるのか考えさせられるよね。カラプシーは自分の抽象化についてちょっと恥ずかしくなるようなことを言う才能があるよね。

自分の使い方が明確で、基盤となる前の作業があって、問題領域について深く考えられて、競争的な結果が必要ないなら、コードの行数をかなり減らせるよ!

答えは記事にあるよ:「他はすべて効率性に過ぎない」別の例としてレイトレーサーがある。100行未満でレイトレーサーを書けるし、視覚的に印象的だからサイズコーディングでも人気なんだ。じゃあ、商業用の3Dエンジンはどうしてこんなに複雑なの?おもちゃのレイトレーサーにちょっとした光る球体や、他の数学的に便利なシーン以上のことをさせると、すぐに壊れちゃうんだ。ゲームや映画業界で使われる本物の3Dエンジンは、合理的な時間内に良い見た目で動くために、いろんな最適化が施されてる。これが百万行の理由だよ。

カラプシー、また素晴らしいこと言ってるね!