46 ポイント 投稿者 GN⁺ 23 일 전 | 1件のコメント | WhatsAppで共有
  • 900万パラメータを持つ超小型言語モデルで、Colab ノートブック 1 つで 5 分以内に学習できる構成
  • データ生成からトークナイザー、モデル学習、推論まで全工程を単一環境で実行でき、ブラウザ・Colab・ローカルのすべてに対応
  • **水中環境を想像するキャラクター「Guppy」**として設計されており、短く単純な文で対話し、教育向けの透明性に重点
  • 基本形の Transformer アーキテクチャを用い、複雑な手法なしでも言語モデルの中核構造を明確に示す
  • HuggingFace 公開データセットと MIT ライセンスにより、誰でも実験・学習できるオープンソースプロジェクト

GuppyLM 概要

  • GuppyLM は約 900万パラメータを持つ超小型言語モデルで、魚のキャラクター 「Guppy」 のように会話するモデル
  • Colab ノートブック 1 つで 5 分以内に自分で学習できる LLM を目標に設計されており、データ生成からトークナイザー、モデル構造、学習ループ、推論まで全工程を単一環境で実行可能
  • 大規模 GPU クラスターや専門知識がなくても、言語モデルの内部動作原理を自分で体験できるように作られている
  • 大規模モデルのように長文を生成することはできないが、入力・重みの学習・出力生成の全工程を透明に見せる教育用モデル
  • ブラウザ、Colab、ローカル環境のすべてで実行でき、HuggingFace を通じてデータセットとモデルが公開されている

モデルの特徴

  • GuppyLM は 水、温度、光、振動、餌 など、水中環境を中心に考えるキャラクター
  • 短く小文字の文を使い、人間の抽象概念(お金、政治など)は理解しない
  • 親しみやすく、好奇心が強く、単純な性格を持つ
  • 学習データは 60 のトピック、6 万件の合成会話サンプルで構成され、単一 GPU で約 5 分で学習可能
  • モデルサイズが小さいため、ブラウザ内の WebAssembly ベース推論も可能

アーキテクチャ

  • パラメータ数: 8.7M
  • レイヤー数: 6
  • 隠れ次元: 384
  • アテンションヘッド: 6
  • FFN 次元: 768 (ReLU)
  • 語彙サイズ: 4,096 (BPE)
  • 最大シーケンス長: 128 トークン
  • 正規化: LayerNorm
  • 位置埋め込み: 学習型
  • LM ヘッド: 埋め込みと重みを共有
  • GQA, RoPE, SwiGLU, early exit などの複雑な手法は使わない 基本形 Transformer 構造

性格と会話トピック

  • Guppy は 短い文小文字表現感覚中心の思考で会話する
  • 食べ物、水、光、水槽、泡、反射、水面、外の世界 など、さまざまな話題に反応する
  • 主な 60 のトピックには あいさつ、感情、温度、餌、光、水、水槽、騒音、孤独、夢、季節、冗談、愛、健康、TV などが含まれる

実行と使用方法

  • ブラウザで実行

    • WebAssembly ベースで ローカル推論を実行
    • 10MB サイズの量子化 ONNX モデルをダウンロードし、サーバーや API キーなしで実行可能
  • Colab でチャット

    • HuggingFace から事前学習済みモデルをダウンロードして 対話型インターフェースとして利用
    • すべてのセルを実行するとすぐにチャット可能
  • Colab で学習

    • ランタイムを T4 GPU に設定してから全セルを実行
    • データセットのダウンロード、トークナイザー学習、モデル学習、テストまで自動実行
    • 結果のモデルを HuggingFace にアップロードするかローカルに保存可能
  • ローカル環境でチャット

    • pip install torch tokenizers をインストール後、python -m guppylm chat コマンドで実行
    • 会話が長くなると 128 トークン制限により品質が低下
    • 単一プロンプトを入力して応答だけ受け取り終了するモードにも対応

データセット

  • HuggingFace の arman-bd/guppylm-60k-generic データセットを使用
  • サンプル数: 60,000 (学習 57K / テスト 3K)
  • 形式: {"input": "...", "output": "...", "category": "..."}
  • カテゴリ数: 60
  • 生成方式: テンプレートベースの合成データ
    • 約 60 個のテンプレート、30 個の水槽オブジェクト、17 種類の餌、25 個の活動の組み合わせで 約 16,000 個の固有出力を生成

プロジェクト構成

  • guppylm/

    • config.py: モデルおよび学習ハイパーパラメータ
    • model.py: 基本 Transformer モデル
    • dataset.py: データ読み込みとバッチ処理
    • train.py: 学習ループ (cosine LR, AMP)
    • generate_data.py: 60 トピックの会話データ生成
    • eval_cases.py: テストケース
    • prepare_data.py: データ準備とトークナイザー学習
    • inference.py: チャットインターフェース
  • tools/

    • make_colab.py: Colab ノートブック生成
    • export_onnx.py: ONNX モデルとしてエクスポート (uint8 量子化)
    • export_dataset.py: データセットを HuggingFace にアップロード
    • dataset_card.md: HuggingFace 用データセット説明
  • docs/

    • index.html: ブラウザデモ (ONNX + WASM)
    • download.sh: モデルとトークナイザーのダウンロード
    • model.onnx: 量子化済みモデル (~10MB)
    • tokenizer.json: BPE トークナイザー
    • guppy.png: ロゴ画像

設計上の決定

  • システムプロンプトの削除:9M モデルは条件付き指示に従うのが難しいため、すべてのサンプルに同じプロンプトを使う代わりに性格を重みに直接埋め込んだ

    • これにより推論時に約 60 トークンを節約
    • 単一ターン会話: 128 トークン制限のため、3〜4 ターン以降は品質が低下
    • Guppy の「金魚の記憶力」というコンセプトには合っているが、単一ターンが最も安定
    • 基本 Transformer を維持: GQA, SwiGLU, RoPE, early exit などは 9M 規模では品質向上の効果がなく、複雑さだけが増す
    • 標準アテンション + ReLU FFN + LayerNorm の組み合わせで十分な性能を確保
    • 合成データを使用: 一貫したキャラクター性を維持するため、テンプレートベースのデータ生成方式を採用

ライセンス

  • MIT ライセンス

1件のコメント

 
GN⁺ 23 일 전
Hacker Newsのコメント
  • このプロジェクトにドキュメントがあるのか気になる
    コード自体は (Not So) Large Language Model の最も単純な実装のひとつに見えるが、multi-head attention、ReLU FFN、LayerNorm、positional embedding などに慣れていない開発者にとっては理解しやすいとは言えない
    このプロジェクトは Minix に近い教育的な性格を持っている。Minix が OS 設計を学ぶための道具として使われたように、学生が GuppyLM に機能を追加しながら LLM 設計を学ぶのも良いアプローチだ

    • コードを LLM に入力して、それについて対話してみるのも良い方法かもしれない
  • このプロジェクトが Andrej Karpathy の microgptminGPT とどう違うのか気になる

    • まだ比較していないが、提案には感謝している。2つのプロジェクトを見てみる予定だ
    • 比較はそれほど重要ではない。これは製品ではなく、素晴らしい実験プロジェクト
  • bbycroft.net/llm には小さな LLM レイヤーを3D 可視化した例がある。内部動作を理解するのにとても役立つ
    関連する議論は こちら でも見られる

    • かなりすごい! もう少し深く見てみるつもりだ
    • 直接の関連はないが、プロジェクト自体が本当に素晴らしい。UI をもう少し追加してみると良さそうだ
    • 興味深い可視化だ
  • LLM 入門用として本当に素晴らしい
    以前、Milton の Paradise Lost をベースに自分用のモデルを作ってみたことがある
    参考: wvrk.org/works/milton

  • これはおそらく学習データがすべて小文字だったために起きた現象のようだ

    You> hello
    Guppy> hi. did you bring micro pellets.
    You> HELLO
    Guppy> i don't know what it means but it's mine.
    
    • いい発見だ! 大文字トークンがトークナイザーにまったく存在しないようだ
      それでもキャラクターの反応はまだ生きている
  • Toki Pona だけで学習した LLM を作れるのか気になった
    Toki Pona ウィキ 参照

    • ただし、学習データが十分ではない。LLM の本質は膨大なデータと計算資源にある
  • 複数の LLM エージェントがひとつの仮想世界を共有し、自律的に相互作用するプロジェクトを進めている
    驚くべきなのは、「世界」の存在がモデルの振る舞いに大きな影響を与えることだ
    同じモデル、同じプロンプトでも、資源制約、他のエージェント、持続的メモリといった環境要素が変わると結果はまったく違ってくる
    私たちはモデル自体の最適化にばかり集中し、その動作環境についてはあまりに考えていない

  • ついに世界について正直な LLMが現れた気がする
    「人生の意味は食べ物だ」という答えは、1万倍大きいモデルたちが出す答えよりも間違っていない気がする

    • むしろあの有名な答えより良い解釈かもしれない
    • 生命の目的は繁殖だ。食べ物はその手段にすぎず、あらゆる資源や特性は交尾を助けるために存在する
  • アイデアは良いが、例は学習データからそのまま複製されたように見える
    未知の問い合わせにはどう対応するのか気になる

    • ほとんど対応できない。9M パラメータでは容量がかなり限られている
      このプロジェクトの目的は LLM の動作原理の実演にある
  • 素晴らしい仕事だ。共有してくれて感謝している
    ただ、これで本当に LLM が**「神秘性を失った」**ように感じられるのか気になる
    依然として、単なる統計と莫大な計算だけでこうした結果が出ることには驚かされる