TensorFlow 2.x在如火如荼的迭代,1.15.4是TF 1.x的稳定版本。本文介绍在Ubuntu和virtualenv的环境下的tensorflow 1.15.4源码安装过程。源码安装的一个好处是可以自定义cuda和cudnn的次级版本号,比如TF 1.15.4默认支持CUDA 10,但是pip上的预安装的tensorflow 1.15.4是基于10.0,源码安装可以自定义到10.2。

Get TF 1.15.4

直接去TensorFlow Github上,选择tag v1.15.4,然后下载。或者直接通过git clone然后git checkout,来获得对应版本。

Install Python

需要python3-dev,python3-pip,通过下面命令安装,不过这两个应该已经安装好了。

sudo apt install python3-dev python3-pip

Install Bazel

源码安装TF需要使用Bazel编译,不同的TF版本对于Bazel也有要求,具体要求参考TF源代码根目录的configuration.py,TF 1.15.4的要求是_TF_MIN_BAZEL_VERSION = '0.24.1',_TF_MAX_BAZEL_VERSION = '0.26.1'

去Bazel的github页面,找到对应的tag下载文件bazel-<version>-installer-linux-x86_64.sh,这里版本选择0.26.1

Ubuntu安装Bazel之前,还需要一些其他库

# 参考https://docs.bazel.build/versions/master/install-ubuntu.html
sudo apt install g++ unzip zip

之后就可以进行安装

chmod +x bazel-<version>-installer-linux-x86_64.sh
sudo ./bazel-<version>-installer-linux-x86_64.sh --bin=/usr/local/bin

使用--bin安装方式,Bazel会被安装在制定路径,我自己喜欢安装在/usr/local/bin

./bazel-<version>-installer-linux-x86_64.sh --user

使用--user安装方式,Bazel会被安装在$HOME/bin,所以确保~/.bashrc文件里有对应的path路径

Build Virtualenv

前文已经介绍了如何安装和建立python virtualenv,这里就不赘述了,直接为TF建立一个专门的virtualenv

virtualenv -p python3 --no-site-packages tf-venv

基本上后续所有操作都要在tf-venv这个虚拟环境下进行

Install Dependencies

在文件tensorflow-1.15.3/tensorflow/tools/pip_package/setup.py中定义了所有需要的第三方库和对应的要求版本。安装其中的six,numpy,wheel,setuptools,keras_applications,keras_preprocessing

pip install -U six 'numpy<1.19.0' wheel setuptools
pip install -U keras_applications --no-deps
pip install -U keras_preprocessing --no-deps

Install CUDA and CuDNN

考虑到版本兼容问题,这里选择CUDA 10.2,从cuda官网下载安装即可,基本不会出现什么问题

配合CUDA 10.2,选择CUDNN 7.6.5下载安装。其实CUDNN本质就是一堆库文件,所以直接下载解压然后放到对应的文件夹

tar -xzvf cudnn-10.2-linux-x64-v7.6.5.32.tgz

sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

现在也可以通过Pip3在虚拟环境里安装对应版本的CUDA和CuDNN,隔离性更好,也更方便维护。

Configure TensorFlow

运行源代码根目录下的configure命令,进行命令编译准备

./configure

确认python的路径为tf-venv中的python路径和Python library路径

整个配置过程有一些选项需要选择

# XLA JIT全称Accelerated Linear Algebra Just In Time Compile,好像容易引起一些问题,所以no 
Do you wish to build TensorFlow with XLA JIT support? [Y/n]: n

# 为了支持AMD的选项,不过好像还不是很成熟
Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: n

# 为了支持AMD ROCm[Radeon Open Compute]技术
Do you wish to build TensorFlow with ROCm support? [y/N]: n

# TensorRT是一个高性能的深度学习推理优化器,一般的TF并不需要
Do you wish to build TensorFlow with TensorRT support? [y/N]: n

# 不需要使用clang编译
Do you want to use clang as CUDA compiler? [y/N]: n

# 不需要MPI
Do you wish to build TensorFlow with MPI support? [y/N]: n

Install TensorFlow

配置之后就可以使用Bazel编译TF的whl文件了

bazel build --config=v1 --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

--config=v1表示要编译的是1.x版本,--config=opt应该是要优化编译过程,似乎是使用全部可用thread,--config=cuda表示编译的TF支持GPU计算

编译过程中会出错

ERROR: /build/output/external/nccl_archive/BUILD.bazel:53:1: fatbinary external/nccl_archive/device_dlink_hdrs.fatbin failed (Exit 1) fatbinary fatal: Unknown option ‘-bin2c-path’

需要对源代码进行简单的修改

# 修改文件 tensorflow/third_party/nccl/build_defs.bzl.tpl

# 找到函数,删除"--bin2c-path=%s" % bin2c.dirname
def _device_link_impl(ctx):
    "--cmdline=--compile-only",
    "--link",
    "--compress-all",
    "--bin2c-path=%s" % bin2c.dirname,
    "--create=%s" % tmp_fatbin.path,
    "--embedded-fatbin=%s" % fatbin_h.path,
] + images,

编译成功后即可生成whl文件

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

/tmp/tensorflow_pkg,其实可以是任意路径,此路径下就会生成安装文件tensorflow-<version-info>-linux_x86_64.whl

pip3 install /tmp/tensorflow_pkg/tensorflow-<version-info>-linux_x86_64.whl

至此,成功在虚拟环境里安装了TensorFlow 1.15.4