LLM Inference at the Edge: Mobile, NPU, and GPU Performance Efficiency Trade-offs Under Sustained Load
Organizations: Conscious Engines
Abstract
Deploying large language models on-device for always-on personal agents demands sustained inference from hardware tightly constrained in power, thermal envelope, and memory. We benchmark Qwen 2.5 1.5B (4-bit quantised) across four platforms: a Raspberry Pi 5 with Hailo-10H NPU, a Samsung Galaxy S24 Ultra, an iPhone 16 Pro, and a laptop NVIDIA RTX 4050 GPU. Using a fixed 258-token prompt over 20 warm-condition iterations per device, we measure throughput, latency, power, and thermal behaviour. For mobile platforms, thermal management supersedes peak compute as the primary constraint: the iPhone 16 Pro loses nearly half its throughput within two iterations, and the S24 Ultra suffers a hard OS-enforced GPU frequency floor that terminates inference entirely. On dedicated hardware, distinct constraints dominate: the RTX 4050 is bounded by its battery power ceiling, while the Hailo-10H is limited by on-module memory bandwidth. The RTX 4050 sustains 131.7 tok/s at 34.1 W; the Hailo-10H sustains 6.9 tok/s at under 2 W with near-zero variance, matching the RTX 4050 in energy proportionality at 19x lower throughput. Results should be interpreted as platform-level deployment characterisations for a single model and prompt type, reflecting hardware and software combined, rather than general claims about hardware capability alone.
Figures & tables
| RPi 5 + Hailo-10H | S24 Ultra | iPhone 16 Pro | RTX 4050 Laptop | |
|---|---|---|---|---|
| SoC / CPU | BCM2712 4 A76 @ 2.4 GHz | Snapdragon 8 Gen 3 | Apple A18 Pro | Intel Core i5-13420H |
| AI Accel. | Hailo-10H NPU (40 TOPS, 5 W) | Hexagon NPU (45 TOPS) | Neural Engine 17-core ( 35 TOPS) | RTX 4050 (80 Tensor Cores) |
| RAM | 8 GB LPDDR4X | 12 GB LPDDR5X | 8 GB Unified | 16 GB DDR5 |
| GPU | VideoCore VII | Adreno 750 | 6-core Apple GPU | RTX 4050 (2560 CUDA cores) |
| VRAM | Shared | Shared | Shared | 6 GB GDDR6 |
| OS | Raspberry Pi OS | Android 16 | iOS 26 | Ubuntu 22.04.3 |
| RPi 5 + Hailo-10H | S24 Ultra | iPhone 16 Pro | RTX 4050 Laptop | |
|---|---|---|---|---|
| Framework | hailo-ollama | MLC-LLM 0.1.0 | MLX Swift v0.29.1 | vLLM (CUDA 12.1) |
| Backend | HailoRT 4.17.0 | OpenCL 3.0 + TVM 0.14 | Metal (MLX) | PyTorch 2.1.0 |
| Language | Python 3.10 | Java / NDK r26b | Swift 5.9 (SwiftUI) | Python 3.10 |
| Model format | GGUF Q4_0 | MLC binary q4f16_2 | MLX safetensors Q4_0 | GPTQ Int4 safetensors |
| Context window ‡ | 2,048 | 2,048 | 2,048 (KV) | 2,048 |
| Power monitor | INA219 (1 kHz) | BatteryManager (per-iter) ∗ | UIDevice batteryLevel | nvidia-smi (100 ms) |
| Attribute | Value |
|---|---|
| Parameters | 1.5B |
| Architecture | Transformer decoder, GQA (2 groups) |
| Layers | 28 |
| Hidden size | 1536 |
| Attention heads | 12 |
| Vocabulary | 151,936 tokens |
| Metric | Unit | Definition |
|---|---|---|
| Decode tokens | count | Tokens generated during the decode phase |
| Decode time | ms | Wall-clock duration of the decode phase |
| Prefill Time | ms | Time from prompt submission to first output token; equivalent to the duration of the prompt encoding phase |
| Throughput (TPS) | tok/s | |
| Avg power | W | Mean system power draw over inference duration |
| Peak power | W | Maximum instantaneous power observed |
| Metric | Mean | Std Dev | Min | Max |
| Decode tokens | 1789 | 0 | 1789 | 1789 |
| Decode time (ms) | 13,697 | 274 | 12,881 | 13,906 |
| Throughput (tok/s) | 131.70 | 2.87 | 128.65 | 138.88 |
| Prefill time (ms) | 1,998 | 42 | 1,894 | 2,028 |
| Avg system power (W) | 34.12 | 0.17 | 33.75 | 34.40 |
| Peak system power (W) | 35.28 | 0.21 | 35.05 | 35.73 |
| Metric | Mean | Std Dev | Min | Max |
|---|---|---|---|---|
| Decode tokens | 564 | 0 | 564 | 564 |
| Decode time (ms) | 81,569 | 34 | 81,516 | 81,640 |
| Throughput (tok/s) | 6.914 | 0.003 | 6.908 | 6.919 |
| Prefill time (ms) | 1,287 | 1 | 1,286 | 1,290 |
| Avg system power (W) | 1.870 | 0.016 | 1.851 | 1.921 |
| Peak system power (W) | 3.065 | 1.099 | 2.383 | 6.662 |
| Metric | Mean | Std Dev | Min | Max |
|---|---|---|---|---|
| Decode tokens | 819 | 0 | 819 | 819 |
| Decode time (s) | 32.19 | 3.69 | 20.23 | 35.06 |
| Throughput (tok/s) | 25.89 | 4.11 | 23.36 | 40.49 |
| TTFT (s) | 0.466 | 0.064 | 0.268 | 0.544 |
| Prompt throughput (tok/s) | 606.5 | 122.9 | 505.7 | 1027.5 |
| Battery drain (total) | 5% over 20 iterations (100% 95%) | |||
| Metric | Mean | Std Dev | Min | Max |
|---|---|---|---|---|
| Decode tokens | 646 | 0.3 | 645 | 646 |
| Decode time (ms) | 59,908 | 4,122 | 52,906 | 67,619 |
| Throughput (tok/s) | 10.83 | 0.75 | 9.55 | 12.21 |
| Prefill time (ms) | 91,376 | 3,077 | 89,899 | 104,108 |
| Max GPU temperature (°C) | 64.6 | 1.9 | 61.1 | 68.5 |
| Max CPU temperature (°C) | 61.3 | 1.2 | 59.7 | 64.0 |
| Platform | TPS | CV | Avg Power (W) | W/tok/s | mJ/token |
|---|---|---|---|---|---|
| RTX 4050 † | 2.2% | 34.12 † | 0.259 † | 297.3 † | |
| iPhone 16 Pro (Hot) | 1.2% | ∗ | ∗ | ∗ | |
| S24 Ultra (plateau) | 4.2% | 1.486 § | 0.143 § | 143.0 § | |
| RPi 5 + Hailo-10H | 0.04% | 1.870 ‡ | 0.271 ‡ | 270.5 ‡ | |
| ∗ Power not available: iOS exposes no per-component API. | |||||
| Energy figures are not directly comparable across platforms due to differing | |||||
| Scenario | RTX 4050 | iPhone 16 Pro | S24 Ultra | RPi + Hailo |
| Interactive assistant (AC-powered) | ✓ | |||
| Intermittent queries (5–10/hr) | ✓ | ✓ | ✓ | |
| Sustained agent ( 20/hr) | × | ✓ | ||
| Battery-powered always-on | × | ✓ | ||
| Low-latency streaming response | ✓ | × | × |
On-Device Language Model Inference
On-device language model inference runs language models locally on phones, computers, and edge devices under tight memory, power, and latency limits.
See all 164 papers