写点什么

从源代码构建 TensorFlow 流程记录

  • 2023-01-03
    北京
  • 本文字数:3141 字

    阅读完需:约 10 分钟

从源代码构建TensorFlow流程记录

京东科技隐私计算产品部 曹雨晨

为什么从源代码构建

通常情况下,直接安装构建好的.whl 即可。不过,当需要一些特殊配置(或者闲来无事想体会 TensorFlow 构建过程到底有多麻烦)的时候,则需要选择从源代码构建 TensorFlow。万幸文档混乱的 TensorFlow 还是好心地为我们提供了一整页的文档供参考 https://www.tensorflow.org/install/source?hl=zh-cn ,个人认为其中最需要关注的部分莫过于经过测试供参考的源配置(列于文末)。TF 使用 Google 的开源构建工具 bazel 构建,并且源码的版本与 bazel 的版本高度相关,所以尽量匹配版本进行构建。

流程记录 TF v1.14.0 CPU on Ubuntu 18.04

安装对应版本的 bazel

根据计划构建的版本,查阅文末的对应配置,参考官方文档: https://bazel.build/install/ubuntu 安装相应版本的 bazel,如本次计划构建的版本是 v1.14.0,对应的 bazel 版本是 0.24.1(此次使用 0.26.1 也是可以的)。


为方便,这里直接贴出对应 0.26.1 release 的页面: https://github.com/bazelbuild/bazel/releases?expanded=true&page=2&q=0.26.1 ,点击 assets 找到对应的文件下载即可。


wget https://github.com/bazelbuild/bazel/releases/download/0.26.1/bazel-0.26.1-installer-linux-x86_64.shchmod +x bazel-version-installer-linux-x86_64.sh./bazel-version-installer-linux-x86_64.sh --user
复制代码

克隆 TensorFlow 仓库

从 Github 上 clone 源码仓库


git clone https://github.com/tensorflow/tensorflow 
复制代码


cd 到仓库目录并 git checkout到相应 tag,比如这次是构建 v1.14.0 版本:


git checkout v1.14.0
复制代码

* 一些小调整,通常可以略过

Build with C++17

因为之后需要写的 Custom OP 依赖的另一个库是 C++17,而除了刚刚才发布的 v2.10 版,以前的 TF 默认是使用 C++11,实际构建的时候,代码有一些 minor fix。此处参考 https://github.com/tensorflow/tensorflow/pull/30836/files 修改 .bazelrc build:c++17 的配置,在 tensorflow/core/lib/gif/gif_io.cc 中添加 #include<cstring>, 并在 tensorflow/stream_executor/stream_executor_pimpl.h 中添加 #include "absl/memory/memory.h"(否则 compile 时会报错找不到 absl::make_unique)(这里 make_unique 是 C++17 标准库里的用法,Google 的 abseil 的 make_unique 方法则方便 C++11 的代码也可以使用它;最新的 v2.10 版由于默认使用 C++17,已经改为 std::make_unique)


.bazelrc 文件里记录了构建时各种配置选项 ([--config=option])的映射规则,如有需要可以进行修改。由于 GCC 不支持--stdlib命令,此次修改如下:


  # Build TF with C++ 17 features.- build:c++17 --cxxopt=-std=c++1z- build:c++17 --cxxopt=-stdlib=libc+++ build:c++17 --cxxopt=-std=c++17
复制代码

网络不通

Bazel 在构建过程中,需要现拉取远程仓库的许多依赖。由于 TF 的构建过程消耗内存很严重,选择在服务器上进行构建,而服务器远程拉取 github 上仓库经常失败。所以需要手动在网络良好的机器上下载相应的库的 release (对应的版本在 WORKSPACE 文件中可以找到一行注释),存放在服务器本地,并在 WORKSPACE 文件中对应的 http_archive 部分添加一行本地地址。若需要换版本,也可以在相应 github 库的 releases 下面找到对应的 URL 及 sha256(实在是找不到对应的也可以手动下载压缩包后通过 shasum256 命令获取)


例如:


http_archive( name = "build_bazel_rules_apple", sha256 = "a045a436b642c70fb0c10ca84ff0fd2dcbd59cc89100d597a61e8374afafb366", urls = ["https://github.com/bazelbuild/rules_apple/releases/download/0.18.0/rules_apple.0.18.0.tar.gz",         "file:///opt/tensorflow_build_deps/rules_apple.0.18.0.tar.gz"],) # https://github.com/bazelbuild/rules_apple/releases
复制代码

配置 build

运行源码根目录下的 ./configure 进行配置。


./configure
复制代码


此次编译一个尽量简略的 CPU 版本,会话如下:


WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".You have bazel 0.26.1 installed.Please specify the location of python. [Default is /usr/local/bin/python]:  Found possible Python library paths:  /usr/local/lib/python3.6/dist-packages  /usr/lib/python3/dist-packagesPlease input the desired Python library path to use.  Default is [/usr/local/lib/python3.6/dist-packages] Do you wish to build TensorFlow with XLA JIT support? [Y/n]: nNo XLA JIT support will be enabled for TensorFlow. Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: nNo OpenCL SYCL support will be enabled for TensorFlow. Do you wish to build TensorFlow with ROCm support? [y/N]: nNo ROCm support will be enabled for TensorFlow. Do you wish to build TensorFlow with CUDA support? [y/N]: nNo CUDA support will be enabled for TensorFlow. Do you wish to download a fresh release of clang? (Experimental) [y/N]: nClang will not be downloaded. Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native -Wno-sign-compare]:  Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: nNot configuring the WORKSPACE for Android builds. Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.    --config=mkl            # Build with MKL support.    --config=monolithic     # Config for mostly static monolithic build.    --config=ngraph         # Build with Intel nGraph support.    --config=numa           # Build with NUMA support.    --config=dynamic_kernels    # (Experimental) Build kernels into separate shared objects.    --config=v2             # Build TensorFlow 2.x instead of 1.x.Preconfigured Bazel build configs to DISABLE default on features:    --config=noaws          # Disable AWS S3 filesystem support.    --config=nogcp          # Disable GCP support.    --config=nohdfs         # Disable HDFS support.    --config=nonccl         # Disable NVIDIA NCCL support.Configuration finished
复制代码

构建 pip 软件包并安装

官方提供的命令:


bazel build [--config=option] //tensorflow/tools/pip_package:build_pip_package
复制代码


本次使用:


bazel build --config=c++17 --config=c++1z --jobs=6 //tensorflow/tools/pip_package:build_pip_package
复制代码


其中使用的 --config=c++17 --config=c++1z 对应刚刚修改的 .bazelrc 文件中相应的部分


注意:bazel build 的过程时间会比较长,对内存的消耗较大,jobs 数谨慎开大。


bazel build 结束后,一个名为 build_pip_package 的可执行文件就创建好了,接下来可以执行:


./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
复制代码


如果希望构建的whl名为 tf-nightly 版本,则可以加上 --nightly_flag 的选项。


./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg
复制代码


此后便获得了 .whl 文件,通过 pip 安装即可:


pip install /tmp/tensorflow_pkg/tensorflow-[version]-[tags].whl
复制代码


其中,version是对应的版本,tags与系统有关。

经过测试的源配置

Linux

CPU


GPU


macOS

CPU


GPU


发布于: 刚刚阅读数: 4
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
从源代码构建TensorFlow流程记录_tensorflow_京东科技开发者_InfoQ写作社区