我目前正在将模型从TensorFlow转换为TensorFlow Lite。我已通过首先创建检查点和已保存的失重图(.pbtxt),然后将模型冻结为具有图权重的.pb,将其从常规TF 1.x会话转换为.tflite文件。 ,最后在冻结的模型文件上运行tflite_convert命令。在此过程中没有量化-保留了浮动。之后,我将模型放入Android Studio中,并使用Adreno 506 GPU在摩托罗拉Moto G7 Power上运行。
但是,我的原始模型与TF Lite正在运行的模型之间有两个主要区别。在TF Lite上,我的推理精度大约降低了2%(我目前正在研究),GPU计算比手机上的CPU计算慢得多。在计算机上,GPU计算大大加快了推理速度,但是在我的手机上,在GPU上的推理速度比CPU慢30倍。
我已经看到我的手机当前正在运行Android 9,因为它仅支持〜30 NNAPI操作,而Android 10支持〜100(Video:@ 6:19),这可能存在一些问题,但是关于GPU委托,还没有看到类似的信息。我的模型只是一个隐藏层大小为200的简单MLP,我看不到它的简单操作不受支持并导致CPU-GPU操作切换滞后。
我的输入数组的大小为[N] x [384],并输出大小为[N] x [1]的数组,其中N是我希望在给定时间输入的384个大小的输入的数量。我输入的所有输入数组的N都在400-800之间,但是我尝试使用更大的n来查看是否我发现的变慢是由于运行GPU推断时创建了委托内核。对于较大的n,GPU的推理时间接近CPU的推理时间,这让我认为也许GPU代表只是依靠手机的CPU进行计算。
以下是一些与n大小相比的CPU / GPU时序示例:
N = 500
CPU: 21ms
GPU: 601ms
N = 5,000
CPU: 454ms
GPU: 1004ms
N = 10,000
CPU: 949ms
GPU: 1490ms
请注意,GPU时间似乎比CPU时间慢了480毫秒,这让我认为480毫秒花在了委托内核的创建上,而这最终只是在CPU上完全运行推理。
我正在使用以下代码创建我的GPU委托:
GpuDelegate delegate = new GpuDelegate();
Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
并使用以下代码创建并运行我的解释器:
Interpreter tfliteGPU = new Interpreter(loadedFile, options);
tfliteGPU.run(inputArray, outputArray);
我正在将TF Lite Nightly 0.0.0用于TF Lite GPU和TF Lite Base:
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
为什么会这样?任何帮助表示赞赏!
答案 0 :(得分:0)
使用基准测试应用检查模型,看看是否所有的Ops都在GPU上运行,问题可能出在模型回落到CPU上,这会浪费处理时间。