ここ数か月、Quadtrix.cpp — C++17で実装した、GPTスタイルの言語モデルを完成させる作業を進めていました。PyTorchなし。LibTorchなし。BLASなし。どんな種類の自動微分ライブラリもなし。依存関係はC++17の標準ライブラリとPOSIXソケットだけです。
Repo: https://github.com/Eamon2009/Quadtrix.cpp
すべて手書きです:テンソルライブラリ、全てのフォワードパス処理、そして各演算子ごとの勾配導出を明示的に行う、完全な解析的バックワードパス。
学習実行 v1.0
- アーキテクチャ:4層 x 4ヘッド x 200d デコーダのみのTransformer
- パラメータ:826,985(0.83 M)
- コンテキストウィンドウ:128文字
- コーパス:子ども向け物語 31.4 M文字
- 最良のval損失:1.6371 ナット
- 学習時間:単一のCPUコアで76.2分
- 外部依存:ゼロ
実装されているもの
- 軽量なCPU用floatテンソルライブラリ(2D/3D、行優先ストレージ)
- トークンおよび位置埋め込み、LayerNorm、Linear、Dropout
- 因果マスク付きマルチヘッド因果セルフアテンション
- フィードフォワードブロック:Linear -> ReLU -> Linear
- 完全なバックワードパス:クロスエントロピー、softmax、レイヤ正規化(Baら 3項の式)、スケールド・ドット・プロダクト・アテンション、Q/K/Vの勾配、ReLU、dropout、埋め込みのscatter-add
- バイアス補正付きAdamWオプティマイザ
- 文字レベルのトークナイザとバッチサンプラ
- 全CPUコアに対するOpenMP並列化 — matmul、bmm、softmax、layernormはいずれも並列化されています。8コア機で約5〜7倍の高速化
勾配の導出だけで、約1週間かかりました。
layernormのバックワードが、みんなをつまずかせる部分です。フォワードパス中にmu、inverse-std、x-hatを各行ごとに保存し、バックワードで完全な3項の式を適用する必要があります。アテンションのバックワードでは、アテンション重みに適用されたdropoutマスクと、射影出力に適用されたdropoutマスクのどちらが使われたのかを注意深く追跡する必要があります。
学習後のサンプル出力
```
You > Once upon a time
Quadtrix > , and said askiced and so owas said sri. The his brickerys and stew hhat and saw and stark a din't. She stingry and asked day. Timmy watch and played to cones.
You > Timmy is a
Quadtrix > bog the scated justo prove the bret you. Timmy nevery some the gecid. Her neplay to bet starked a way, that litked cliend.
You > what is life
Quadtrix > st happe. It happ a liked back abp happy thing flongs way. Lily lood take maked a fiside apie? Tom and abed Timm.
```
はい、これはめちゃくちゃです。これは、CPUで76分学習した0.83Mパラメータのモデルです。でもこれは私のめちゃくちゃで、私自身が導出して実装した勾配によって生成され、標準ライブラリの外側に絶対に何もリンクしていないバイナリ上で動いています。
LibTorchのGPU移植も別ブランチとして行いました。アーキテクチャも同じ、ハイパーパラメータも同じ、学習ループも同じ。違いはmodel->to(torch::CUDA)だけで、そしてautogradがそれを扱うのでbackward.hの600行ぶん全部が削除されます。RTX 3080ではおよそ75倍高速です。
[link] [comments]




