一个很常见的判断错误

选设备的时候,很多人会拿模型文件大小去对设备的存储和内存:模型几十兆,盒子有 4G 内存,看起来绰绰有余。

装上去跑起来,两路摄像头还行,加到第四路开始掉帧;或者白天客流少的时候正常,一到高峰期识别就慢半拍。

这类问题经常不是算力不够,而是搬运跟不上。模型文件小,只说明静态权重小;运行时真正占内存、占带宽的,是网络内部一层一层流动的中间数据。

计算和搬运是两件事

一个算子算完,结果要写回内存,下一个算子再从内存里读出来。这条链路上,权重只在用到时读一次,中间数据却是每个算子都写一遍、读一遍。

后果有三个,都跟门店现场对得上:

  • 峰值内存不由模型大小决定。 输入分辨率越高、通道越宽,中间张量越大。同一套模型,换成 4K 摄像头,内存占用立刻上一个台阶。
  • 带宽是共享的。 盒子上同时跑检测、识别、属性几个模型,几路视频一起抢同一条内存总线。抢不过来,表现出来就是延迟抖动,而不是平均速度变慢。
  • 尾部延迟先坏。 平均值可能还好看,但排队时顾客感受到的是最慢的那几次。

所以「模型不大」和「设备跑得动」之间,隔着一层内存带宽。这一层不在配置表上。

什么情况下会撞上这堵墙

不是所有门店都会遇到。下面几种情况风险明显更高:

  • 多路视频进同一台设备。 尤其是四路以上、或者分辨率不统一的时候。
  • 一台设备上叠了好几个模型。 检测框、商品识别、属性判断分开跑,每个模型的中间数据都要占地方。
  • 设备是 ARM 盒子,内存和显存共用。 算得再快,数据搬不过来也没用。
  • 现场还在跑别的程序。 收银软件、广告屏、远程运维工具,都在同一块内存里。

如果门店只是单路、低分辨率、只跑一个模型,这层开销通常还撑得住;一旦往上加,问题就出来了。

在现场怎么看出来

不用看跑分,看拐点。

  1. 逐路加负载。 一路、两路、三路、四路分别跑一段真实客流,记录每路的单次耗时。哪一路开始明显变差,那台设备的实际上限就在那里。
  2. 看延迟分布,不看平均值。 要 P95 这类尾部数据。平均值掩盖的正是顾客最不舒服的那几次。
  3. 看内存峰值。 营业高峰时段的内存最高点,比开机时空转的数字有用得多。
  4. 在满路数下连续跑。 跑一个完整的高峰时段,而不是演示五分钟。

这四件事都不需要专业知识,需要的是把设备放到真实负载下。

选型时该问的问题

把问题从「算力多少 TOPS」换成下面这组,更容易问到点上:

  • 推理过程中有没有做算子融合,中间结果是不是尽量留在片上、少往内存里写?
  • 多路视频是不是共用一份预处理和内存池,还是每路各拷贝一份?
  • 满路数运行时,能不能提供延迟分布和内存峰值,而不是单路演示?
  • 换摄像头分辨率、加一个模型,需不需要重新调优?

这四个问题背后是同一件事:这套东西在设计时有没有考虑过搬运成本。考虑过的方案,回答会很具体;没考虑过的,通常只能回到「我们算力很大」。

门店这边能做的事

中间张量怎么压、编解码算子放在计算图的哪个位置,是推理引擎和模型侧的工作,门店改不了。门店能做的是三件:

  • 不要用模型大小反推设备够不够,用满负载实测代替估算。
  • 把「加一路会怎样」写进验收条件,而不是等开业后才发现上限。
  • 给设备留余量。 按计划路数买设备、再指望它撑住旺季,是最常见的失误。

小结

模型文件小,不等于运行时省内存。层与层之间搬的数据,往往才是端侧设备真正的开销所在——它不出现在配置表上,只在加路数、上分辨率、叠模型的时候暴露出来。选型时多问一句「满路数下的延迟分布和内存峰值是多少」,比对比参数表有用。