最近、DGX Spark と M3 Ultra による分散プリフィル、つまり1台のマシンでプリフィルして別のマシンでデコードする、という記事を見かけました。DGX Spark は、M3 Ultra の 4 倍の matmul 性能があるそうです。これは M5 Ultra でも同等のはずです。そこで Spark を入手して、今週末いろいろ試しています。llama.cpp で得られた結果は以下のとおりです:
┌──────────────┬─────────────┬───────────────┬────────────┐ │ Model │ Mac pp16384 │ Spark pp16384 │ Result │ ├──────────────┼─────────────┼───────────────┼────────────┤ │ Qwen 35B A3B │ 1574 t/s │ 2198 t/s │ Spark 1.4x │ ├──────────────┼─────────────┼───────────────┼────────────┤ │ Qwen 27B │ 340 t/s │ 778 t/s │ Spark 2.3x │ ├──────────────┼─────────────┼───────────────┼────────────┤ │ Minimax M2.7 │ 372 t/s │ 763 t/s │ Spark 2.1x │ ├──────────────┼─────────────┼───────────────┼────────────┤ │ Mistral 128B │ 72 t/s │ 241 t/s │ Spark 3.4x │ └──────────────┴─────────────┴───────────────┴────────────┘ 最終的に、この単純な用途に対しては exo は少しやり過ぎだと分かりました。そこで私は、llama.cpp の kv シリアライズだけを使い、さらに kv キャッシュの受け渡しを扱うためのラッパーをいくつか用意して、より焦点を絞った直接的なセットアップを Claude に組ませています。
Spark を入手したばかりの人、またはこれから入手しようと思っている人向けに言うと、いまのところ私が見つけた最も重要な点は、llama.cpp で mmap=0 を設定することです。これをしないと、モデルのロード時間が大きく悪化します(数分ではなく 20 秒程度になる)し、プリフィル速度もさらに低下します。
Spark は 小型 で低電力です。M3 Ultra と組み合わせると、まとまっていて静かな構成の良い補完になります。
もちろん M3 Ultra は、M5 Ultra が持つ帯域幅の約 66% しかないので、デコード速度は低くなります。とはいえ、私はすでに M3 のデコードにはかなり満足しています。M5 Ultra は、もう 1 万ドル($10k)追加してまで買うほどの十分なブーストにはならないでしょう。現在の構成は、CUDA に対応できる点を除けば、だいたい M5 Max と M5 Ultra の間くらいです。
もし今なにかアップグレードするとしたら、200GbE 経由で 2 台目の Spark を追加することだと思います!
vllm でも、特にバッチングに関して、さらに良いパフォーマンスが引き出せるのかなと思っています。これについて良い情報をお持ちの方がいれば、ここに投稿してもらえますか? 私は引き続き実験して、興味がある人がいれば随時報告します。
[link] [comments]




