小型言語モデル GuppyLM で言語モデルの仕組みを自分で体験する
(github.com/arman-bd)- 約 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件のコメント
Hacker Newsのコメント
このプロジェクトにドキュメントがあるのか気になる
コード自体は (Not So) Large Language Model の最も単純な実装のひとつに見えるが、multi-head attention、ReLU FFN、LayerNorm、positional embedding などに慣れていない開発者にとっては理解しやすいとは言えない
このプロジェクトは Minix に近い教育的な性格を持っている。Minix が OS 設計を学ぶための道具として使われたように、学生が GuppyLM に機能を追加しながら LLM 設計を学ぶのも良いアプローチだ
このプロジェクトが Andrej Karpathy の microgpt や minGPT とどう違うのか気になる
bbycroft.net/llm には小さな LLM レイヤーを3D 可視化した例がある。内部動作を理解するのにとても役立つ
関連する議論は こちら でも見られる
LLM 入門用として本当に素晴らしい
以前、Milton の Paradise Lost をベースに自分用のモデルを作ってみたことがある
参考: wvrk.org/works/milton
これはおそらく学習データがすべて小文字だったために起きた現象のようだ
それでもキャラクターの反応はまだ生きている
Toki Pona だけで学習した LLM を作れるのか気になった
Toki Pona ウィキ 参照
複数の LLM エージェントがひとつの仮想世界を共有し、自律的に相互作用するプロジェクトを進めている
驚くべきなのは、「世界」の存在がモデルの振る舞いに大きな影響を与えることだ
同じモデル、同じプロンプトでも、資源制約、他のエージェント、持続的メモリといった環境要素が変わると結果はまったく違ってくる
私たちはモデル自体の最適化にばかり集中し、その動作環境についてはあまりに考えていない
ついに世界について正直な LLMが現れた気がする
「人生の意味は食べ物だ」という答えは、1万倍大きいモデルたちが出す答えよりも間違っていない気がする
アイデアは良いが、例は学習データからそのまま複製されたように見える
未知の問い合わせにはどう対応するのか気になる
このプロジェクトの目的は LLM の動作原理の実演にある
素晴らしい仕事だ。共有してくれて感謝している
ただ、これで本当に LLM が**「神秘性を失った」**ように感じられるのか気になる
依然として、単なる統計と莫大な計算だけでこうした結果が出ることには驚かされる