Samsung Galaxy S21使用TensorFlow Lite+NNAPI运行异常缓慢问题求助
问题原因分析
三星Galaxy S21(尤其是搭载Exynos 2100芯片的版本)的NNAPI实现存在兼容性问题,主要表现为GPU后端对部分TensorFlow Lite算子的调度效率极低,甚至出现内核阻塞。而S20使用的Exynos 990/骁龙865芯片的NNAPI实现更成熟,因此不会出现该问题。此外,早期One UI版本的系统bug也可能加剧这一现象。
可行解决方案
1. 强制NNAPI使用CPU后端
通过配置NNAPI委托选项,指定优先使用CPU而非GPU,避免触发有问题的GPU内核逻辑:
// 创建并配置NNAPI委托选项 TfLiteNnapiDelegateOptions nnapi_options = TfLiteNnapiDelegateOptionsDefault(); // 设置执行偏好为CPU优先 nnapi_options.execution_preference = NNAPI_EXECUTION_PREFERENCE_CPU; // 将配置好的委托添加到解释器选项中 TfLiteInterpreterOptionsAddDelegate(m_options, TfLiteNnapiDelegateCreate(&nnapi_options));
替代原有的TfLiteInterpreterOptionsSetUseNNAPI(m_options, true);,这样NNAPI会使用CPU执行,避免GPU端的阻塞问题。
2. 针对S21设备单独切换到GPU/CPU委托
既然S21在使用TFLite原生GPU委托时能达到9-10fps,可通过设备型号判断,对S21禁用NNAPI,改用原生GPU委托:
// C++中读取设备型号示例 #include <sys/system_properties.h> char model[PROP_VALUE_MAX]; __system_property_get("ro.product.model", model); if (strstr(model, "SM-G991") != NULL || strstr(model, "Galaxy S21") != NULL) { // 使用TFLite GPU委托 TfLiteGpuDelegateOptionsV2 gpu_options = TfLiteGpuDelegateOptionsV2Default(); TfLiteInterpreterOptionsAddDelegate(m_options, TfLiteGpuDelegateV2Create(&gpu_options)); } else { // 其他设备使用NNAPI TfLiteInterpreterOptionsSetUseNNAPI(m_options, true); }
3. 排查算子兼容性
使用TensorFlow Lite提供的nnapi_coverage工具,检查模型中哪些算子被NNAPI支持:
python -m tensorflow.lite.tools.nnapi_coverage --model=your_model.tflite
如果存在大量不支持的算子,NNAPI会频繁在GPU/CPU间切换调度,导致性能暴跌。针对这些不支持的算子,可以尝试修改模型结构(比如替换为NNAPI兼容的算子),或者禁用这些算子的NNAPI加速。
4. 升级系统版本
早期One UI 3.1版本的S21存在NNAPI调度的系统bug,升级到One UI 4.0及以上版本后,部分兼容性问题会被修复。建议引导用户检查并更新系统。
关于性能追踪结果的说明
你看到的ANeuralNetworksExecution_compute()耗时集中在GPU内核,正是因为Exynos 2100的NNAPI GPU后端在处理特定算子时出现了异常阻塞,属于芯片厂商的NNAPI实现问题,而非TensorFlow Lite本身的bug。
内容的提问来源于stack exchange,提问作者Di Wang

