ubuntu16.04 tensorflow c ++ compilação e chamada

Excelente referência: link

Obrigado ao autor! ! !

Resuma os buracos que encontrei antes de escrever, um punhado de lágrimas amargas! !
Big pit 1:
Insira a descrição da imagem aqui
Eu verifiquei meu / usr / local / include ... Há uma função de tensor_shape.h nesse caminho. Algumas pessoas dizem que tensorflow_cc.so não consegue encontrar o link . Algumas pessoas dizem que o link foi compilado desde tensorflow é compilado. By the way, compile whl e, em seguida, desinstale o tensorflow instalado por pip install. Eu tentei este método, mas ainda relatou um monte de erros de balabala indefinidos. Minha solução final é: add -fuse-ld = gold para o vinculador, que usei por último Esta linha de declaração é assim: g ++ -std = c ++ 11 -fuse-ld = gold…

Tai Hang 2:

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

A razão para isso é mais provável que o Eigen não foi instalado ou encontrado. Eu não o encontrei. Da
Hang 3:

This file was generated by an older version of protoc

O motivo desse erro é que as versões de tensorflow e protocbuf não correspondem! ! Certifique-se de instalar a versão correta do protocbuf. Tenho a sensação de que esta versão do protocbuf e do tensorflow correspondem bem, porque não consegui instalar o 3.6.1, apenas 3.6.0 foi instalado com sucesso! !
Pit 4: A
biblioteca de rapel reportou um erro. O link resolveu o problema, mas não reportei o erro depois de reconfigurá-lo. Não sei se o erro desapareceu por causa da resolução de outros erros, ou porque o diretório onde a biblioteca foi localizada foi O motivo pelo qual entrei no banco de dados de pesquisa, não reportei esse erro, portanto, registre-o primeiro!

Esqueça os outros, a maior parte do tempo é gasto com eles! ! !

Ambiente:
ubuntu16.04
python3.5
protocbuf 3.6.0
bazel 0.15.0 NCCL
: 2.2.13
tensorflow-gpu = 1.12
Versão Eigen: 3.3.90

  1. Instale o bazel
下载Bazel官网:
https://github.com/bazelbuild/bazel/releases
安装
./bazel-0.15.0-installer-linux-x86_64.sh
  1. Instalar protocbuf
    A versão que instalei antes era 3.6.1 e depois relatei o erro de incompatibilidade de versão! Posteriormente descobri que a informação da versão já vinha fornecida no código fonte, basta instalar de acordo com a informação da versão fornecida! As informações da versão estão em ./tensorflow/workspace.bzl no código-fonte tensorflow. Os principais usados ​​para compilar tensorflow e c ++ são Eigen, protocbuf e bazel. Basta lembrar as informações de versão dessas bibliotecas! Encontrei a versão que desejo usar neste arquivo!
官网:
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
(这个过程还蛮久的!)

Para visualizar a versão protobuf instalada nesta máquina:

1. pip show protobuf
2. protoc  --version

Aqui, desejo anexar um método para desinstalar o 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. Instale Eigen, esta é a biblioteca de tempo de execução de matriz 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

Após a conclusão da instalação, você pode procurar um pequeno programa na Internet para testar se a instalação foi bem-sucedida, obrigado por me ajudar a responder porque devo copiá-lo para a biblioteca de inclusão no final, com um link
sudo cp - r / usr / local / include / eigen3 / Eigen / usr / local / include
4. Instale o 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. Para compilar o tensorflow,
    tenho o código-fonte da versão 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

O seguinte é compilado

正常人都是这么编译的:
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

Quando eu chegar aqui, meu blog dirá para executar este script./tensorflow/contrib/makefile/download_dependencies.sh para baixar as coisas que preciso, não consegui! Felizmente, mais tarde descobri que essas bibliotecas podem ser baixadas por mim mesmo!
Mas aqui fiz outra operação, pois sempre relato erros

/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

Dei uma olhada no arquivo device_attributes.pb.h em bazel-genfiles / tensorflow / core / framework! Mais tarde, alguns erros foram relatados. Encontrei-o em bazel-genfiles / tensorflow / cc / ops e, em seguida, substituí o conteúdo das pastas cc e core em "tensorflow / bazel-genfiles / tensorflow /". Tensorflow / tensorflow / file , as mãos tremem ao bater! ! ! Mas então nenhum erro foi relatado, hahahahaha! ! !
Em seguida, crie pastas e mova arquivos

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

Meu ambiente de teste está usando este link de projeto

Aqui, adiciono o caminho da biblioteca ao diretório de pesquisa, ou seja, adiciono o diretório da biblioteca ao final do arquivo /etc/ld.so.conf
Insira a descrição da imagem aqui
e , em seguida, ldconfig
ldconfig -v mostra o caminho recém-adicionado. Se um erro for relatado , ibtensorflow_cc.so: Não existe tal arquivo ou diretório, ou seja, o arquivo movido acima não está certo, verifique a parte que moveu o arquivo acima, até que gcc -ltensorflow_cc --verbose não reporte o erro que tensorflow_cc.so pode ' t ser encontrado, é bem-sucedido!

Sou um pouco diferente do link a que me referi. Meu script aqui é assim:
Insira a descrição da imagem aqui

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)

Após o make, execute sh run.sh e exiba o resultado. Até agora, está feito! ! !

Aqui, minha versão gcc padrão do ubuntu é 4.8, mas vi que o site oficial disse que a versão gcc necessária para ubuntu16.04 é 4.8, joguei novamente, mudei a versão gcc, consulte o link do link e observe que as outras estão combinadas, um comando resolvido, mas só posso separar

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 ++ é a mesma operação! !

Preciso anexar um pequeno episódio aqui, pois continuo relatando o erro do make, que é o erro indefinido acima. Verifiquei minhas outras coisas e não há problema. A diferença dos outros é o comando ao compilar tensorflow_cc.so, mas não há erro. Não quero recompilar! Então eu vi que o cmake foi bem-sucedido no ubuntu. Achei que não tivesse entendido agora, então é melhor tentar, e vi este link de blog . Essa pessoa também está muito feliz. A execução deste script foi bem-sucedida./ download_dependencies .sh, cara de inveja! ! A seção anterior dele é a mesma comigo, eu não tenho controle, então essa parte de mim está começando, é
seguida pelo estabelecimento de um arquivo CMakeList.txt na pasta, escreva esta parte do início do arquivo,
crie um novo arquivo CMakeLists.txt
I Copiei o código-fonte do meu tensorflow1.12 para o arquivo main.cpp e agora existem estes arquivos neste caminho:

Insira a descrição da imagem aqui

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)

Algo aconteceu aqui. Minha versão do cmake é 3.6. Eu disse que a versão é baixa e preciso baixar novamente a versão alta. Vi este link. Essa pessoa deve ser um grande deus. Não há bobagem. as palavras são concisas e a instalação foi bem-sucedida! ! Este grande deus é realmente altista! ! ! O backhand é apenas uma preocupação, estou ansioso por mais atualizações, deixe-me saber mais! ! ! !
Em seguida, compile o projeto

mkdir  build
cd  build
cmake ..
make 

Então corra

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

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Neste ponto, foi bem-sucedido. Também mostrou que meu arquivo tensorflow_cc.so foi compilado sem problemas, e então comecei a procurar o motivo de indefinido. Mais tarde, descobri que g ++ compilou o vinculador com -fuse-ld = gold e estava tudo bem, e a saída desejada foi produzida com sucesso. resultado! !
Desta vez é um grande sucesso!
Claro, meu próprio projeto também foi configurado com sucesso, e eu o escrevi para registrar meus próprios bugs e algumas experiências com projetos de outras pessoas! !

Acho que você gosta

Origin blog.csdn.net/weixin_43868576/article/details/108311429
Recomendado
Clasificación