编译tensorflow的小小记录
編譯tensorflow有專門的編譯工具bazel,所以需要先安裝bazel。我使用的是源碼編譯bazel(https://github.com/bazelbuild/bazel/releases)。
第一個坑:git clone bazel源碼或者使用下載的bazel-0.21.0.tar.gz,這種源碼里缺少生成需要的文件,所以需要下載的是bazel-0.21.0-dist.zip這種帶有dist的源碼包。編譯命令簡單,./compile.sh就可以了。這里需要的依賴工具有:pkg-config zip g++ zlib1g-dev unzip python?python-numpy(python3-numpy) swig python-dev(python3-dev) openjdk-8-jdk,這些是安裝頁面提示的,全安了就行。生成的bazel在output/目錄下,并且要把目錄添加到PATH中。
第二個坑:git clone --recurse-submodules https://github.com/tensorflow/tensorflow,其中--recurse-submodules 參數是必須得, 用于獲取 TesorFlow 依賴的 protobuf 庫(這個是官方說明,如果不加貌似需要自己安裝依賴的protobuf庫:http://www.tensorfly.cn/tfdoc/get_started/os_setup.html,另一個:https://tensorflow.google.cn/install/source),從git上下載的tensorflow版本需要的bazel版本也比較高,所以需要切一下版本。
查看本地版本:git branch,查看遠程分支:git branch -a,切換分支:git checkout -b “本地自己命名” “遠程分支名”,如果不切分支,tensorflow和bazel版本不對應,無法編譯。
第三個坑:下載cuda和cudnn,并安裝,版本需要對應,需要注意的是cuda默認目錄是/usr/local/cuda/,但是cudnn默認在/usr/目錄下,所以需要把/usr/include下的cudnn.h拷貝到/usr/local/cuda/include下,把/usr/lib/x86_64-linux-gnu下的libcudnn相關的庫都拷貝到/usr/local/cuda/lib64目錄下。如果沒有進行拷貝,會提示各種庫沒有,各種頭文件找不到,真實是個大坑。
第四個坑:./configure時需要確認各種條件,這些條件我也沒有全弄明白需要哪些,從網上查到的情況看,初級只需要cuda相關的選y,其他的都選n就可以,目錄也只需要確認python、cuda、cudnn這些就可以了。
編譯命令:
bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer(例子,同時生成frame的so)
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so(這個是c++的so)
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_framework.so
更新:
1.編譯自己的庫,將項目目錄拷貝到tensorflow/examples下,使用命令:
bazel build -c opt --config=cuda //tensorflow/examples/xxx/...進行編譯,注意啦:自己的項目xxx目錄后面要加...三個點,否則不知道為啥編譯不過,可能是寫的比較挫吧(>人<;)
bazel build -c opt --config=cuda //tensorflow/examples/xxx/... --linkopt=//home/ubuntu/myprojects/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so 新版本貌似需要指定連接
項目中的BUILD一定要寫好,需要編譯的源文件要寫全,否則編譯完成了不報錯,運行就苦惱了。
有的人使用編譯選項--copt=-msse3 --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma,目前了解的情況大概是這個是cpu架構支持的選項。如果有大神知道都代表什么意思希望能留言指點一下,謝謝!
2.ignoring visible gpu devices:0 ,with Cuda compute capability 7.0. The minimum required Cuda capability is 7.5,這個問題是編譯tensorflow的時候的configure有一個配置:Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 7.5]:需要寫7.0(按不同使用的卡填寫),默認的是7.5,所以設備跑不起來,而且跑起來之后自己的庫也要重新編譯。算力官網地址:https://developer.nvidia.com/cuda-gpus
2020.02.26更新:
3.tensorflow與bazel對應版本在tensorflow目錄下有一個.bazelversion文件,里面寫的就是需要的版本號,切換tensorflow版本分支后,.bazelversion內會有變化。
4.編譯TensorFlow2.0及之后版本的時候命令略有不同需要添加--config=v2,例如
bazel build --config=opt --config=cuda --config=v2 //tensorflow:libtensorflow_framework.so
2020.04.03更新:
5.--cxxopt='-g' 可以用于編譯debug版本,方便gdb查找,例如:bazel build -c opt --cxxopt='-g' --config=cuda //tensorflow/examples/xxx/... --linkopt=//home/ubuntu/myprojects/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so
6.可以使用--retain-symbols-file和--version-script來限定對外開放的接口,防止接口名沖突導致的一系列問題。例如:
bazel build -c opt --config=cuda //tensorflow/examples/xxx/... --linkopt=//home/ubuntu/myprojects/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so?--linkopt=-Wl,--retain-symbols-file=/home/ubuntu/projects/tf/tensorflow/tensorflow/examples/model_classify/retain_symbols.sys --linkopt=-Wl,--version-script=/home/ubuntu/projects/tf/tensorflow/tensorflow/examples/model_classify/version_script.map
2020.05.15更新:
7.如果一個新的環境編譯時自動下載特別慢,可以考慮使用proxy,但是有個問題可能不是每個人都會遇到,就是配置了代理之后,報錯:HTTP/1.1 407 Proxy Authentication Required,這個問題基本確定是bazel的問題,所以搜索之后發現了這個:https://github.com/bazelbuild/bazel/issues/7487#issuecomment-466012513,bazel自己家的解決方法,先使用wget將下載失敗的依賴包下載下來,這時候proxy是起作用的,速度很快,然后將所有需要的依賴包放到一個目錄中,使用bazel的--distdir參數來指定本地依賴包目錄,相當于離線,參考命令:
bazel build -c opt --config=cuda --distdir /home/test/projects/downloads //tensorflow/cc:tutorials_example_trainer
2020.05.21更新:
8.如果你的環境是arm64即aarch64的,那么可能會遇到其他奇特的問題,比如總有一些函數沒有編譯進庫里,總是提示未定義函數等,稍微總結一點點,希望幫到大家。
首先,可能交叉編譯環境不支持,所以要手動添加一下cpu類型,在tensorflow/third_party/gpus/crosstool目錄下找到CROSSTOOL_hipcc.tpl,vi打開,找到
default_toolchain {cpu: "arm"toolchain_identifier: "local_linux" }在后面添加一個aarch64的:
default_toolchain {cpu: "aarch64"toolchain_identifier: "local_linux" }保存退出。
第二 ,還是這個目錄,vi打開BUILD.tpl,找到標簽cc_toolchain_suite下面的toolchains =中的"arm": ":cc-compiler-local",,在這個下面添加一行"aarch64": ":cc-compiler-local",,然后保存退出,如下:
cc_toolchain_suite(name = "toolchain",toolchains = {"local|compiler": ":cc-compiler-local","darwin|compiler": ":cc-compiler-darwin","x64_windows|msvc-cl": ":cc-compiler-windows","x64_windows": ":cc-compiler-windows","arm": ":cc-compiler-local","aarch64": ":cc-compiler-local","k8": ":cc-compiler-local","piii": ":cc-compiler-local","ppc": ":cc-compiler-local","darwin": ":cc-compiler-darwin",}, )?第三,有可能你會用到aws相關的,那么在tensorflow/third_party/aws目錄下找到BUILD.bazel文件,vi打開,找到標簽cc_library-->srcs = select-->"//conditions:default": [],修改為如下:
cc_library(name = "aws",srcs = select({"@org_tensorflow//tensorflow:linux_x86_64": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),"@org_tensorflow//tensorflow:darwin": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),"@org_tensorflow//tensorflow:linux_ppc64le": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),"@org_tensorflow//tensorflow:raspberry_pi_armeabi": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),#"//conditions:default": [],"//conditions:default": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),}) + glob([?
2021.04.01更新:
ERROR: An error occurred during the fetch of repository 'io_bazel_rules_docker'
方法來自:https://blog.csdn.net/lsqtzj/article/details/108899430
?
目前遇到的坑就這些,已經編譯出so了,能用,有新問題或新發現會在更新中順序向下,待以后補充。
總結
以上是生活随笔為你收集整理的编译tensorflow的小小记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis mysql5.7_spr
- 下一篇: c语言第一周作业答案,C语言程序设计下m