从CentOS Linux上的Tomcat访问Tensorflow

Jam*_*mes 6 java linux tomcat tensorflow

我有一个使用Tensorflow进行图像分类的Java演示工作.它在Windows上运行正常,但现在我想从Java Tomcat Web服务器将其作为Web服务运行.

我已将所有Tensorflow jar添加到Tomcat的lib中,但Tensorflow具有jni依赖性.我不知道如何安装和链接这个,所以Tensorflow可以在CentOS Linux服务器上运行.

我已经读过这个,但我不需要在服务器上运行python,只需从Java访问Tensorflow.

更新:**好的,要在Windows上运行Tomcat,我会执行以下操作,

https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-1.6.0.jar下载libtensorflow.jar

然后是来自https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow_jni-cpu-windows-x86_64-1.6.0.zip的dll (解压zip以获取dll)

请参阅https://www.tensorflow.org/install/install_java

把jar放在我的tomcat lib中,然后创建一个tomcat dll dir并将dll放入其中

编辑我的setenv.bat并添加该行,

SET CATALINA_OPTS=-Xmx4g -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.library.path=D:\Engineering\apache-tomcat-7.0.50\dll
Run Code Online (Sandbox Code Playgroud)

这适用于Windows.

对于Linux,CentOS 6,我也这样做,但不是从dll下载这些文件, 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"
Run Code Online (Sandbox Code Playgroud)

但这些似乎都不起作用,我总是得到错误,

找不到适用于OS的TensorFlow本机库:linux,architecture: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

当我尝试这个选项时,似乎找到了这样的文件,但是我收到了这个错误,

/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只支持非常特定的操作系统和版本?

我发现这个, 在Ubuntu 12.04中导入python2.7中的Tensorflow时出错.'找不到GLIBC_2.17'

但尚未尝试任何选项.生产系统看起来并不乐观.

看看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时出现此错误,似乎它依赖于另一个lib ...

加载共享库时出错:__ docso_time:dlopen()的无效模式

此时我已经准备放弃了,并尝试安装Centos7,但这条路线需要我们升级12台生产服务器......

bla*_*sel 1

我只是仔细看了看。

简单地将依赖项添加到org.tensorflow:tensorflow:1.4.0-rc0您最喜欢的构建工具(或您喜欢的任何版本)。

这将引入对 的依赖org.tensorflow:libtensorflow_jni:1.4.0-rc0。这将包括以下内容:

blafasel@localhost:~$ unzip -t .m2/repository/org/tensorflow/libtensorflow_jni/1.4.0-rc0/libtensorflow_jni-1.4.0-rc0.jar
Archive:  .m2/repository/org/tensorflow/libtensorflow_jni/1.4.0-rc0/libtensorflow_jni-1.4.0-rc0.jar
    testing: META-INF/                OK
    testing: META-INF/MANIFEST.MF     OK
    testing: org/                     OK
    testing: org/tensorflow/          OK
    testing: org/tensorflow/native/   OK
    testing: org/tensorflow/native/darwin-x86_64/   OK
    testing: org/tensorflow/native/linux-x86_64/   OK
    testing: org/tensorflow/native/windows-x86_64/   OK
    testing: org/tensorflow/native/darwin-x86_64/libtensorflow_framework.so   OK
    testing: org/tensorflow/native/darwin-x86_64/LICENSE   OK
    testing: org/tensorflow/native/darwin-x86_64/libtensorflow_jni.dylib   OK
    testing: org/tensorflow/native/linux-x86_64/libtensorflow_framework.so   OK
    testing: org/tensorflow/native/linux-x86_64/libtensorflow_jni.so   OK
    testing: org/tensorflow/native/linux-x86_64/LICENSE   OK
    testing: org/tensorflow/native/windows-x86_64/tensorflow_jni.dll   OK
    testing: org/tensorflow/native/windows-x86_64/LICENSE   OK
    testing: META-INF/maven/          OK
    testing: META-INF/maven/org.tensorflow/   OK
    testing: META-INF/maven/org.tensorflow/libtensorflow_jni/   OK
    testing: META-INF/maven/org.tensorflow/libtensorflow_jni/pom.xml   OK
    testing: META-INF/maven/org.tensorflow/libtensorflow_jni/pom.properties   OK
No errors detected in compressed data of .m2/repository/org/tensorflow/libtensorflow_jni/1.4.0-rc0/libtensorflow_jni-1.4.0-rc0.jar.
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它已经包含了使 JNI 在所有官方支持的平台上工作所需的所有二进制文件。其中包含 x86_64 上的任何 Linux。

只要您不尝试在raspi或 32 位 CentOS 上使用它,并且只要您使用合适的构建工具,您就应该可以幸免。

唯一的风险在于这些库对其他系统库的依赖性。ldd对on 的调用libtensorflow_framework.so显示:

blafasel@localhost:~$ ldd org/tensorflow/native/linux-x86_64/libtensorflow_framework.so
    linux-vdso.so.1 =>  (0x00007ffffaa62000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f07c6494000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f07c6290000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f07c6073000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f07c5cf0000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f07c5ada000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f07c5710000)
    /lib64/ld-linux-x86-64.so.2 (0x000056525c661000)
Run Code Online (Sandbox Code Playgroud)

如果您在系统上找不到这些传递依赖项,您可能应该尝试旧版本的 tensorflow 或更新版本的 CentOs。