ubuntu16.04 tensorflow c ++のコンパイルと呼び出し

優れたリファレンス:リンク

著者に感謝します!

書く前に私が遭遇した落とし穴、ほんの一握りの苦い涙を要約してください!
大きな落とし穴1:
ここに画像の説明を挿入
/ usr / local / includeをチェックしました...そのパスにtensor_shape.hの関数があります。tensorflow_cc.soがリンクを見つけられないと言う人もいますリンクがコンパイルされていると言う人もいます。tensorflowがコンパイルされます。ちなみに、whlをコンパイルしてから、pip installによってインストールされたtensorflowをアンインストールします。この方法を試しましたが、未定義のバラバラエラーが多数報告されました。最終的な解決策は次のとおりです。-fuse-ld= goldをに追加します。最後に使用したリンカーこのステートメントの行は次のようになります:g ++ -std = c ++ 11 -fuse-ld = gold…

タイハング2:

./third_party/eigen3/unsupported/Eigen/CXX11/Tensor:1:42: fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory

この理由は、Eigenがインストールされていないか、見つからなかった可能性があります。見つかりませんでした。DaHang3

This file was generated by an older version of protoc

このエラーの理由は、tensorflowとprotocbufのバージョンが一致しないためです。必ず正しいバージョンのprotocbufをインストールしてください。3.6.1のインストールに失敗したため、このバージョンのprotocbufとtensorflowはうまく対応していると感じています。3.6.0しか正常にインストールされませんでした。
ピット4:
abseilライブラリがエラーを報告しました。リンクは問題を解決しましたが、再構成後にエラーを再度報告しませんでした。他のエラーの解決のためにエラーが消えたのか、それともディレクトリがライブラリが見つかったのは、検索データベースに参加した理由です。このエラーは再度報告しなかったので、最初に記録してください。

他の人のことを忘れて、主な時間はこれらに費やされます!

環境:
ubuntu16.04
python3.5
protocbuf 3.6.0
bazel 0.15.0 NCCL
:2.2.13
tensorflow-gpu = 1.12
Eigenバージョン:3.3.90

  1. バゼルをインストールします
下载Bazel官网:
https://github.com/bazelbuild/bazel/releases
安装
./bazel-0.15.0-installer-linux-x86_64.sh
  1. protocbuf
    をインストールする以前にインストールしたバージョンは3.6.1でしたが、バージョンの不一致のエラーが報告されました。後で、バージョン情報がすでにソースコードに記載されていることがわかりました。指定されたバージョン情報に従ってインストールするだけです!バージョン情報は、ソースコードtensorflowの下の./tensorflow/workspace.bzlにあります。tensorflowとc ++のコンパイルに使用される主なものは、Eigen、protocbuf、およびbazelです。これらのライブラリのバージョン情報を覚えておいてください。このファイルで使用したいバージョンを見つけました!
官网:
https://github.com/google/protobuf/releases
我下载的版本3.6.0
cd prtobuf-3.6.0
./configure
sudo make -j8
make check -j8
sudo make install
sudo ldconfig
查看版本信息:protoc --version
(这个过程还蛮久的!)

このマシンにインストールされているprotobufバージョンを表示するには:

1. pip show protobuf
2. protoc  --version

ここで、protocbufをアンインストールするメソッドを添付します。

sudo apt-get remove libprotobuf-dev
which protoc
这样删除我发现并没有删干净
sudo rm /usr/local/bin/protoc  //执行文件
sudo rm -rf /usr/local/include/google //头文件
sudo rm -rf /usr/local/lib/libproto* //库文件
这种办法才可以删的干净!!
  1. Eigenをインストールします。これはC ++マトリックスランタイムライブラリです。
官网:
https://gitlab.com/libeigen/eigen/-/releases
我的版本3.3.90
tar -zxvf eigen-3.3.90.tar.gz
cd eigen-3.3.90/
mkdir build
cd build
cmake ..
sudo make
sudo make install
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include

インストールが完了したら、インターネットで小さなプログラムを検索して、インストールが成功したかどうかをテストできます。リンクリンク
sudo cpを使用して、最後にインクルードライブラリにコピーする必要がある理由を回答していただきありがとうございます。r / usr / local / include / eigen3 / Eigen / usr / local / include
4.NCCLをインストールします

官网:
https://developer.nvidia.com/nccl
我下载的2.2.13(给我眼睛都找瞎了才找到)
sudo dpkg -i nccl-repo-ubuntu1604-2.2.13-ga-cuda9.0_1-1_amd64.deb
sudo apt update
sudo apt install libnccl2 libnccl-dev
sudo cp /usr/lib/x86_64-linux-gnu/libnccl.so.2 /usr/local/cuda/lib
sudo cp /usr/include/nccl.h /usr/local/cuda/include/
  1. テンソルフローをコンパイルするために
    、ソースコードバージョン1.12があります
官网:
https://github.com/tensorflow/tensorflow/tags
tips:
这里也可以用git方法,然后切换分支,但是我更喜欢源码安装,就没选那种方法
./configure
这个过程我只记得一些没选默认的:
1. 我的ubuntu上有python3.5,python3.6,我想安装在3.5下,我就指定了安装目录:/usr/bin/python3.5
2. cuda那个我选了Y,因为我要用cuda,其他的都是默认或者n

以下をまとめました

正常人都是这么编译的:
bazel build --config=opt //tensorflow:libtensorflow_cc.so // 无显卡,cpu版本
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so // 有显卡
我看到人家说要加个参数,不然c++ imread()读图容易出问题,但是我搜了很久都没搜到人家混合一起的命令,可我还是加了,我的命令是这样的
bazel build --config=monolithic --config=cuda //tensorflow:libtensorflow_cc.so
这个过程差不多20多分钟吧,看到successful就是成功了,我编译了好几次,这边都没出过错!
后面我要pip install .whl所以这边我又编译了whl
bazel build --config=noaws //tensorflow/tools/pip_package:build_pip_package --verbose_failures --copt=-funsafe-math-optimizations --copt=-march=armv8-a --copt=-mtune=cortex-a53

ここに着くと、ブログにこのスクリプトを実行するように指示されます。/tensorflow/contrib/makefile/download_dependencies.sh必要なものをダウンロードするために、成功しませんでした。幸いなことに、これらのライブラリはすべて自分でダウンロードできることが後でわかりました。
しかし、ここでは常にエラーを報告するため、別の操作を実行しました

/usr/local/include/tf/tensorflow/core/public/session.h:22:60: fatal error: tensorflow/core/framework/device_attributes.pb.h: No such file or directory

bazel-genfiles / tensorflow / core / frameworkの下にあるファイルdevice_attributes.pb.hを調べました。その後、いくつかのエラーが報告されました。bazel-genfiles/ tensorflow / cc / opsの下で見つけたので、「tensorflow / bazel-genfiles / tensorflow /」のccフォルダーとコアフォルダーの内容を上書きしました。tensorflow/ tensorflow / file 、ノックすると手が震えます!しかし、その後、エラーは報告されませんでした、ハハハハハ!
次に、フォルダを作成してファイルを移動します

sudo mkdir /usr/local/include/tf
sudo cp -r bazel-genfiles/ /usr/local/include/tf/
sudo cp -r tensorflow /usr/local/include/tf/
sudo cp -r third_party /usr/local/include/tf/
sudo cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/
sudo cp bazel-bin/tensorflow/libtensorflow_framework.so /usr/local/lib

私のテスト環境はこのプロジェクトリンクを使用しています

ここでは、検索ディレクトリにライブラリパスを追加します。つまり、ファイル/etc/ld.so.confの後ろにライブラリディレクトリを追加します。
ここに画像の説明を挿入
次に、ldconfig
ldconfig -vに、追加したばかりのパスが表示されます。エラーが報告された場合、ibtensorflow_cc.so:そのようなファイルまたはディレクトリはありません。つまり、上に移動したファイルが正しくありません。gcc-ltensorflow_cc--verboseがtensorflow_cc.soで報告できないエラーを報告しないまで、上にファイルを移動した部分を確認してください。見つからない、成功します!

参照したリンクとは少し異なります。ここでのスクリプトは次のようになります。
ここに画像の説明を挿入

SOURCE_DIR =./src
BIN_DIR = ./bin

CPP     = g++ -std=c++11 -fuse-ld=gold
LDFLAGS = -g -Wall -D_DEBUG -Wshadow -Wno-sign-compare -w
LDLIBS  = -L/usr/local/lib/
INCLUDES = -I/usr/local/include/tf -I/usr/local/include/eigen3
ACTUAL_LIBS = `pkg-config --cflags --libs protobuf` -ltensorflow_cc -ltensorflow_framework

INPUT_FILE = $(SOURCE_DIR)/main.cpp $(SOURCE_DIR)/ann_model_loader.cpp
OBJET_FILE = $(BIN_DIR)/tfcpp_demo

tfcpp_demo:
        $(CPP) -o $(OBJET_FILE) $(INCLUDES) $(LDFLAGS) $(LDLIBS) $(ACTUAL_LIBS) $(INPUT_FILE)

makeの後、sh run.shを実行して結果を出力します。これで完了です!

ここで私のubuntuのデフォルトのgccバージョンは4.8ですが、公式Webサイトでubuntu16.04に必要なgccバージョンは4.8であると言われているのを見ました。もう一度投げて、gccバージョンを切り替え、リンクリンクを参照して、他のバージョンが結合されていることに注意してください。 1つのコマンドが解決しましたが、分離できるのは

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8
下面是我的:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 101
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 101

g ++も同じ操作です!

上記の未定義のエラーであるmakeのエラーを報告し続けるので、ここに小さなエピソードを添付する必要があります。他のことを確認しましたが、問題はありません。他との違いは、tensorflow_cc.soをコンパイルするときのコマンドですが、エラーはありません。再コンパイルしたくありません。それから、cmakeがubuntuで成功したのを見ました。今は手に入らないと思ったので、試してみたほうがいいと思い、このブログリンクを見ました。この人もとても幸せです。このスクリプトの実行は成功しています。/ download_dependencies .sh、嫉妬深い顔!彼の前のセクションは私と同じです、私は制御できません、そして私のその部分が始まり、
続いてフォルダにCMakeList.txtファイルが確立され、ファイルの最初のこの部分を書き
、新しいものを作成しますfile CMakeLists.txt tensorflow1.12
のソースコードをmain.cppファイルにコピーしましたが、次のファイルがこのパスにあります。

ここに画像の説明を挿入

cmake_minimum_required(VERSION 3.11)
project(cpptensorflow)
set(CMAKE_CXX_STANDARD 11)
link_directories(/home/ubuntu/tensorflow-1.12.0/bazel-bin/tensorflow)
include_directories(
        /home/ubuntu/tensorflow-tutorial/cpp/src/tensorflow-1.12.0
        /home/ubuntu/tensorflow-tutorial/cpp/src/tensorflow-1.12.0/bazel-genfiles
        /home/ubuntu/tensorflow-tutorial/cpp/src/tensorflow-1.12.0/bazel-bin/tensorflow
        /usr/local/include/eigen3
)
add_executable(cpptensorflow main.cpp ann_model_loader.h model_loader_base.h ann_model_loader.cpp)
target_link_libraries(cpptensorflow tensorflow_cc tensorflow_framework)

ここで何かが起こりました。私のcmakeバージョンは3.6です。バージョンが低いので、高いバージョンを再ダウンロードする必要があると言いました。このリンクを見ましたこの人は偉大な神であるに違いありません。ナンセンスはまったくありません。言葉は簡潔で、インストールは成功しています!この偉大な神は本当に強気です!バックハンドはただの懸念です、私はより多くの更新を楽しみにしています、私にもっと学びましょう!
次に、プロジェクトをコンパイルします

mkdir  build
cd  build
cmake ..
make 

次に実行します

./cpptensorflow /home/ubuntu/tensorflow-tutorial/cpp/model/nn_model_frozen.pb

ここに画像の説明を挿入
ここに画像の説明を挿入
この時点で成功しました。また、tensorflow_cc.soファイルが問題なくコンパイルされたことを示した後、未定義の理由を探し始めました。その後、g ++が-fuse-ld = goldとを使用してリンカーをコンパイルしたことがわかりました。それは問題なく、目的の出力が正常に出力されました。結果!
今回は本当に成功です!
もちろん、私自身のプロジェクトも正常に構成されており、私は自分のバグや他の人のプロジェクトでのいくつかの経験を記録するためにそれを書きました!

おすすめ

転載: blog.csdn.net/weixin_43868576/article/details/108311429