近頃Ollamaのアップデートが止まらない。最新版が出たとおもったら、Pre-release版がすぐにあがり、数時間するとRelease版が出る。Docker ImageやBrewが追従できていない。理由は、Qwen 3.8のリリース対応。動かしてみた。以下、検証結果をAIで書いてもらったもの。
Ollamaを最新版に更新したので、Qwen 3.8 27Bを手元の3台で比較してみた。
今回使用した環境は以下である。
-
AMD Strix Haloを搭載した EVO-X2 128GB
-
NVIDIA GB10を搭載した DGX Spark 128GB
-
Apple M4を搭載した MacBook Air 32GB
単純に「何tok/s出るか」だけでは実際の使用感が分かりにくいため、通常生成から長文Prefill、MTP、最後にはstreaming APIを使った実TTFT(Time To First Token)まで測定した。
結論から書くと、かなり面白い結果になった。
EVO-X2とDGX Sparkは、文章を生成する速度そのものはほとんど変わらない。しかし、長いPromptを処理して最初の文字を出すまでの速度ではDGX Sparkが圧倒的に速い。
そして、EVO-X2とDGX SparkではMTPを使うことでQ8モデルでも20 tok/s前後まで高速化できた。
まず通常のQwen 3.8 27Bを比較する
最初にQ4_K_MとQ8_0を通常のOllamaモデルとして実行した。
条件は32K context、Warm-up後に256 tokensを生成するものとした。
|
環境
|
モデル
|
Prompt tok/s
|
Generation tok/s
|
|---|---|---|---|
|
EVO-X2
|
Q4_K_M
|
84.6
|
12.82
|
|
DGX Spark
|
Q4_K_M
|
389.8
|
12.73
|
|
M4 MBA
|
Q4_K_M
|
29.0
|
4.29
|
|
EVO-X2
|
Q8_0
|
145.6
|
7.75
|
|
DGX Spark
|
Q8_0
|
291.2
|
8.20
|
|
DGX Spark
|
BF16
|
200.7
|
4.88
|
|
M4 MBA
|
MLX
|
19.0
|
5.65
|
ここで最初の意外な結果が出た。
Q4の生成速度を見ると、
EVO-X2 12.82 tok/s
DGX Spark 12.73 tok/s
である。
ほとんど同じなのだ。
Q8でも、
EVO-X2 7.75 tok/s
DGX Spark 8.20 tok/s
であり、大きな差はない。
価格もアーキテクチャも大きく異なる2台だが、27B Denseモデルを1ユーザーで逐次生成させる限り、生成性能は驚くほど近かった。
ただし、Prompt処理性能にはすでに大きな差が見えている。
約5K tokensを投入するとDGX Sparkの本領が出た
そこで約5,229 tokensの長文Promptを作り、Prefill性能を測定した。
結果は次のようになった。
|
環境
|
モデル
|
Prefill tok/s
|
Prefill時間
|
Decode tok/s
|
|---|---|---|---|---|
|
DGX Spark
|
Q4
|
845.97
|
6.18秒
|
12.66
|
|
EVO-X2
|
Q4
|
245.21
|
21.32秒
|
12.76
|
|
M4 MBA
|
Q4
|
37.32
|
140.13秒
|
2.40
|
|
M4 MBA
|
MLX
|
30.51
|
171.38秒
|
6.01
|
DGX Sparkは約846 tok/s、EVO-X2は約245 tok/sである。
つまり、
DGX Spark
845.97 tok/s
│
│ 約3.45倍
▼
EVO-X2
245.21 tok/s
となった。
一方、生成速度は12.66対12.76 tok/sで、やはりほぼ同じである。
ここから両者の性格が見えてきた。
短いPrompt
+
長い回答
↓
EVO-X2 ≒ DGX Spark
大量のPrompt
RAG
長い会話履歴
Coding Agent
↓
DGX Spark >>> EVO-X2
DGX Sparkの強みは単純なtoken生成速度ではなく、大量のcontextを一気に処理するPrefill性能にあるようだ。
MTPを使ったら状況が大きく変わった
今回もっとも面白かったのがMTP対応モデルである。
MTP(Multi-Token Prediction)を利用したQ4/Q8モデルと通常モデルを比較した。
Q4
|
環境
|
Normal
|
MTP
|
高速化
|
|---|---|---|---|
|
EVO-X2
|
12.83
|
25.94
|
2.02倍
|
|
DGX Spark
|
12.72
|
27.17
|
2.13倍
|
|
M4 MBA
|
3.42
|
2.38
|
0.70倍
|
Q8
|
環境
|
Normal
|
MTP
|
高速化
|
|---|---|---|---|
|
EVO-X2
|
7.77
|
18.75
|
2.41倍
|
|
DGX Spark
|
8.16
|
20.25
|
2.48倍
|
EVO-X2ではQ8が、
7.77 → 18.75 tok/s
DGX Sparkでは、
8.16 → 20.25 tok/s
となった。
2倍を大きく超える高速化である。
特に興味深いのは、MTP Q8が通常Q4より速いことである。
EVO-X2なら、
通常 Q4 12.83 tok/s
MTP Q8 18.75 tok/s
DGX Sparkなら、
通常 Q4 12.72 tok/s
MTP Q8 20.25 tok/s
となる。
つまり、量子化をQ4まで落とさなくても、Q8 MTPを使えば品質を維持しながら通常Q4を大きく上回る速度が得られる。
今回の検証では、これがモデル選択を変える最大の要因となった。
MacではMLXを使った方がよい
M4 MacBook Air 32GBについては、Linuxとはかなり異なる結果になった。
短いPromptでは、
GGUF Q4 4.29 tok/s
MLX 5.65 tok/s
だった。
さらに長いcontextを与えると、
GGUF Q4 2.40 tok/s
MLX 6.01 tok/s
となった。
MLXは長いcontextでも生成速度をかなり維持している。
一方、GGUFのMTPモデルを使うと、
Normal Q4 3.42 tok/s
MTP Q4 2.38 tok/s
となり、逆に約30%遅くなった。
したがって今回の環境では、
Linux AMD/NVIDIA
↓
MTPが非常に有効
Apple Silicon
↓
MLXを使用
という使い分けになった。
Ollamaでは近い世代のQwen 27Bについても、GGUF系とは別にMLXモデルやMTP Q4/Q8モデルが提供されており、バックエンドに応じたモデル選択が重要になっている。
実運用を想定して「5K Prompt + 512 tokens」を測る
単純なPrefillやDecodeだけでは実際のOpen WebUIやRAGでの体感とは少し違う。
そこで、
約5K tokensのPrompt
↓
Prefill
↓
512 tokens生成
という実運用寄りのベンチマークを行った。
結果は以下である。
|
環境
|
モデル
|
Prefill
|
TTFT相当
|
Decode
|
Total
|
|---|---|---|---|---|---|
|
EVO
|
Q4
|
240 tok/s
|
22.15秒
|
12.54
|
63.75秒
|
|
EVO
|
MTP Q4
|
245
|
21.73秒
|
27.83
|
40.22秒
|
|
EVO
|
Q8
|
209
|
25.41秒
|
7.66
|
92.35秒
|
|
EVO
|
MTP Q8
|
250
|
21.26秒
|
19.75
|
47.28秒
|
|
DGX
|
Q4
|
841
|
6.53秒
|
12.46
|
47.74秒
|
|
DGX
|
MTP Q4
|
807
|
6.81秒
|
29.80
|
24.11秒
|
|
DGX
|
Q8
|
889
|
6.23秒
|
8.07
|
69.81秒
|
|
DGX
|
MTP Q8
|
854
|
6.45秒
|
21.97
|
29.86秒
|
MTPの効果は実運用条件でも非常に大きい。
特にQ8を見ると、
EVO-X2
Normal Q8 92.35秒
MTP Q8 47.28秒
ほぼ半分である。
DGX Sparkでは、
Normal Q8 69.81秒
MTP Q8 29.86秒
半分以下になった。
Q8をこの速度で使えるのであれば、少なくとも今回の用途では通常Q4を常用する必要性は低いと判断した。
最後に「本当のTTFT」を測る
最後にstreaming APIを使った。
ここまで使用していたTTFT相当値は、
load_duration + prompt_eval_duration
から算出したものだった。
そこで実際に、
HTTP request開始
↓
OllamaがPromptを処理
↓
最初の生成chunkを受信
するまでのwall clock timeをPythonで計測した。
使用モデルは最終候補の、
qwen3.8:27b-mtp-q8_0
である。
Promptは4,253 tokens、出力は512 tokensとした。
結果はこうなった。
|
|
EVO-X2
|
DGX Spark
|
|---|---|---|
|
Prompt
|
4,253 tokens
|
4,253 tokens
|
|
実TTFT
|
17.09秒
|
5.47秒
|
|
Prefill
|
253.14 tok/s
|
844.42 tok/s
|
|
Decode
|
20.45 tok/s
|
20.65 tok/s
|
|
Decode時間
|
25.04秒
|
24.80秒
|
|
Wall Total
|
42.15秒
|
30.28秒
|
これが今回もっとも分かりやすい結果である。
EVO-X2とDGX Sparkは「生成速度」がほぼ同じだった
まずDecodeを見る。
EVO-X2 20.45 tok/s
DGX Spark 20.65 tok/s
差は約1%しかない。
ほぼ同じと考えてよい。
512 tokensの生成時間も、
EVO-X2 25.04秒
DGX Spark 24.80秒
である。
これだけを見るとEVO-X2とDGX Sparkの差はほとんどない。
ところがPrefillは、
EVO-X2 253 tok/s
DGX Spark 844 tok/s
となった。
約3.34倍である。
その結果、実TTFTは、
EVO-X2 17.09秒
DGX Spark 5.47秒
となった。
DGX Sparkは約3.1倍速く最初のtokenを返してくる。
つまり体感差はこうなる
Open WebUIなどで短い質問をした場合、
短いPrompt
↓
Prefill時間が短い
↓
生成開始
↓
EVO 約20 tok/s
DGX 約21 tok/s
なので、それほど大きな違いは感じないはずである。
しかしRAGなどで、
System Prompt
+
Conversation History
+
RAG Documents
+
User Prompt
↓
数千~数万tokens
となると事情が変わる。
今回の4,253-token Promptだけでも、
EVO-X2
17秒待ってから回答開始
DGX Spark
5.5秒で回答開始
となった。
回答が始まった後は同じ速度なのに、回答が始まるまでの待ち時間がまったく違うのである。
これがDGX Sparkの大きな強みだと考える。
EVO-X2の評価もかなり高い
一方、この結果を「DGX Sparkが圧勝した」とだけ見るのも違う。
EVO-X2はQwen 3.8 27B Q8を、
約29GB
100% GPU
約20 tok/s
で生成できている。
しかもsingle-user DecodeではDGX Sparkとほぼ互角である。
したがって、
-
普通のローカルチャット
-
single-user用途
-
短~中context
-
大容量Unified Memoryを利用したLLM
という用途なら、EVO-X2はかなり優秀である。
DGX Sparkとの差が大きくなるのは、
-
RAG
-
Coding Agent
-
長い会話履歴
-
巨大System Prompt
-
Document processing
など、大量のPrefillが発生する用途である。
最終的に残したモデル
比較が終了したので、実運用用として残すモデルは3つに絞った。
EVO-X2
qwen3.8:27b-mtp-q8_0
Q8品質を維持しながら約20 tok/s出るため、Q4ではなくこちらを常用する。
DGX Spark
qwen3.8:27b-mtp-q8_0
約21 tok/sのDecodeに加え、約840 tok/sというPrefill性能を利用できる。
RAGやAgent用途はこちらを優先する。
M4 MacBook Air 32GB
qwen3.8:27b-mlx
Apple Siliconでは今回MLXが最も安定していた。
32GBのMacBook Airでも27Bモデルが約5~6 tok/sで動くという点は十分実用的である。
まとめ
今回の比較で一番意外だったのは、EVO-X2とDGX SparkのQwen 3.8 27B生成速度がほぼ同じだったことである。
MTP Q8のstreaming実測では、
EVO-X2 20.45 tok/s
DGX Spark 20.65 tok/s
だった。
一方、Prefillは、
EVO-X2 253 tok/s
DGX Spark 844 tok/s
である。
したがって両者の違いは、
DGX Sparkは文章を生成すること自体が圧倒的に速いのではない。大量のcontextを処理して、文章を生成し始めるまでが圧倒的に速い。
ということになる。
今回の結果を用途別に整理すると、次のようになる。
|
用途
|
選択
|
|---|---|
|
普通のローカルLLM
|
EVO-X2 + MTP Q8
|
|
RAG / Agent / 長context
|
DGX Spark + MTP Q8
|
|
MacでローカルLLM
|
M4 + MLX
|
|
EVO/DGXで速度最優先
|
MTP Q4
|
|
品質と速度のバランス
|
MTP Q8
|
特にMTPの効果は大きかった。
従来なら27B Q8で7~8 tok/s程度だったものが、MTPによって20 tok/s前後まで高速化された。これならQ4まで量子化を下げず、Q8を常用するという選択が十分現実的になる。
そして今回、Cold load、Warm-up、通常Decode、長文Prefill、Q4/Q8/BF16、GGUF/MLX、MTP、5K実運用、最後にはstreaming APIによる実TTFTまで測定した。
単純な「何tok/s出た」という比較から一歩進み、実際にユーザーが何秒待てば回答が始まり、そこからどの速度で文章が流れてくるのかまで確認できた。
Qwen 3.8 27Bについては、これでひとまず検証完了である。
性能差と価格差を考えると安価な値段設定であるStrix Haloはお勧めなんだが、今となっては、Strix Halo、DGX Sparkともにおいそれと買えない金額になっている。EVO-X2は、自分の買った時の2〜3倍、DGX Sparkは1.5倍になっている。それでも今や300万くらいするNvidia Pro6000 VRAM 96GB単体GPUカードと比較するとまだ安いのだが。
Strix Haloは、GPUはオマケとして考えて、DDR5 128GB搭載のNUCが去年の今頃は20万円代。その時点でも格安だった。今は、60-70万円。さらに、このパーツ不足、高騰のせいで、1年経っても後継機種が出ていない、現行機種、プラットフォームというのも驚き。さらにStrix Haloの性能がだいぶ上がってきている。お勧めといいたいが、ほんと高くなってしまった。