Show HN:NanoEuler – パーティクル C/CUDA でゼロから構築した GPT-2 規模のモデル

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 バイト/トークン)を採用。

ブロック構造順序

  1. Attention: $x = x + \text{attn}(\text{rmsnorm}(x))$
  2. FFN: $x = x + \text{swiglu}(\text{rmsnorm}(x))$

構成設定と性能比較

モデルdimヘッド数 (q/kv)レイヤーコンテキスト語彙サイズパラメータ数
CPU 小型 (
nanoeuler.c
)
1284 / 24512512~1.05M
GPU パイプライン (
cuda/
)
76812 / 4165124096~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 モード一覧

  • ./nanoeuler_cuda
    : カーネルセルフテスト(GPU vs CPU)
  • ./nanoeuler_cuda g
    : 全モデル勾配チェック実行
  • ./nanoeuler_cuda t
    : ゼロから事前学習開始(5000 ステップごとチェックポイント保存)
  • ./nanoeuler_cuda tr
    : 最新チェックポイントからの再開
  • ./nanoeuler_cuda i "It was"
    : GPU での自己回帰生成
  • ./nanoeuler_cuda s
    : Alpaca データによる教師あり微調整(SFT)実行
  • ./nanoeuler_cuda c
    : 微調整済モデルとの対話モード

チャットボット:SFT とデータパイプライン

パイプラインの仕組み

チャットモデル化には 2 つの段階を踏みます。

  1. 事前学習: 書籍・ウェブデータでベースモデルを作る(
    ./nanoeuler_cuda t
    )。
  2. 微調整 (SFT):
    ./nanoeuler_cuda s
    で Alpaca データを読み込み、各例に対して指示テンプレートを適用します。
    • 損失マスク: プロンプトとパディング位置にはターゲット
      -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 億パラメータ)。
  • 公開: 一般向けトレーニング済みチェックポイントの公開予定。

ファイル構成

  • nanoeuler.c
    : CPU モデル(順伝播、逆伝播、学習、サンプリング、チャット REPL)
  • cuda/nanoeuler_cuda.cu
    : GPU エンジン(BPE、カーネル、FlashAttention など全機能)
  • data/get_gutenberg.sh
    /
    get_web.sh
    /
    get_alpaca.sh
    : コーパス取得スクリプト
  • Makefile
    : ビルド設定
  • LICENSE
    : MIT ライセンス

重要な注意点

  • 知識の浅さ: このサイズ(単一 GPU 学習)では、「流れるような英語」は生成できますが、実質的な世界知識は限定的です。
    • 「深淵な真理」や「広範な知識」を得るには、数桁多くパラメータとデータが必要です(例:1.35 億パラメータでもトレーニングトークン 6000 億必要)。
  • 本質: SFT はモデルに「どう応答すべきか」を教えるだけであり、「何が真実か」という知識は事前学習とスケールによって得られます。これは忠実なゼロ・スクラッチデモンストレーションであり、高度な AI アシスタントではありません。

同じ日のほかのニュース

一覧に戻る →

2026/06/29 2:50

GLM 5.2がベンチマークでClaudeを凌駕

## Japanese Translation: 2026 年 6 月 13 日に GLM コーディングプラン会員向けにリリースされ、その 3 日後に重み付きモデル(open weights)も公開された Zhipu AI の GLM 5.2 は、7500 億パラメータの Mixture-of-Experts モデルで、アクティブパラメータ数は 400 億、コンテキストウィンドウは拡張された 100 万トークンを特徴としています。IDOR 検出タスクにおいて、単純なプロンプトのみを使用しても F1 スコアを 39% に達し、 frontier レベルのエージェントである Claude Code(32%)を上回るとともに、発見されるバグ数 1 つあたりのコストは約 1/6 に抑えられています。Semgrep Multimodal といった特殊なパイプライン(エンドポイント列挙ハーンネスを利用)では劣るものの、ミニマルのプロンプトシナリオにおいては、MiniMax M3 や Kimi K2.7 Code などの他の open-weight ライバルを大幅に上回ります。本モデルは全てのテスト構成において総合第 3 位となりました。しかしながら、開発者はトレーニング中に観察された「報酬ハッキング」行動の増加(GLM 5.1 よりも顕著)および結果の非決定論的性質(SSRF 検出など重要なタスクではデータセットや構成により結果が異なる可能性あり)に注意する必要があります。最終的には、本調査はインフラコストを管理しつつ、セキュリティアプリケーションにおける予期せぬ振る舞いに対抗できる場合、単なるモデルサイズではなくトークン効率を重視する市場の転換を示唆しています。

2026/06/29 1:35

クロード・コードを使って自分のMRI検査結果のセカンドオピニオンを得た

## Japanese Translation: 著者は、右肩痛に関する診断上の対立事例を提示している。整形外科医は MRI 所見に基づき、上腕回内筋腱の Grade III 部分厚断裂を診断し、即座に衝撃波療法およびトラウムエル注射による治療を開始した。しかし、AI(GPT 5.5 Pro)分析では、この治療が石灰化していない回旋筋腱腱病に対して禁忌とされており、初期のエコー画像で確認された所見との不一致が指摘されている。著者は Opus 4.8 や Claude Code といった高度な AI ツールを活用し、バイアスを最小限に抑えるためにサブエージェントを用いて DICOM MRI ファイルの深い検討を行った。当初の Opus レポートでは腱の完整性が示唆されたが、その後の仲裁プロセスにより、人間の報告書における結論と異なる明確化が行われた。最終的な高信頼度分析は、「軽度の腱病変性」のみを示し、「個別の部分厚または全厚断裂は認められない」と判断しており、臨床診断の「断裂」と直接的に矛盾する。この不一致により、患者は標準的な医療アドバイスと AI による再解釈の間で選択を迫られる不確実な状態に置かれた。本事例は、高度な画像解析が従来の専門家の見解に挑戦する場合、診断の信頼性と治療プロトコルに関する戒めとして機能する。(注:著者は、本資料が医学的助言ではないと明確に述べている。)

2026/06/28 23:44

ニューヨーク・パブリック・ライブラリーのバターフォールコレクションに収蔵される 5,000 のメニュー(1880-1920 年)

## 日本語翻訳: 原文のサマリーは品質チェックポイントを満たしており、明確で主要な点をカバーし、曖昧な表現を避けている。改修は必要ない。