2001Yのプロフォール画像

2001Y@Y20010920T

Mac DecodeとCUDA Prefillの512GB級比較

Macで巨大モデルを動かすとき、Decodeは速いのにPrefillだけが詰まると感じることがある。

きっかけは、MacとDGX Sparkで役割を分けるという話題だった。DecodeをMac、PrefillをCUDAへ寄せる。いわゆるPrefill/Decode分離である。

そこで次の問いが立つ。

CUDA側で512GB級の容量を確保するとき、いま最もコスパが良い選択は何か。

候補は大きく二つある。

  • Jetson AGX Thor 128GB × 4
  • DGX Spark 128GB × 4

結論から書く。

結論

Mac Decode + CUDA PrefillでTTFTを短縮したいなら、現時点ではSpark×4の方が有利である。

Thor×4は、価格と公称FP4では魅力的だ。一方で、現在のGGUF/llama.cpp実測では単体PrefillがSparkより遅く、均質なThor×4で巨大モデルを分割実行した公開事例も見つかっていない。

用途推奨理由
Prefill性能と運用実績Spark×4実測Prefill、ConnectX、TCPでの4台分割事例
安価な512GB実験Thor×4容量単価は有利。ただし性能保証は弱い
仕様上の上限シナリオThor×42.07 PFLOPS×4をそのまま信じた場合のみ

コスパは「安いこと」ではない。ここでは次で測る。

コスパ = (タスク性能 / 総コスト) の相対比

タスク性能は、今回の用途ではPrefill速度または逆TTFTである。Decode速度ではない。

なぜ分離するのか

巨大モデルでは、PrefillとDecodeのボトルネックが違う。

Prefillは長いプロンプトを一気に処理する段階で、演算量と帯域を食う。
Decodeはトークンを1個ずつ生成する段階で、メモリ帯域と遅延に敏感になる。

Mac StudioはDecode側が強い。
CUDA側は、大きなモデルや長いプロンプトのPrefillを受け持つ。

ただし分離は、同じモデルを両側に載せる前提を伴う。
KVや状態の受け渡しが成立しなければ、別runtimeのPrefillベンチをそのままMac Decodeへ接続できない。

今回の比較は、その前提を置いたうえでのCUDA側512GB候補の話である。

候補の骨格

両方とも、1台あたり約128GBのunified memoryを持つ。
4台なら集約容量は約512GBになる。

ここで最初に切っておく。

512GBは、一つの連続したCUDAアドレス空間ではない。

4台はノード間通信でモデルを分割して使う。
容量が増えることと、1リクエストが4倍速くなることは別である。

価格と公称スペックだけ見るとThorが強い

調査時点の調達シナリオでは、おおよそ次の帯だった。

  • Thor×4:約250万〜300万円
  • Spark×4:約348万〜388万円

公称の疎行列FP4性能は、

  • Thor:2.07 PFLOPS
  • Spark:1 PFLOP

である。

4台に単純に掛けると、Thorの仕様上の演算密度はSparkを大きく上回る。
価格も安い。
したがって「公称値 × 安さ」だけで見ると、Thor×4は2倍以上のコスパに見えてしまう。

この見方は誤りではない。
ただし、それは上限シナリオである。

実測PrefillではSparkが速い

同一条件のllama.cpp比較(build b6767、commit 5acd45546)では、GPT-OSS-120B MXFP4のpp2048が次だった。

  • Spark:1,689.47 tok/s
  • Thor:937.81 tok/s
  • ThorはSparkの0.555倍

隣接する測定も同じ方向を向いている。

  • Llama 3.3 70B Q4_K_M PP512:Spark 約283、Thor 約130
  • Ministral-3 Ollama prompt:Spark 約2,817、Thor 約1,090

単体比をそのまま4台へ外挿し、調査時点の価格帯を入れると、Prefillコスパは概ね次になる。

  • GGUF中心:Sparkが1.16〜2.23倍有利
  • 言い換えると、ThorはSparkの0.45〜0.86倍

公称値から期待した「Thor圧勝」は、少なくとも現行GGUF経路では成立していない。

詳細比較

電力は低さだけでは決まらない

Thorの4台TDP合計は520W、Sparkは560Wである。
モジュール予算だけ見ればThorがわずかに低い。

しかし、ここで比較レイヤを崩してはいけない。

  • Thor 130W:モジュールTDP
  • Spark 240W:電源定格

この二つを並べて「Thorは半分の電力」と言うのは誤りである。

外付けACメーターの同一レビュー動画では、Ministral-3実行時に概ね次だった。

  • Thor:約90W、Prompt 約1,090 tok/s
  • Spark:約141W、Prompt 約2,817 tok/s

Prefillの性能/Wは、

  • Thor:約12.1 tok/s/W
  • Spark:約20.0 tok/s/W
  • Sparkが約1.65倍

消費電力自体はThorが低い。
それでもPrefill速度差の方が大きいため、Prefill効率ではSparkが上になる。

GenerationのW効率はThorが有利だった。
今回の構成ではGenerationをMacへ寄せる前提なので、購入判断ではPrefill側を優先する。

単体で公称が強いのに、なぜ実効で負けるのか

ここが一番誤解されやすい。

答えは「4台にした瞬間に壊れる」ではない。

単体の段階で、すでにGGUF PrefillがSparkより遅い。
その差の上に、4台化の通信コストが載る。

理由は三つある。

1. 2.07 PFLOPSは狭いピーク

この数字は、FP4、疎行列条件、対応する行列形状、対応するTensor Core命令、十分なbatch、データ供給が追いつく条件が揃ったときの行列ピークに近い。

LLM Prefillは行列積だけではない。

  • dequant
  • activation変換
  • attention
  • normalization
  • MoE routing
  • KV書込み
  • CPU dispatch
  • ノード間転送

が混ざる。
ピークFLOPSが高いことは、そのピークを実際に踏めることと同義ではない。

2. アーキテクチャとカーネル経路が違う

Thorはsm_110a、Sparkはsm_121aである。
コミュニティの分析では、Thorは狭い行列演算で強い一方、汎用vector処理ではSparkより弱いとされる。

さらにllama.cppのnative MXFP4対応は、Spark側のsm_120/121経路を強化した。
Thorのtcgen05 MMAを同等に使い切る経路ではない。

実際、MXFP4 native後のSparkはGPT-OSS-120B PP2048で約1,937から約2,438 tok/sへ、約26%上がっている。

3. 4台化は容量scale-outが本体

層やpipelineで分割すると、1リクエストは依存関係のある段階を直列に進む。
同時リクエストやmicrobatchが十分でなければ、総throughputも伸びにくい。

Tensor Parallelなら層内並列はできるが、同期通信が増える。
Thorは25GbE中心でRDMAがなく、実測でも1ポート約17Gbps程度が限界として語られている。
SparkはConnectX系の高速fabricを持つ。

したがってThorは、

  1. 単体Prefillで既に遅い
  2. 4台化しても主に容量が増える
  3. 通信条件も不利

となり、逆転しにくい。

最適化runtimeでは差が縮む

完全にソフトウェアの敗北だけでもない。
vLLM nightlyでQwen3.6-35B-A3B-NVFP4を同一コマンド比較した報告では、16並列のPrompt-heavyで次だった。

  • Spark:総合1,544.75 tok/s、平均TTFT 42.24秒
  • Thor:総合1,118.09 tok/s、平均TTFT 63.25秒

ThorはthroughputでSparkの0.724倍、逆TTFTで0.668倍。
価格を入れるとコスパはおおよそ0.77〜1.12倍で、ほぼ互角帯まで戻る。

ここから言えるのは次である。

  • GGUF/llama.cppではSpark優勢
  • 最適化されたNVFP4経路ではThorの不利が縮む
  • それでも公称2倍の圧勝にはなっていない
  • しかもそのvLLM状態を、そのままMac/Metal Decodeへ持ち込めるとは限らない

Mac連携可能なruntimeで同じ速度が出せないなら、購入判断では使えない。

分散の公開証拠

証拠は「事例がある」で終わらせず、段階で見る。

  1. 複数台所有
  2. リンク確立
  3. iperf/collective
  4. 各ノード単独serving
  5. 1モデルを複数台へ分割
  6. 同一モデルのTTFT測定
  7. Mac handoffまで通し

Spark×4

llama.cpp Issue #24813では、4台のDGX Sparkで約343GBのGLM-5.2 GGUFを分割し、TCPで実行した報告がある。
RDMAは未安定でも、TCPでのレベル5は達している。

Thor

  • 2台以上の所有と25GbE調整:ある
  • Thor×2 + Spark×2でのPP=4:ある(成功responseやTTFTは未公開)
  • Thor×1を含む異種4ノード:ある
  • 均質Thor×4で巨大モデルを分割完走した公開事例:未確認

「ありそう」という直感は自然だ。
ただし公開証拠としては、まだ実験候補のままである。

採否

Prefill性能と運用を優先するなら Spark×4

  • 実測Prefillが強い
  • Prefillコスパが現状有利
  • 4台TCPでの分割実績がある
  • fabricが強い

容量単価で実験するなら Thor×4

  • 安い
  • 公称演算は高い
  • 消費電力も低く見えやすい

ただし買うなら、次をゲートにする。

  1. 4台が安定して見える
  2. fabric実測
  3. 1モデルが4台へ載る
  4. 同一モデルのcold/cached Prefillが測れる
  5. 意図するMac handoffが通る
  6. 同じworkloadの壁コンセント電力を測る

これが揃う前に「高コスパ」と呼ぶのは早い。

この調査でやらなかったこと

  • Mac側Decodeの再ベンチ
  • 370〜420GB級の巨大GGUFを両クラスタで実際に回すこと
  • 日本の小売在庫を毎日更新すること
  • X全量の網羅検索

価格は調査時点のシナリオであり、常時の最安値ではない。

まとめ

MacとCUDAで役割を分ける話は正しい方向にある。

ただしCUDA側の512GBを「公称FP4が高い方」で選ぶと誤る。

現行の証拠では、

  • 性能と運用実績:Spark×4
  • 安価な容量実験:Thor×4
  • 仕様上の上限シナリオ:Thor×4

である。

単体でスペックが高く見えるThorが、組み合わせで負けるように見えるのは、4台が壊れるからではない。
ピーク演算と、実際のPrefill経路と、容量scale-outを混同しているからである。