ocr识别耗时分布分析

1. 核心数据拆解:时间都去哪了?

随便挑两组挨得最近的日志组合(根据线程/端口号对应):

样本 A(高耗时请求):

1
2
服务内部统计:e2e=937.8ms queue_wait=0.2ms infer=879.6ms decode=57.7ms encode=0.1ms
Web服务响应:2026-06-04T08:06:17.404581843Z INFO: 192.168.24.1:36264 - "POST /ocr_v5_server HTTP/1.0" 200 OK
  • 服务内总耗时(e2e):937.8 毫秒
  • 模型推理(infer)879.6 毫秒 (占总耗时的 **93.8%**)
  • 图片解码(decode):57.7 毫秒
  • 结果编码(encode):0.1 毫秒
  • 排队等待(queue_wait):0.2 毫秒

样本 B(相对低耗时请求):

1
2
服务内部统计:e2e=434.0ms queue_wait=0.0ms infer=432.7ms decode=1.1ms encode=0.0ms
Web服务响应:2026-06-04T08:06:17.400280409Z INFO: 192.168.24.1:36294 - "POST /ocr_v5_server HTTP/1.0" 200 OK
  • 服务内总耗时(e2e):434.0 毫秒
  • 模型推理(infer)432.7 毫秒 (占总耗时的 **99.7%**)

2. 为什么你会误以为“内部很快”?

你之所以产生“实际内部处理很快”的错觉,很可能是因为被高并发下的日志打印交错(时间戳)误导了。

例如看这两行连续的日志:

1
2
17.401649064Z  ... e2e=937.8ms ... infer=879.6ms ...
17.404581843Z INFO: 192.168.24.1:36264 - "POST ..."

这两行日志几乎在同一毫秒(17.401 和 17.404)打印出来。如果只看日志输出的间隔,会觉得“哇,怎么一瞬间就弹出了好几条响应,服务应该处理得很快啊!”

但实际上,大模型/OCR 服务内部开了多进程(从日志中的 __mp_main__ 可以看出是 Python 的 multiprocessing 多进程或多线程)。这 937.8 毫秒是在后台默默执行了近 1 秒钟,只是在完成的那一刻才把日志喷出来。因为多个并发请求交错完成,导致日志打印非常紧凑,制造了“处理很快”的假象。


3. 结论与真正的瓶颈

通过日志可以得出以下确定性的结论:

  1. 排队不是问题: queue_wait 只有 0.1ms ~ 0.3ms,说明请求进来后立刻就分配到了工作进程中,没有卡在队列里。
  2. 传输与前后处理不是主因: 图片解码(decode)大都在 50ms 左右,甚至有 1.1ms 的,编码 0.1ms,这部分开销很小。
  3. 真正的瓶颈就是 infer 每次请求模型推理需要 400ms ~ 880ms 不等。在计算机的世界里,单个请求推理接近 1 秒是非常重的操作。

4.优化建议

既然瓶颈铁证如山在 infer(模型推理)上,你可以从以下几个方向去突破:

  • 图片尺寸(Resolution): 推理时间从 432ms 到 879ms 浮动很大,通常是因为 OCR 识别的图片分辨率大小不一,或者图片里的文字量差异巨大。可以尝试在 decode 之后、infer 之前,限制输入图片的最大长宽(等比例缩放)。
  • 模型量化/加速: 检查 ocr_v5 目前跑在什么硬件上?如果是 CPU,强烈建议迁移到 GPU;如果是 GPU,考虑将模型导出为 ONNX 格式并使用 TensorRT 加速,或者进行 FP16 / INT8 量化
  • Batching(批处理): 目前看日志是来一个请求处理一个。如果并发量高,可以开启框架的动态批处理(Dynamic Batching),把几个请求的图片打包成一个 Batch 送给 GPU,能大幅提升吞吐量并降低平均耗时。