CentOS 6 编译 TensorFlow for Java 以及 Maven Pom
我们的系统环境
CentOS 6.5, JDK 1.8更新yum源
$ yum update安装 Python 2.7
$ yum install python27 python27-numpy python27-python-devel python27-python-wheel升级 gcc 至 4.8.2
$ cd /opt/
$ wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
$ yum install --nogpg -y zip unzip patch libcurl-devel git devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++
$ scl enable devtoolset-2 python27 bash
$ gcc -vJDK版本
1.8(如1.8.0_73)安装bazel(编译不同版本的tensorflow,需要不同版本的bazel。这里编译tensorflow_v1.6.0,需要bazel_0.9.0)
$ cd /opt
$ wget https://github.com/bazelbuild/bazel/releases/download/0.9.0/bazel-0.9.0-dist.zip
$ unzip bazel-0.9.0-dist.zip -d bazel-0.9.0-dist
$ cd bazel-0.9.0-dist
$ ./compile.sh
$ mkdir -p ~/bin
$ cp output/bazel ~/bin/编译tensorflow
$ cd /opt
$ git clone https://github.com/tensorflow/tensorflow && cd tensorflow
$ git checkout v1.6.0
$ ./configure
配置中提示的问题,全部选择n(no)
在执行bazel build之前,
把文件/opt/tensorflow/tensorflow/tensorflow.bzl中的代码片段
def tf_cc_shared_object(
name,
srcs=[],
deps=[],
linkopts=[],
framework_so=tf_binary_additional_srcs(),
**kwargs):
修改为
def tf_cc_shared_object(
name,
srcs=[],
deps=[],
linkopts=['-lrt'],
framework_so=tf_binary_additional_srcs(),
**kwargs):
把文件/opt/tensorflow/tensorflow/java/BUILD中的代码片段
tf_cc_binary(
name = "generate_pom",
srcs = ["generate_pom.cc"],
deps = ["//tensorflow/c:c_api"],
)
修改为
tf_cc_binary(
linkopts = ["-lrt"],
name = "generate_pom",
srcs = ["generate_pom.cc"],
deps = ["//tensorflow/c:c_api"],
)
把
tf_cc_binary(
name = "java_op_gen_tool",
srcs = [
"src/gen/cc/op_gen_main.cc",
],
copts = tf_copts(),
linkopts = select({
"//tensorflow:windows": [],
"//conditions:default": ["-lm"],
}),
linkstatic = 1,
deps = [
":java_op_gen_lib",
"//tensorflow/core:framework",
"//tensorflow/core:framework_internal",
"//tensorflow/core:lib",
"//tensorflow/core:ops",
],
)
修改为
tf_cc_binary(
name = "java_op_gen_tool",
srcs = [
"src/gen/cc/op_gen_main.cc",
],
copts = tf_copts(),
linkopts = select({
"//tensorflow:windows": [],
"//conditions:default": ["-lm","-lrt"],
}),
linkstatic = 1,
deps = [
":java_op_gen_lib",
"//tensorflow/core:framework",
"//tensorflow/core:framework_internal",
"//tensorflow/core:lib",
"//tensorflow/core:ops",
],
)
如果还是报错`ndefined reference to 'clock_gettime'`, 还需要把文件/opt/tensorflow/tensorflow/tensorflow.bzl中出现`linkopts`的地方,全部添加`'-lrt'`。
$ bazel build --linkopt='-lrt' -c opt //tensorflow/java:tensorflow //tensorflow/java:libtensorflow_jni //tensorflow/java:pom
$ cd /opt/tensorflow/tensorflow/java/maven/
部署 libtensorflow
修改 /opt/tensorflow/bazel-bin/tensorflow/java/pom.xml 中的groupId, version用于deploy到自己公司的远程仓库中,并指定仓库的repositoryId(比如我的是artifactory)和url(请查看你的配置)
$ mvn deploy:deploy-file -Dfile=../../../bazel-bin/tensorflow/java/libtensorflow.jar -DpomFile=../../../bazel-bin/tensorflow/java/pom.xml -DrepositoryId= -Durl=
部署 libtensorflow_jni
修改/opt/tensorflow/tensorflow/java/maven/pom.xml和/opt/tensorflow/tensorflow/java/maven/libtensorflow_jni/pom.xml中的groupId, version,并添加自己公司的distributionManagement配置,同时只需保留libtensorflow_jni模块。
$ cd /opt/tensorflow/tensorflow/java/maven/
$ mkdir -p libtensorflow_jni/src/main/resources/org/tensorflow/native/linux-x86_64
$ cp ../../../bazel-bin/tensorflow/libtensorflow_framework.so libtensorflow_jni/src/main/resources/org/tensorflow/native/linux-x86_64/
$ cp ../../../bazel-bin/tensorflow/java/libtensorflow_jni.so libtensorflow_jni/src/main/resources/org/tensorflow/native/linux-x86_64/
$ mvn versions:set -DnewVersion="${TENSORFLOW_VERSION}-cpu-optimized"
$ mvn package -Dgpg.skip=true
$ mvn deploy -Dgpg.skip=true参考资料
附录: 编译成python 源
scl enable devtoolset-2 bash
bazel clean
./configure
bazel build --linkopt='-lrt' -c opt --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
pip install /tmp/tensorflow_pkg/tensorflow-1.6.0rc0-cp27-none-linux_x86_64.whl
CentOS 6 编译 TensorFlow for Java 以及 Maven Pom的更多相关文章
- Centos下命令行编译MapReduce代码(Java)并打包在Hadoop中执行
前提条件:搭建好Hadoop系统 新建文件夹:input 和 output hdfs dfs -mkdir /inputhdfs dfs -mkdir /output 查看文件系统 hdfs df ...
- 无IDE时编译和运行Java
最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这 ...
- [转]无IDE时编译和运行Java
本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的 ...
- 64位 CentOS NDK 编译 FFMPEG
64位 CentOS NDK 编译 FFMPEG 一. 参考文章: http://www.cnblogs.com/baopu/p/4733029.html http://www.c ...
- CentOS 使用yum命令安装Java SDK(openjdk)
CentOS 6.X 和 5.X 自带有OpenJDK runtime environment (openjdk).它是一个在linux上实现开源的java 平台.CentOS yum 命令 安装 ...
- 编译TensorFlow源码
编译TensorFlow源码 参考: https://www.tensorflow.org/install/install_sources https://github.com/tensorflo ...
- JAVA 基础开发环境 vscode 搭建 Windows下VSCode编译运行简单java
JAVA 基础开发环境 vscode 搭建 来源 https://www.cnblogs.com/freewsf/p/7744728.html 对于使用 Visual Studio Code 的 Ja ...
- IDEA中不编译src/main/java目录下的*.xml文件
使用idea构建maven项目时不编译src/main/java目录下写的mapper.xml文件,这是找到pom.xml文件,在<build>节点下添加如下代码: <!-- map ...
- YangTools从YANG生成Java类(Maven)
1.说明 ODL提供了Yang Tools工具从YANG文件生成Java类, 本文介绍使用Maven插件的方式生成, 基于yang-maven-plugin这个插件. 2.创建Maven工程 Ecli ...
随机推荐
- PHP Laravel 中使用简单的方法跟踪用户是否在线
今天,我的任务是,在 Laravel 应用程序用户个人资料页面上,用户名旁边添加一个绿点,表示他们是否在线.我首先想到的是,我们将需要启动一个 node.js 服务器并跟踪每个用户的活动套接字连接.然 ...
- PHP 教你使用 Swoole-Tracker 秒级定位 PHP 卡死问题
PHPer 肯定收到过这样的投诉:小菊花一直在转!你们网站怎么这么卡!当我们线上业务遇到这种卡住(阻塞)的情况,大部分 PHPer 会两眼一抹黑,随后想起那句名言:性能瓶颈都在数据库然后把锅甩给DBA ...
- 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)
航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...
- API网关在API安全性中的作用
从单一应用程序切换到微服务时,客户端的行为不能与客户端具有该应用程序的一个入口点的行为相同.简单来说就是微服务上的某一部分功能与单独实现该应用程序时存在不同. 目前在使用微服务时,客户端必须处理微服务 ...
- 力扣(LeetCode)两整数之和 个人题解
不使用运算符 + 和 - ,计算两整数 a .b 之和. 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, b = ...
- 基于Pytorch的简单小案例
神经网络的理论知识不是本文讨论的重点,假设读者们都是已经了解RNN的基本概念,并希望能用一些框架做一些简单的实现.这里推荐神经网络必读书目:邱锡鹏<神经网络与深度学习>.本文基于Pytor ...
- 【转】Pandas常见用法总结
关键缩写和包导入 在这个速查手册中,我们使用如下缩写: df:任意的Pandas DataFrame对象 s:任意的Pandas Series对象 raw:行标签 col:列标签 引入响应模块: im ...
- Java File类常用方法及实例
创建:createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false. createTempFile(String prefix, String s ...
- Virtualbox修改虚拟机分配内存的大小
起因:因为虚拟机刚开始分配的内存太小,导致太卡, 解决方法:修改虚拟机分配内存的大小 方法一:必须在关闭ubuntu的前提下进行,否则无法修改 点击设置 系统选项 主板中的内存大小 之后开启即可 方法 ...
- Go语言冒泡、选择、插入、快速排序实战浅析
Hello,各位小伙伴大家好,我是小栈君,今天为大家带来的分享是关于go语言中的排序实战浅析. 我们就实际操作关于go的冒泡排序.选择排序.插入排序和快速排序四种方式的理论和实战进行分享,希望能够为大 ...