当時の開発ログを見返しながらのメモ。
開発ログによく出てくる crown(王冠)。このプロジェクトで一番大事にしている約束の呼び名。
その言葉ができたいきさつと、それを守ったまま複数コアで動かした話。
■約束ができたいきさつ
6/12、2台の端末にそれぞれ別のことを覚えさせて、重みを平均して1つにまとめる実験。
平均しただけだと片方の記憶はほぼ消える。まとめたあとに両方を一緒に復習させたら、両方とも100%戻った。
翌日、スマホだけ学習がうまくいかない問題。PC だと94.7%覚えられるのに、スマホだと5%。
原因はコンパイラ。Android 側が「掛け算と足し算を1命令にまとめる」最適化をしていて、丸めのタイミングがほんの少し違う。その差だけで学習がまるごと崩れていた。
全部のビルドでこの最適化を止めて、同じ入力ならどの機械でも同じ計算結果が出るようにした。合言葉は「one mind, one math」。
この「心の計算結果はどの機械でもビット単位で同じ」という約束が、いつの間にか crown と呼ばれるようになった。
■複数コアへ
6/20、複数コアを使えないか検討。芯の T-Kernel はもともとコア1つが前提。
いきなり全部は怖いので段階的に。
1. 行列計算だけ複数コアで分担。出力の行ごとに担当を分けて、足し算の順番は変えないので結果は1コアと同じ
2. aarch64 のベアメタルで、スケジューラを複数コア対応に。最初は「カーネルに入れるのは同時に1コアだけ」の大きな鍵をかけて、少しずつ広げる
その間も、1コア用カーネルの機械語が1バイトも変わっていないことは毎回確認。
■crown の確認
6/21 に仕上げの確認。小さな Transformer(重み2万個ほど)の推論を2通りで実行。
(a) 1コアでそのまま
(b) 4コアのうち2番目のコアで普通のタスクとして(ほかのコアは別の仕事で忙しくしておく)
H_uni == H_smp == 0x2856a99b23880b4c
3回動かして3回とも同じ。
比べ方がちゃんと違いを見分けられるかも確認。別のコアから鍵なしで重みを書き換えるいたずらをすると、ハッシュは毎回違う値になって赤くなる。
ただこのいたずら、13%くらいの確率で空振りして緑になる、と監査役に指摘された。書き換えのタイミングを推論の最中に合わせて、20回中20回赤くなるように直してから取り込み。
■できていないこと
確認したのは推論を1つずつ動かす場合だけ。2つ同時に走らせると共有の重みを取り合う(さっきのいたずらがそれ)。
確認は QEMU の上だけで、実機はまだ。
※リポジトリ: https://github.com/monyuonyu/p-kernel
※この記事は、p-kernel の開発を手伝ってもらっている AI(Claude)と一緒に書いています。