
轻松学习 TFLM Day 6:从.tflite找出必须注册的 opDay 5 讲了fully_connected优化 kernel 和your_chip后端。今天把模型分析、resolver 注册和运行验证串起来,解决一个实际问题:拿到一个.tflite模型后,如何准确知道 TFLM 需要注册哪些 op?摘要:本文讲解如何从.tflite模型准确找出 TFLM 必须注册的 op。核心思路是直接读取模型的operator_codes,而不是凭模型名称猜测。文中介绍了 TFLM 自带的模型 resolver 生成器,演示了分析自有模型、生成最小MicroMutableOpResolver、接入MicroInterpreter的完整流程,并给出 builtin/custom op 的注册对照、多模型共用 resolver、验证覆盖与失败定位方法,最后总结了面向 AI 芯片后端的优化工作清单。本章不凭模型名字猜算子,而是直接读取模型 FlatBuffer,并把结果变成可以编译的MicroMutableOpResolver。1. 先理解“需要注册”到底指什么模型中可能有很多 operator 节点,但 resolver 注册的是不同的 op 类型。模型节点:CONV_2D, CONV_2D, RELU, SOFTMAX | v 唯一 op:CONV_2D, RELU, SOFTMAX | v resolver.AddConv2D() resolver.AddRelu() resolver.AddSoftmax()因此:同一种 op 出现多次,只注册一次。MicroMutableOpResolverN中的N是唯一注册项数量。builtin op 和 custom op 都必须有匹配的 registration。找到 op 名称,不等于当前 TFLM 一定支持它的全部类型和 shape。2. 当前仓库模型的典型结果如果“当前模型”指仓库中的示例模型,可以先按模型路径确认。常见结果如下。hello_world_float.tflite模型路径:tensorflow/lite/micro/examples/hello_world/models/hello_world_float.tflite唯一 op:FULLY_CONNECTED注册代码:tflite::MicroMutableOpResolver1resolver;resolver.AddFullyConnected();person_detect.tflite模型路径:tensorflow/lite/micro/models/person_detect.tflite唯一 op:AVERAGE_POOL_2D CONV_2D DEPTHWISE_CONV_2D RESHAPE SOFTMAX注册代码:tflite::MicroMutableOpResolver5resolver;resolver.AddAveragePool2D();resolver.AddConv2D();resolver.AddDepthwiseConv2D();resolver.AddReshape();resolver.AddSoftmax();这个模型适合验证 AI 芯片的卷积后端:CONV_2D和DEPTHWISE_CONV_2D通常是主要优化目标。keyword_scrambled.tflite模型路径:tensorflow/lite/micro/models/keyword_scrambled.tflite唯一 op:FULLY_CONNECTED QUANTIZE SOFTMAX SVDF注册代码:tflite::MicroMutableOpResolver4resolver;resolver.AddFullyConnected();resolver.AddQuantize();resolver.AddSoftmax();resolver.AddSvdf();上面只是仓库内模型的例子。自己的模型必须重新分析,不能因为模型名称相似就照抄 resolver。3. 最可靠的办法:使用仓库生成器TFLM 已经提供了从模型生成最小 resolver 的工具:tensorflow/lite/micro/tools/gen_micro_mutable_op_resolver/工具读取模型中的:Model.operator_codes | ├── builtin_code ├── deprecated_builtin_code └── custom_code然后会:解析 builtin 和 custom op。把 op 名称转换成Add...()调用。去重并排序。生成gen_micro_mutable_op_resolver.h。对应源码:tensorflow/lite/micro/tools/gen_micro_mutable_op_resolver/generate_micro_mutable_op_resolver_from_model.py4. 分析一个自己的模型实战:分析person_detect.tflite下面用一个具体模型走一遍完整流程。假设模型位于:/tmp/models/person_detect.tflite执行生成器:bazel run tensorflow/lite/micro/tools/gen_micro_mutable_op_resolver:generate_micro_mutable_op_resolver_from_model --\--common_tflite_path=/tmp/models\--input_tflite_files=person_detect.tflite\--output_dir=/tmp/tflm_generated生成的完整头文件位于:/tmp/tflm_generated/person_detect/gen_micro_mutable_op_resolver.h内容大致如下:#pragmaonce#include"tensorflow/lite/micro/micro_mutable_op_resolver.h"constexprintkNumberOperators=5;tflite::MicroMutableOpResolverkNumberOperatorsget_resolver(){tflite::MicroMutableOpResolverkNumberOperatorsresolver;resolver.AddAveragePool2D();resolver.AddConv2D();resolver.AddDepthwiseConv2D();resolver.AddReshape();resolver.AddSoftmax();returnresolver;}注意:kNumberOperators是 5,对应 5 个唯一 op,而不是模型中的节点总数。集成到 TFLM 示例工程把生成的头文件复制到示例工程的models目录:cp/tmp/tflm_generated/person_detect/gen_micro_mutable_op_resolver.h\tensorflow/lite/micro/examples/person_detection/models/在应用代码中直接使用:#include"models/gen_micro_mutable_op_resolver.h"consttflite::Model*model=tflite