C++17でスクラッチからトランスフォーマーを作った——PyTorchもBLASも依存なし、CPU学習で0.83Mパラメータ

Reddit r/LocalLLaMA / 2026/5/3

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • 開発者はQuadtrix.cppとして、C++17でGPTスタイルの言語モデルをスクラッチ実装し、PyTorch/LibTorch/BLASや自動微分ライブラリを使わず、C++標準ライブラリとPOSIXソケットのみを依存としている。
  • プロジェクトには自作テンソルライブラリと、各演算子に対する勾配の解析的導出を明示的に実装する完全なバックプロパゲーションが含まれており、LayerNormや注意機構(ドロップアウトマスクの扱いを正確に追跡すること)などが難所だとしている。
  • モデルはデコーダーオンリーのトランスフォーマー(4層、4ヘッド、200d)でパラメータは0.83M、コンテキストは128文字、学習データは児童向け物語の31.4M文字だ。
  • 記載された学習では、単一CPUコアで76.2分、検証損失の最良値は1.6371 natsに到達し、OpenMP並列化により8コア環境で約5〜7倍の速度向上が得られた。
  • 生成例は大半が判別しにくい(ガービッシュ)ものの、著者は自前で導出・実装した勾配に基づいて、依存ゼロのC++バイナリ上で学習と推論が動いている点を強調している。

ここ数か月、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倍高速です。

submitted by /u/Suspicious_Gap1121
[link] [comments]