ailia LLM の QNN バックエンドで Gemma 4 を Qualcomm SoC の NPU で実行した測定結果を、同じ端末の CPU 実行と比較して示します。
QNN バックエンドの使い方は ailia LLM NPU(QNN)ガイド を参照してください。
Gemma 4 を 2 機種で測定した結果です。Snapdragon 8+ Gen 1(SM8475 / Hexagon v69)は E2B の FP16 モデル、Snapdragon 7s Gen 3(SM7635 / Hexagon v73)は E2B / E4B の Int16 モデルを使用しています。いずれも QAIRT 2.47、コンテキスト長 8192、AR-256 / AR-1 構成です。
CPU は同じ端末上で、同一の Q4_0 GGUF を標準の llama.cpp 経路で実行した値です(デコーダワーカー 8、コンテキスト 8192)。出荷構成は OpenMP 無効のビルドで、表の「CPU」がこれにあたります。「CPU(OpenMP)」は GGML_OPENMP=ON / OMP_NUM_THREADS=2 でビルドした比較用の構成です。
81 トークン入力・1,000 トークン生成時のスループットです。
| 端末 | モデル | CPU | CPU(OpenMP) | NPU(QNN) | NPU の効果 |
|---|---|---|---|---|---|
| SM8475(Hexagon v69) | E2B / FP16 | 9.971 tokens/s | 8.482 tokens/s | 8.062 tokens/s | 0.81 倍 |
| SM7635(Hexagon v73) | E2B / Int16 | 5.805 tokens/s | 4.195 tokens/s | 6.410 tokens/s | 1.10 倍高速 |
| SM7635(Hexagon v73) | E4B / Int16 | 3.351 tokens/s | 3.203 tokens/s | 3.128 tokens/s | 0.93 倍 |
SM7635 の E2B では NPU の Decode が CPU より 1.10 倍(OpenMP ビルド比では 1.53 倍)高速です。一方、SM8475 の E2B(0.81 倍)と SM7635 の E4B(0.93 倍)では CPU を下回ります。Decode は 1 トークンずつ処理するため重みの読み出しが支配的になり、NPU の並列演算性能を活かしにくいためです。
入力トークン数を 64〜2,048 まで変えたときのスループット(tokens/s)です。2 トークンのウォームアップ後、評価を伴わない SetPrompt を 2 回呼んで KV キャッシュを消去し、各入力長で 1 トークンだけ生成しています。
| 端末・モデル・経路 | 64 | 128 | 256 | 512 | 1024 | 2048 |
|---|---|---|---|---|---|---|
| SM8475 E2B CPU | 109.359 | 95.722 | 88.243 | 85.663 | 79.940 | 71.244 |
| SM8475 E2B CPU(OpenMP) | 54.184 | 55.333 | 61.476 | 60.319 | 55.500 | 51.064 |
| SM8475 E2B NPU(FP16) | 76.244 | 144.406 | 277.775 | 302.667 | 301.791 | 299.827 |
| SM7635 E2B CPU | 91.550 | 77.064 | 80.496 | 76.187 | 69.757 | 59.192 |
| SM7635 E2B CPU(OpenMP) | 27.441 | 49.999 | 62.793 | 70.965 | 69.228 | 56.059 |
| SM7635 E2B NPU(Int16) | 33.601 | 66.523 | 130.329 | 133.404 | 131.367 | 130.252 |
| SM7635 E4B CPU | 1.697 | 29.105 | 28.417 | 62.663 | 64.383 | 60.897 |
| SM7635 E4B CPU(OpenMP) | 6.746 | 27.824 | 40.097 | 61.877 | 66.980 | 54.372 |
| SM7635 E4B NPU(Int16) | 20.304 | 40.890 | 80.700 | 83.758 | 83.314 | 78.258 |
実入力トークン数 / 最初の生成呼び出し時間 です。
2,048 トークン Prefill における、最初の生成呼び出し前後のプロセス CPU 時間です。8 コアすべてを使い切った状態を 100% として表しています。アプリケーションプロセスの使用率であり、端末全体の使用率ではありません。
| 端末・モデル | CPU | CPU(OpenMP) | NPU(QNN) |
|---|---|---|---|
| SM8475 E2B | 98.7% | 86.3% | 3.0% |
| SM7635 E2B | 96.4% | 97.3% | 2.4% |
| SM7635 E4B | 97.5% | 96.7% | 2.6% |
NPU では Prefill 中の CPU 使用率が 3% 前後に収まるため、アプリケーション側の処理に CPU を残せます。CPU 実行では 8 コアをほぼ使い切るため、発熱と他処理への影響が大きくなります。
同一の 768x768 画像 10 枚、各 100 トークン出力での中央値です。TTFT は画像エンコーダを含むプロンプト設定と最初の生成呼び出しの合計で、モデルのオープンは含みません。
| 端末・モデル・経路 | TTFT(中央値) | Decode(中央値) |
|---|---|---|
| SM8475 E2B CPU | 83.63 秒 | 12.081 tokens/s |
| SM8475 E2B CPU(OpenMP) | 128.22 秒 | 7.491 tokens/s |
| SM8475 E2B NPU(FP16) | 6.60 秒 | 7.033 tokens/s |
| SM7635 E2B CPU | 95.01 秒 | 5.891 tokens/s |
| SM7635 E2B CPU(OpenMP) | 97.45 秒 | 3.569 tokens/s |
| SM7635 E2B NPU(Int16) | 8.35 秒 | 6.444 tokens/s |
| SM7635 E4B CPU | 115.03 秒 | 3.332 tokens/s |
| SM7635 E4B CPU(OpenMP) | 96.90 秒 | 2.642 tokens/s |
| SM7635 E4B NPU(Int16) | 15.01 秒 | 3.098 tokens/s |
画像入力の TTFT は、SM8475 の E2B で約 12.7 倍、SM7635 の E2B で約 11.4 倍、E4B で約 7.7 倍高速です。CPU と NPU はいずれも同じ 768x768 の画素と 256 個の画像埋め込みを処理しています。
FLEURS の 10 録音(5 言語 各 2 件、自然な EOS まで生成し上限 256 トークン)の中央値です。TTFT は音声エンコーダを含むプロンプト設定と最初の生成呼び出しの合計で、モデルのオープンは含みません。
| 端末・モデル・経路 | TTFT(中央値) | Decode(中央値) | 出力トークン数 |
|---|---|---|---|
| SM8475 E2B CPU | 37.29 秒 | 10.416 tokens/s | 21〜89 |
| SM8475 E2B CPU(OpenMP) | 36.49 秒 | 10.539 tokens/s | 21〜89 |
| SM8475 E2B NPU(FP16) | 4.06 秒 | 6.495 tokens/s | 21〜90 |
| SM7635 E2B CPU | 47.22 秒 | 5.166 tokens/s | 21〜89 |
| SM7635 E2B CPU(OpenMP) | 35.37 秒 | 3.846 tokens/s | 21〜89 |
| SM7635 E2B NPU(Int16) | 6.98 秒 | 6.356 tokens/s | 22〜60 |
| SM7635 E4B CPU | 89.91 秒 | 3.053 tokens/s | 21〜91 |
| SM7635 E4B CPU(OpenMP) | 45.99 秒 | 2.947 tokens/s | 21〜91 |
| SM7635 E4B NPU(Int16) | 12.37 秒 | 3.018 tokens/s | 21〜91 |
音声入力の TTFT は、SM8475 の E2B で約 9.2 倍、SM7635 の E2B で約 6.8 倍、E4B で約 7.3 倍高速です。
E2B は SM7635(Hexagon v73)で、LLM / VLM / ALM の各構成を 8 トークン生成で実行したときのメモリ使用量です(単位 MiB、コンテキスト長 8192)。CPU は Q4_0 GGUF と BF16 の mmproj、NPU は Int16 の QNN Model を使用しています。モデルは mmap で読み込むため、実際に確保した作業メモリである匿名メモリ(RssAnon)と、ページキャッシュとして再利用できるファイルマッピング(RssFile)を分けて記載します。ピークはプロセスの最大常駐サイズ(VmHWM)です。
| モデル | ワークロード | 実行系 | VmHWM | RssAnon | RssFile |
|---|---|---|---|---|---|
| E2B | LLM | CPU | 4574.2 | 1524.1 | 2896.5 |
| E2B | LLM | NPU(Int16) | 1666.8 | 386.4 | 1276.2 |
| E2B | VLM | CPU | 4881.2 | 2512.4 | 40.3 |
| E2B | VLM | NPU(Int16) | 2161.2 | 673.3 | 1483.7 |
| E2B | ALM | CPU | 4873.7 | 2623.0 | 1509.1 |
| E2B | ALM | NPU(Int16) | 2202.5 | 591.6 | 1606.7 |
mallopt(M_PURGE, 0) を呼ぶと 23 MiB 前後になります。E4B は同じ端末で、81 トークン入力・100 トークン出力の LLM を 1 回ずつ実行した参考測定です(単位 MiB)。RssAnon と RssFile の内訳は取得しておらず、実行中の PSS を併記します。E2B の表とは条件が異なります。
| モデル | ワークロード | 実行系 | VmHWM | 実行中の PSS |
|---|---|---|---|---|
| E4B | LLM | CPU | 5569.8 | 4432.7 |
| E4B | LLM | CPU(OpenMP) | 5518.2 | 3922.2 |
| E4B | LLM | NPU(Int16) | 1976.0 | 1801.8 |
E4B でも NPU のピークは CPU の約 3 分の 1 です。この測定は端末が Thermal Status 1 の状態で、Android のページ回収の影響を受けています。