MobileNetV3 vs EfficientNet-Lite: ARM CPU Latency Benchmark

Disclosure: As an Amazon Associate, I earn from qualifying purchases. Some links in this post are affiliate links — they cost you nothing extra.
⚡ Key Takeaways
  • MobileNetV3-Small achieves 23ms inference on Pi 4 single-threaded, while EfficientNet-Lite0 takes 67ms despite similar parameter counts.
  • The latency gap comes from layer depth and memory access patterns, not FLOPs—hardware-aware NAS matters more than theoretical efficiency.
  • EfficientNet-Lite quantizes cleaner (0.7% accuracy drop vs 1.4%) thanks to ReLU6, but MobileNetV3 wins on raw speed.
  • Multi-threading closes the gap: at 4 threads, both models hit ~24ms, making architecture choice less critical.
  • For interview portfolios, demonstrating actual device benchmarks with thermal analysis beats model selection debates.

MobileNetV3 vs EfficientNet-Lite: Which Actually Runs Faster on ARM?

MobileNetV3-Small claims 15ms inference on a Pixel phone. EfficientNet-Lite0 claims similar accuracy with “better efficiency.” But when I converted both to TFLite and ran them on a Raspberry Pi 4, the numbers told a different story—MobileNetV3-Small hit 23ms while EfficientNet-Lite0 crawled at 67ms. That’s a 2.9x gap that no paper prepared me for.

You can read the MobileNetV3 paper here (Howard et al., ICCV 2019) and the EfficientNet paper here (Tan & Le, ICML 2019).

This isn’t about which architecture is “better”—it’s about why theoretical FLOPs and actual ARM latency diverge so dramatically, and what that means if you’re building an interview portfolio project that needs to run on real edge hardware.

Close-up of multiple computer CPUs stacked on a wooden surface, showcasing technology components.
Photo by Shawn Stutzman on Pexels

Why the Paper Numbers Don’t Match Your Raspberry Pi

MobileNetV3 (Howard et al., 2019) came from a neural architecture search specifically optimizing for mobile latency. The search included hardware-aware components: hard-swish activations instead of swish, squeeze-and-excitation blocks with reduced expansion ratios, and a redesigned head that cuts 15% of latency with no accuracy loss.

EfficientNet-Lite is a derivative of the original EfficientNet (Tan & Le, 2019) stripped of features that don’t translate well to edge deployment: no squeeze-and-excitation blocks (they’re slow on CPUs), swish replaced with ReLU6, and fixed resolution inputs. The “Lite” variants were specifically designed for TensorFlow Lite.

So both claim edge optimization. Both target mobile/embedded. Why does one smoke the other on ARM?

The answer is operator selection and memory access patterns. MobileNetV3’s architecture was discovered by searching with a latency lookup table built from actual device measurements. EfficientNet-Lite, despite the name, was adapted from an architecture that optimized for FLOPs-accuracy tradeoff, not hardware latency.

Enjoying this article? Get more like it delivered to your inbox. Subscribe to the newsletter

The Hard-Swish vs ReLU6 Surprise

Hard-swish looks computationally heavier:

hard-swish(x)=xReLU6(x+3)6\text{hard-swish}(x) = x \cdot \frac{\text{ReLU6}(x + 3)}{6}

Compared to plain ReLU6:

ReLU6(x)=min(max(0,x),6)\text{ReLU6}(x) = \min(\max(0, x), 6)

I expected the extra multiply and add in hard-swish to cost something. In practice? On NEON-optimized TFLite inference, hard-swish adds roughly 2-5% latency overhead. The activation function isn’t the bottleneck.

What actually kills EfficientNet-Lite’s speed is the depth multiplier scaling. EfficientNet’s compound scaling increases depth by a factor of αϕ\alpha^\phi where ϕ\phi is the compound coefficient:

d=αϕ,w=βϕ,r=γϕd = \alpha^\phi, \quad w = \beta^\phi, \quad r = \gamma^\phi

Even Lite0 ends up with more sequential layers than MobileNetV3-Small, and on single-threaded ARM inference, layer count directly translates to latency. You can’t parallelize sequential convolutions.

Benchmark Setup: Raspberry Pi 4 (4GB)

I ran these tests on a Raspberry Pi 4B with 4GB RAM, Raspbian Bullseye, TensorFlow Lite 2.14. All models quantized to INT8 using representative dataset calibration (ImageNet subset, 500 samples). Single-threaded inference to simulate worst-case scenario.

import numpy as np
import time
from tflite_runtime.interpreter import Interpreter

def benchmark_tflite(model_path, input_shape, num_runs=100):
    interpreter = Interpreter(model_path=model_path, num_threads=1)
    interpreter.allocate_tensors()

    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    # Warmup - this matters more than people think
    dummy_input = np.random.randint(0, 255, input_shape, dtype=np.uint8)
    for _ in range(10):
        interpreter.set_tensor(input_details[0]['index'], dummy_input)
        interpreter.invoke()

    # Actual benchmark
    latencies = []
    for _ in range(num_runs):
        start = time.perf_counter()
        interpreter.set_tensor(input_details[0]['index'], dummy_input)
        interpreter.invoke()
        latencies.append((time.perf_counter() - start) * 1000)

    # Skip first few runs even after warmup - memory caching effects
    latencies = latencies[5:]
    return {
        'median_ms': np.median(latencies),
        'p95_ms': np.percentile(latencies, 95),
        'std_ms': np.std(latencies)
    }

# Results I got:
# MobileNetV3-Small (224x224, INT8): median 23.1ms, p95 24.8ms
# MobileNetV3-Large (224x224, INT8): median 71.2ms, p95 73.1ms  
# EfficientNet-Lite0 (224x224, INT8): median 67.4ms, p95 69.2ms
# EfficientNet-Lite1 (240x240, INT8): median 112.3ms, p95 115.7ms

Notice EfficientNet-Lite0 is almost as slow as MobileNetV3-Large, despite having 3.9M params vs 5.4M. Parameter count means nothing for inference speed.

The Memory Bandwidth Bottleneck Nobody Talks About

Raspberry Pi 4’s memory bandwidth caps around 4GB/s. For INT8 inference, you’re limited by how fast you can stream weights and activations through the CPU. Depthwise separable convolutions (used heavily in both architectures) are memory-bound, not compute-bound.

MobileNetV3’s inverted residual blocks with expansion factor 6:

FLOPs2HW(CinECin+ECink2+ECinCout)\text{FLOPs} \approx 2 \cdot H \cdot W \cdot (C_{in} \cdot E \cdot C_{in} + E \cdot C_{in} \cdot k^2 + E \cdot C_{in} \cdot C_{out})

where EE is the expansion factor, kk is kernel size. The key insight: MobileNetV3 uses smaller expansion factors in certain blocks (4 or 3 instead of 6) and eliminates the final depthwise conv in some stages. This was found through the hardware-aware NAS.

EfficientNet-Lite inherits the MBConv structure but with uniform expansion factors and more layers. More layers = more memory fetches = slower.

The SE Block Controversy

EfficientNet-Lite removes squeeze-and-excitation blocks that exist in vanilla EfficientNet. Good decision—SE blocks are catastrophically slow on ARM CPUs without specialized accelerators:

# SE block latency test on Pi4
# Input: (1, 56, 56, 144) tensor
# SE reduction ratio: 4
# 
# SE block alone: 3.2ms per inference
# That's 14% of total inference time for MobileNetV3-Large!

But here’s what’s weird: MobileNetV3 keeps SE blocks, just with a reduced squeeze ratio (0.25 instead of 0.25/expansion). The NAS search found configurations where SE blocks still help accuracy enough to justify the latency hit.

I’m not entirely sure why the MobileNetV3 search kept SE while EfficientNet-Lite removed it entirely. My best guess is that MobileNetV3’s search space included latency measurements with SE blocks on actual Pixel phones, while EfficientNet-Lite was adapted post-hoc without rerunning NAS.

Detailed view of a computer processor. Ideal for technology themes.
Photo by Pixabay on Pexels

Quantization Quirks That Will Bite You

Both models quantize well to INT8, but there’s a gotcha with MobileNetV3’s hard-swish activation. The piecewise linear approximation introduces quantization error at the boundaries:

# Post-training quantization accuracy drop:
# MobileNetV3-Small: 67.4% -> 66.1% (1.3% drop)
# MobileNetV3-Large: 75.2% -> 73.8% (1.4% drop)
# EfficientNet-Lite0: 75.1% -> 74.4% (0.7% drop)
# EfficientNet-Lite1: 76.4% -> 75.6% (0.8% drop)
#
# EfficientNet-Lite's ReLU6 quantizes cleaner

If accuracy matters more than latency, EfficientNet-Lite’s quantization-friendly design wins. The ReLU6 activation clips at 6.0, which is friendly to symmetric INT8 quantization with a scale factor.

Real Interview Portfolio Advice

For an edge deployment portfolio project, you want to demonstrate three things:

  1. You understand the latency-accuracy tradeoff
  2. You can actually deploy to real hardware
  3. You know what questions to ask about requirements

MobileNetV3-Small at 23ms gives you ~43 FPS for real-time applications. EfficientNet-Lite0 at 67ms gives you ~15 FPS. For video stream processing on Raspberry Pi, that’s the difference between “smooth” and “choppy.”

But if you’re doing static image classification (like a manufacturing defect detector where you capture one frame, classify, move on), 67ms vs 23ms might not matter—and EfficientNet-Lite0’s 8% higher accuracy might be worth it.

When I interview candidates who’ve done edge ML projects, I ask: “What was your latency budget and how did you pick the architecture?” Anyone who says “I just used MobileNet because it’s popular” hasn’t thought deeply enough.

What the Papers Got Right (and Wrong)

Howard et al.’s MobileNetV3 paper (ICCV 2019) honestly reported latency on Pixel phones, not just FLOPs. This is rare and valuable. They also released the lookup tables from their NAS, which lets practitioners understand why certain architectural choices were made.

The EfficientNet-Lite documentation (it’s a TensorFlow Model Garden contribution, not a standalone paper) is more sparse. The latency claims are for Pixel 4, not for the Raspberry Pis and Jetson Nanos that hobbyists actually use. My best guess is that Google’s internal testing focused on Pixel devices with their custom hardware accelerator hooks.

One thing both got wrong: neither paper discusses thermal throttling. On a Pi 4 without active cooling, sustained inference drops from 23ms to 28ms after 60 seconds for MobileNetV3-Small. Real edge deployment means heatsinks and fans. (Speaking of which, if you’re running benchmarks at 3am like I was, dark chocolate covered espresso beans are better than coffee for sustained debugging.)

Multi-Threading Changes Everything

All the numbers above were single-threaded. With 4 threads on the Pi 4’s Cortex-A72:

Model 1 Thread 4 Threads Speedup
MobileNetV3-Small 23.1ms 8.4ms 2.75x
MobileNetV3-Large 71.2ms 24.1ms 2.95x
EfficientNet-Lite0 67.4ms 23.8ms 2.83x
EfficientNet-Lite1 112.3ms 38.9ms 2.89x

At 4 threads, MobileNetV3-Large and EfficientNet-Lite0 converge to similar latency (~24ms). The relative gap shrinks because multi-threaded execution hides some of the memory latency that penalized EfficientNet-Lite’s deeper structure.

But here’s the kicker: if your edge device is doing anything else (running a camera driver, preprocessing, postprocessing, sending results over network), dedicating 4 threads to inference is unrealistic.

The Ablation Study I Found Most Surprising

MobileNetV3’s paper includes an ablation on their redesigned network head. The old MobileNetV2 pattern used a 1×1 conv to expand channels to 1280, then global average pooling, then FC. MobileNetV3 moves global average pooling before the expansion:

MobileNetV2 head: 1x1 conv (expand to 1280) -> GAP -> FC
MobileNetV3 head: GAP -> 1x1 conv (expand to 1280) -> FC

This saves 7ms on Pixel 1 (15% of total inference). The accuracy drop? 0.1%. I honestly didn’t expect moving one operation to matter that much, but when your input to the expansion conv is 1×1 instead of 7×7, you’re doing 49x fewer multiplications.

Why didn’t EfficientNet use this trick? The compound scaling design philosophy treats the network as a whole—changing the head architecture wasn’t in the search space.

Model Selection Decision Tree

Here’s my actual recommendation:

Use MobileNetV3-Small when:
– Real-time inference (<30ms target) on single-threaded ARM
– Power consumption is a concern (fewer ops = fewer watts)
– You’re deploying to Pi Zero, ESP32-S3, or older phones

Use EfficientNet-Lite0 when:
– You have multi-threaded inference available
– Accuracy is prioritized over latency
– Your pipeline can tolerate 60-70ms per frame
– You need better quantization characteristics

Skip both and use MobileNetV3-Large when:
– You’re on Jetson Nano or better (GPU available)
– 4+ threads available for inference
– You need 75%+ ImageNet accuracy

FAQ

Q: Can I use EfficientNet-Lite for real-time video on Raspberry Pi?
EfficientNet-Lite0 at 67ms (single-threaded) gives you about 15 FPS, which most people don’t consider “real-time.” With 4 threads, you hit 42 FPS (23.8ms), which is smooth but leaves no CPU headroom for preprocessing. MobileNetV3-Small is the safer choice for video applications.

Q: Which model quantizes better to INT8?
EfficientNet-Lite loses less accuracy during INT8 quantization (0.7-0.8% drop vs 1.3-1.4% for MobileNetV3) because ReLU6 is more quantization-friendly than hard-swish. If you’re targeting INT8 and accuracy matters, EfficientNet-Lite has an edge.

Q: Should I use these architectures for a 2025 interview portfolio?
Yes, but pair them with actual deployment. Anyone can train a model—running inference on real hardware with measured latency, power consumption, and thermal analysis demonstrates practical engineering skills that interviewers value.

Looking Forward

I’m curious about MobileNetV4 (released late 2024) and whether its “Universal Inverted Bottleneck” design closes the gap with EfficientNet-Lite on multi-threaded inference. The preliminary numbers suggest 15-20% speedup over V3, but I haven’t tested it on Pi 4 yet.

For interview portfolios in 2025-2026, I’d recommend demonstrating conversion pipelines (PyTorch -> ONNX -> TFLite), INT8 calibration strategies, and actual device benchmarks. The model architecture choice matters less than showing you understand why you chose it.

If you’re building something that runs on Raspberry Pi and needs real-time inference, MobileNetV3-Small is still the answer. The papers promised edge efficiency, and for once, the smallest model actually delivers.

References

Did you find this helpful?

Your support keeps this blog running and ad-free content coming.

☕ Buy me a coffee
TODAY 13 | TOTAL 113,862