freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

从源代码构建TensorFlow流程记录
2023-02-27 16:42:11
所属地 四川省

作者:京东科技 曹雨

为什么从源代码构建

通常情况下,直接安装构建好的.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.sh
chmod +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-packages
Please 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]: n
No XLA JIT support will be enabled for TensorFlow.
 
Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: n
No OpenCL SYCL support will be enabled for TensorFlow.
 
Do you wish to build TensorFlow with ROCm support? [y/N]: n
No ROCm support will be enabled for TensorFlow.
 
Do you wish to build TensorFlow with CUDA support? [y/N]: n
No CUDA support will be enabled for TensorFlow.
 
Do you wish to download a fresh release of clang? (Experimental) [y/N]: n
Clang 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]: n
Not 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

版本Python 版本编译器构建工具
tensorflow-2.6.03.6-3.9GCC 7.3.1Bazel 3.7.2
tensorflow-2.5.03.6-3.9GCC 7.3.1Bazel 3.7.2
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.0.0
tensorflow-2.1.02.7、3.5-3.7GCC 7.3.1Bazel 0.27.1
tensorflow-2.0.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.1
tensorflow-1.15.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.1
tensorflow-1.14.02.7、3.3-3.7GCC 4.8Bazel 0.24.1
tensorflow-1.13.12.7、3.3-3.7GCC 4.8Bazel 0.19.2
tensorflow-1.12.02.7、3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.11.02.7、3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.10.02.7、3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.9.02.7、3.3-3.6GCC 4.8Bazel 0.11.0
tensorflow-1.8.02.7、3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.7.02.7、3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.6.02.7、3.3-3.6GCC 4.8Bazel 0.9.0
tensorflow-1.5.02.7、3.3-3.6GCC 4.8Bazel 0.8.0
tensorflow-1.4.02.7、3.3-3.6GCC 4.8Bazel 0.5.4
tensorflow-1.3.02.7、3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.2.02.7、3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.1.02.7、3.3-3.6GCC 4.8Bazel 0.4.2
tensorflow-1.0.02.7、3.3-3.6GCC 4.8Bazel 0.4.2

GPU

版本Python 版本编译器构建工具cuDNNCUDA
tensorflow-2.6.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.5.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.08.011.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.07.610.1
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.0.07.610.1
tensorflow-2.1.02.7、3.5-3.7GCC 7.3.1Bazel 0.27.17.610.1
tensorflow-2.0.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.15.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.14.02.7、3.3-3.7GCC 4.8Bazel 0.24.17.410.0
tensorflow_gpu-1.13.12.7、3.3-3.7GCC 4.8Bazel 0.19.27.410.0
tensorflow_gpu-1.12.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.11.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.10.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.9.02.7、3.3-3.6GCC 4.8Bazel 0.11.079
tensorflow_gpu-1.8.02.7、3.3-3.6GCC 4.8Bazel 0.10.079
tensorflow_gpu-1.7.02.7、3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.6.02.7、3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.5.02.7、3.3-3.6GCC 4.8Bazel 0.8.079
tensorflow_gpu-1.4.02.7、3.3-3.6GCC 4.8Bazel 0.5.468
tensorflow_gpu-1.3.02.7、3.3-3.6GCC 4.8Bazel 0.4.568
tensorflow_gpu-1.2.02.7、3.3-3.6GCC 4.8Bazel 0.4.55.18
tensorflow_gpu-1.1.02.7、3.3-3.6GCC 4.8Bazel 0.4.25.18
tensorflow_gpu-1.0.02.7、3.3-3.6GCC 4.8Bazel 0.4.25.18

macOS

CPU

版本Python 版本编译器构建工具
tensorflow-2.6.03.6-3.9Xcode 10.11 中的 ClangBazel 3.7.2
tensorflow-2.5.03.6-3.9Xcode 10.11 中的 ClangBazel 3.7.2
tensorflow-2.4.03.6-3.8Xcode 10.3 中的 ClangBazel 3.1.0
tensorflow-2.3.03.5-3.8Xcode 10.1 中的 ClangBazel 3.1.0
tensorflow-2.2.03.5-3.8Xcode 10.1 中的 ClangBazel 2.0.0
tensorflow-2.1.02.7、3.5-3.7Xcode 10.1 中的 ClangBazel 0.27.1
tensorflow-2.0.02.7、3.5-3.7Xcode 10.1 中的 ClangBazel 0.27.1
tensorflow-2.0.02.7、3.3-3.7Xcode 10.1 中的 ClangBazel 0.26.1
tensorflow-1.15.02.7、3.3-3.7Xcode 10.1 中的 ClangBazel 0.26.1
tensorflow-1.14.02.7、3.3-3.7Xcode 中的 ClangBazel 0.24.1
tensorflow-1.13.12.7、3.3-3.7Xcode 中的 ClangBazel 0.19.2
tensorflow-1.12.02.7、3.3-3.6Xcode 中的 ClangBazel 0.15.0
tensorflow-1.11.02.7、3.3-3.6Xcode 中的 ClangBazel 0.15.0
tensorflow-1.10.02.7、3.3-3.6Xcode 中的 ClangBazel 0.15.0
tensorflow-1.9.02.7、3.3-3.6Xcode 中的 ClangBazel 0.11.0
tensorflow-1.8.02.7、3.3-3.6Xcode 中的 ClangBazel 0.10.1
tensorflow-1.7.02.7、3.3-3.6Xcode 中的 ClangBazel 0.10.1
tensorflow-1.6.02.7、3.3-3.6Xcode 中的 ClangBazel 0.8.1
tensorflow-1.5.02.7、3.3-3.6Xcode 中的 ClangBazel 0.8.1
tensorflow-1.4.02.7、3.3-3.6Xcode 中的 ClangBazel 0.5.4
tensorflow-1.3.02.7、3.3-3.6Xcode 中的 ClangBazel 0.4.5
tensorflow-1.2.02.7、3.3-3.6Xcode 中的 ClangBazel 0.4.5
tensorflow-1.1.02.7、3.3-3.6Xcode 中的 ClangBazel 0.4.2
tensorflow-1.0.02.7、3.3-3.6Xcode 中的 ClangBazel 0.4.2

GPU

版本Python 版本编译器构建工具cuDNNCUDA
tensorflow_gpu-1.1.02.7、3.3-3.6Xcode 中的 ClangBazel 0.4.25.18
tensorflow_gpu-1.0.02.7、3.3-3.6Xcode 中的 ClangBazel 0.4.25.18
# 开源 # 开源代码安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录