我有一个 Java demo working使用 Tensorflow 进行图像分类。它在 Windows 上运行良好,但现在我想从 Java Tomcat Web 服务器将其作为 Web 服务运行。
我已将所有 Tensorflow jar 添加到 Tomcat 的库中,但 Tensorflow 具有 jni 依赖项。我不确定如何安装和链接它以便 Tensorflow 可以在 CentOS Linux 服务器上运行。
I have read this ,但我不需要在服务器上运行 python,只需从 Java 访问 Tensorflow。
更新:**好的,为了让它在 Windows 上的 Tomcat 上运行,我执行以下操作,
从下载 libtensorflow.jar, https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-1.6.0.jar
然后是dll, https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow_jni-cpu-windows-x86_64-1.6.0.zip (解压得到dll)
参见,https://www.tensorflow.org/install/install_java
将jar放到我的tomcat lib中,然后创建一个tomcat dll目录并将dll放入其中
编辑我的 setenv.bat 并添加行,
SET CATALINA_OPTS=-Xmx4g -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.library.path=D:\Engineering\apache-tomcat-7.0.50\dll
这适用于 Windows。
对于 Linux、CentOS 6,我也这样做,但不是从 dll 下载 so 文件, https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow_jni-cpu-linux-x86_64-1.6.0.tar.gz
并编辑我的 setenv.sh 并添加行,
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/tomcat8/so"
export JAVA_OPTS="-server -Xmx38g -Djava.library.path=/usr/local/tomcat8/so"
export CATALINA_OPTS="-Djava.library.path=/usr/local/tomcat8/so"
但是这些似乎都不起作用,我总是得到错误,
Cannot find TensorFlow native library for OS: linux, architecture: x86_64. See https://github.com/tensorflow/tensorflow/tree/master/tensorflow/java/README.md for possible solutions (such as building the library from source). Additional information on attempts to find the native library can be obtained by adding org.tensorflow.NativeLibrary.DEBUG=1 to the system properties of the JVM.
我发现还有另一个部署选项,只需添加 jar,
到lib,它会神奇地找到正确的so文件。
https://mvnrepository.com/artifact/org.tensorflow/libtensorflow_jni
当我尝试这个选项时,它似乎找到了 so 文件,但我得到了这个错误,
/usr/local/tomcat8/temp/tensorflow_native_libraries-1522357321965-0/libtensorflow_jni.so: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by /usr/local/tomcat8/temp/tensorflow_native_libraries-1522357321965-0/libtensorflow_jni.so)
似乎 Tensorflow 只支持非常特定的操作系统和版本??
我发现了这个, Error while importing Tensorflow in python2.7 in Ubuntu 12.04. 'GLIBC_2.17 not found'
但还没有尝试过任何选项。对于生产系统来说看起来不太有前途。
看看GLIBC是什么,它是给GPU用的,但是我没有也不需要用GPU,只想用CPU,为什么需要这个库??
** 更新 所以...我尝试在 Centos6 上构建 glibc 1.6.0,以便我可以通过以下方式使用它,
https://unix.stackexchange.com/questions/176489/how-to-update-glibc-to-2-14-in-centos-6-5
这些步骤有效,但在尝试运行 Tensorflow 时会导致此错误,似乎它依赖于另一个库...
error while loading shared libraries: __vdso_time: invalid mode for dlopen()
此时我准备放弃,尝试安装Centos7,但这条路线需要我们升级12台生产服务器...
最佳答案
嗯,我对 Java 中的 tensorflow 知之甚少。但是,我确实做了一些研究,相信我得出了解决您的问题的结论。
当然是你在Error while importing Tensorflow in python2.7 in Ubuntu 12.04. 'GLIBC_2.17 not found'发布的解决方案如果您阅读@Igor 的解决方案,实际上可以缓解问题。
为了更好地理解这个问题:tensorflow 在 java 中的工作方式是你的包调用 python 库,它实际上调用 C 代码,这是库的主要核心和功能所在。因此,您可能会认为 Java 包是 Python tensorflow 的包装器,而 Python tensorflow 是 C 库的包装器。
回想一下,linux 操作系统是用 C 构建的,并且几乎总是按照系统要求预安装 Glibc here在前几行。话虽如此,您面临的问题是 tensorflow 需要的 GLibc 是最新版本,与您的操作系统运行的版本不同。
如果您在这里阅读问题 installation problem (version 'GLIBC' 2.14 not found) ,你会看到有一个类似的问题,其中运行的操作系统是 Cent OS,与你的相同。该特定问题的唯一区别是,所讨论的人使用的是 python 而不是 java,但问题是相同的。
因此,您有几种可能的方法来解决它。
在 Glibc 与 tensorflow 兼容(或可以轻松更新)的另一个基于 linux 的操作系统上运行您的代码
全局升级您的系统 GLIBC。如果您在服务器上运行它并且有详细记录,这将非常痛苦 here . (据我了解,您可能只需安装 python 即可解决此问题。抱歉,我没有完整阅读这篇文章)。
向您的系统添加第二个 GLIBC(有风险)
从源代码编译 Glibc 和 Bazel。 (听起来像是第一个选项之后对我来说最合理的解释)
按照 @Igor 在本 post 中的建议,从源代码编译 tensorflow 以在您当前的 glibc 上工作.我不知道这是否可行,因为我不确定 tensorflow 库可能调用了哪个 C 功能。
我希望这个回复至少能帮上点忙。干杯!
关于java - 在 CentOS Linux 上从 Tomcat 访问 Tensorflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46836882/