【发布时间】:2018-03-31 21:41:46
【问题描述】:
我有一个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 (解压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"
但这些似乎都不起作用,我总是收到错误,
找不到适用于操作系统的 TensorFlow 本机库:linux,架构: x86_64。看 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/java/README.md 寻找可能的解决方案(例如从源代码构建库)。 有关尝试查找本机库的其他信息可以是 通过向系统添加 org.tensorflow.NativeLibrary.DEBUG=1 获得 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:未找到版本“GLIBC_2.16”(/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 时会导致此错误,似乎它依赖于另一个库...
加载共享库时出错:__vdso_time: invalid mode for dlopen()
此时我准备放弃,尝试安装 Centos7,但这条路线需要我们升级 12 台生产服务器...
【问题讨论】:
-
您必须像在 Windows 上一样提供 jni 库。库必须放置在您使用
-Djava.library.path=...指定的路径上。唯一的区别:库被命名为lib.so,而不是lib.dll。您的问题和链接都没有告诉我们哪个库。所以我们不能告诉你要安装哪个包。 -
@James 你的项目是 maven 的吗?
-
不,没有 maven,运行 tomcat 应用程序被部署到 tomcat webapps,所有 jar 都在 tomcat/lib 中,所以文件在 tomcat/so 中 - 问题是 tomcat 似乎没有收到所以路径,或者tensorflow不喜欢so文件
-
@James 我已经更新了答案,还包括在 linux 上托管的专用 tomcat Web 服务器的设置
-
更新后的帖子出现新错误,未找到“GLIBC_2.16”
标签: java linux tomcat tensorflow