AI・機械学習
M1 MacでKimi K3を実行する
Running Kimi K3 on a M1 Mac (github.com)
要約
Deltafinは、Apple Silicon Mac上で大規模なKimi K3 Mixture-of-Expertsモデルを実行可能にするプロジェクトです。記事では、インストール手順、ストレージ容量とダウンロード時間に応じて選択できるフルダウンロードモードとストリーミングモード、パフォーマンスのトレードオフ、int8スパインのような最適化、そしてOpenAI互換サーバー機能について解説しています。これにより、高性能なモデルをコンシューマーハードウェアで利用可能にすることを目指しています。
全文翻訳
M1 MacでKimi K3を実行する
____ _ _ __ _ | _ \ ___| | |_ __ _ / _(_)_ __ | | | |/ _ \ | __/ _` | |_| | '_ \ | |_| | __/ | || (_| | _| | | | | |____/ \___|_|\__\__,_|_| |_|_| |_|
これは、機械が搭載するモデルよりもはるかに大きなMixture-of-Expertsモデルを実行する、小規模な研究プロジェクトであるDeltafinに関する実験です。
パフォーマンスは速くなく、M1 Maxでトークンあたり約16秒ですが、正確で再現性があり、64GBのラップトップで動作します。新しいチップとより多くのRAMは自動的に速度を向上させます。
インストール
3つのコマンドで、生成を開始できます。
唯一の実際の決定はステップ3です。
# 1. 環境 (Python 3.12+、およびclang用のXcode CLT)
python3 -m venv venv
./venv/bin/pip install torch numpy safetensors tiktoken ml_dtypes blobfile \
"transformers==4.56.2" einops tokenizers
# 2. 融合MXFP4カーネルをビルド
clang -O3 -mcpu=native -shared -DNO_MAIN -o tools/libmxfp4gemv.dylib tools/fused_gemv.c
# 3. モデルをダウンロード (以下の2つのモードを参照)
./venv/bin/python tools/setup_k3.py --full
2つのモード
--full (推奨)
--stream
必要なディスク容量
~1.7 TB
~215 GB
ダウンロード時間
5–10時間、再開可能
~30分
その後の速度
~60–76 s/token、すべてのプロンプト
キャッシュされていないものすべてで約3分/トークン
推論時のネットワーク
なし
定数
各トークンは16のエキスパート × 92のレイヤー = 25.8 GBのエキスパートデータを読み取ります。
ローカルディスクからでは約4秒ですが、ネットワーク経由では数分かかります。
この単一の事実が、2つの列の間のすべての違いを生んでいます。
ディスク容量が許す場合は --full を選択し、そうでない場合はストリーミングにフォールバックし、解放する必要があるスペースを正確に通知します。
ストリーミングから始めて後でアップグレードする
ストリーミングは、1.7 TBをコミットせずにDeltafinを試すための良い方法です。
速度が必要なときはいつでも、1つのコマンドで完了します。再インストールや再設定は不要で、すでにキャッシュされているものをすべて引き継ぎます。
./venv/bin/python tools/fetch_experts_all.py # 再開可能、いつでも実行
./venv/bin/python tools/fetch_experts_all.py --dry-run # 数値のみ表示
./venv/bin/python tools/fetch_experts_all.py --layers 1-40 # 部分的なダウンロードも可能
Deltafinは、CLIとAPIサーバーの両方で、まだストリーミングモードの場合、ローカルにあるプールの量と、完了にかかるコストを示すリマインダーを起動時に表示します。
オプション: int8スパイン
トークンあたりのI/Oを、エキスパート以外の重みに対して半分にします。品質への意味のある変化はありません。数分かかります。
./venv/bin/python tools/convert_spine_int8.py
使用方法
# 質問をする。モデルが回答を終了するまで生成します。
./venv/bin/python tools/kimi_run.py --chat --prompt "What are the three largest moons of Saturn?"
# 生の完了 (チャットテンプレートなし)。Ctrl-Cを押すか、上限を設定するまで実行されます。
./venv/bin/python tools/kimi_run.py --prompt "The capital of France is" --max-new 16
トークンは生成されると同時に表示されるため、常にテキストが流れてくるのを見ることができます。
Ctrl-Cでいつでもクリーンに停止し、それまでの結果を表示します。--max-new Nで長さを制限します。
正直な警告: K3は回答する前に考えます。1分あたり約1トークンの速度では、完全なチャット回答には時間がかかる場合があります。ストリーミングを見るのが体験の一部です。
ルーターの選択は、K3のルーティング動作を研究したい場合に備えて、router_trace.jsonlに記録されます。
OpenAI互換サーバー
Deltafinは標準のOpenAI APIを提供できるため、チャットインターフェイス、openai SDK、コーディングエージェントは、ベースURLを変更することで使用できます。
./venv/bin/python tools/serve_openai.py --port 8000
curl http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' \
-d '{"model": "deltafin-kimi-k3", "messages": [{"role": "user", "content": "Hello!"}]}'
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="none")
r = client.chat.completions.create(
model="deltafin-kimi-k3",
messages=[{"role": "user", "content": "Hello!"}]
)
print(r.choices[0].message.content) # 回答
print(r.choices[0].message.reasoning_content) # K3の思考、存在する場合
/v1/chat/completions, /v1/completions, および /v1/models が実装されており、ストリーミング ("stream": true) も機能します。
OPENAI_BASE_URL と OPENAI_API_KEY を読み取るほとんどのツールは、それらをサーバーに向けることで機能するはずです。
自動化されたものを指す前に、これらの注意点を読んでください。
時間。回答は到着したときに到着します。クライアントのタイムアウトを秒ではなく時間に設定してください。max_tokensを省略すると、モデルは回答を完了します (推奨)。独自の終了がない生の完了は、デフォルトで256になります。オペレーターはK3_SERVER_MAX_TOKENSでハードキャップを設定できます。
ストリーミングインストールはここでは遅いです。チャットテンプレートのプロンプトは60トークン以上で、プリフィルはレイヤーごとに多くのエキスパートに触れるため、部分的に埋められたキャッシュでは、チャットリクエストは取得に数時間かかることがあります。フルインストールでは、通常の (遅い) 推論です。サーバーは、ストリーミングモードの場合、起動時に警告を表示します。
グリディのみ。temperatureとtop_pは受け入れられますが無視され、一度に1つのリクエストが実行されます (2番目の同時リクエストは429エラーになります)。エージェントは好奇心の対象であり、ワークフローではありません。コーディングアシスタントは原理的には機能しますが、長いシステムプロンプトはプリフィルを高くつきます。
設定
すべて設定なしで動作します。Deltafinは、GPUがある場合はGPUを選択し、int8スパインがビルドされている場合はint8スパインを選択し、起動時に選択したものを表示します。
これらはそれをオーバーライドするための変数です。
変数
デフォルト
意味
K3_DEV
auto
利用可能な場合はGPU (mps)、それ以外はCPU
K3_SPINE
auto
ビルドされている場合はint8 (推奨)、それ以外はbf16
K3_SPEC
1
n-gramスペキュレーション (ロスレス)
K3_TEMPLATES
1
テンプレートレイヤーバッファの再利用
K3_PRELOAD / K3_PREFETCH
1
バックグラウンドレイヤーロード / エキスパートプリフェッチ
K3_APPROX
0
fp16数値。ニアタイでの再現性なし
K3_RAM_GB / K3_PIN_LAYERS
auto
RAM予算をオーバーライド
K3_PROFILE
0
各パスのフェーズごとのタイミング
DELTAFIN_ROOT
リポジトリルート (キャッシュと重みが格納される場所)
K3_HF_HOST / K3_HF_PATH
Hugging Face
エキスパート取得をミラーに向ける
K3_SERVER_MAX_TOKENS
unlimited
サーバー生成のオプションのハードシーリング
要件
Apple Silicon Mac。
公開されているすべての数値は64GBのM1 Maxから取得したものです。これは、実行された中で最も遅いマシンです。より多くのRAMは自動的に使用されます (128GBのマシンはモデルの数倍をピン留めします)。新しいチップは、より高いメモリ帯域幅、より多くのGPUコア、およびより高速なストレージをもたらします。新しいMacがなぜ速くなるべきかを参照してください。
Xcode Command Line Tools (clang用) (xcode-select --install)。
Python 3.12以降。
ディスク: フルインストールで約1.7TB、ストリーミングで約215GB (インストールを参照)。
Hugging Faceへのネットワークアクセス。
仕組み
K3の重みは合計約1.56 TBで、これはこのマシンの空きディスク容量よりも、ましてやRAMよりも大きいです。
それでもローカル推論を可能にする観察は、Mixture-of-Expertsモデルがトークンあたり自己の一部しか触れないということです。
常駐スパイン (~114 GB: アテンション、共有エキスパート、潜在射影、埋め込み) は一度ダウンロードされ、各トークンでローカルNVMeからレイヤーごとに読み取られ、int8に量子化され、GPUで計算されます。
82,432のルーティングされたエキスパート (~1.45 TB)。
各トークンについて、K3のルーターはレイヤーごとに16のエキスパートを選択し、それらのみが読み取られます。
可能であればすべてローカルにインストールしてください (推奨)。それ以外の場合、DeltafinはオンデマンドでHugging Faceからそれらをフェッチします (エキスパートあたり1つのHTTPレンジリクエスト)。ディスクキャッシュが成長します。
フォワードパスは、Moonshot独自のモデリングコードを、変更せずに実行します。
小さな純粋なPyTorchシムが、CUDA専用のflaカーネルの代わりになります。
flowchart LR
subgraph HF["Hugging Face CDN"]
W[("96 safetensors shards<br/>1.56 TB · MXFP4")]
end
subgraph MAC["MacBook (M1 Max, 64 GB)"]
subgraph DISK["NVMe"]
SP[("resident spine<br/>114 GB bf16 → 60 GB int8")]
EC[("expert cache<br/>raw shard spans")]
end
subgraph TOK["per token"]
R{"router<br/>top-16 of 896<br/>× 92 layers"}
L["93 decoder layers<br/>2 shared GPU templates"]
K["fused MXFP4 GEMV<br/>NEON"]
end
end
W -- "one range request<br/>per missing expert" --> EC
SP -- "double-buffered<br/>layer loader" --> L
EC -- "mmap" --> K
R -- "selected experts" --> K
K --> L
L -- "logits" --> R
ロード
何を期待するか
以下のすべての数値は、