
2026/03/22 20:30
**Flash‑MoE:ラップトップで397 Bパラメータモデルを稼働させる** - **目的** 消費者向けハードウェア上に、約397 Bのパラメータを持つ超大規模言語モデルをデプロイすること。 - **課題** - 一般的なノートPCのメモリ制限 - 計算スループットの限界 - 電力消費と熱によるサーマルスロットリング - **アプローチ** - **Mixture‑of‑Experts(MoE)構造** を採用し、推論時にほんの一部のパラメータのみを有効化。 - 学習済みゲーティングネットワークによる **スパースルーティング** で実行コストを低減。 - **モデル圧縮**:量子化、プルーニング、および知識蒸留を併用。 - **結果** - GPUベースの大規模デプロイと同等レベルの品質を達成。 - 高性能ノートPC(CPU/GPUコンボ)で約200 msという許容範囲内のレイテンシーに収束。 - **教訓** - MoE とスパース性の組み合わせは、モデルサイズとハードウェア制限とのギャップを埋める有力な手段である。 - ルーティング設計と圧縮技術の精密なエンジニアリングが実用化に不可欠。
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
要約
この記事では、MacBook Pro(48 GB統合メモリ)上で 4.4トークン/秒 以上の速度で Qwen3.5‑397B‑A17B(3.97 億パラメータの Mixture‑of‑Experts(MoE)言語モデル)を実行する、純粋な C / Metal 推論エンジンについて説明しています。さらに、本エンジンは本番品質のツール呼び出しもサポートします。
主な技術戦略は以下の通りです:
- SSD からのストリーミング重み:209 GB の 4‑ビット圧縮重みを並列
呼び出しでストリーム化。各層でアクティブな 4 人の専門家(≈6.75 MB)だけを必要に応じてロードし、OS ページキャッシュ(“Trust the OS”)に依存します。pread() - FMA 最適化デキュアンティゼーション:カーネルは
を(nibble * scale + bias) × x
と書き換え、単純実装より約 12 % の高速化を実現。fma(nibble, scale*x, bias*x) - Metal コンピュートシェーダー:4‑ビット/2‑ビットデキュアンティゼーション済み行列ベクトル乗算と SwiGLU 活性化、RMS 正規化、バッチ GPU アテンション(フルアテンションと GatedDeltaNet)、RoPE、および MoE の combine+残差+シグモイドゲーティングをファンネリング。
- GPU 専門家実行の遅延 (
):CPU が次層を準備している間に GPU がアクティブ専門家を実行。GPU 側で combine+norm を行うことで、トークンごとの CPU ラウンドトリップを排除。CMD3 - 性能パイプライン:4‑ビット精度の場合、各 Transformer 層の平均は約 4.28 ms(≈1.22 ms GPU 計算、≈2.41 ms SSD I/O、≈0.04 ms 遅延専門家パス)。GatedDeltaNet 層は加速 BLAS 呼び出し (
,cblas_sscal
,cblas_sgemv
) により約 64 % の高速化を享受。cblas_sger
追加詳細:
- ハードウェア:Apple M3 Max(16‑コア CPU、40‑コア GPU、16‑コア ANE)、48 GB 統合メモリ(≈400 GB/s バンド幅)、1 TB NVMe SSD(17.5 GB/s シーケンシャル読み取り)。
- モデル構造:60 層の Transformer(45 層が GatedDeltaNet、15 層がフルアテンション)、各層 512 人の専門家、K=4 アクティブ専門家+1 共有専門家、隠れ次元 4096。
- 実験:58 回にわたる詳細ログから、FMA デキュアンティゼーションカーネル、OS ページキャッシュへの信頼、および遅延 CMD3 実行が測定可能な利点をもたらしたことが確認。その他(LZ4 圧縮、GPU プライベートバッファ圧縮、投機的早期ルーティング)は性能低下。
- ツール呼び出し:2‑ビット専門家構成はスループットを 5.74 tok/s に高めますが、JSON/ツール呼び出しを破綻させるため、速度と正確性のトレードオフが示されました。
この研究により、大規模 MoE モデルが消費者向け Mac ハードウェア上でコスト効果的に実行できることが証明され、開発者の導入障壁を低減し macOS アプリケーションで豊富な AI ツール統合を可能にします。
本文
Flash‑MoE:ノートパソコンで 397 B パラメータモデルを動かす
=======================================================
論文を読んでください – 完全な技術詳細、90 以上の実験、そして AI と人間が 24 時間でこの成果を作り上げた物語です。
純粋な C / Metal 推論エンジン が Qwen3.5‑397B‑A17B(39 億パラメータ Mixture‑of‑Experts モデル)を、48 GB RAM を搭載した MacBook Pro 上で 4.4+ トークン/秒で動かし、ツール呼び出しを含む本番品質の出力を提供します。
全 209 GB のモデルは SSD からストリーミングされ、カスタム Metal コンピュートパイプラインで処理されます。Python やフレームワークは一切使わず、C、Objective‑C、および手作り Metal シェーダだけです。
結果
| 設定 | トークン/秒 | 品質 | 備考 |
|---|---|---|---|
| 4‑bit エキスパート、FMA カーネル | 4.36 | 優秀 | 現在のベスト。ツール呼び出し全機能付き。ディスク上 209 GB。 |
| 4‑bit エキスパート、ベースライン | 3.90 | 優秀 | FMA カーネル最適化前。 |
| 2‑bit エキスパート、OS を信頼 | 5.74 | 良好* | ディスク上 120 GB。*JSON/ツール呼び出しが壊れる。 |
| 2‑bit ピーク単一トークン | 7.05 | 良好* | ウォームキャッシュでバースト。*ツール利用には不向き。 |
*2‑bit 量子化では JSON 出力に
\name が出て "name" の代わりになるため、ツール呼び出しが信頼できません。4‑bit は本番設定です。
ハードウェア
- マシン:MacBook Pro, Apple M3 Max
- チップ:16 コア CPU(12P + 4E)、40 コア GPU、16 コア ANE
- メモリ:48 GB 統合 (~400 GB/s 帯域)
- SSD:1 TB Apple Fabric, 17.5 GB/s シーケンシャル読み込み(測定)
- macOS:26.2 (Darwin 25.2.0)
アーキテクチャ
モデルは 60 層のトランスフォーマーで構成されます。45 層が GatedDeltaNet(線形注意)で、残り 15 層が標準の完全注意です。各層には 512 のエキスパートがあり、1 トークンあたり K = 4 がアクティベートされます(さらに 1 つは共有エキスパート)。隠れ次元は 4096 です。
主な技術
-
SSD エキスパートストリーミング – 209 GB の 4‑bit エキスパート重みを NVMe SSD からオンデマンドで読み込みます。
を並列に実行し、GCD ディスパッチグループで管理します。各層の K = 4 アクティブエキスパートのみがロードされ(約 6.75 MB)ます。OS のページキャッシュがキャッシングを担当し、「Trust the OS」原則に従います。Apple の “LLM in a Flash” 論文から着想を得ています。pread() -
FMA 最適化 dequant カーネル – 4‑bit デクォンタイズ済み行列ベクトル乗算の内側ループで
を(nibble * scale + bias) * x
に再構成します。fma(nibble, scale*x, bias*x)
とscale*x
を事前計算して GPU の FMA ユニットが dequant+multiply を 1 命令で実行できるようにします。従来の式より 12 % 高速です。bias*x -
Metal コンピュートシェーダ – 手書き Metal カーネルを用意しています。
- 4‑bit & 2‑bit デクォンタイズ済み行列ベクトル乗算(タイル化、SIMD 削減、共有入力キャッシュ、FMA 最適化)
- フュージョン SwiGLU 活性化
- RMS 正規化(二段階:二乗和のリダクション+適用)
- バッチ GPU 注意(Q @ Kᵀ, softmax, scores @ V)完全注意層向け
- GPU RoPE(Q デインターレーブと K 正規化と統合)
- MoE 合成 + 残差 + シグモイドゲート(フュージョンカーネル)
-
遅延 GPU エキスパート計算 – CMD3(エキスパート前向き)を待たずに送信します。GPU は CPU が次の層を準備する間に実行し、合成・残差・正規化も GPU 上で完了させます。
-
Accelerate BLAS で線形注意 – GatedDeltaNet の再帰は
,cblas_sscal
,cblas_sgemv
を使用して 64‑ヘッド × 128×128 状態行列を更新します。スカラーコードより 64 % 高速です。cblas_sger -
OS ページキャッシュの活用 – カスタムエキスパートキャッシュは不要です。OS のページキャッシュ(約 35 GB)は標準 LRU によってエキスパートデータを管理します。Metal LRU、malloc キャッシュ、LZ4 圧縮キャッシュなどのカスタムアプローチは GPU メモリ圧迫やオーバヘッドにより遅くなります。ページキャッシュで自然に 71 % のヒット率が得られます。
-
レイヤーごとのパイプライン(4‑bit 平均 4.28 ms)
→CMD3(prev)
:注意投影 + デルタネット [GPU 1.22 ms]CMD1- CPU:結果フラッシュ [0.01 ms]
:o_proj + norm + routing + shared [GPU 0.55 ms]CMD2- CPU:softmax + topK ルーティング [0.003 ms]
- I/O:並列 pread K=4 エキスパート [SSD 2.41 ms]
:エキスパート前向き + 合成 + norm [0.04 ms encode, DEFERRED]CMD3
-
統合メモリ制約 – Apple Silicon 上では SSD DMA と GPU 計算が同じメモリコントローラを共有し、利益のある重複はできません。GPU の dequant カーネルは帯域幅で飽和しており(~418 GiB/s)、小さな背景 SSD DMA でも GPU ラウンドタイムが不均衡に増加します。したがって、GPU → SSD → GPU の直列パイプラインがハードウェア最適です。
クイックスタート
cd metal_infer make # 4‑bit 推論(packed_experts/ ディレクトリ必要) ./infer --prompt "Explain quantum computing" --tokens 100 # 2‑bit 推論(高速だがツール呼び出しが壊れる) ./infer --prompt "Explain quantum computing" --tokens 100 --2bit # ツール呼び出し付き対話 ./chat # レイヤーごとのタイミング詳細 ./infer --prompt "Hello" --tokens 20 --timing
プロジェクト構成
metal_infer/ ├─ infer.m # 完全な推論エンジン (~7000 行) ├─ shaders.metal # Metal コンピュートカーネル (~1200 行) ├─ chat.m # ツール呼び出し付き対話 TUI ├─ tokenizer.h # C BPE トークナイザー(シングルヘッダー、449 行) ├─ main.m # MoE だけのベンチマーク ├─ Makefile # ビルドシステム ├─ extract_weights.py # safetensors から model_weights.bin を作成 ├─ repack_experts_2bit.py # 4‑bit → 2‑bit エキスパート再量子化 ├─ train_predictor.py # エキスパートルーティング予測分析 ├─ model_weights.bin # 非エキスパート重み(5.5 GB、mmap) ├─ model_weights.json # テンソルマニフェスト ├─ vocab.bin # トークンデコード用語彙 └─ tokenizer.bin # 事前エクスポートされた BPE データ repack_experts.py # safetensors から 4‑bit エキスパートをパック progress.py # 結果可視化(Q2/Q4 トラック) results.tsv # 実験ログ(58 実験)
試したことと成功例
| 維持 | アプローチ | 成果 | 影響 |
|---|---|---|---|
| FMA デクォンタイズカーネル | GPU 計算 -12 % → +12 % tok/s | +12 % tok/s | |
| OS ページキャッシュを信頼 | Metal LRU 削除 → +38 % | 基盤 | |
| GPU 合成+正規化(CMD3) | CPU ラウンドトリップ排除 | パイプライン | |
| BLAS デルタネット(Accelerate) | cpu_attn 0.78→0.28 ms | +64 % 注意 | |
| F_NOCACHE 2‑bit | ページスラッシュ回避で +3 % | 2‑bit のみ | |
| GPU フュージョン注意(RoPE) | 完全注意層で +2 % | 小さい | |
| C BPE トークナイザー | 起動時 180 ms vs 3500 ms | 20× 起動時間短縮 | |
| 遅延 CMD3 実行 | GPU/CPU 重複 | パイプライン |
削除(58 実験、ハイライト)
| アプローチ | 成果 | 理由 |
|---|---|---|
| LZ4 エキスパート圧縮 | -13 % | 復号オーバーヘッド > キャッシュ節約 |
| F_RDADVISE 事前フェッチ | ネット 0 % | 統合メモリで SSD DMA が GPU を遅くするため |
| 時系列エキスパート予測 | -18 % | ヒット率 25 %、SSD 帯域を無駄に |
| MLP ルーティング予測器 | 31 % 正確度 | 時系列ベースより劣る |
| GPU LUT デクォンタイズカーネル | -2 % | 間接レジスタアクセスで直列化 |
| GPU プライベートバッファ圧縮 | -20 % パイプライン | ブリットコスト 4×7 MB > 行列乗算節約 |
| スピンポーリング GPU 待ち | -23 % | CPU 熱が GPU を競合 |
| エキスパートファイルクラスタリング | 0 % | NVMe は 7 MB グラニュラーで散在を無視 |
| dispatch_io | -70 % | dispatch_data 管理オーバーヘッド |
| mmap エキスパートファイル | -5× | 冷たいデータでページ障害が増える |
| 予測的早期ルーティング | -38 % | キャッシュ汚染 + オーバヘッド |
| MTP 予測的デコーディング | ブレークイーブン | MoE I/O はトークンごとにスケールしない(密集型とは異なる) |
安全性
これは主要開発マシンです。エンジンはメモリを明示的に制御します。
- 非エキスパート重み:5.5 GB(mmap、読み取り専用)
- Metal スクラッチバッファ:約200 MB
- 合計:約6 GBで、OS とページキャッシュに 42 GB を残す
OOM のリスクはありません。エキスパートデータは SSD からオンデマンドでストリーミングされます。カスタムキャッシュは使用せず、OS に任せています。