10日前、私はベンチマークを持っていた。MoEモデルファイル内のエキスパート重みを、測定された共活性化によって並べ替えると、トークンあたりのディスク読み取りが2.23×減少する。それは本物で、再現性があり、完全に自分のマシンで測定された——つまり、まだほとんど価値がなかった。

今日、この仕事に結びついた最も強い数字は、私が作り出したものではない:48 GB MacBook上で動作する235Bパラメータモデルで、+32.3%のデコードスループットと-26.3%のtime-to-first-token。私は会ったことのない誰かが測定したもので、私が使ったことのない推論エンジンを使い、私のスクリプトを修正せずに使用し、ページキャッシュ制御としてアームをスワップしたものだった。その過程で、私の3つの元の提案のうち2つがデータによって反証され、私の1つの事前登録されたスケーリング予測は自身の閾値に失敗し、主要パラメータを予測する2つの試みは反対方向に外れた。

反証は生産的な部分だった。この投稿は、それらを安価にしたプロセスについてだ。5つのエンジン、半ダースの見知らぬ人、一つのissueスレッド、そしてそこに現れた規律——なぜなら、このプロセスが一般化可能だと考え、通常見る書き物がそれに言及しないからだ。

セットアップ

アイデア(プロジェクト:mbolt)は、モデルバイナリにBOLT/PGOを適用することだ。チェックポイントテンソルの順序はトレーニングパイプラインの偶然であり、推論時のMoEルーティングはランダムとは程遠い——エキスパートはクリークで発火する。エンジンがSSDからエキスパートをストリーミングする場合、ファイルレイアウトが、トークンのミスが少数の長いシーケンシャル読み取りになるか、数千の散在した読み取りになるかを決定する。そこで:ルーティングをトレースし、共活性化をクラスタリングし、ファイルを書き換え、重みをバイト同一に保つ。

1週間のソロ作業の後、私は80Bモデルで2.23×の読み取り削減、パッチされたllama.cppに対する1.55×のエンドツーエンドデコードゲイン、正しさゲート(バイト同一の重み、100.000%のルーティングマッピング、出力の発散は同じエンジンのCPU↔Metalバックエンドデルタの5倍以下)、そして48対46で26の引き分けという500プロンプトのブラインドA/B——レイアウト変更としてはコイン投げという目標——を得た。

また、自分で測定したnullもあった。ストックllama.cppでは、これらのどれも重要ではない。mmapページフォルトパスはレイアウトに盲目であり、私は同等性を測定してそう言った。ゲインには明示的な読み取りを発行するエンジンが必要だ。

そのnullは、起動戦略を決定した——当時は戦略として考えていなかったが。明示的な読み取りエキスパートストリーマーを実行する人々は数えられるほどだ。Show HNを投稿する代わりに、私はデータを彼らのissueトラッカーに持ち込んだ:ml-explore/mlx-lm#1438、ここでは@mabaeyensがMLX用にエキスパートオフロードストリーマーを出荷しており、JustVugg/colibri#119、744BモデルをNVMeからストリーミングするCエンジンだ。冒頭の行:あなたのエンジンがレイアウトパスの自然なホームであるため、データを共有する——そして私の発見の一つは、このオーディエンスがまさにあなただということだ。

初接触:一つの返信で2つの提案が死ぬ

mabaeyensは私のフレーミングに反論しなかった。彼はそれを測定した。

彼の返信は私の3つの提案——最もホットなエキスパートをRAMに固定する、共活性化によって次のレイヤーのエキスパートをプリフェッチする、ファイルを並べ替える——を取り上げ、最初の2つを彼自身のエンジンのカウンターで殺した。レジデントセットのヒートピニングは、同じトピック、同じセッショントラフィックでも、単純なレイヤーごとのLRUに負ける:LRUはすでに再利用をバンクしており、凍結されたスロットはすべて、ワークロードのドリフトが使用できないスロットだ。そしてクロスレイヤープリフェッチには実行する信号がない。隣接レイヤー間のエキスパートオーバーラップは、シャッフルコントロールの0.016に対して0.017を測定した。独立したレイヤーごとのルーターと負荷分散損失がレイヤーを非相関化する。予測するものは何もない。

その日、私はスレッド内で両方を撤回した。

ここで強調したいことがある。なぜなら、それが物語全体の要だからだ:スレッドは反証を敗北ではなく、スコーピングとして扱った。主張は死ななかった。それは移動した。保持がデコードの勝利を殺すなら、レイアウトレバーは読み取りがまだ起こる場所——コールドプリフィル——に移行する。そして(彼の次の測定が示したように)エキスパートテーブルがRAMよりはるかに大きく、ミスが永遠にコールドのままであるデコードにも移行する。彼の断片化数字は私の元の提案よりもケースを鋭くした。彼のリーダーはデコードトークンあたり~471のファイルオープン、1つのコールドエキスパートあたり9つのバイトレンジを発行した。レバーは死んでいなかった。それは誤ってラベル付けされていただけだ。

スレッドが収束したルール

誰も方法論を宣言しなかった。それは、一度に1つの焼けた手で集積し、最終的に以下のようになった。

実験を実行する前にロックする。 決定的なテスト——プロファイル不要で決定論的なcoalescing単独 vs トレースが必要なcoalescing + co-activation reorder——を設計したとき、アーム、メトリクス、決定ルールは、誰かが何かを実行する前にスレッドで合意された。なぜなら、答えが彼のエンジンのread-straight-from-shards不変量を破るかどうかを決定したからだ。

痛みを伴う可能性のある閾値で数値を事前登録する。 私の記録上の予測:より深いオフロードでcoalesceゲインは~+20%に達し、「+15%を下回る場合、正直な書き物はこのレバーがnice-not-necessaryで頂点に達すると言う」だった。それは+9.7%で着地した。私は完全に譲歩した——設定の違いに訴えることはなかった。なぜなら事前登録はすでにそれらを放棄していたからだ。

コミット速度で譲歩する。 私の分析モデルは、彼のリーダーがすでに排除していた36 µsのopen()コストを過大評価していた——彼のshared-fd修正は、私が構築した数値を引用してから約4分後に着地した。彼の測定が私のモデルより低い値で戻ってきたとき、モデルは公に、同じ日に負けた。スコアキーピングノート:スレッド全体で、私はコールド読み取りシェアの予測で0-for-2(両方とも反対方向に外れた)で、コミュニティのルールはエンジンごとに測定し、決して持ち越さないに固まった。

コントロール、さもなくば起こらなかった。 スレッドのカナリアは私のお気に入りの成果物だ。「2.23×のスピードアップ」は実際にはmacOSがレジデントページを退避することを拒否していた(F_NOCACHEは3人のうちの1人が想定していたことをしない。手がかりはコントロールアームでの不可能な0.18×だった)。予測A/Bは「予測アームを確認」したが、著者が両方のセルが同じコードを実行していたことを発見するまで——バイト同一のヒット率が手がかりだった——そして適切に再実行した。予測子は2.9%で負け、節約したバイトあたり6.9バイトを読み取った。クロスアーキテクチャオーバーラップの主張は、分析的な一様ベースラインに対して1.17×の信号を示し、シャッフルコントロールに対して0.98×を示した——分析ベースラインは信号を製造していた。アームスワッピングは、スレッド内のすべてのA/Bの標準になった。

ベースラインに名前を付ける、さもなくば数字は移転しない。 同じ書き換えが、エキスパートあたり9つの散在した読み取りを発行するリーダーに対して+32%、深いオフロードでプロジェクションあたり3つに対して+31%、すでに各エキスパートを連続的に格納するコンテナに対して~nilである。ベースラインの読み取りパターンに名前を付けずにレイアウトゲインを引用することは、数字が複製を停止する方法だ。

1つの生きている成果物を維持する。 途中、私はコメントとして統合サマリーを投稿し、v1.0からv1.5.1までバージョン管理し、API経由でその場で編集し、変更履歴を持ち、参加者が明示的に赤線を引けるようにした。人々はそれを使った。1人の参加者の赤線は純粋に帰属的だった(エンジンの名前——私は2日間それを誤字にした。v1.4.1で修正され、はい、それは変更履歴にある)。サマリーは、スレッドが生成するものだ。スコーピングされた発見、測定されたポイント、そしてトラップセクション。

報酬となった反証

+9.7%の失敗は、プロジェクトにとって最善の出来事だった。

その背後のメカニズム——coalescingはIOPSレバーであり、4 MBスライスはすでに帯域幅に縛られている——は、スレッドが今slice-size lawと呼ぶものに一般化した:gain ≈ 1 + saved_ops · t_op / (slice_bytes / BW)、ここでt_op ≈ 100 µs、BW ≈ 6 GB/s、このハードウェアクラスで。エンドツーエンドでは、コールド読み取りシェアsと合成してspeedup = 1/((1−s) + s/g)となる。これはエンジニアリングの適合であって物理学ではない——しかし今では5つのエンジンにわたる6つの測定点があり、良いモデルが行う1つのことを行う。事前にあなたの設定が手間をかける価値があるかどうかを教えてくれる。

lawのテストは、初期交換後に参加した2人の参加者から来た。@lBrothは私の変換スクリプトを修正せずに119 GBのQwen3-235Bビルドに対して実行し、出力を自分のエンジンに配線した。+32.3%のデコード——読み取りあたりのゲインが大きかったからではない(そうではなかった。大きなスライス、g ≈ 1.34)——2.6× over-DRAMでコールド読み取りシェアが~0.96であり、lawの他の項が引き継いだからだ。それから彼は自分のエンジン内に深いバリアントを構築し、lawが彼の名前付きベースラインに対して予測した+31.3%の場所で+31.2%を測定した。そして@pierre427——本番のGLM-5.2ペイジャーを実行——は、私たちが導出した読み取りあたりのゲインバンド(1.2、バンド1.15–1.3)を事前登録し、1.195を測定した。lawの最初の登録-測定されたポイント。

もう一方の端も価格付けされ、これは同じくらい重要だ。@philipjohnbasileは、744Bエンジンのコンテナ——すでに各エキスパートを1つの連続した~19 MB読み取りとして格納——を残存+1.3%で測定し、彼自身のプロモーションゲートを下回った。彼はno-goとして投稿し、私は同意し、私が以前に浮かべた~+20% GLMクラスの数字は引退した。coalescingラダーは今完全に価格付けされている。9-scattered → シェアに応じて+14–32%;per-projection → 深いオフロードで+31%;per-expert-contiguous container → デバイス帯域幅上限でほぼ何もなし。非適用性のドメインが測定され公開されている最適化は、成功事例のみを持つものよりも価値がある。

Nullは製品

今日現在のスレッドの墓場:予測プリフェッチ(3つの独立したnull——構造的なもの、適切に制御されたA/B、クロスアーキテクチャシャッフルテスト)、LRUに対するヒートピニング、LRUよりスマートな退避、そして私の元のクロスレイヤーフレーミング(撤回)。各nullはスコープされている——batch-1、デコード、これらのアーキテクチャ——そしてそれぞれが、今誰かが構築する必要のないロードマップアイテムだ。

それから結末は自ら書かれた。スレッドの後半で、PhilipJohnBasileは自分のエンジンをオープンソース化した——そしてそのREADMEには、私たちが話したことのないに5番目のエンジンで測定された、ほぼ設計理論全体の独立した複製が含まれていることが判明した。router-lookahead prefetchは−6.96%で戻され、よりスマートな退避はヒットレートの変化なしで−26%で死に、静的ピニングは死に、hotsetトレーニングは死んだ。彼のサマリーライン:「キャッシュポリシーのフロンティアは閉じている。capacity vs reuse distanceが壁だ。」私たちは4つの異なるコードベースから同じ壁に収束していた。

(そのオープンソース化は、スレッドの偉大な小さな瞬間の1つにおける引用の謎も解決した。誰もが私たちの測定に帰属させ続けていたスループット数値は、実際には彼のエンジンがフォークするプロジェクトの6141行目のイタリア語コードコメントであることが判明した——7月初旬にLinuxで測定され、彼のフォークのコピーが削除したプラットフォーム修飾子だった。私たちの2人は、GitHubのコード検索がそのような大きなファイルを静かにインデックスしないため、間違った出所を「検証」していた。今それはトラップセクションにもある。)

私が得たもの

  • 主張を、それを殺せるマシンを持つ人々に届ける。 4人のエンジン著者が、数日以内にすべての主要な主張を反証、スコープ、または拡張した。一般的なオーディエンスはそうしない。ニッチなスレッドは、ローンチに対する謙虚な代替案ではなかった。それはより高い帯域幅のチャネルだった。
  • 事前登録は、間違っていることを安価にする。 私が事前にコミットしたすべての数字は、生き残った(そして今重みを持つ)か、きれいに死んだ(そしてlawを生み出した)。私がヘッジした2つの予測は、解きほぐすためにフォローアップラウンドを要したものだ。
  • 公の譲歩が通貨だ。 スレッドの著者は、結びで私よりうまく言った。「私は正しかった部分よりも、間違っていた部分から多くを学んだ。良いスレッドだ。」
  • 1つのバージョン管理された、赤線を引けるサマリーを維持する。 それはスクロールバックと論文の両方を上回る。現在のもので、編集可能で、すべての参加者が修正する権利を持つ。
  • 勝利と一緒にnullを出荷する。 ストックllama.cppでの同等性結果を冒頭に投稿したことが、適切な人々が関与した理由だ。

スレッドはまだ開いている。Co-activation-aware orderingは今mlx-lm PRで名前付きのフォローアップだ。colibriコミュニティは、この仕事からのco-activationフォーマットでエキスパートアトラスを構築している。2つのルーティングトレースを待っている、共同署名された、事前宣言されたクロスエンジン実験がある。統合サマリーはここ(スレッドの最後にピン留め)、再現可能なパイプラインは公開、リポジトリはgithub.com/doramirdor/mbolt

信じるに足るベンチマークがあるなら、それを反証できる5人を見つけ、彼らが住む場所に投稿せよ。最悪の場合、あなたは主張を失う。最善の場合、2つ失ってlawを得る。


測定順のクレジット:@mabaeyens(mlx-lmエキスパートオフロード、および反証のほとんど)、@lBroth(スケール検証、エンジン内ビルド)、@philipjohnbasile(744Bエンドポイント、iliria)、@pierre427(本番ペイジャー、登録バンドポイント)、そしてcolibriクルー——@JustVugg、@ZacharyZcR、@bokiko、@mohamedmastouri2000-boop——彼らは私たちの誰も計画していなかった場所にco-activationの仕事を連れて行っている。

詳細およびその他のプロジェクトについてはhttps://getnadir.com