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多的方法都沒有解決,或者很複雜。。。,浪費了很多時間,最後附上自己的解決方法:
- 修改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"]),
)
- 新建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
裏邊爲函數輸出列表,調用時候缺少的加進去即可!重複以上命令繼續編譯直至編譯成功。測試如下:
附上我編譯的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