win11 Bazel编译C++的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
  1. 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 之间的任意版本
  2. CUDA和CUDNN环境配置 ,参考:CUDA安装及环境配置——最新详细版
    在tensorflow官网查看tensorflow-gpu-2.5版本对应的cuda和cudnn版本即cuda11.2、cudnn8.1,下载对应版本的就行。但在安装cudnn8.1版本时官网下载需要会员,于是我用了cuda11.2对应的cudnn的最新版8.9实际编译过程也没有什么问题;
  3. anaconda环境配置 ,anaconda的安装这里不细说,正常安装就行。在配置编译需要的环境时选python3.9,pip install tensorflow-gpu==2.5。安装好后里面就有各种编译过程中需要用到的包例如numpy、six、wheel等。
  4. 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官网从源代码构建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦的自画相

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值