编译 tensorflow1.15

本文基于官方安装文档 [1] 及博文 [2],在 windows10 上编译 tensorflow1.15 (CPU 版)

一、环境配置

下载 tensorflow

1
2
3
4
5
6
7
git clone https://gitclone.com/github.com/tensorflow/tensorflow.git

#查看当前分支数
git branch -a

#切换版本
git checkout r1.15

安装 MSYS2

下载 MSYS2

MSYS2 集成了 pacman 和 Mingw-w64 的 Cygwin 升级版,提供了 bash shell 等 linux 环境、版本控制软件(git/hg)和 MinGW-w64 工具链,在这里下载 MSYS2,并双击进行安装

PATH 中配置环境变量

1
2
C:\msys64
C:\msys64\usr\bin

安装 msys2 环境包

以管理权限打开 cmd,运行以下命令

1
2
3
4
pacman -Syu
pacman -S git
pacman -S patch unzip grep
pacman -S git patch unzip

安装 Bazel

手动安装 Bazel,首先下载 Bazel,但下载前需要提前检查 tensorflow 支持的版本,即 tensorflow/configure.py 中指定的介于 _TF_MIN_BAZEL_VERSION_TF_MAX_BAZEL_VERSION 之间的任意版本

image-20210531111336316

本次下载 bazel0.26.0 版本,下载完成后不用安装,拷贝到 MSYS 安装目录下,

image-20210531143059444

然后在系统环境变量中新增以下变量

1
2
3
4
5
6
#msys2中bash路径
BAZEL_SH=C:\msys64\usr\bin\bash.exe
#vs路径
BAZEL_VS=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional
#vc路径
BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC

二、编译 tensorflow

编译前配置 tensorflow

运行以下命令

1
python configure.py

配置说明 [2:1]

接下来会弹出一些配置的选择,对每个选择进行讲解下
Please specify the location of python
这个是确认 Python 环境的安装目录,无误的话直接按 enter 键确认。

Please input the desired Python library path to use
这个是确认 Python 的第三方模块安装目录,也就是 numpy 等模块安装的 site-packages 目录

Do you wish to build TensorFlow with XLA JIT support? [y/N]:
XLA 利用 JIT 编译技术分析用户在运行时创建的 TensorFlow 图表,根据实际运行时维度和类型将其专门化,将多个运算融合在一起并为它们生成高效的本机代码 —— 适用于 CPU、GPU 之类的设备和自定义加速器(例如,Google 的 TPU)。目前 XLA 是实验性的。大多数使用情况在性能(加快速度或减少内存使用)方面都没有改进,选择 N

Do you wish to build TensorFlow with ROCm support? [y/N]
AMD 显卡系列的 GPU 加速,由于我没有使用 A 卡,因此这里也选择 N

Do you wish to build TensorFlow with CUDA support? [y/N]
这个就是通常所说的 N 卡 GPU 使用 cuda 进行加速计算,编译 GPU 版本的下个博客里会说,这次是编译 CPU 版本的,因此这个地方也选择 N

Please specify optimization flags to use during compilation when bazel option “–config=opt” is specified [Default is /arch:AVX]:
这个是选择使用 AVX 哪个指令集,现在很多电脑都是支持 AVX2 指令集的,因此这个地方输入:/arch:AVX2

Would you like to override eigen strong inline for some C++ compilation to reduce the compilation time? [Y/n]
由于 TensorFlow 的 C++ 版本关于多维数据使用 eigen 计算,这个意思是使内联函数加快 eigen 编译速度,因此这个地方选择 Y

image-20210531144537493

编译

编译生成 C++ 使用的 dll
1
bazel build --config=opt --copt=-nvcc_options=disable-warnings --define=no_tensorflow_py_deps=true //tensorflow:tensorflow_cc.dll

image-20210531152026013

image-20210531152104511

生成 dll 文件,lib 文件可以直接改名问 tensorflow_cc.lib 使用,也可使用下面命令生成

编译生成 lib
1
bazel build --config=opt --copt=-nvcc_options=disable-warnings //tensorflow:tensorflow_cc_dll_import_lib

image-20210531155149111

image-20210531155211255

生成头文件
1
bazel build --config=opt --copt=-nvcc_options=disable-warnings //tensorflow:install_headers

image-20210531155038421

image-20210531155105935

三、测试

打开 VS2019,并新建 C++ 控制台工程,给项目配置 tensorflow 环境

  1. 头文件设置:VC++ 目录 -》包含目录

    image-20210531192448856

  2. lib 文件设置

    (1)VC++ 目录 -》库目录

image-20210531192429832

​ (2)链接器 -》输入 -》附加依赖项

image-20210531192322379

  1. dll 文件设置:项目目录 -》x64-》Release

image-20210531191348573

使用以下代码测试 tensorflow,是否可以正常使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define COMPILER_MSVC
#define NOMINMAX
#define PLATFORM_WINDOWS

#include <iostream>
#include <vector>
#include <tensorflow/core/public/session.h>
#include <iostream>

using namespace std;
using namespace tensorflow;

int main()
{
Session* session;
Status status = NewSession(SessionOptions(), &session);
if (!status.ok()) {
std::cout << status.ToString() << std::endl;
}
else {
std::cout << "Session created successfully" << std::endl;
}
cout << "Session successfully created.\n";

getchar();
return 0;
}

生成解决方案后,运行出现以下信息,表示 tensorflow 成功被使用

image-20210531192841382

四、错误

无法下载 49177915a14a.tar.gz[3]

1
2
ERROR: /root/sshfs_dir/tensorflow-v1.10/third_party/eigen3/BUILD:30:1: no such package '@eigen_archive//': java.io.IOException: Error downloading [https://storage.googleapis.com/mirror.tensorflow.org/bitbucket.org/eigen/eigen/get/49177915a14a.tar.gz, https://bitbucket.org/eigen/eigen/get/49177915a14a.tar.gz] to /root/.cache/bazel/_bazel_root/3cc9890b7cd1fc0c9b0085d3849fe7f9/external/eigen_archive/49177915a14a.tar.gz: All mirrors are down: [GET returned 404 Not Found] and referenced by '//third_party/eigen3:eigen3'
ERROR: Analysis of target '//tensorflow/tools/pip_package:build_pip_package' failed; build aborted: no such package '@eigen_archive//': java.io.IOException: Error downloading [https://storage.googleapis.com/mirror.tensorflow.org/bitbucket.org/eigen/eigen/get/49177915a14a.tar.gz, https://bitbucket.org/eigen/eigen/get/49177915a14a.tar.gz] to /root/.cache/bazel/_bazel_root/3cc9890b7cd1fc0c9b0085d3849fe7f9/external/eigen_archive/49177915a14a.tar.gz: All mirrors are down: [GET returned 404 Not Found]

找到文件 tensorflow\workspace.bzl,使用浏览器下载该文件,成功后重新编译

测试例子生成解决方案失败 [4]

1
error: LNK1107: 文件无效或损坏: 无法在 0x310 处读取

动态链接库设置错误,VS 链接设置时,使用的是 lib,而不是 dll,lib 是编译时需要的,dll 是运行时需要的

链接器-》输入-》附加依赖项中设置 lib,将 dll 拷贝到运行目录

image-20210531191253595

image-20210531191348573

生成解决方案时,VS 无法解析两个函数 [2:2]

在这里插入图片描述

打开文件 tensorflow\tools\def_file_filter\def_file_filter.py.tpl,找到 args.target 位置,确保文件缩进 4 个空格,而不是制表符,并添加以下内容:

1
2
def_fp.write("\t ?NewSession@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@PEAPEAVSession@1@@Z\n")
def_fp.write("\t ??0SessionOptions@tensorflow@@QEAA@XZ\n")

添加完成后,文件内容为:

image-20210531191801548

参考资料:


  1. 在 Windows 环境中从源代码构建 | TensorFlow ↩︎

  2. win10 下使用 bazel 从源码 images.3 的 C++ 动态库 (CPU 版本支持 AVX2 指令集)_Keras 深度学习 - CSDN 博客 (https://blog.csdn.net/qq_37781464/article/details/110162108) ↩︎ ↩︎ ↩︎

  3. tf 编译无法下载 49177915a14a.tar.gz - cyssmile - 博客园 ↩︎

  4. 【Qt】 error: LNK1107: 文件无效或损坏:无法在 0x310 处读取_郭老二 - CSDN 博客 ↩︎