Keras线程安全吗?

2024-06-16 09:56:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Python和Keras(目前使用的是ano后端,但我不担心切换)。我有一个并行加载和处理多个信息源的神经网络。目前,我已经在一个单独的进程中运行每一个,它从文件中加载自己的网络副本。这似乎是对RAM的浪费,所以我认为用一个由所有线程使用的网络实例创建一个多线程进程会更有效。但是,我想知道Keras在任何一个后端是否是线程安全的。如果我在不同的线程中同时对两个不同的输入运行.predict(x),我会遇到竞争条件或其他问题吗?

谢谢


Tags: 实例网络进程副本浪费神经网络条件线程
2条回答

是的,Keras是线程安全的,如果你稍微注意一下的话。

事实上,在强化学习中,有一种称为Asynchronous Advantage Actor Critics (A3C)的算法,其中每个代理依赖同一个神经网络来告诉他们在给定状态下应该做什么。换句话说,每个线程都像在问题中一样同时调用model.predict。一个带有Keras的示例实现是here

但是,如果查看代码,则应特别注意这一行: model._make_predict_function() # have to initialize before threading

这在Keras文档中从来没有提到过,但是要使它同时工作是必要的。简而言之,_make_predict_function是编译predict函数的函数。在多线程设置中,您必须提前手动调用此函数来编译predict,否则predict函数在第一次运行之前将不会被编译,这将在许多线程同时调用它时出现问题。你可以看到详细的解释here

到目前为止,我在Keras中还没有遇到过多线程的任何其他问题。

引用种类fcholet

_make_predict_function is a private API. We should not recommend calling it.

Here, the user should simply call predict first.

Note that Keras models can't be guaranteed to be thread-safe. Consider having independent copies of the model in each thread for CPU inference.

相关问题 更多 >