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一般版本匹配就好)
可以进一步采用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支持:
编译c++ DLL GPU版本:
bazel build--config=opt --config=cuda --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow_cc.so ////tensorflow:install_headers
编译成功是下面这样子的!(其中踩过的坑,只有自己知道了!)
在操作source目录下看到所编译出SO等文件:
并库文件重新命名*.dll, *.lib文件:
liblibtensorflow_cc.so.ifso --> llibtensorflow_cc.lib
libtensorflow_cc.so --> llibtensorflow_cc.dll
相应头文件在bazel-genfiles下:
将头文件,库文件,包含到自己的c++工程种进行编译,如果一次编译成功并能正常运行exe,那也就太容易了!
因为当C++编译的时候,会发现很多unsolved symbols !!!!, 很显然,编译出来的DLL是缺少不少函数的,试过网上N多的方法都没有解决,或者很复杂。。。,浪费了很多时间,最后附上自己的解决方法:
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"]),
)
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
里边为函数输出列表,调用时候缺少的加进去即可!重复以上命令继续编译直至编译成功。测试如下:
附上我编译的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