GPT-2ベース、3000バイトのCで実装されたChatGPTクローン(2023)
(nicholas.carlini.com)-
ChatGPTクローンの実装
- このプログラムは、GPT-2の依存関係なしの実装。
- TensorFlowファイルから重み行列とBPEファイルを読み込み、入力をシンプルなバイトペアエンコーダでトークン化する。
- 基本的な線形代数パッケージを実装し、Transformerアーキテクチャを定義し、Transformer推論を実行し、BPEデコーダで出力をデトークン化する。
- 約3000バイトのCで書かれている。
- 効率的に最適化されており、GPT-2 Smallモデルは現代のデバイスで数秒以内に応答できる。
- KVキャッシュと効率的な行列積アルゴリズムを実装している。
-
プログラム構成
- 基本行列数学ライブラリ(700バイト)
- 高速行列積(300バイト)
- ニューラルネットワーク層(300バイト)
- Transformerモデル(600バイト)
- バイトペアエンコーディング(400バイト)
- 入出力(200バイト)
- 重みの読み込み(300バイト)
- バイトペアエンコーディングの読み込み(300バイト)
-
ChatGPTとTransformerの背景
- ChatGPTは、言語モデルと対話できるアプリケーション。
- GPT-4は最新モデルで、非常に印象的。
- このCプログラムは、2019年の比較的弱いモデルであるGPT-2を使ってChatGPTの動作を実装している。
- GPT-2は、固定サイズの単語シーケンスを入力として受け取り、次の単語を予測するTransformer。
-
Cコードの説明
-
行列数学の導入(700バイト)
- ニューラルネットワークは行列演算で構成される。
- 最小限の行列定義を使って行列ライブラリを構築している。
- マクロを使って共通ロジックをメタルーチンとして抽出している。
-
高速行列積(300バイト)
- 基本的な行列積は3つのループを使って実装される。
- メモリとキャッシュの動作の都合上、同じメモリを繰り返し読み書きするほうが高速。
-
ニューラルネットワーク層(300バイト)
- Transformerを書くために、いくつかの特殊なニューラルネットワーク層を定義している。
- GELU活性化関数や、因果的注意に必要な下三角設定関数などを実装している。
-
Transformerアーキテクチャ(600バイト)
- Transformerを600バイトで実装している。
- 各層でキー、クエリ、値を計算し、注意行列を生成して結果を結合する。
-
バイトペアエンコーディング(400バイト)
- 言語モデルには固定サイズの入力が必要なため、単語断片を使ってトークンを生成する。
- 与えられた単語を個々の文字に分割し、隣接するトークンのペアをマージする。
-
重みの読み込み(300バイト)
- ニューラルネットワークの重みをディスクから読み込む。
- 重みは32ビット浮動小数点としてシリアライズされている。
-
バイトペアエンコーディングの読み込み(300バイト)
- バイトペアエンコーディング語彙をディスクから読み込む。
- ファイル形式はバイトペアエンコーディングの一覧で構成される。
-
-
結論
- 機械学習の数十年にわたる進歩を数千バイトに圧縮できる。
- シンプルなニューラルネットワークの例であり、実際のモデル重みを除くすべてを含んでいる。
1件のコメント
Hacker Newsの意見
GPT-2を使って友人との会話をシミュレートしたところ、面白く、ときには驚くほど正確だった。GPT-2とGPT-3の間の大きな飛躍は、より大きなモデル、より多くのデータ、あるいはその両方によるものなのか気になる。RLHFが大きな違いを生んでいるが、ベースのGPT-3モデルも十分な例が与えられれば非常に有用だった
シンプルなニューラルネットワークが実際にどれほどシンプルかを示す良い例だ。人工知能は、私たちがお金を稼ぐために使っている黒魔術だ
コードは実行していないが、その小ささには感銘を受けた。初期のELISAプログラムはもっと大きかった。ここ4年で、これをバイト単位で収められるようになった。魔法がどこにあるのか、ヒントがあるなら説明してほしい。GELU関数なのか、bashスクリプト経由でダウンロードされたモデルなのか気になる
GPT-2が私の好きなおとぎ話を書いてくれた。リンク: The Princess, the Fairy Godmother, and the Chest
GPT-2が実際にチャット用途に使えるよう調整されているのか気になる。そうでなければ、これをChatGPTクローンと呼ぶのは無理があると思う
LISPが常にCより優れているわけではない。今回は許される。コードへのリンクを見落としたなら、ここにある: C-Chat-GPT-2
どんなハードウェアで実行できるのか気になる。huggingfaceの量子化済み重みを使えるのか、どんな問題やクエリに特によく合うのかも気になる
最近はgptscriptを使って簡単に自分自身のChatGPTを実装できる。リンク: gptscript
Cマクロが正規表現とどう似ているのか理解できない。Cマクロは単語にマッチして別のテキストに置き換える。正規表現は比較的複雑なパターンでテキストにマッチするが、それ自体ではテキスト置換を行わない
ローカルで実行して、この GPT-2 がどんな出力を生成するのか確認した人がいるのか気になる