Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附tensorflow CPU/GPU开)发包

Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附windows端tensorflow CPU/GPU开发包)

       采用官方Bazel编译,其中踩坑无数,只有程序员才能理解程序员的心酸。踩过的坑就不一一写了, 以下随便记录下其中出现的问题和自己解决的方法。

      在编译之前,首先搭配建立好自己的软件和系统环境。如果环境没建立好,后面Bazel编译的时候肯定会出错的。不想码太多文字在怎么搭建上了,亲自搜以下很容易看到。

    我使用的具体软件环境如下:

1. CUDA10.0 + CUDNN7.4:cuda_10.0.130_411.31_win10.exe、 cudnn-10.0-windows10-x64-v7.4.2.24.zip
2. tensorflow v1.13.2
3. Python 3.7.4:Anaconda3-2019.10-Windows-x86_64.exe
4. VS2015
5. Bazel -0.20
6. Msys64 (官网下载慢,先用了网络上的)

CUDA直接默认安装即可

cudnn解压后cuda/*下文件,拷贝到cuda文件下v10.0下。

cudnn和cuda一定是匹配的版本(从官方找对应的版本包下载即可)

安装完后,检测cuda是否运行正确如下:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\demo_suite

下命令行运行deviceQuery.exe

信息如下说明cuda正确(cudnn一般版本匹配就好)

Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附tensorflow CPU/GPU开)发包_第1张图片

可以进一步采用pycharm 验证CUDA是否正确

运行pip install tensorflow-gpu==1.13.2版本, 安装完后:

 import tensorflow as tf

如果报错以下:

ImportError: No module named '_pywrap_tensorflow_internal';DLL load failed: 找不到指定的模块

说明CUDA和CUDNN没有安装好。有时候是在线安装后需要重启才发生作用,这是个坑。。。

MSYS64 + bazel.exe

直接下载安装在c:\msys64即可

将Tensorflow1.13.2源码放解压在tensorflow1132\source下,运行cmd.exe 

cd ./source

python ./configure.py

其中我增加了CPU AVX2支持:

Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附tensorflow CPU/GPU开)发包_第2张图片

 

编译c++ DLL  GPU版本:

bazel build--config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow_cc.so ////tensorflow:install_headers

编译成功是下面这样子的!(其中踩过的坑,只有自己知道了!)

Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附tensorflow CPU/GPU开)发包_第3张图片

在操作source目录下看到所编译出SO等文件:

Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附tensorflow CPU/GPU开)发包_第4张图片

并库文件重新命名*.dll, *.lib文件:

 

liblibtensorflow_cc.so.ifso  -->  llibtensorflow_cc.lib 

libtensorflow_cc.so -->  llibtensorflow_cc.dll

相应头文件在bazel-genfiles下:

Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附tensorflow CPU/GPU开)发包_第5张图片

 

将头文件,库文件,包含到自己的c++工程种进行编译,如果一次编译成功并能正常运行exe,那也就太容易了!

因为当C++编译的时候,会发现很多unsolved symbols !!!!, 很显然,编译出来的DLL是缺少不少函数的,试过网上N多的方法都没有解决,或者很复杂。。。,浪费了很多时间,最后附上自己的解决方法:

  1. 修改tensorflow/BUILD文件字段如下:
tf_cc_shared_object(
    name = "libtensorflow_cc.so",
    linkopts = select({
        "//tensorflow:darwin": [
            "-Wl,-exported_symbols_list",  # This line must be directly followed by the exported_symbols.lds file
            "$(location //tensorflow:tf_exported_symbols.lds)",
        ],
        "//tensorflow:windows": [
            "-def:" +   # This line must be directly followed by the exported_symbols_msvc.lds file
            "$(location //tensorflow:tf_exported_symbols_msvc.lds)",
        ],
        "//conditions:default": [
            "-z defs",
            "-Wl,--version-script",  #  This line must be directly followed by the version_script.lds file
            "$(location //tensorflow:tf_version_script.lds)",
        ],
    }),
    visibility = ["//visibility:public"],
    deps = [
		"//tensorflow:tf_exported_symbols.lds",
		"//tensorflow:tf_exported_symbols_msvc.lds",
        "//tensorflow:tf_version_script.lds",
        "//tensorflow/c:c_api",
        "//tensorflow/c/eager:c_api",
        "//tensorflow/cc:cc_ops",
        "//tensorflow/cc:client_session",
        "//tensorflow/cc:scope",
        "//tensorflow/cc/profiler",
        "//tensorflow/core:tensorflow",
    ] + if_ngraph(["@ngraph_tf//:ngraph_tf"]),
)

 

  1. 新建tf_exported_symbols_msvc.lds文件并将保存在tensorflow根目录下:
LIBRARY libtensorflow_cc
EXPORTS
    ??0MetaGraphDef@tensorflow@@QEAA@XZ
    ??1MetaGraphDef@tensorflow@@UEAA@XZ
    ??0LogMessageFatal@internal@tensorflow@@QEAA@PEBDH@Z
    ??1LogMessageFatal@internal@tensorflow@@UEAA@XZ
    ?CheckDimsEqual@TensorShape@tensorflow@@AEBAXH@Z
    ?CheckDimsAtLeast@TensorShape@tensorflow@@AEBAXH@Z
    ??0Tensor@tensorflow@@QEAA@XZ
    ??0GraphDef@tensorflow@@QEAA@XZ
    ??1GraphDef@tensorflow@@UEAA@XZ
    ?CheckType@Tensor@tensorflow@@AEBAXW4DataType@2@@Z
    ?CopyFromInternal@Tensor@tensorflow@@AEAAXAEBV12@AEBVTensorShape@2@@Z
    ??1NodeDef@tensorflow@@UEAA@XZ
    ??0NodeDef@tensorflow@@QEAA@AEBV01@@Z
	??0RunOptions@tensorflow@@QEAA@XZ
	??1RunOptions@tensorflow@@UEAA@XZ
	?IgnoreError@Status@tensorflow@@QEBAXXZ
	?LoadSavedModel@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@AEBVRunOptions@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$unordered_set@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@6@QEAUSavedModelBundle@1@@Z
	?NewSession@tensorflow@@YAPEAVSession@1@AEBUSessionOptions@1@@Z

     里边为函数输出列表,调用时候缺少的加进去即可!重复以上命令继续编译直至编译成功。测试如下:

Bazel编译Tensorflow C++ 版本CPU/GPU DLL动态库(附tensorflow CPU/GPU开)发包_第6张图片

 

附上我编译的tensorflow 1.13.2 C/C++库,可以直接用:

CPU/GPU X64 库和头文件:

https://mp.csdn.net/console/editor/html/104448153

其他相关依赖DLL:

https://download.csdn.net/download/yyplc/12185057

一些其他可能用到的命令:

编译C版本:
bazel build --config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow

编译C/C++版本:
bazel build --config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow_cc.so //tensorflow:install_headers 

编译framework:
bazel build --config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow_framework.so

 

你可能感兴趣的:(tensorflow,深度学习,opencv)