https://tensorflow.google.cn/install/source?hl=zh-cn查看tensorflow和其他需要下載軟件對應的版本,最好一模一樣
1、下載TensorFlow源碼
https://github.com/tensorflow/tensorflow
2、安裝編譯protobuf(3.9.2)
protobuf版本要和TensorFlow版本對應;
protobuf版本查看方法:
打開TensorFlow源碼下tensorflow-master/tensorflow/workspace2.bzl文件
搜索可以找到地址"https://github.com/protocolbuffers/protobuf/archive/v3.9.2.zip"
安裝編譯:
cd protobuf-XXX/
./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache.
查看protobuf版本
protoc --version
3、安裝編譯bazel(3.1.0)
bazel版本要和TensorFlow版本對應;
bazel版本查看方法:
打開TensorFlow源碼下tensorflow-master/configure.py
搜索可以找到:
_TF_MIN_BAZEL_VERSION = ‘4.2.2’
_TF_MAX_BAZEL_VERSION = ‘4.99.0’
這里可以選擇安裝4.2.2版本
安裝編譯: 下載:鏈接 Releases · bazelbuild/bazel · GitHub
安裝依賴:
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python
編譯:
chmod +x bazel-<version>-installer-linux-x86_64.sh
./bazel-<version>-installer-linux-x86_64.sh --user
4.2.2版本對應寫法:
chmod +x bazel-4.2.2-installer-linux-x86_64.sh
./bazel-4.2.2-installer-linux-x86_64.sh --user
將 export PATH="$PATH:$HOME/bin"
添加進去,添加到bashrc不管用那么就直接在tensorflow編譯的文件夾中執行這句話生成零時變量。
4、編譯TensorFlow
進入tensorflow文件夾中,首先進行項目配置:./configure
這里系統應該已經安裝了gcc g++ 7.5 除了使用cuda y, 其余都選no和默認
bazel build --config=opt --config=cuda // tensorflow:libtensorflow_cc.so
編譯完成后,在bazel-bin/tensorflow中會生成兩個我們需要的庫文件:libtensorflow_cc.so 和 libtensorflow_framework.so
問題1. error
解決:安裝cudnn 我的cuda是11.0選擇cudnn是8.0.4(將deb也進行安裝)
cudnn安裝可能需要如下問題,說so不是符號連接之類的依次執行下面
sudo ln -sf /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.0.4 /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_adv_train.so.8
sudo ln -sf /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.0.4 /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8
sudo ln -sf /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.0.4 /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8
sudo ln -sf /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.0.4 /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8
sudo ln -sf /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.0.4 /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_ops_train.so.8
sudo ln -sf /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.0.4 /usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8
建立成功后最好執行sudo ldconfig (原因沒查)
問題2.
解決:我的系統是ubuntu18.04 所以執行以下指令成功部署
也就是指定cpu的核數,因為不指定會內存爆掉,就失敗了
問題3. 需要將so文件全部拷貝到usr/local/lib文件(cp xx 目標文件夾)(否則程序會報錯:cannot open shared object),并賦予權限sudo chmod +x libtensorflow_cc.so.2(我將這些so文件的軟連接和bazel-bin/tensorflow中進行了對應,但是不確定有沒有意義,也許不需要這樣做 最后發現必須要軟連接并且要將framework.so連接到framework.so.2)
問題4. absl文件夾需要在githbub下載(https://github.com/abseil/abseil-cpp/tree/master/absl),為了保險我直接將服務器的absl拷貝到tensorflow-2.4.0目錄中解決該問題
問題5. 在編譯失敗從新編譯最好使用bazel -clean后在執行編譯指令
缺失文件可能需要使用bazel clean --expunge,而不是bazel -clean
成功結果
總結
這是本人tensorflow源碼編譯遇到的各種問題,其中對應版本是一個很麻煩的過程,因為官網給的tf對應的protobuf等庫版本可能不適用,大家最好百度教程,然后在別人成功的基礎上嘗試,第二點是介于本人當時水平有限很多問題的解決方法不是很合理,僅供參考