win11 Bazel编译Tensorflow-gpu2.5.0.lib和dll
win11 Bazel编译Tensorflow-gpu2.5.0.lib和dll
网上也有许多bazel编译tensorflow源码的教程,基本都差不多都能参考,只是一些细节上有区别。这里记录一下,我成功的过程。
tensorflow官网编译过程:https://tensorflow.google.cn/install/source_windows?hl=zh-cn
官网的编译过程是值得认真参考的,但里面有些写得不够详细的地方,操作起来容易出错,这里做更加详细的说明。
软件准备
必须要做的准备是Tensorflow 源码、bazel和msys2下载,环境配置,anaconda的安装是为了减少一些出错的地方:
1.创建文件夹,我创建了一个tensorflow_c++的文件夹,并把msys2等相关工具放入里面
2. msys2 ,https://www.msys2.org/
随便选择你认为合适的路径进行安装,但需要添加系统环境变量
然后,使用 cmd.exe (在文件夹目录输入cmd可快速进入)运行以下命令:
pacman -S git patch unzip
更新的过程一直选Y就行
3.tensorflow源码下载,我选择用git下载所有版本,然后选择2.5版本分支
在msys2的安装目录下使用cmd.exe下载
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
选择分支
git checkout r2.5
- bazel安装,官网:https://bazel.build/install?hl=zh-cn
华为云:https://mirrors.huaweicloud.com/bazel/3.7.2/
把下载好的bazel安装包bazel-3.7.2-windows-x86_64.exe ,重名为bazel.exe,重命名之后才能被系统识别自动加载。放在E:\tensorflow_c++_tools\msys64\tensorflow下。
bazel的具体版本也可以在**E:\tensorflow_c++_tools\msys64\tensorflow\configure.py **中查找指定的介于 _TF_MIN_BAZEL_VERSION 和 _TF_MAX_BAZEL_VERSION 之间的任意版本 - CUDA和CUDNN环境配置 ,参考:CUDA安装及环境配置——最新详细版
在tensorflow官网查看tensorflow-gpu-2.5版本对应的cuda和cudnn版本即cuda11.2、cudnn8.1,下载对应版本的就行。但在安装cudnn8.1版本时官网下载需要会员,于是我用了cuda11.2对应的cudnn的最新版8.9实际编译过程也没有什么问题; - anaconda环境配置 ,anaconda的安装这里不细说,正常安装就行。在配置编译需要的环境时选python3.9,pip install tensorflow-gpu==2.5。安装好后里面就有各种编译过程中需要用到的包例如numpy、six、wheel等。
- VS2019
C++的桌面开发组件必须安装,需要用到MSVC v142 -VS2019 C++ x86/64生成工具
添加环境变量
最后需要注意
E:\tensorflow_c++_tools\msys64\tensorflow.bazelrc
E:\tensorflow_c++_tools\msys64\tensorflow\configure.py
E:\tensorflow_c++_tools\msys64\tensorflow\tensorflow\workspace.bzl
这里面有些环境需要的参数,如果配置过程中出现了什么错误,可以到里面查找需要的版本
编译 Release 版本
1.编译需要的内存,一般情况下编译结果保存在C:\Users\Administrator_bazel_Administrator\fhifgvrj\execroot\org_tensorflow\bazel-out中,而编译的结果至少十几G。请确保空间足够大。或者采用增加内存使用限制和修改 bazel 默认输出目录。(我C盘空间足够,就没有试了)
2.打开 Anaconda Prompt, 输入 activate tf25 (这个是我的名称, 改成你的) 来激活 Environment
3.输入git checkout r2.5 确保选择正确分支
4.输入 python configure.py 运行配置程序,如果显示没有安装bazel,就点击目录下的bazel.exe,试运行后在重新运行配置程序。
具体的配置过程:
- python:选择用anaconda配置的环境E:\Anaconda3\envs\tf25\python.exe
- library paths: 默认
- ROCM:N
- CUDA:Y,NVIDIA官方查找GPU算力的网址:https://developer.nvidia.com/cuda-gpus。我查找的算力是8.9,但编译不通过,最后选择了8.0
- option “–config=opt” is …arch: /arch:AVX2 (比较新的CPU都支持这个, 注意输入的是
/arch:AVX2符号也要带上) override eigen strong inline: Y, 这个可以减少编译时间
6. 编译 dll. 输入 bazel build --config=opt //tensorflow:tensorflow_cc.dll 开始编译 C++ 版本的 dll , 编译过程中会下载任务,fetch各种包。
如果出现404、time out,多输入 bazel build --config=opt //tensorflow:tensorflow_cc.dll几次,让他重新下载就行。除了这类的错误,再报错时,具体看里面的错误在哪个文件上出现什么问题,例如numpy缺少什么东西,那就是numpy的版本不对。
这个编译过程时间会有点长
7.编译lib.输入 bazel build --config=opt //tensorflow:tensorflow_cc.lib开始编译 C++ 版本的 lib。编译时间会快很多
8.输入 bazel build --config=opt //tensorflow:install_headers 开始输出头文件
9.在E:\tensorflow_c++_tools\msys64\tensorflow\bazel-bin\tensorflow中保存着编译输出结果
但其他文件也还有用,如果空间足够就保留他们吧。清除命令是bazel clean
在VS中测试
在测试之前需要做一下vs的配置
1.添加include目录
include目录中还需要将E:\Anaconda3\envs\tf25\Lib\site-packages\tensorflow\include\google 中google整个文件夹复制到include,不然使用过程中会出现找不到google的相关文件
2.因为命令冲突的原因需要预编译NOMINMAX
3.将包含tensorflow_cc.lib的文件夹添加进去
4.添加依赖项
5.添加dll,在工程ConsoleApplication1\x64\Release加入tensorflow_cc.dll
6.测试代码,编译平台选Release x64
#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"
int main() {
using namespace tensorflow;
using namespace tensorflow::ops;
Scope root = Scope::NewRootScope();
// Matrix A = [3 2; -1 0]
auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f} });
// Vector b = [3 5]
auto b = Const(root, { {3.f, 5.f} });
// v = Ab^T
auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
std::vector<Tensor> outputs;
ClientSession session(root);
// Run and fetch v
TF_CHECK_OK(session.Run({ v }, &outputs));
// Expect outputs[0] == [19; -3]
LOG(INFO) << outputs[0].matrix<float>();
return 0;
}
7.相关报错:
VS编译项目后:LNK2001 无法解析的外部符号,例如: “public: __cdecl tensorflow::ClientSession::ClientSession(class tensorflow::Scope const &)” (??0ClientSession@tensorflow@@QEAA@AEBVScope@1@@Z)
打开E:\tensorflow_c++_tools\msys64\tensorflow\tensorflow\tools\def_file_filter\def_file_filter.py.tpl
接着下面安装对应格式添加进去def_fp.write(“\t \n”),如上面的例子则添加def_fp.write(“\t ??0ClientSession@tensorflow@@QEAA@AEBVScope@1@@Z\n”)
添加进入之后再在cmd中编译lib、dll,可以接着之前的编译结果接着编译,这样编译会快很多。后面再遇到无法解析的符号时,更改起来也方便
参考文章
[1]: [Windows10 Bazel 编译 Tensorflow 2 C++ dll 和 lib 文件]
[2]: CUDA安装及环境配置——最新详细版
[3]: tensorflow C++动态库编译
[4]: Bulid tensorflow c++ API on windows
[5]: Windows 环境TensorFlow源码C++编译———实战与避坑记
[6]:tensorflow官网从源代码构建