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 ...
随机推荐
- 如何在Vue项目中给路由跳转加上进度条
1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大 ...
- PHP RSA签名(公钥、私钥)
签名算法: Setp.1 确定待签名参数 在请求参数列表中,除去sign参数外,其他需要使用到的参数皆是要签名的参数. 在通知返回参数列表中,除去sign参数外,凡是通知返回回来的 ...
- Algorithm: GCD、EXGCD、Inverse Element
数论基础 数论是纯数学的一个研究分支,主要研究整数的性质.初等数论包括整除理论.同余理论.连分数理论.这一篇主要记录的是同余相关的基础知识. 取模 取模是一种运算,本质就是带余除法,运算结果就是余数. ...
- vue根据不同环境进行编译打包
工作中我们在开发过程中,有很多的开发环境,如果我们不进行统一配置,那么我们只能手动进行更改,这样会给我们带来诸多不便,所以我们要配置根据不同的环境来进行编译打包. 先看一下我的项目目录: 在confi ...
- Redis单节点数据同步到Redis集群
一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...
- PostgreSQL各数据类型的内置函数
参考<PostgreSQL实战> 3.1.2 数字类型操作符和数学函数 PostgreSQL 支持数字类型操作符和丰富的数学函数 例如支持加.减.乘.除.模取取余操作符 SELECT 1+ ...
- python_06
今日内容:注意: selenium驱动的浏览器是干净的,没有任何缓存. 1.selenium剩余用法 2.selenium万能登录破解 3.selenium爬取京东商品信息 4.破解极验滑动验证码 X ...
- python selenium框架的Xpath定位元素
我们工作中经常用到的定位方式有八大种:id name class_name tag_name link_text partial_link_text xpath css_selector 本篇内容主要 ...
- python线程条件变量Condition(31)
对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...
- spring日志体系浅析(spring 5.x)
日志是进行软件开发必不可少的一项功能,目前流行着很多开源日志库,比如log4j.log4j2.logback.JDK Logging.commons-logging.slf4j等. 几种日志产品的介绍 ...