编译 tensorflow1.15
本文基于官方安装文档 [1] 及博文 [2],在 windows10 上编译 tensorflow1.15 (CPU 版)
一、环境配置
下载 tensorflow
1 | git clone https://gitclone.com/github.com/tensorflow/tensorflow.git |
安装 MSYS2
下载 MSYS2
MSYS2 集成了 pacman 和 Mingw-w64 的 Cygwin 升级版,提供了 bash shell 等 linux 环境、版本控制软件(git/hg)和 MinGW-w64 工具链,在这里下载 MSYS2,并双击进行安装
PATH
中配置环境变量
1 | C:\msys64 |
安装 msys2 环境包
以管理权限打开 cmd,运行以下命令
1 | pacman -Syu |
安装 Bazel
手动安装 Bazel,首先下载 Bazel,但下载前需要提前检查 tensorflow 支持的版本,即 tensorflow/configure.py
中指定的介于 _TF_MIN_BAZEL_VERSION
和 _TF_MAX_BAZEL_VERSION
之间的任意版本
本次下载 bazel0.26.0 版本,下载完成后不用安装,拷贝到 MSYS 安装目录下,
然后在系统环境变量中新增以下变量
1 | #msys2中bash路径 |
二、编译 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 是实验性的。大多数使用情况在性能(加快速度或减少内存使用)方面都没有改进,选择 NDo you wish to build TensorFlow with ROCm support? [y/N]
AMD 显卡系列的 GPU 加速,由于我没有使用 A 卡,因此这里也选择 NDo you wish to build TensorFlow with CUDA support? [y/N]
这个就是通常所说的 N 卡 GPU 使用 cuda 进行加速计算,编译 GPU 版本的下个博客里会说,这次是编译 CPU 版本的,因此这个地方也选择 NPlease specify optimization flags to use during compilation when bazel option “–config=opt” is specified [Default is /arch:AVX]:
这个是选择使用 AVX 哪个指令集,现在很多电脑都是支持 AVX2 指令集的,因此这个地方输入:/arch:AVX2Would you like to override eigen strong inline for some C++ compilation to reduce the compilation time? [Y/n]
由于 TensorFlow 的 C++ 版本关于多维数据使用 eigen 计算,这个意思是使内联函数加快 eigen 编译速度,因此这个地方选择 Y
编译
编译生成 C++ 使用的 dll
1 | bazel build --config=opt --copt=-nvcc_options=disable-warnings --define=no_tensorflow_py_deps=true //tensorflow:tensorflow_cc.dll |
生成 dll 文件,lib 文件可以直接改名问 tensorflow_cc.lib
使用,也可使用下面命令生成
编译生成 lib
1 | bazel build --config=opt --copt=-nvcc_options=disable-warnings //tensorflow:tensorflow_cc_dll_import_lib |
生成头文件
1 | bazel build --config=opt --copt=-nvcc_options=disable-warnings //tensorflow:install_headers |
三、测试
打开 VS2019,并新建 C++ 控制台工程,给项目配置 tensorflow 环境
头文件设置:VC++ 目录 -》包含目录
lib 文件设置:
(1)VC++ 目录 -》库目录
(2)链接器 -》输入 -》附加依赖项
- dll 文件设置:项目目录 -》x64-》Release
使用以下代码测试 tensorflow,是否可以正常使用
1 |
|
生成解决方案后,运行出现以下信息,表示 tensorflow 成功被使用
四、错误
无法下载 49177915a14a.tar.gz[3]
1 | 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' |
找到文件 tensorflow\workspace.bzl
,使用浏览器下载该文件,成功后重新编译
测试例子生成解决方案失败 [4]
1 | error: LNK1107: 文件无效或损坏: 无法在 0x310 处读取 |
动态链接库设置错误,VS 链接设置时,使用的是 lib,而不是 dll,lib 是编译时需要的,dll 是运行时需要的
在链接器-》输入-》附加依赖项
中设置 lib,将 dll 拷贝到运行目录
生成解决方案时,VS 无法解析两个函数 [2:2]
打开文件 tensorflow\tools\def_file_filter\def_file_filter.py.tpl
,找到 args.target
位置,确保文件缩进 4 个空格,而不是制表符,并添加以下内容:
1 | def_fp.write("\t ?NewSession@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@PEAPEAVSession@1@@Z\n") |
添加完成后,文件内容为:
参考资料:
win10 下使用 bazel 从源码 images.3 的 C++ 动态库 (CPU 版本支持 AVX2 指令集)_Keras 深度学习 - CSDN 博客 (https://blog.csdn.net/qq_37781464/article/details/110162108) ↩︎ ↩︎ ↩︎