使用bazel在windows 10下构建tensorflow 2.0的动态链接库,

2 篇文章 0 订阅
1 篇文章 0 订阅

tensorflow2.0出来了,在python环境很容易构建,在linux环境也很好构建,不过在windows环境就有点麻烦了,要做的事比较多,经验多次失败,最终成功构建。


一、保证安装了python,编译tensorflow2.0建议用3.6.8
    使用pip list查看需要的python工具包,保证有以下版本的工具包
    Keras-Applications     1.0.8
    Keras-Preprocessing 1.1.0
    numpy                        1.16.2
    six                              1.13.0
    wheel                         0.33.6
二、安装msys64,并把安装路径加入到环境变量的path中,包括msys64安装目录及msys64/usr/bin目录
三、下载bazel-0.26.1并拷贝到msys64的/usr/bin目录,编译tensorflow2需要这个版本
    设置bazel及visual c++的相关系统环境变量(如果还没有的就添加,已经存在的检查一下是不是正确)

    (本人开发开发环境全部放在D盘)
    BAZEL_SH=D:\msys64\usr\bin\bash.exe
    BAZEL_VC=D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
    BAZEL_VS=D:\Program Files (x86)\Microsoft Visual Studio 14.0
    
    运行以下命令更新msys及bazel,通常你肯定会遇到超时的麻烦,加上这个参数吧:--disable-download-timeout
    pacman -Syu
    pacman -S git
    pacman -S patch unzip grep
    pacman -S git patch unzip

四、以管理员身份运行Power shell
五、下载tensorflow
    git clone https://github.com/tensorflow/tensorflow.git
    cd tensorflow
    提取指定的版本,这里说的是r2.0
    git checkout r2.0


六、配置编译环境
    python ./configure.py

    这里主要是配置问题,如果使用CUDA需要先行配置CUDA SDK。
七、按需求执行以下命令编译出相关的内容
查看\tensorflow\tensorflow\BUILD的创建规则,分别多次调用以下命令来生成DLL和LIB还有相关头文件
-- 生成C库
bazel build --config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow/tools/lib_package:libtensorflow
-- 生成C库
bazel build --config=opt --copt=-nvcc_options=disable-warnings //tensorflow/tools/lib_package:libtensorflow
-- 生成C++库
bazel build --config=opt --config=cuda --copt=-nvcc_options=disable-warnings --define=no_tensorflow_py_deps=true //tensorflow:tensorflow_cc.dll
-- 生成C++ import lib (也可以不使用此方法生成输入库,而是把生成的.ifso文件改名为.lib)
bazel build --config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow:tensorflow_cc_dll_import_lib 
-- 生成相关头文件
bazel build --config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow:install_headers

七、低版本Visual Studio可能会出现的错误(2017以下)

Execution platform: @bazel_tools//platforms:host_platform
tensorflow/core/grappler/optimizers/data/rebatch.cc(66): fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1468)
 To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++
 Help menu, or open the Technical Support help file for more information

主要是由于编译器无法解释constexpr char这种写法。编辑tensorflow\tensorflow\core\grappler\optimizers\data\rebatch.cc文件,把kBatchDatasetOps注释掉,改成以下样子。

//constexpr std::array<const char*, 6> kBatchDatasetOps = {
//    kBatchOp,       kBatchV2Op,      kMapAndBatchOp, kExperimentalMapAndBatchOp,
//    kPaddedBatchOp, kPaddedBatchV2Op};
constexpr std::array<const char*, 6> kBatchDatasetOps = {
    "BatchDataset", "BatchDatasetV2", "MapAndBatchDataset", "ExperimentalMapAndBatchDataset",
    "PaddedBatchDataset", "PaddedBatchDatasetV2"
};


!!!注意!!!

按照上面的操作你肯定可以得到相应的so或者dll,但是当你以为得米的时候马上写一个hello world来验证时会发现
VS的输出界面遍布“无法解析的符号”。(你肯定会遇到的)

例如以下的代码

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


//tensorflow-master为tensorflow源码根目录,不喜欢include这么长的路径可以把这个路径加到cmakelist,再直接包含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";
}
 

??0SessionOptions@tensorflow@@QEAA@XZ

?NewSession@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@PEAPEAVSession@1@@Z

编辑 tensorflow/tools/def_file_filter/def_file_filter.py.tpl文件,

    # Header for the def file.
    if args.target:
      def_fp.write("LIBRARY " + args.target + "\n")
    def_fp.write("EXPORTS\n")
    def_fp.write("\t ??1OpDef@tensorflow@@UEAA@XZ\n")
    def_fp.write("\t ??0SessionOptions@tensorflow@@QEAA@XZ\n")
    def_fp.write("\t ?NewSession@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@PEAPEAVSession@1@@Z\n")
把缺少的符号按上面的形式加入到新的行,保存后再bazel build编译出新的库。

务必注意,执行脚本的是PYTHON,代码的缩进非常重要,请必须保证前面有四个空格。笔者实际加了以下条目:

    def_fp.write("\t ??1OpDef@tensorflow@@UEAA@XZ\n")
    def_fp.write("\t ??0SessionOptions@tensorflow@@QEAA@XZ\n")
    def_fp.write("\t ?NewSession@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@PEAPEAVSession@1@@Z\n")
    def_fp.write("\t ??0Operation@tensorflow@@QEAA@PEAVNode@1@@Z\n")
    def_fp.write("\t ??1Scope@tensorflow@@QEAA@XZ\n")
    def_fp.write("\t ?NewRootScope@Scope@tensorflow@@SA?AV12@XZ\n")
    def_fp.write("\t ?ToGraphDef@Scope@tensorflow@@QEBA?AVStatus@2@PEAVGraphDef@2@@Z\n")
    def_fp.write("\t ?WithOpNameImpl@Scope@tensorflow@@AEBA?AV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z\n")
    def_fp.write("\t ??0ExpandDims@ops@tensorflow@@QEAA@AEBVScope@2@VInput@2@1@Z\n")
    def_fp.write("\t ??0Placeholder@ops@tensorflow@@QEAA@AEBVScope@2@W4DataType@2@@Z\n")
    def_fp.write("\t ??0Cast@ops@tensorflow@@QEAA@AEBVScope@2@VInput@2@W4DataType@2@@Z\n")
    def_fp.write("\t ??0Div@ops@tensorflow@@QEAA@AEBVScope@2@VInput@2@1@Z\n")
    def_fp.write("\t ?NewSession@tensorflow@@YAPEAVSession@1@AEBUSessionOptions@1@@Z\n")

其它编译器相关的麻烦不一一列出,通常改加一下相关宏定义就可以了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值