当前位置: 首页 > 知识库问答 >
问题:

只有当输入大小大于1时,TensorFlow Lite Android才会在GPU计算上崩溃

柏修洁
2023-03-14

我一直在开发一个AndroidStudio应用程序,它使用TensorFlow Lite的GPU代理来加快推理速度。它使用一个模型,该模型接受大小为[n]x[384]的输入数组,并输出大小为[n]x[1]的数组,其中n是我希望在给定时间输入的384大小的输入数。输出n仅依赖于输入n。对于n=1,我没有问题-TF Lite的CPU和GPU推理都可以正常工作(尽管GPU确实需要更长的时间-可能是因为较小的输入大小?)。当我增加n使其大于1并运行我的模型时,CPU计算工作正常,但GPU计算会使我的程序崩溃。当我使用模拟的Pixel 3 XL运行程序时,我收到以下错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mlptest, PID: 10405
java.lang.IllegalArgumentException: Internal error: Failed to apply delegate: OpenCL library not loaded - dlopen failed: library "libOpenCL-pixel.so" not found
Falling back to OpenGL
TfLiteGpuDelegate Init: OpenGL ES 3.1 or above is required to use OpenGL inference.
TfLiteGpuDelegate Prepare: delegate is not initialized
Node number 4 (TfLiteGpuDelegateV2) failed to prepare.

当我在我的个人手机Motorla Moto G7电源上运行GPU compute时,我收到以下错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mlptest, PID: 16906
java.lang.IllegalStateException: Internal error: Unexpected failure when preparing tensor allocations: TfLiteGpuDelegate Init: Index is out of range
TfLiteGpuDelegate Prepare: delegate is not initialized
Node number 4 (TfLiteGpuDelegateV2) failed to prepare.

只要GPU代理的解释器运行,就会发生此崩溃。我使用以下代码行创建委托:

                GpuDelegate delegate = new GpuDelegate();
            Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);

使用选项初始化解释器,然后运行它:

                Interpreter tfliteGPU = new Interpreter(loadedFile, options);

最后在计算后关闭委托:

delegate.close();

我使用的原始TensorFlow模型是在TensorFlow 1.x中创建的,并使用tflite\u convert命令从冻结图转换而来。我正在运行TF Lite 2.2.0和TF Lite GPU 2.2.0的应用程序:

    implementation 'org.tensorflow:tensorflow-lite:2.2.0'
    implementation 'org.tensorflow:tensorflow-lite-gpu:2.2.0'

我已经查看了TF Lite的Android API参考和他们在GPU代表上的页面,没有找到任何相关的解决方案。感谢您的帮助!

共有1个答案

姜弘化
2023-03-14

建议每晚试用TensorFlow实现后:

    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'

我在构建中切换了实现。gradle每晚使用0.0.0,我的问题就解决了。我说不出最初是什么导致了它,然而这就是解决它的原因。

 类似资料:
  • 只有当新项目的日期比现有项目更近时,我才想更新DynamoDB中的项目。目前,我正在查询现有项目,在代码中进行比较,然后写入数据库。我想知道是否有办法让DynamoDB为我进行检查。我已经研究过使用预期,但是它的比较运算符需要引入一个参数,这违背了目的,因为这意味着无论如何都必须查询现有项目。 我和8Java一起工作。

  • 我使用的是最新版本的Java(FX)、macOS和IntelliJ IDEA CE的Mac电脑。问题是,当我调整JavaFX窗口的大小时,我的Mac会立即崩溃。只有当我按下电源按钮5秒钟后,MacBook才会重新启动。我创建了一个普通IntelliJ JavaFX项目,其中包含以下自动创建的文件: Hello控制器。java 我没有改变任何事情,开始了这个项目。一切正常,直到你尝试调整窗口大小,M

  • 问题内容: 我正在尝试计算光盘上文件的大小。在Java的7本可以用做Files.walkFileTree如图我的答案在这里。 但是,如果我想使用java-8流来执行此操作,则它将适用于某些文件夹,但不适用于所有文件夹。 上面的代码可以很好地用于路径,但是会抛出以下异常 我了解它的来源以及如何使用Files.walkFileTree API避免它。 但是如何使用Files.walk() API 避免

  • 我在UITableView中使用Auto Layout和size类,其中单元格根据其内容自调整大小。为此,我使用的方法是,对于每种类型的单元格,您都要保留该单元格的屏幕外实例,并在其上使用来确定正确的行高——这种方法在StackOverflow帖子和其他地方得到了很好的解释。 在我开始使用大小班级之前,这种方法非常有效。具体来说,我为常规宽度布局中的文本定义了不同的边距约束常数,因此iPad上的文

  • 在我的minimax算法中,当计算机上有一个玩家有两种方法赢得计算机时,他只会选择棋盘的第一个打开位置。以下面的例子为例。X可以在0,2和1,0位置获胜。 目前,我的算法将把o放置在位置0,1。我相信它会这样做,因为当minimax运行并将o放置在位置0,1时,因为这不是一个胜利,它再次调用minimax,这一次是为x。然后,x移动到位置0,2,为胜利。这个位置返回-10。如果计算机在位置0,2移