135. eIQ的模型转换与优化:从一次推理卡死到部署实战
深夜两点,示波器上I2C总线的波形像心电图一样抽搐。我盯着调试串口最后一行输出——“推理开始”,然后就是死一般的寂静。板子上的i.MX RT1060像被施了定身术,连看门狗都没来得及咬。这不是第一次了,自从把那个在PC上跑得飞快的MobileNetV2丢进eIQ,噩梦就开始了。
后来发现,问题出在模型转换时一个被忽略的量化参数上。今天这篇笔记,就把eIQ模型转换与优化这条路上踩过的坑,连根带泥翻出来晒晒。
模型转换不是“另存为”
很多人把eIQ的模型转换想象成Word转PDF——点一下按钮完事。天真。eIQ的转换工具链(ONNX到TensorFlow Lite,再到eIQ自家的格式)本质上是在做三件事:算子映射、内存重排、精度妥协。
那次卡死的根因,是模型里一个自定义的PReLU激活函数。eIQ的推理引擎(比如Glow或TensorFlow Lite Micro)不认识这个算子,转换时直接报了个Warning,然后自作主张把它替换成了ReLU。结果呢?负半轴的输出全被截断,后续层的数值分布彻底崩了,推理到一半直接触发硬件浮点异常。
血的教训:转换完成后,一定要用eIQ Portal的“Model Analyzer”工具逐层检查算子映射表。看到“Unsupported Op”或者“Fallback to CPU”的标记,立刻停手。要么改模型结构,要么手写算子插件。
量化:性能与精度的钢丝绳
eIQ支持两