运行UINT8量化LSTM模型报FlexTensor错误的CMake配置问题
运行LSTM模型时的TFLite Flex报错
报错信息如下:
ERROR: Fallback unsupported op 32 to TfLite Explicitly applied EXTERNAL delegate, and the model graph will be partially executed by the delegate w/ 13 delegate kernels. ERROR: Regular TensorFlow ops are not supported by this interpreter. Make sure you apply/link the Flex delegate before inference. ERROR: Node number 5 (FlexTensorListFromTensor) failed to prepare. ERROR: Failed to apply the default TensorFlow Lite delegate indexed at 0. Failed to allocate tensors!
该报错本质是TFLite默认只内置精简原生op集,LSTM模型转换后残留的部分TensorFlow原生Flex op没有被默认构建包支持,不需要手动修改TensorFlow源码内的CMakeLists.txt,通过CMake编译时按如下配置开启Flex支持即可。
CMake启用Flex支持编译步骤
- 第一步:准备对应版本的TensorFlow源码,在
tensorflow/lite路径下创建独立构建目录并进入:
mkdir build && cd build
- 第二步:执行CMake配置命令,开启Flex编译开关,交叉编译场景下直接在该命令后追加原有工具链、目标架构配置即可,不需要修改其他构建脚本:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DTFLITE_ENABLE_FLEX=ON \ -DTFLITE_ENABLE_XNNPACK=ON
TFLITE_ENABLE_FLEX=ON是核心开关,开启后构建脚本会自动拉取Flex delegate依赖的TensorFlow核心op组件,自动完成op注册相关的编译配置,不需要手动调整上层CMake规则。
- 第三步:执行编译,根据自身CPU核心数调整并行任务数,内存小于16G的设备建议把并行数降到2-4,避免编译过程OOM:
make -j$(nproc)
- 第四步:配置自身项目的CMake规则,除了常规链接编译生成的
tensorflowlite库,额外链接同构建目录下生成的tensorflowlite_flex库即可,示例配置:
target_link_libraries(your_inference_target tensorflowlite tensorflowlite_flex # 其余原有项目依赖 )
注意事项
- 必须保证导出TFLite模型的TensorFlow版本和编译推理库的源码版本完全一致,版本不匹配会出现op kernel缺失、模型解析失败的问题
- 编译完成后不需要手动在推理代码里追加Flex op的注册逻辑,解释器初始化时会自动加载Flex delegate支持的所有TensorFlow原生op,包括报错中提到的
FlexTensorListFromTensor - 安卓、嵌入式等交叉编译场景下,不需要额外调整Flex相关的编译参数,只要原有工具链配置能正常编译基础TFLite库,开启开关后就能正常编译出带Flex支持的库
- 不要在构建时手动拷贝零散的Flex相关源文件到自己的项目里,直接链接编译生成的整库即可,手动拆分文件很容易出现依赖缺失、符号找不到的问题
内容的提问来源于stack exchange,提问作者kskill
相关产品推荐
相关产品推荐

