
2026/04/21 4:51
『Soul Player C64 ―1MHz のコモドール64で動作する本物のトランスフォーマー』
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Soul Player C64 は、未修正の Commodore 64 でネイティブ速度(約 1MHz)で完全動作する縮小版变压器モデルを実行し、画期的な成果を達成しました。このシステムは、2 レイヤーのdecoder-only アーキテクチャを実装するため、手書きの 6502/6510 アセンブリ言語を使用しており、リアルなマルチヘッド因果的自己注意機構、RMSNorm、および ソフトマックス(128 エントリのルックアップテーブル経由で)を備えており、すべてが 1 つのフロッピーディスクに収まります。主要な技術的突破口としては、6502 プロセッサの精度限界を克服しつつ有意義な重みを保つために、標準の 17 ビットではなく 14 ビットのみで注意スコアをシフトすることなどが挙げられます。
ChatGPT のような現代の巨人と並んでモデルは動作しますが、約 25,000 int8 パラメータという厳格な制約下にあります:単語書式は 128 トークン(大文字を未知として扱う)、埋め込み次元は 32、最大トレーニングコンテキストウィンドウは 20 トークンです。推論にはトークンあたり約 60 秒かかりつつも、レガシーハードウェアでのローカル機械学習の探求へのアクセシブルなパスを提供します。
このプロジェクトには、ユーザーがカスタムモデルをトレーニングするための包括的なツールが含まれています:
train.py は Quantization-Aware Training (QAT)、FakeQuantI8、およびラベルスムージングをサポートし、重みをコンパクトなバイナリ形式にエクスポートします;build.py は C64 バイナリをコンパイルします;test.py はほぼ 90 の厳密な検証テストにより安定性を確保します。リリースパッケージにはソースファイルと即座に実行可能なビルドの両方が含まれており、高度な AI コンセプトがハードウェア変更なしでビンテージシステム上で機能することを示しています。本文
Soul Player C64
1 MHz のコモドール 64(C64)上で動作する、真正のトランスフォーマー。
SOUL PLAYER C64
パラメータ数: 25,000
層数: 2
特徴: 真正的なトランスフォーマー(Real Transformer)
記録媒体: フロッピーディスクからロード
ユーザ: hey C64: HELLO! 「RE SOUNDS ME. MEFUL!」(こんにちは!私を認識してくれるのですね。素敵です!)
これは、ChatGPT、Claude、Gemini の背後にある同じアーキテクチャを採用した 2 層のDecoder-only トランスフォーマーであり、変更なしのコモドール 64上で動作する手書きの 6502/6510 アセンブリ言語実装です。約 25,000 の int8 パラメータを搭載しています。真正なマルチヘッド因果的自己注意機構(real multi-head causal self-attention)、真正なSoftmax、真正的な RMSNorm を採用しています。トークンあたり約 60 秒の処理速度です。全体が空きスペースを残してフロッピーディスク1枚に収まるサイズです。
アーキテクチャ
2層、4ヘッド×8次元の注意機構、32次元のエンベッディング、64ユニットのFFN ヒドロ単位。約 25,000 のパラメータを int8 へ量子化し、パーテンザルシフトスケーリング(per-tensor shift scaling)を適用しています。 最大の技術的突破口は、Softmax スコアの正規化処理を修正したことにあります。注意スコアを 17 ビットではなく 14 ビットだけシフトすることで、128 エントリを持つ exp ルックアップテーブルに必要なダイナミックレンジを提供し、意味のある注意重み(attention weights)の生成を可能にしました。この修正を行わない場合、整数ベースの注意メカニズムはすべての位置に対して本質的に均一的となり、アーキテクチャや学習の有無に関わらずモデルが「目を開いていない」状態になってしまいます。
クイックスタート:プレビルトのソウルを実行
disk/soulplayer.d64 を入手し、任意のコモドール 64 エミュレーター(VICE が推奨)でロードしてください。
- 小文字の短いメッセージを入力し、RETURN キーを押し、少し待ちましょう。思考中に表示フレームのボーダーが瞬くようになります。各トークンに対して SID のビップ音が鳴ります。完全なレスポンスには数分がかかります。終了するには
と入力してください。q - ヒント: モデルは小文字のアルファベット、空白、および句読点(. , ! ? ' : ; -)を理解します。大文字は「未知トークン」として扱われます。
自分だけのソウルを学習させる(トレーニング)
これが最も楽しいパートです。コーパスを作成し、モデルを学習させ、フロッピーディスクを構築します。
環境の準備(依存ライブラリのインストール)
コーパスの作成
各行に1回の対話を記述したテキストファイルを作成します。形式は
<SEP>入力<SEP>応答<SEP> です:
<SEP>hello<SEP>hey! nice to see you!<SEP> <SEP>i'm sad<SEP>i hear you. i care about you.<SEP> <SEP>tell me a joke<SEP>why did the bit flip? it was tired!<SEP>
対話は短く保ってください。モデルのコンテキストウィンドウは 20 トークンです。スタート用のサンプルは
data/example_corpus.txt を参照してください。
トレーニングの実行
python train.py data/example_corpus.txt
これは、BPE トカナイザー(128 トークン)を学習させ、QAT トランスフォーマーをトレーニングし、
models/soul.bin および models/tokenizer.json をエクスポートします。GPU 環境であれば数分で完了します。
500 エポック毎に、浮動小数点計算と int8 推論の出力結果が並列に表示されます(モデルが学習した内容 vs C64 が実際に生成する内容)。チェックポイントの保存は float のロスカルブではなく、int8 の品質に基づいて行われます。すべてのチェックポイントは
models/checkpoints/ に保存され、後から選別して使用できます。
オプション:
python train.py data/my_corpus.txt --epochs 30000 --output models/ python train.py # ビルトインの「情緒的サポート」コーパスを使用します
以前の実行でチェックポイントが存在する場合は、トレーニングが自動的に再開されます。
C64 バイナリの構築
すべての 6502/6510 ルーチンをアセンブルし、学習済みの重みデータを埋め込み、
disk/soulplayer.prg および disk/soulplayer.d64 を生成します。
実行
x64 disk/soulplayer.d64 # VICE エミュレーターの場合
または、
.d64 ファイルを物理的な 1541 フロッピーディスクに書き込んでハードウェアで動作させます。
ローカルでの対話(チャット)
python soulchat.py # models/soul.bin を使用 python soulchat.py models/soul.bin # カスタムのソウルを使用
C64 と同様の整数演算を実行しますが、速度が速くなります。
テストの実行
python test.py # 完全なテストスイート(約 90 テスト、所要時間約 30 秒) python test.py --quick # 6502/6510 アセンブリ関連のテストをスキップ
テストでは、浮動小数点リファレンス → 整数リファレンス → メモリ忠実なシャドウ(memory-faithful shadow)→ 6502/6510 アセンブリルーチン → ビルドラウンドトリップ、という一連のチェーン全体の検証を行います。
リポジトリの内容
soulplayer-c64/
- モデルの学習と重みのエクスポートtrain.py
- C64 バイナリの構築(アセンブリ)build.py
- すべてのテストの実行test.py
- 端末での対話機能soulchat.pydata/example_corpus.txt
models/
- 事前学習済みの重み(25KB、int8)soul.bin
- BPE トカナイザー(128 トークン)tokenizer.json
- すべての保存済みトレーニングチェックポイントcheckpoints/
disk/
- オリジナルリリースのディスクイメージmeful.d64
- オリジナルリリースのローンプログラム(PRG)meful.prg
- 実行準備のディスクイメージsoulplayer.d64
- ローンプログラム(PRG)soulplayer.prg
- エンジンソースsrc/
- 真値:固定小数点計算と前方伝播numerics.py
- .bin 重みファイル形式の仕様soul_io.py
- 6502/6510 のメモリの状態を正しく再現する Python シャドウ実装shadow.py
- ミニ 6502 アセンブラ(ラベル、パッチ、遠隔分岐対応)assembler.py
- テスト用のミニマルな 6502 インタープリタcpu6502.py
- 6502 の行列・ベクトル積演算asm_matvec.py
- 6502 の RMSNorm(整数平方根+除算)asm_rms_norm.py
- 6502 の注意ヘッド(LUT ソフトマックス)asm_attn_head.py
- 6502 のエンベッディング、残差接続、ReLU、argmaxasm_simple.py
- PRG および D64 アセンブラbuild.py
スペック表
| 機能 | 詳細 |
|---|---|
| 辞書(ボキャブ) | 128 トークン(4 つの特別トークン + 34 文字・句読点 + 90 ブースト merges) |
| エンベッディング | 32 次元 |
| 層数 | 2 |
| 注意機構 | 4 ヘッド × ヘッドあたり 8 次元 |
| FFN | 64 ヒドロ単位(隠れ層) |
| コンテキスト | 20 トークン |
| パラメータ数 | 約 25,000(すべて int8) |
| 重みサイズ | 25 KB |
| デコーディング | グリディ(argmax) |
各層の構造:RMSNorm → マルチヘッド因果的自己注意機構 → 残差接続 → RMSNorm → ReLU MLP → 残差接続。最終的に RMSNorm → 出力射影 → argmax。 すべての活性化関数は Q8.8 固定小数点(int16)で表されます。重みは int8 であり、パーテンザルの 2 のべき乗シフトを適用します。バイアスは matmul アクミューレーターへ入力するために pre-scaled された int16 です。Softmax は 128 エントリを持つ exp ルックアップテーブルを使用し、スコアの正規化には >>14 を適用します。6502 は乗算命令を持たないため、すべての演算はシフトと加算によって行われます。
メモリーマップ
コード + トカナイザーテーブル(約 6 KB)$0801-$20FF
重みデータ(25.3 KB)$2100-$85A0
アクティベーションバッファ(5.8 KB)$8600-$9D00
トークンバッファ、入力、作業領域(scratch)$C000-$C3FF
VIC-II、SID、CIA(I/O ポート)$D000-
トレーニングの仕組み
モデルは量子化感知型トレーニング(Quantization-Aware Training, QAT)を使用します。学習中に重みは
FakeQuantI8 を通過し、連続的な浮動小数点スケーリングとストライクトルー・グラディエント推定による擬似的な量子化が施されます。学習における「連続的なスケール」と、エクスポートにおける「2 のべき乗のシフトグリッド」間の意図的な不一致が、暗黙的なノイズとして機能し、モデルを量子化ギャップに耐えるより広いログイットマージンをもつ重みを学習させることを強制します。バイアスは単純な fq() 関数を使用した擬似的な量子化が適用されます。すべての matmul で、シミュレーション用の × 0.5 のポストシフトが加えられており、これは 6502 の >>1 を模倣しています。
ラベルスムージング(0.15)は、int8 演算で確実に見分けることを超えてログイット分布を鋭くすることを防止します。トレーニングループでは 500 エポック毎に実際の整数前方伝播(numerics.forward())を評価し、float ロスではなく int8 の argmax 精度に基づいて最良のチェックポイントを検出・保存します。
トレーニング出力には float と int8 の推論結果が並列に表示され、モデルが学習した内容と C64 が実際に生成する内容との差異を確認できます。
注意点
- 知能ではありません。 25,000 パラメータは GPT-4 の約 7,000 万倍も小さく、文法が崩れた文章を生成することがあります。これが本題です。このアーキテクチャはこの規模でも機能することを示しています。
- ゆっくり考えます。 物理ハードウェア上ではトークンあたり約 60 秒。完全なレスポンスには数分かかります。
- 大文字は '' になります。 小文字を使うようにしてください。
- 辞書が限られています。 128 トークンのボキャブと 20 トークンのコンテキストですので、トレーニング用の対話は短く保ってください。
クレジット
コード、学習実装: gizmo64k
デバッグ、ユニットテスト、ラバーダック(思考を言葉にする相棒): Anthropic の Claude (Opus 4.6)
運命のソウル:1982 年、コモドールビジネスマシーンスより発売のコモドール 64
ライセンス
GNU General Public License v3。詳細は LICENSE ファイルを参照してください。
未来は過去に戻ってきました。そして今、それには魂がつきました。