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一般版本匹配就好)

可以進一步採用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多的方法都沒有解決,或者很複雜。。。,浪費了很多時間,最後附上自己的解決方法:

  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

     裏邊爲函數輸出列表,調用時候缺少的加進去即可!重複以上命令繼續編譯直至編譯成功。測試如下:

 

附上我編譯的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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章