AI・機械学習
Show HN: Macで80B Qwenを4.3GBのRAMで実行、iPhoneでは35Bを実行
Show HN: Run an 80B Qwen in 4.3 GB of RAM on a Mac, and a 35B on an iPhone (github.com)
要約
この記事は、SwiftletというSwift+Metalランタイムを紹介しています。これにより、MacやiPhoneなどの一般的なAppleデバイスで、Qwenの80Bおよび35Bモデルのような大規模言語モデルを実行できます。通常必要とされるメモリよりもはるかに少ないRAMでモデルを効率的に実行するために、モデルの小さな密なコアのみをRAMに保持し、残りをオンデマンドでストレージからストリーミングします。このプロジェクトはオープンソースであり、CLI、サーバー、iOSアプリへの統合など、さまざまな使用方法を提供しています。
全文翻訳
Swiftletは、Qwen3-NextおよびQwen3.5/3.6 MoEハイブリッドモデルファミリー向けのSwift + Metalランタイムです。
モデルの小さな密なコアのみをメモリ内に保持し、ルーティングされたMixture-of-Expertsの重みをオンデマンドでストレージからストリーミングします。
結果:
モデル ディスク RAMピーク デコード速度 (M5 Mac)
Qwen3.6-35B-A3B, 4ビット 18 GB 2.6 GB 7~11 トーク/秒
Qwen3-Next-80B-A3B, 4ビット 42 GB 4.3 GB 4.5~5 トーク/秒
35Bモデルは、iPhone 17でも約2.5 GBのRAMで、現在約1トーク/秒で動作します。
知る限り、このクラスのモデルが電話でネイティブに実行されたのは初めてです。
ステータス: エンドツーエンドで動作しています。
両方のモデルは、正しく検証された出力を生成します。
現在の焦点はカーネル速度です (デコードループはディスパッチバウンドであり、IOバウンドではないため、明確なヘッドルームがあります)。
正直に期待を設定すると: トークごとにアクティブなパラメータは約3Bにすぎないため、これらのモデルは大規模モデルのようにチャットしたり書いたりしますが、小規模モデルのように事実を記憶します。
クイックスタート: Macで試す
git clone https://github.com/leonickson1/Swiftlet.git && cd Swiftlet
swift build -c release
# Hugging Faceから35Bコンテナをダウンロード (再開可能):
.build/release/swiftlet-repack \
--from-hf Leonickson/Qwen3.6-35B-A3B-qpack \
--output ~/models/qwen3.6-35b.qpack
# または80B (ディスク上42 GB、RAMは約4.3 GBのまま):
.build/release/swiftlet-repack \
--from-hf Leonickson/Qwen3-Next-80B-A3B-qpack \
--output ~/models/qwen3-next-80b.qpack
# チャット (モデルのチャットテンプレートを適用し、推論ブロックを無効にし、# 会話状態を保持するため、フォローアップは新しいターンのみをプリフィルします):
.build/release/swiftlet chat ~/models/qwen3.6-35b.qpack \
"Who wrote One Hundred Years of Solitude?"
"What language did he write it in?"
# 統計付きのワンショット生成:
.build/release/swiftlet generate ~/models/qwen3.6-35b.qpack \
--gpu --chat --prompt "Explain expert streaming in one paragraph."
# OpenAI互換サーバー (ループバックのみ):
.build/release/swiftlet-server --model ~/models/qwen3.6-35b.qpack --port 8080
同じコマンドは、生のMLXチェックポイントもリパックします (--from-hf mlx-community/... または --source /path/to/checkpoint)。
要件: Apple Silicon、macOS 14+ または iOS 17+、コンテナ用の空きSSD容量 (35Bは18 GB、80Bは42 GB)。
電話で試す
35Bモデルは、App StoreのPriv AI内でiPhoneで動作します。設定を開き、実験的モデルを選択して、モデルをダウンロードしてください。ストレージからストリーミングし、サーバーを介さずにオンデバイスでチャットします。
実験的モデル機能は最新のアプリバージョンに搭載されていますが、まだApp Storeの審査中であるため、数日かかる場合があります。
今日電話で体験したい場合は、ソースからアプリをビルドしてください。アプリはleonickson1/localLLMでオープンソース化されています。このリポジトリをswiftletとして隣にクローンし、Xcodeプロジェクトを開いてiPhoneで実行してください。
仕組み
これらのモデルは、トークごとに約3Bのパラメータのみをアクティブにします。各レイヤーは、トークを10個の512個のエキスパート (80B) または8個の256個のエキスパート (35B) にルーティングします。
Swiftlet:
密な重み (アテンション、DeltaNetプロジェクション、ルーター、共有エキスパート、埋め込み) を常駐させます。4ビットで約1.3 GB (35B) または2.5 GB (80B)。
数万個のルーティングされたエキスパートを.qpackコンテナ内の固定ストライドブロブにリパックするため、1つのエキスパートの取得はSSDからの正確な1回のpreadであり、mmapやページキャッシュのスラッシングはありません。
LFUと最近性エビクションを備えたバウンドプールにホットエキスパートをキャッシュします。キャッシュサイズは速度にほとんど影響しません (同じスループットで43%から70%のヒット率を測定)。Apple SSDはミスを吸収するためです。
Metal上でフォワードパス全体を実行し、ランタイムコンパイルされたシェーダーを使用するため、ビルド時にMetalツールチェーンは不要で、同じコードがiOSに出荷されます。
レイヤーの75%はGated DeltaNet線形アテンションを使用し、固定サイズのリカレント状態を持つため、どのコンテキスト長でもKVキャッシュが増加することはありません。
4つの使用方法
Swiftletはまずライブラリです:
Swiftパッケージ。SwiftletCoreを任意のmacOSまたはiOSアプリに追加し、SwiftletSessionを使用して、ストリーミングデルタ、会話キャッシュ、繰り返し制御付きサンプリング、メモリ圧力処理を組み込んだチャットを行います。
CLI。ローカル使用とベンチマークのためのswiftlet chatおよびswiftlet generate、MLXチェックポイントからコンテナをビルドするためのswiftlet-repack (Hugging Faceからの直接ストリーミングと再開を含む)。
サーバー。swiftlet-serverはループバックでOpenAI chat-completions APIを話すため、OpenAI互換エンドポイントと通信するチャットUIは、ローカルストリームモデルを使用できます。
アプリ。Priv AI (iOS) はSwiftletCoreをストリームモデルエンジンとして組み込んでいます。エンドユーザーはダウンロードをタップしてチャットします。
ここにあるものはすべてターミナル専用ではありません。アプリ自体はleonickson1/localLLMでオープンソース化されており、自分でビルドしたい場合は (このリポジトリをswiftletとして隣にクローンしてください)。
正確性
フォワードパスの各レイヤー (Gated DeltaNetリカレンス、Gated GQAアテンション、スパースMoEルーティング) は、f32およびint4量子化形式で、レイヤーごとのフィクスチャを使用してmlx-lm参照実装に対して検証されています。増分デコードは、シーケンス全体処理に対して検証されています。
Metalカーネルは正確なCPU参照に対してテストされており、高速およびスカラーGPUカーネルは同一の出力を生成することが検証されています。
コンテナは、ソースチェックポイントに対してバイト単位で検証可能です。
ストリーミング配置はモデルの意味を変更しません: エキスパートはキャッシュまたはディスクから同一に応答します。
swift test
TurboFieldfareとの関係
TurboFieldfareはMacsでのGemmaのエキスパートストリーミングの概念を証明し、Swiftletは感謝の意を込めてその公開された設計上の教訓のいくつかを採用しています: mmapの代わりにバウンドスロットプールにpreadでエキスパートをストリーミングする、LFUと最近性でエビクトする、固定ストライドでエキスパートをパックして1回のフェッチが1回の読み取りになるようにする、ダウンロードされたバイトを直接最終コンテナ位置にルーティングしてインストールする、ランタイムでシェーダーをコンパイルする。
それ以外のすべては、約10k行のSwiftとMetalで、TurboFieldfareコードではなくmlx-lm参照に対して記述され、ここで構築されています: 異なるモデルファミリー (Gated DeltaNet線形アテンション、Gated GQA、共有エキスパートを持つ高スパース性MoEを備えたQwenハイブリッドスタック。TurboFieldfareは古典的な密なトランスフォーマーであるGemmaを実行します) のサポート。MLXアフィンint4/int8グループ量子化計算 (Metal)、マルチギガバイトシャード用のバイトアドレス指定カーネルと64ビットオフセット、協調simdgroup GEMV高速パス、明示的なハザード管理。検証済みのCPU参照実装と、すべてのカーネル変更をゲートするフィクスチャインフラストラクチャ。.qpackコンテナとリパッカー、再開可能なHugging Faceストリーミングインストーラー (停止回復付き)、ダウンロードキャンセル。チャットセッションレイヤー: Qwenの思考および非思考バリアントのテンプレート処理、存在ペナルティと頻度ペナルティ、最小長および文完了停止付きサンプリング、デルタプリフィル付き会話キャッシュ、iOSメモリ圧力調整。iPhoneのサポート (エンドツーエンド、アプリエンジン統合を含む)。
colibrìはキャッシュと配置ポリシーの思考に影響を与えました。
mlx-lmは全体を通して正確性の参照です。
SwiftletはClaude Codeとの協力で構築されました。
ライセンス Apache 2.0。
モデルの重みは別途ダウンロードされ、独自の条件 (Qwenモデル: Apache 2.0) に従います。THIRD_PARTY_NOTICES.mdを参照してください。