android 使用nnapi delegete运行解释器,导致推断期间CPU使用率激增

hwamh0ep  于 2023-02-02  发布在  Android
关注(0)|答案(1)|浏览(130)

我将在我的数据集上训练的yolov 8转换为tflite并运行它,结果很好,但在推理过程中CPU使用率跳跃。
这些图片显示了在nnapi和4threads上运行的比较。
nnapi
running four threads
nnapi
running four threads
当使用nnapi时,推理速度确实比4个线程快,推理在执行器上移动,但在推理过程中屏幕冻结了片刻,这是正常的行为吗?还是我在转换到tflite的过程中做错了什么,我不确定。
我的转换代码是

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS
  ,tf.lite.OpsSet.SELECT_TF_OPS
]
converter.target_spec.supported_types = [tf.compat.v1.lite.constants.FLOAT16]
tflite_model = converter.convert()
open("yolov8s-seg.tflite", "wb").write(tflite_model)

我训练有素的yolov 8 s模型工作正常,所以在导出过程中出错了。
(原始).pt -〉(使用:yolov 8/导出器).onnx -〉保存的模型-〉tflite

# onnx to saved_model
import onnx
from onnx_tf.backend import prepare

onnx_model = onnx.load(yolov8s-seg.onnx")
tf_rep = prepare(onnx_model)
tf_rep.export_graph("yolov8s-seg")

任何建议都将不胜感激。谢谢。

7z5jn7bk

7z5jn7bk1#

从屏幕截图来看,NNAPI路径的平均CPU使用率似乎比4线程CPU要低,但偶尔会出现一些峰值。
我能想到两个可能的原因:
1.也许您正在重复创建新的TFLite解释器示例,这会触发NNAPI重新初始化和编译模型。
1.该模型没有完全委托给NNAPI,留下了相当大一部分运行在TFLite CPU实现上的模型。
检查NNAPI详细日志记录可能会有帮助,以了解更多详细信息。要执行此操作,请执行以下操作:adb shell setprop debug.nn.vlog 1,然后运行应用程序10秒,然后运行adb logcat -d

相关问题