边缘AI内存规划:先压峰值再谈模型大小
模型文件能装进闪存,不代表推理过程能装进内存。边缘AI的容量门槛往往由同时存活的激活张量决定,而分块降峰值又会引入新的边缘误差。
激活峰值来自生命周期重叠,而不是各层张量大小的简单求和。带跳连的网络需要保留早期特征,直到后续融合节点消费完毕;多分支结构还会在汇合前同时占用若干输出。若运行时按执行顺序逐层申请释放,却不知道张量最后一次被谁读取,就会把本可复用的区域长期锁住。静态内存计划应先建立生产者和消费者关系,再把生命周期不相交的张量映射到同一物理区,这与编译器寄存器着色的思路相近。
原地计算也有边界。激活函数覆盖输入通常安全,但张量若同时被残差支路引用,提前写回会破坏另一条路径需要的原值。动态形状则要求计划覆盖最大合法尺寸,若只按标称分辨率分配,现场切换摄像头模式时会越界;一味按绝对最大值预留,又会挤掉其他任务。可行做法是限定输入档位,为每个档位生成独立计划,并在切换前排空仍引用旧缓冲的推理任务。
多模型并发时,单模型峰值也不足以指导容量。检测和分割模型若恰好在同一时刻进入高占用层,工作区会叠加;通过错开启动相位,往往能在不降低各自帧率的情况下压低总峰值。验证工具需要输出时间轴上的实际水位、复用冲突和外部内存回退次数,而不是只报告分配成功。若某次回退依赖操作系统交换或临时扩容,实时性已经失去确定上界。
内存计划还应与编译版本绑定。算子融合、量化方式或内核选择一变,张量生命周期和临时工作区都可能重新排列;沿用旧版本估算,会出现容量看似不变、峰值位置却突然前移的情况。发布流程应从最终编译产物提取计划摘要,记录每个缓冲的大小、对齐和存活区间,并用运行时高水位交叉验证。模型文件哈希相同而编译器不同,也不能直接共用旧基线。
当完整图像确实放不下时,分块推理可以降低峰值,但切块不能沿像素边界生硬截断。卷积输出依赖感受野,靠近块边缘的特征缺少邻域信息;目标跨过边界时,检测框会被拆开,分割轮廓也会出现接缝。必须为每块加入与有效感受野相匹配的重叠区,再在输出域裁掉不可信的边缘。重叠太小会留下误差,过大则重复计算并增加搬运。
边缘AI采用多尺度网络时,所需重叠宽度不能只看第一层卷积核。下采样、空洞卷积和特征金字塔会扩大依赖范围,理论感受野又不等于实际贡献范围,因此应从网络结构推导下限,再用跨边界样本验证。对检测任务,块内非极大值抑制还要在全局合并后再做一次,否则同一目标会以两个框出现;对像素级任务,则要设计加权拼接,避免重叠区亮度或概率发生阶跃。
分块调度同样影响内存收益。若预取下一块、计算当前块和回写上一块同时进行,三套缓冲可能重新抬高峰值;只用单缓冲虽然省空间,却让DMA与计算串行。工程上应枚举双缓冲和三缓冲的水位,按截止期选择,而不是默认流水越深越好。测试还要包含目标恰好落在四块交界、输入尺寸不能整除块宽等条件,这些位置最容易暴露裁剪和坐标回映射错误。
所以,内存优化应先看张量何时死亡,再决定图像如何切开。把生命周期复用与边缘补偿共同量化,边缘AI才能在有限容量中保持结果连续。





