Skip to content

性能基准测试

这些基准测试确立了 YOLO-Toys 运行时的基线性能特征。它们不是与其他服务框架的竞争性对比;而是运维人员可用于调整缓存大小、超时值和并发限制的内部基线

核心洞察
冷启动惩罚是热启动延迟的 10–40 倍。这意味着 ModelCache 是运行时中性能最关键的组件。每次缓存未命中耗时以秒计,每次缓存命中仅需毫秒。

测试方法

所有测量均在受控条件下进行:

参数
硬件Intel Core i7-12700H, 32 GB RAM, NVIDIA RTX 3060 Laptop (6 GB VRAM)
软件Python 3.12, PyTorch 2.3.0, CUDA 12.1
输入图像640×480 BGR numpy 数组,随机噪声
预热测量前 3 次推理运行稳定 GPU 时钟
计时方式墙上时钟,单线程,time.perf_counter()
重复次数每场景 10 次,取中位数

冷启动与热启动延迟

图 1. 延迟对比

冷启动延迟是从磁盘或 HuggingFace Hub 加载模型的代价。热启动延迟是模型已在 ModelCache 中时的推理代价。该比率使缓存命中率成为最关键的运维变量。

模型冷启动 (CPU)冷启动 (CUDA)热启动 (CPU)热启动 (CUDA)
yolov8n.pt0.45s0.12s18ms4ms
yolov8m.pt1.82s0.38s65ms12ms
facebook/detr-resnet-504.2s1.1s380ms90ms
google/owlvit-base-patch323.8s0.95s420ms110ms
Salesforce/blip-image-captioning-base2.1s0.55s280ms70ms

为何冷启动至关重要

YOLO-Toys 采用懒加载机制:模型在首次请求时加载,而非服务启动时。这使启动速度保持快捷,但意味着任何模型的第一个调用者将承担完整的冷启动代价。在生产环境中,运维人员应在接入真实流量之前,通过 /infer 端点预热关键模型。

并发下的吞吐量

使用 locust 模拟(20 个并发用户,产生速率 5/秒,运行 2 分钟):

场景请求/秒平均延迟95 分位延迟
单模型 (yolov8n.pt),已缓存142120ms180ms
双模型轮换,均已缓存118145ms220ms
每第 3 个请求缓存未命中38420ms1.2s
GPU 内存已满(OOM 压力)121.8s5.2s
运维阈值
当缓存命中率降至约 80% 以下时,系统会进入延迟悬崖,吞吐量随之崩塌 3–4×。请监控 /metricscache_size,并在其接近 cache_maxsize 时设置告警。

各模型家族的内存占用

模型磁盘模型大小峰值 VRAM(推理)缓存开销
yolov8n.pt6.2 MB180 MB~2 MB
yolov8m.pt49.7 MB420 MB~2 MB
facebook/detr-resnet-50159 MB680 MB~2 MB
google/owlvit-base-patch32587 MB1.1 GB~2 MB
Salesforce/blip-image-captioning-base990 MB1.6 GB~2 MB

6 GB GPU 的安全缓存配置

配置VRAM 估算状态
3× BLIP~4.8 GBOOM 风险
2× BLIP + 1× DETR~3.9 GBOOM 风险
3× DETR~2.0 GB安全
1× BLIP + 1× DETR + 1× YOLO~2.3 GB安全
3× YOLO nano~0.6 GB非常安全

这正是 memory_threshold=0.85 至关重要的原因:它在 GPU 耗尽之前触发 LRU 驱逐。

内存压力驱逐实践

驱逐序列确保 GPU 内存永不超出安全边界。LRU 策略保证最近最少使用的模型最先被驱逐,实践中这意味着低频使用的大模型(BLIP、OWL-ViT)会优先于高频使用的快速模型(YOLOv8n)被驱逐。

请求阶段延迟分解

YOLOv8n GPU 热请求:

阶段典型耗时备注
HTTP 解析 + Pydantic 校验0.5–2msPydantic v2 速度快
缓存查询< 0.1ms字典查找,O(1)
图像解码(JPEG → numpy)0.5–3ms取决于图像尺寸
YOLO 推理2–8ms分辨率相关
结果归一化0.2–0.5msJSON 序列化
合计3–14msp50 ≈ 5ms(RTX 3060)

DETR CPU 冷启动:

阶段典型耗时备注
注册表查询 + 处理器初始化< 1ms
模型下载(首次运行)5–30s受网络速度影响
从磁盘加载模型2–4sTransformers 反序列化
设备放置(CPU)0.2storch.to()
预热推理0.3s首次调用较慢
后续请求380msCPU 热推理

在自己的环境中进行基准测试

YOLO-Toys 包含一个 pytest-benchmark 测试套件:

bash
# 从仓库根目录执行
cd /path/to/yolo-toys
pytest tests/benchmarks/ --benchmark-only --benchmark-sort=mean

基准测试套件涵盖:

  • 各模型家族的加载时间(冷启动代价)
  • 各模型家族的推理延迟(热启动代价)
  • 缓存命中与未命中的延迟对比
  • 并发请求吞吐量模拟

接下来阅读什么

  • 模型缓存 — 这些基准测试所验证的缓存策略
  • 请求生命周期 — 了解延迟在流水线中的分布
  • 对比 — 了解这些数字与相邻服务系统的比较
  • 配置参考cache_maxsizememory_thresholdcache_ttl 调优

Released under the MIT License.