zoukankan      html  css  js  c++  java
  • 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 -v

    • JDK版本
      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
    
  • 相关阅读:
    冲刺第四天
    冲刺第三天
    构建之法阅读笔记03
    冲刺第二天
    第八周学习进度条
    冲刺第一天
    第七周学习进度条
    软件工程课堂练习:返回一个一维整数数组中最大子数组的和
    团队项目成员和题目
    调用TerminateProcess是无法触发DLL_PROCESS_DETACH的
  • 原文地址:https://www.cnblogs.com/lasclocker/p/9578623.html
Copyright © 2011-2022 走看看