
2026/06/29 4:38
Show HN:NanoEuler – パーティクル C/CUDA でゼロから構築した GPT-2 規模のモデル
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Nanoeuler は独自の研究アソファクトであり、C/CUDA で完全にゼロから構築された GPT-2 クラスの言語モデルです。その名前はレオナルド・オイラーに由来し、残差ブロックを常微分方程式のフォワード・オイラー法ステップとして解釈することから命名されています。PyTorch や autograd などの外部機械学習フレームワークを使用せずに開発され、標準ライブラリ(libm、OpenMP)のみを用いて実装されており、RMSNorm(pre-norm)、Rotary embeddings、SwiGLU フィードフォワードネットワーク、Grouped-query attention (GQA)、Multi-token prediction (MTP)、そしてカスタム FlashAttention カーネルを搭載したデコーダーのみを持つトランスフォーマーを実装しています。
プロジェクトは手書きによるフォワード・バックワードパスで数学的な正しさを示し、RTX 4070(〜1.16億パラメータ)上で二重精度による厳密な有限差分勾配チェックを経て検証されました。これらのカスタムカーネルのおかげで、標準実装と比較して学習速度が約 3 倍向上しています。モデルは Project Gutenberg の古典作品と FineWeb-Edu ウェブスライスで事前学習され、Alpaca 指示データを用いてファインチューニングされ、現在では指令レスポンス形式に従うチャット能力のあるシステムとして動作していますが、生成されるコンテンツは浅いものとされています。
nvcc sm_89(GPU)、gcc 13 -O3(CPU)という特定のコンパイラ設定で構築された Nanoeuler は、事前学習、チェックポイントの再開、全モデル勾配チェック、インタラクティブチャットモードをサポートしています。MIT ライセンスの下に教育・研究のためのベンチマークとして而非営製品の位置付けで公開されており、複雑な AI パイプラインに対する透明性のある代替手段として機能し、モデルの完全性を検証すると同時に、C/CUDA でエンドツーエンドの学習プロセス全体を提示しています。今後の計画には、約 2.7 億パラメータへの規模拡大と、より良い人間価値整合性のための直接好み最適化(DPO)の実装が含まれます。
本文
GPT-2 規模言語モデル:ゼロ・スクラッチ C/CUDA 実装
ゼロから構築された、GPT-2 規模の言語モデル。PyTorch、自動微分、既存の機械学習ライブラリは一切使用せず、順伝播と逆伝播を完全に手書きで記述・検証済みです。 本プロジェクトはトレーニング全体のパイプライン(バイトレベル BPE トークナイザーから事前学習、教師あり微調整まで)を含み、RLHF や DPO の検討も予定しています。
現状および正直な報告
- 目的: オープンな研究・教育のアートファクトです。実用的なチャットボットではありません。
- 性能: 単一コンシューマー GPU(RTX 4070 など)で約 1.16 億パラメータ学習させたモデルです。
- GPT-2-small の精神を受け継ぎ、英語を扱える流暢さですが、実世界に関する知識はありません。
- 事前学習から SFT(教師あり微調整)までのエンドツーエンドパイプラインは機能します。
- 目標: ゼロ・スクラッチでのエンジニアリングと、完全かつ理解しやすいトレーニングパイプラインの実現にあります。
使用方法
以下コマンドで動作します。外部依存関係はありません(Linux/gcc 13 推奨)。
make check # 逆伝播の検証(勾配チェック、倍精度計算) make # トレーニングバイナリのビルド ./nanoeuler train # 小さなデモモデル(〜0.76M パラメータ)の学習 ./nanoeuler train big # 大きいモデル(〜10M パラメータ;GPU 向け)の学習 ./nanoeuler chat # REPL: プロンプト入力→続き生成
なぜ「Euler(オイラー)」なのか?
- 残差ブロックの意味: $x = x + f(x)$ という計算は、数値積分のステップと解釈できます。
- 数学的根拠: 順法(Forward-Euler)で常微分方程式 $\frac{dx}{dt} = f(x)$ を離散化すると、ステップサイズ $\Delta t = 1$ のときまさに残差更新に等しくなります。
- $$ x(t+\Delta t) = x(t) + \Delta t \cdot f(x(t)) \implies x_{new} = x + f(x) $$
- 概念: 深い残差ネットワークは**離散化された常微分方程式(ODE)**であり、深さは積分時間、各層は隠れ状態の 1 ステップ積分です。
- 命名の由来: Neural ODEs のこの視点を提案したレオンハルト・オイラーにちなんで名付けられました。
アーキテクチャ
Decoder-only Transformer です。どこにもバイアスはありません。
基本構成
- Norm: RMSNorm(pre-norm、バイアスなし)
- 位置エンベッディング: クエリ・キー適用時の RoPE(回転位置エンベッディング)
- FFN: SwiGLU ($down(silu(gate(x)) \cdot up(x))$)
- Attention: グルーピング・クエリ・アテンション(GQA)
- マルチトークン予測(MTP): 補助的なヘッドを用いた推論加速。生成時はヘッド 0 が使用されます。
トークナイザー
- 手書きのバイトレベル BPE。
- GPT-2 スタイルで、独立した「リードインスペース」をトークン化することで無駄をなくします。
- GPU モデルでは語彙サイズ 4096(英語約 3.4 バイト/トークン)を採用。
ブロック構造順序
- Attention: $x = x + \text{attn}(\text{rmsnorm}(x))$
- FFN: $x = x + \text{swiglu}(\text{rmsnorm}(x))$
構成設定と性能比較
| モデル | dim | ヘッド数 (q/kv) | レイヤー | コンテキスト | 語彙サイズ | パラメータ数 |
|---|---|---|---|---|---|---|
CPU 小型 () | 128 | 4 / 2 | 4 | 512 | 512 | ~1.05M |
GPU パイプライン () | 768 | 12 / 4 | 16 | 512 | 4096 | ~116M |
- CPU 小型: 12 コアで数時間学習完了。デモ用途向け。
- GPU パイプライン: FlashAttention カーネル適合(ヘッドサイズ 64)。書籍・ウェブデータでの事前学習および SFT 対応。
検証された逆伝播
手書きの逆伝播は誤りが発生しやすいですが、すべての解析的勾配を中央有限差分法と比較して検証しています。 チェックは倍精度で行われ、浮動小数点数の相殺による誤差が正しい勾配を隠しません。
tok : max rel err 1.02e-04 qkvw : max rel err 7.20e-07 gatew : max rel err 6.86e-08 ... max relative error: 1.02e-04 >>> backward OK (error < 1e-2)
RoPE、SwiGLU、GQA、MTP など、すべてのパラメータテンソルと隠蔽関数の勾配がチェック済み。
GPU エンジン(CUDA)
cuda/nanoeuler_cuda.cu は完全なゼロ・スクラッチ CUDA ポートです。
各カーネルは CPU 参照実装に対してデバイス上で検証され、**全モデルレベルでの GPU 勾配チェック(GPU vs CPU で約 $10^{-6}$ の精度)**が実施されています。
カーネルと加速
- matmul: cuBLAS 委託 + TF32 テンソルコア使用
- RMSNorm / RoPE / SwiGLU / Softmaxなど標準機能実装
- FlashAttention: 手書き実装(タイル化、オンライン Softmax、$T \times T$ メトリクスなし)を採用。
- これによりトレーニングステップが約 3 倍高速化。
- Optimizer: AdamW
ビルド(RTX 40 シリーズ / sm_89 向け)
cd cuda nvcc -O3 -arch=sm_89 -Xcompiler -fno-tree-reassoc,-fno-tree-copy-prop nanoeuler_cuda.cu -o nanoeuler_cuda -lcublas
GPU モード一覧
: カーネルセルフテスト(GPU vs CPU)./nanoeuler_cuda
: 全モデル勾配チェック実行./nanoeuler_cuda g
: ゼロから事前学習開始(5000 ステップごとチェックポイント保存)./nanoeuler_cuda t
: 最新チェックポイントからの再開./nanoeuler_cuda tr
: GPU での自己回帰生成./nanoeuler_cuda i "It was"
: Alpaca データによる教師あり微調整(SFT)実行./nanoeuler_cuda s
: 微調整済モデルとの対話モード./nanoeuler_cuda c
チャットボット:SFT とデータパイプライン
パイプラインの仕組み
チャットモデル化には 2 つの段階を踏みます。
- 事前学習: 書籍・ウェブデータでベースモデルを作る(
)。./nanoeuler_cuda t - 微調整 (SFT):
で Alpaca データを読み込み、各例に対して指示テンプレートを適用します。./nanoeuler_cuda s- 損失マスク: プロンプトとパディング位置にはターゲット
を設定し、クロスエントロピーカーネルをゼロ勾配にします。-1
- 損失マスク: プロンプトとパディング位置にはターゲット
データセットの準備
以下の手順でコーパスを作成します(Python なし、単一バイナリのみ)。
sh data/get_gutenberg.sh # 書籍(Project Gutenberg クラシック)-> data/gutenberg.txt sh data/get_web.sh # ウェブ(FineWeb-Edu スライス)-> data/web.txt cat data/gutenberg.txt data/web.txt > data/pretrain.txt sh data/get_alpaca.sh # 微調整用指示データ -> data/alpaca.json
- 書籍: 著作権切れ作品をダウンロードし、ヘッダー/フッター(*** START ... *** / *** END ... ***)を削除します。
- ウェブ: DuckDB CLI を直接利用し、静的バイナリで取得します。
ロードマップとファイル構成
完了済み ✅
- GPT-2 スタイルの手書きバイトレベル BPE トークナイザー完成。
- cuBLAS/FlashAttention を用いたゼロ・スクラッチ CUDA エンジン構築および勾配チェック検証完了。
- 書籍・ウェブ混合データによる事前学習、チェックポイント保存・再開機能の実装。
- Alpaca データを用いた SFT(応答マスク付き損失)によるチャットモデル化完了。
計画予定 ⏳
- DPO: 次に取り組むアライメント段階です。
- スケーリング: モデル規模とデータ量の拡大(目標:約 2.7 億パラメータ)。
- 公開: 一般向けトレーニング済みチェックポイントの公開予定。
ファイル構成
: CPU モデル(順伝播、逆伝播、学習、サンプリング、チャット REPL)nanoeuler.c
: GPU エンジン(BPE、カーネル、FlashAttention など全機能)cuda/nanoeuler_cuda.cu
/data/get_gutenberg.sh
/get_web.sh
: コーパス取得スクリプトget_alpaca.sh
: ビルド設定Makefile
: MIT ライセンスLICENSE
重要な注意点
- 知識の浅さ: このサイズ(単一 GPU 学習)では、「流れるような英語」は生成できますが、実質的な世界知識は限定的です。
- 「深淵な真理」や「広範な知識」を得るには、数桁多くパラメータとデータが必要です(例:1.35 億パラメータでもトレーニングトークン 6000 億必要)。
- 本質: SFT はモデルに「どう応答すべきか」を教えるだけであり、「何が真実か」という知識は事前学習とスケールによって得られます。これは忠実なゼロ・スクラッチデモンストレーションであり、高度な AI アシスタントではありません。