1. 环境搭建与基准测试

任务目标

在本案例中,你将搭建一套面向嵌入式设备的AI推理环境,运行一个轻量级图像分类模型(MobileNetV2),并测量单次推理延迟。该延迟数据将作为后续所有优化手段的对比基准。

环境依赖

  • 硬件:任意x86_64 Linux主机(本案例不涉及交叉编译,直接在本机模拟嵌入式环境)
  • Python:3.8+
  • PyTorch:2.0+(CPU版本即可)
  • TorchVision:0.15+
  • Pillow:用于图像加载

安装命令:

pip install torch torchvision pillow --index-url https://download.pytorch.org/whl/cpu

完整实现

以下代码完成:加载预训练MobileNetV2、构造随机输入模拟真实推理、执行预热后测量100次推理延迟,并输出统计结果。

import torch
import torchvision.models as models
import time
import statistics

# 1. 设备配置:CPU模拟嵌入式环境
device = torch.device("cpu")

# 2. 加载预训练模型并设为评估模式
model = models.mobilenet_v2(weights=models.MobileNet_V2_Weights.IMAGENET1K_V1)
model.to(device)
model.eval()

# 3. 构造固定输入:3x224x224,模拟单张图像
input_tensor = torch.randn(1, 3, 224, 224).to(device)

# 4. 预热:排除首次加载/缓存影响
with torch.no_grad():
    for _ in range(10):
        _ = model(input_tensor)

# 5. 正式测量:记录100次推理延迟
latencies = []
with torch.no_grad():
    for _ in range(100):
        start = time.perf_counter()
        _ = model(input_tensor)
        end = time.perf_counter()
        latencies.append((end - start) * 1000)  # 转换为毫秒

# 6. 统计结果
avg_latency = statistics.mean(latencies)
p95_latency = sorted(latencies)[int(len(latencies) * 0.95) - 1]
p99_latency = sorted(latencies)[int(len(latencies) * 0.99) - 1]

print(f"平均延迟: {avg_latency:.2f} ms")
print(f"P95延迟: {p95_latency:.2f} ms")
print(f"P99延迟: {p99_latency:.2f} ms")
print(f"最小延迟: {min(latencies):.2f} ms")
print(f"最大延迟: {max(latencies):.2f} ms")

运行与验证

将上述代码保存为 benchmark.py,在终端执行:

python benchmark.py

验证通过条件:程序正常输出5行统计结果,且平均延迟在合理范围内(通常为20~200ms,取决于CPU性能)。若输出结果稳定且无报错,说明环境搭建成功,该组数据即为后续优化实验的基准。

关键说明

  • 本案例使用随机输入而非真实图像,因为延迟测量与输入内容无关,仅与张量形状和模型结构相关。
  • 预热步骤(10次)是必要的,用于加载权重缓存、触发CPU指令集优化,否则首次推理延迟会显著偏高。
  • 若需在真实嵌入式设备(如树莓派、Jetson)上运行,只需将device改为对应设备(如"cuda"或"cpu"),并确保PyTorch版本与设备架构匹配。

基准数据记录

建议将本次输出的平均延迟记录为baseline_avg_ms,后续每个优化案例均以该数值为参照,计算优化百分比。例如,若本次平均延迟为85ms,后续优化后为60ms,则提升约29.4%。