23 ポイント 投稿者 GN⁺ 2025-09-16 | 7件のコメント | WhatsAppで共有
  • RustGPT は、外部の機械学習フレームワークを使わず、純粋なRustとndarrayだけで実装された トランスフォーマーベースの言語モデル
  • 事前学習(Pre-training)指示チューニング(Instruction tuning) を通じて、事実ベースの知識と対話パターンを学習するよう設計されている
  • 構造は トークナイザー → 埋め込み → トランスフォーマーブロック → 出力射影 へと続く典型的な LLMアーキテクチャ に従う
  • モジュール化されたソース構造テストコード を備え、学習・推論・最適化の過程を細部まで理解できる
  • Rustエコシステムで フレームワークに依存せずLLMをゼロから実装 してみたい開発者や学習者にとって重要な参考資料

プロジェクト概要

  • RustGPTは、外部の機械学習フレームワークや複雑な依存関係なしに、純粋な Rust言語と線形代数演算ライブラリ(ndarray) だけでLLMを実装したオープンソースプロジェクト
  • 主な目標は、現代的なLLMの中核構成要素(トランスフォーマー、アテンション、埋め込み、最適化など)を自ら実装し、学習過程を理解すること
  • 他の主流LLMと異なり、トランスフォーマー構造、バックプロパゲーション、トークナイザー、オプティマイザなどをすべてRustコードで設計しており、Rust開発者や研究者がディープラーニングの原理をゼロから理解し拡張できる点が大きな強み
  • ndarray で行列演算を処理し、PyTorchやTensorFlowのような外部機械学習パッケージに依存しないことが差別化要因
  • モジュール化とテストカバレッジがしっかりしており、多様な実験や改善に適していて、「ゼロから自分で作るLLM(From Scratch)」の教育用途にも向いている

主な特徴と実装方式

  • トランスフォーマーアーキテクチャ: 入力テキスト → トークン化 → 埋め込み → トランスフォーマーブロック → 最終予測
    • 入力テキストはトークン化過程を経て埋め込みベクトルに変換される
    • 埋め込みは Transformer Block(マルチヘッドアテンション + フィードフォワードネットワーク)を通過する
    • 最後に Output Projection Layer で語彙の確率分布を生成し、予測を行う
広告

実装構造

  • main.rs: 学習パイプライン、データ準備、インタラクティブモードの実行
  • llm.rs: LLM全体の順伝播・逆伝播および学習ロジック
  • transformer.rs, self_attention.rs, feed_forward.rs: 中核となるトランスフォーマーブロック
  • embeddings.rs, output_projection.rs: 埋め込みおよび最終出力層
  • adam.rs: Adamオプティマイザの実装
  • 各モジュールには対応する テストコードtests/)が含まれており、機能検証が可能

学習・テスト方法とデータフロー

  • 学習過程
    • 語彙集の生成 → 事前学習(100epoch、事実文データ) → Instructionチューニング(100epoch、対話データ)
    • 事前学習の例: "The sun rises in the east and sets in the west"
    • Instructionチューニングの例: "User: How do mountains form? Assistant: ..."
  • インタラクティブモード対応
    • 学習完了後、プロンプト-応答ベースの対話テストが可能
    • 例: "How do mountains form?" → "Mountains are formed through tectonic forces or volcanism..."
広告

技術的な詳細構成

  • 語彙サイズ: トレーニングデータに基づいて動的に設定
  • 埋め込み次元: 128、隠れ層: 256
  • 最大シーケンス長: 80トークン
  • アーキテクチャ: 3つのトランスフォーマーブロック + 埋め込み + 出力層
  • 学習アルゴリズム: Adamオプティマイザ、gradient clipping(L2 norm 5.0制限)
  • 学習率: pre-training 0.0005、instruction tuning 0.0001
  • 損失関数: cross-entropy loss

モデルとコードの特徴

  • カスタムトークナイザー(句読点処理)
  • グリーディデコーディング ベースのテキスト生成
  • モジュール型の階層構造 と明快なインターフェース
  • テストカバレッジ: 各層・各機能ごとの単体テストコードを搭載
  • 依存関係: ndarray(行列演算)、rand / rand_distr(乱数初期化)のみ使用(PyTorch / TensorFlowなど外部MLは未使用)
  • 教育的価値: 代表的な現代LLMの内部構造・訓練原理の学習に最適

発展可能性

  • 高度なアーキテクチャ導入: マルチヘッドアテンション、RoPE、位置エンコーディングなど
  • 性能最適化: SIMD、並列学習、メモリ効率の改善
  • モデル保存 / 読み込み対応
  • 改良されたサンプリング(ビームサーチ、Top-k / Top-p)および評価指標の追加

意義

  • PythonベースのPyTorch、TensorFlowフレームワークに依存せずとも、RustだけでLLMを直接実装できる ことを示す学習用・実験用プロジェクト
  • LLMの内部動作原理を理解し、Rust環境でMLシステムを作りたい開発者にとって有用なリファレンス

7件のコメント

 
t7vonn 2025-09-18

すっきりしていますね

 
ahwjdekf 2025-09-16

いや、なんで? 俺だってちょっとはできるってことか?

 
cosine20 2025-09-22

karma -47の貫禄ww

 
skrrgang 2025-09-16

rustrを見るだけで、なんだかむずむずしてイラッとしてきますよね?(笑)

 
aer0700 2025-09-16

作りながら学べることがありそうですね

 
devjeonghwan 2025-09-16

やってみなければ作れないものです。

 
GN⁺ 2025-09-16
Hacker Newsのコメント
  • GPTが自動生成したコメントや、既存で定義されている定数を重複して書いたコードが見られるので、こうした部分は削除が必要だと思う。たとえば const MAX_SEQ_LEN: usize = 80 のような定数はすでに lib.rs にあるので、コメントで案内されている通り、その定数をそのまま使う方がよいと思う

    • こうした部分が残っているのは、開発者が実際に理解して作った成果物ではないことを示している点だと思う
    • 関連するPRを送ったのか気になる
    • 定数の使い方については、著者も単にやり方を知らなかっただけかもしれないと思う。自分もRustを始めた最初の週は、命名やコード構造についていろいろ悩んでいた記憶がある
    • vibeコーディング風のRustが、言語全体のコード品質を下げるかもしれないという点についてどう思うか気になる
    • この指摘は本当にもっともだと思う
  • Pythonの依存関係地獄で何日も無駄にした経験があるので、cargo run 一発で終わるRustのやり方は本当に夢のようだ。でも、フレームワークなしで取り組んでいて一番つらかった部分が何だったのか気になる。賭けてもいいが、十中八九バックプロパゲーションのロジックのデバッグではないかと思う

    • uv というツールを勧めたい。実際に使ってみて、Pythonプロジェクトの実行が90%は楽になった。uvはこちら
    • 一番大変なのはGPUなどのリソース活用まわりだと思う
    • Pythonの依存関係問題という表現は2010年ごろなら分かるが、2025年にそれを言うのはかなり大げさだと思う
    • cargo run が夢のようだと言うが、実際には cargo build 特有の、インターネット全体を再コンパイルして冬場にCPUを暖めてくれる体験の方がそれっぽいと思う
    • cargoを褒める人は、依存関係管理のトレードオフをあまり分かっていないことが多いと感じる。Cのように毎回すべてのライブラリを作り直すのも非効率だが、npmやcargoのように依存関係を簡単に取り込めすぎると、依存関係の乱立、ビルド時間、セキュリティ問題などの深刻な欠点が生まれると思う。ビルドシステムが優れていることと、依存関係の追加が簡単であることは必ずしも同じではないし、中央集権的なパッケージリポジトリで誰でも依存関係を絡められる仕組みも、健全なパターンだとは思わない
  • 似たようなRustプロジェクトを進めている。WebAssemblyでブラウザ上で動くバージョンがあり、ブラウザデモソースコード も公開している

  • ndarrayrandrand_distr のパッケージ構成はすっきりして見える

    • 興味本位で cargo tree で依存関係ツリーを見てみたが、今のところはきれいな状態に見える
    • このツリー自体にはそこまで大きな意味はないと思う。自前実装を非効率にしているコードかもしれないし、場合によっては外部ライブラリを適切に使う方がむしろ良いこともあると思う
    • この評価が皮肉なのか、それとも文脈の補足が必要なのか気になる
  • Rustのメモリ安全性は、トランスフォーマー実装でバッファオーバーフローを減らすのにかなり有用だと思う。CUDAカーネルは依然として性能面では優位だ。トークナイザーもBPEを一から作っているのか、それとも既存ライブラリを使っているのか気になる

  • 自分もRustでpicogptを作る際に、jaykmodyの GPT from scratchブログ をかなり参考にした。プロジェクトリンク

  • お祝いを述べつつ、LLMではtransformer blockを再利用せず、それぞれ別インスタンスにした方がよいという軽い指摘をしたい。自分も以前、ZigとMLXで似たように基礎を積み上げる練習をしたことがあり、その後少しずつ機能を増やしていって、最終的にはPyTorch/Transformersに乗り換えた

    • ただし、こうした練習は自分でコードを書く場合にだけ意味があると思う。GPTの助けを借りず、自力で作る経験にこそ意味がある
  • プロジェクト作者のコメントが Redditにまとまっている

  • プロジェクト全体が本当に読みやすい構成なのが気に入った

    • AI生成コードであることには触れておきたい
    • 手続き型/オブジェクト指向スタイルが強く、厳密には良いRustスタイルとは言いにくい。イテレータやenumを使う関数型寄りのスタイルの方が、より簡潔で理想的だと考えられている。ただ、アイデア実験としては十分に良い
    • Rustがここまで読みやすくなり得るとは知らなかった。むしろRustエンジニアたちが、こういうシンプルなコードを避けて一種の自虐コンテストをしているようにさえ感じる。Rustコミュニティや採用文化などで自分が経験してきたことがすべて理解できた気がする
  • データセットの出所が気になる。自分でも探してみるつもりだが、質問だけ残しておく。自分はCPU中心で動き、バックプロパゲーションのないアーキテクチャを開発しており、分類データセットではうまく動いている。単一サンプルのインクリメンタル更新が可能なので、継続学習にも使えそうだ。toy demoとして tiny.txt でトレーニングしたことしかなく、大規模言語モデル(LLM)はまだ試したことがない。自分のアーキテクチャはオンデバイスやオンプレミスのアシスタントとしてかなりうまく動きそうなので、引き続き実験する予定だ。おすすめのオープンソースLLMトレーニングデータセットがあれば知りたい

    • Hermes-3 Dataset が良い
    • Hugging FaceにはさまざまなOpenAI系・Anthropic系のユーザー/アシスタント対話チェーンがあるが、注意点としてハルシネーションが多い。instruction fine-tuning用としてはかなり良い。欲しいのがinstruction followingなら kimi k2 distillation を勧める
    • このプロジェクトでは main.rs ファイル内に学習データがそのまま埋め込まれている。内容は一般常識に関する短文が50個前後で、おそらく学習時間を減らすための選択だと思われる。そのため、スクリプトベースでない入力だと性能が急激に悪化する。プロンプト例と結果:
      • 「hello」入力時: 「Eclipses occur when one celestial body moves into the shadow of another」など、かなり合っている
      • 「what are facts」入力時: 意味のない単語の羅列が繰り返される
      • 「how are mountains formed?」入力時: 一貫性のない単語と意味のない出力が現れる