Google TensorFlow C ++ API 빌드 및 사용 방법


168

C ++에서 Google의 새로운 Tensorflow 라이브러리를 사용하기를 정말로 간절히 원합니다. 웹 사이트와 문서는 프로젝트의 C ++ API를 빌드하는 방법에 대해 정말로 불분명하며 어디서부터 시작 해야할지 모르겠습니다.

더 많은 경험을 가진 사람이 tensorflow의 C ++ API 사용에 대한 안내서를 발견하고 공유하여 도움을 줄 수 있습니까?


4
질문에 +1 Windows에 설치 / 컴파일 할 수 있습니까? 웹 사이트에는 Linux / Mac 만 표시됩니다. Bazel 실행을위한 가이드가 필요합니다. 이 예제는 배우기 좋은 출발점이 될 수 있습니다 : github.com/tensorflow/tensorflow/tree/master/tensorflow/…
alrama

이 질문에는 여전히 답이 없습니다. C ++ tensorflow 만 설치하는 방법 C ++ API 라이브러리에는 이에 대한 지침이 없으며, 허용 된 답변은 여러 제공된 링크를 통해 그 방법에 대한 지침을 제공하지 않습니다.
iantonuk

Windows의 경우이 질문 과 허용되는 답변이 가장 도움이되었습니다. 예제 트레이너 프로젝트를 빌드하면 전체 TensorFlow 프로젝트를 정적 라이브러리로 빌드 한 다음 링크합니다. 자신 만의 프로젝트를 만들고 동일한 방법으로 TensorFlow를 연결할 수 있습니다.
omatai

답변:


2

내가 찾은 Tensorflow C ++ API를 사용하는 한 가지 대안은 cppflow 를 사용하는 입니다.

Tensorflow C API 주위의 경량 C ++ 래퍼 입니다. 매우 작은 실행 파일이 있으며 libtensorflow.so이미 컴파일 된 파일 과 연결 됩니다. 사용 예도 있으며 Bazel 대신 CMAKE를 사용합니다.


55

시작하려면 여기 지침따라 Github에서 소스 코드를 다운로드 해야합니다 ( Bazel 및 최신 버전의 GCC 가 필요함 ).

C ++ API (및 시스템의 백엔드)는에 tensorflow/core있습니다. 현재 C ++ 세션 인터페이스C API 만 지원됩니다. 이 중 하나를 사용하여 Python API를 사용하여 빌드하고 GraphDef프로토콜 버퍼로 직렬화 된 TensorFlow 그래프를 실행할 수 있습니다 . C ++로 그래프를 작성하는 실험적인 기능도 있지만 현재는 Python API만큼 기능이 충분하지 않습니다 (예 : 현재 자동 차별화 기능이 지원되지 않음). C ++로 작은 그래프작성 하는 예제 프로그램을 여기서 볼 수 있습니다 .

C ++ API의 두 번째 부분은 OpKernelCPU 및 GPU에 대한 숫자 커널 구현을 포함하는 클래스 인 new를 추가하기위한 API입니다 . C ++에서 새로운 op를 추가하기위한 튜토리얼tensorflow/core/kernels 뿐만 아니라 이들을 빌드하는 방법에 대한 많은 예제가 있습니다 .


7
C ++에 대한 설치 지시 사항은 tensorflow.org/install 로 표시 되지 않지만 C ++ API를 명확하게 사용하는 tensorflow.org/api_guides/cc/guide 프로그램 예제가 있습니다 . Tensorflow 용 C ++을 정확히 어떻게 설치 했습니까?
user3667089

@ user3667089 설치 절차의 위치는 이제 tensorflow.org/install/install_sources에 있습니다
Dwight

6
@Dwight 이전에이 페이지를 보았지만 C ++에 대한 정보가 없습니다.
user3667089

2
@ user3667089 위의 설치 절차 후 헤더는 설치 절차 중에 선택한 Python 배포의 dist-packages 폴더 (예 : /usr/local/lib/python2.7/dist-packages) 내에 있습니다. 해당 폴더에는 모든 헤더가있는 tensorflow / include 폴더가 있습니다. 포함하는 경로가 포함되어 있는지 확인하려면 약간의 작업을 수행해야합니다. 나는 개인적으로 CMAKE를 사용하므로 이것을 통해 고민하고 있습니다.
드와이트

4
이것은 현재까지 실제 답변이 아닙니다. "시작"으로 시작한 다음 여기에서 안내를 찾는 사람들이 이미 찾은 장소에 관련 정보를 링크하지 않습니다. 그런 다음 주제를 변경하여 다음 단계를 제공하지 못합니다.
iantonuk

28

@mrry의 게시물에 추가하기 위해 C ++ API로 TensorFlow 그래프를로드하는 방법을 설명하는 자습서를 작성했습니다. 매우 작으며 모든 조각이 어떻게 결합되는지 이해하는 데 도움이됩니다. 그 고기는 다음과 같습니다.

요구 사항 :

  • 바젤 설치
  • 클론 텐서 플로우 리포

폴더 구조 :

  • tensorflow/tensorflow/|project name|/
  • tensorflow/tensorflow/|project name|/|project name|.cc (e.g. https://gist.github.com/jimfleming/4202e529042c401b17b7)
  • tensorflow/tensorflow/|project name|/BUILD

짓다:

cc_binary(
    name = "<project name>",
    srcs = ["<project name>.cc"],
    deps = [
        "//tensorflow/core:tensorflow",
    ]
)

해결 방법이있을 수있는 두 가지주의 사항 :

  • 지금 은 TensorFlow 저장소 에서 건물 작업을 수행해야합니다 .
  • 컴파일 된 바이너리는 크기가 큽니다 (103MB).

https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f


1
짐 안녕하세요. 이 튜토리얼은 여전히 ​​TF로 c ++ 프로젝트를 컴파일하는 가장 좋은 방법입니까? 또는 게시물 끝에서 예측할 때 더 쉬운 방법이 있습니까?
Sander

3
나는 이제 빌트인 빌드 규칙이 있다고 생각합니다. 나는 그것을 위해 PR을 잠시 제출했다. 경고에 대해 잘 모르겠습니다. 나는 그것이 TF가 아닌 Bazel의 결과이기 때문에 첫 번째가 남을 것으로 기대합니다. 두 번째는 개선 될 수 있습니다.
Jim

그 튜토리얼을 따랐지만 실행 ./loader하면 오류가 발생 Not found: models/train.pb합니다.
9th Dimension

3
이제 TensorFlow 소스 코드 디렉토리 외부에 프로젝트를 둘 수있는 방법이 있습니까?
Seanny123

그래, .so 라이브러리를 공유했다면 어떻게 축축하게 만드는가?
Xyz

15

Bazel로 프로젝트를 빌드하고 큰 바이너리를 생성하지 않으려면 CMake와 함께 TensorFlow C ++ 라이브러리의 사용법을 지시하는 저장소를 조립했습니다. 여기에서 찾을 수 있습니다 . 일반적인 아이디어는 다음과 같습니다.

  • TensorFlow 저장소를 복제하십시오.
  • 빌드 규칙을 추가하십시오 tensorflow/BUILD(제공된 규칙 에는 모든 C ++ 기능이 포함되지 않음).
  • TensorFlow 공유 라이브러리를 빌드하십시오.
  • 특정 버전의 Eigen 및 Protobuf를 설치하거나 외부 종속성으로 추가하십시오.
  • TensorFlow 라이브러리를 사용하도록 CMake 프로젝트를 구성하십시오.

15

먼저, 설치 한 후 protobuf그리고 eigen, 당신은 Tensorflow를 구축하고 싶습니다 :

./configure
bazel build //tensorflow:libtensorflow_cc.so

다음의 정보는 다음의 제품에 헤더와 동적 공유 라이브러리를 포함 복사합니다 /usr/local/lib/usr/local/include:

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

마지막으로 예제를 사용하여 컴파일하십시오.

g++ -std=c++11 -o tf_example \
-I/usr/local/include/tf \
-I/usr/local/include/eigen3 \
-g -Wall -D_DEBUG -Wshadow -Wno-sign-compare -w  \
-L/usr/local/lib/libtensorflow_cc \
`pkg-config --cflags --libs protobuf` -ltensorflow_cc tf_example.cpp

나는 protobuf와 고유를 설치할 필요가 없다고 생각합니다. bazel 작업 공간 구성에는 해당 구성 요소를 다운로드하고 빌드하는 규칙이 포함되어 있습니다.
4dan

마지막에 미친 공식 빌드 가이드 tensorflow.org/install/source는 그것이 심지어 tensorflow.org에 문서화 아니에요 : 빌드 옵션에 대해 "libtensorflow_cc.so tensorflow을"PIP 모듈, TKS을 구축하기위한 것입니다
datdinhquoc

@lababidi 'bazel build'명령 전에 어떤 C ++ 종속성이 있어야합니까? 한 시간 후에 빌드가 실패한다는 문제에 직면하고 있습니다. 이것은 빌드를 반복해서 테스트하기가 어렵습니다
datdinhquoc

15

독립형 패키지에서 Tensorflow c ++ API를 사용하려고 생각하는 경우 사용할 수있는 c ++ 버전을 빌드하려면 tensorflow_cc.so (ac API 버전 tensorflow.so도 있음)가 필요할 것입니다.

bazel build -c opt //tensorflow:libtensorflow_cc.so

참고 1 : 내장 지원을 추가하려는 경우이 플래그를 다음과 같이 추가 할 수 있습니다. --copt=-msse4.2 --copt=-mavx

참고 2 : 프로젝트에서 OpenCV를 사용하려는 경우 두 라이브러리를 함께 사용할 때 문제가 발생하고 ( tensorflow 문제 ) 사용해야합니다 --config=monolithic.

라이브러리를 빌드 한 후 프로젝트에 라이브러리를 추가해야합니다. 이를 위해 다음 경로를 포함시킬 수 있습니다.

tensorflow
tensorflow/bazel-tensorflow/external/eigen_archive
tensorflow/bazel-tensorflow/external/protobuf_archive/src
tensorflow/bazel-genfiles

라이브러리를 프로젝트에 연결하십시오.

tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so (unused if you build with --config=monolithic)
tensorflow/bazel-bin/tensorflow/libtensorflow_cc.so

또한 프로젝트를 빌드 할 때 c ++ 11 표준을 사용하도록 컴파일러에 지정해야합니다.

참고 : tensorflow 버전 1.5에 상대적인 경로 (버전에서 변경된 사항이 있는지 확인해야 할 수도 있음).

또한이 링크는이 모든 정보를 정기적으로 찾는으로 나에게 많은 도움이 : 링크를


1
버전 1.11로 빌드하려면이 추가 포함 경로가 필요했습니다.tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S


8

CMake를 사용하는 것이 마음에 들지 않으면 TF C ++ API를 빌드하고 설치하는 tensorflow_cc 프로젝트와 연결할 수있는 편리한 CMake 대상이 있습니다. 프로젝트 README에는 쉽게 따라갈 수있는 예제와 Dockerfile이 포함되어 있습니다.


8

Tensorflow를 직접 빌드하지 않고 운영 체제가 Debian 또는 Ubuntu 인 경우 Tensorflow C / C ++ 라이브러리를 사용하여 사전 빌드 된 패키지를 다운로드 할 수 있습니다. 이 배포판은 CPU를 사용한 C / C ++ 추론에 사용할 수 있으며 GPU 지원은 포함되지 않습니다.

https://github.com/kecsap/tensorflow_cpp_packaging/releases

Tensorflow (TFLearn)에서 검사 점을 고정하고 C / C ++ API와의 추론을 위해이 모델을로드하는 방법에 대한 지침이 있습니다.

https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md

주의 : 저는이 Github 프로젝트의 개발자입니다.


5

해킹 / 해결 방법을 사용하여 전체 TF 라이브러리를 직접 빌드하지 않아도됩니다 (시간을 절약 (3 분으로 설정), 디스크 공간, 개발자 종속성 설치 및 결과 바이너리 크기). 공식적으로 지원되지는 않지만 빠르게 뛰어 들기를 원한다면 잘 작동합니다.

pip ( pip install tensorflow또는 pip install tensorflow-gpu)를 통해 TF를 설치하십시오 . 그런 다음 라이브러리 _pywrap_tensorflow.so(TF 0. *-1.0) 또는 _pywrap_tensorflow_internal.so(TF 1.1+)를 찾으십시오 . 제 경우에는 (Ubuntu)에 있습니다 /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so. 그런 다음 lib_pywrap_tensorflow.so빌드 시스템에서 찾을 수있는 이 라이브러리에 대한 심볼릭 링크를 만듭니다 (예 :) /usr/lib/local. 접두사 lib가 중요합니다! 다른 lib*.so이름을 지정할 수도 있습니다. 전화하면 libtensorflow.soTF와 함께 작동하도록 작성된 다른 프로그램과의 호환성이 향상 될 수 있습니다.

그런 다음 익숙한대로 C ++ 프로젝트를 만듭니다 (CMake, Make, Bazel 등 원하는대로).

그런 다음 프로젝트에 TF를 사용할 수 있도록이 라이브러리에 링크 할 준비가되었습니다 (또한 python2.7라이브러리 에 링크해야합니다 )! CMake에서는 예를 들어 add를 추가하십시오 target_link_libraries(target _pywrap_tensorflow python2.7).

C ++ 헤더 파일은이 라이브러리 주위에 있습니다 (예 :) /usr/local/lib/python2.7/dist-packages/tensorflow/include/.

다시 한 번 :이 방법은 공식적으로 지원되지 않으며 다양한 문제가 발생할 수 있습니다. 라이브러리는 예를 들어 protobuf와 정적으로 연결되어있는 것처럼 보이므로 이상한 링크 타임 또는 런타임 문제가 발생할 수 있습니다. 그러나 저장된 그래프를로드하고 가중치를 복원하고 추론을 실행할 수 있습니다. 이는 C ++에서 가장 원하는 기능인 IMO입니다.


나는 이것을 작동시킬 수 없었다. 파이썬에 대한 정의되지 않은 참조에 대한 링크 시간 오류가 발생했습니다.undefined reference to 'PyType_IsSubtype'
0xcaff

아, 지적 해 주셔서 감사합니다 ... 당신은 또한 python2.7라이브러리에 연결해야합니다 ... 나는 그에 따라 게시물을 편집합니다.
Martin Pecka

@MartinPecka 나는 armv7l (Raspberry PI 2)로 Raspbian Buster에서 이것을 시도했습니다. 사용 가능한 최신 Python 2.7 및 3.7 휠은 1.14.0 용이지만 2.0.0을 대상으로합니다. 어쨌든 고마워, 난 당신의 해킹을 upvoted.
Daisuke Aramaki '12

2

Tensorflow 자체는 C ++ API에 대한 매우 기본적인 예만 제공합니다.
다음은 데이터 세트, rnn, lstm, cnn 및 더 많은 tensorflow c ++ 예제 를 포함하는 좋은 리소스입니다.


2

위의 답변은 라이브러리를 작성하는 방법을 보여주기에 충분하지만 헤더를 수집하는 방법은 여전히 ​​까다 롭습니다. 여기서 필요한 헤더를 복사하는 데 사용하는 작은 스크립트를 공유합니다.

SOURCEtensorflow 소스 (빌드) direcoty 인 첫 번째 매개 변수입니다. 수집 된 헤더를 보유
DST하는 두 번째 매개 변수 include directory입니다. (예 : cmake에서 include_directories(./collected_headers_here)).

#!/bin/bash

SOURCE=$1
DST=$2
echo "-- target dir is $DST"
echo "-- source dir is $SOURCE"

if [[ -e $DST ]];then
    echo "clean $DST"
    rm -rf $DST
    mkdir $DST
fi


# 1. copy the source code c++ api needs
mkdir -p $DST/tensorflow
cp -r $SOURCE/tensorflow/core $DST/tensorflow
cp -r $SOURCE/tensorflow/cc $DST/tensorflow
cp -r $SOURCE/tensorflow/c $DST/tensorflow

# 2. copy the generated code, put them back to
# the right directories along side the source code
if [[ -e $SOURCE/bazel-genfiles/tensorflow ]];then
    prefix="$SOURCE/bazel-genfiles/tensorflow"
    from=$(expr $(echo -n $prefix | wc -m) + 1)

    # eg. compiled protobuf files
    find $SOURCE/bazel-genfiles/tensorflow -type f | while read line;do
        #echo "procese file --> $line"
        line_len=$(echo -n $line | wc -m)
        filename=$(echo $line | rev | cut -d'/' -f1 | rev )
        filename_len=$(echo -n $filename | wc -m)
        to=$(expr $line_len - $filename_len)

        target_dir=$(echo $line | cut -c$from-$to)
        #echo "[$filename] copy $line $DST/tensorflow/$target_dir"
        cp $line $DST/tensorflow/$target_dir
    done
fi


# 3. copy third party files. Why?
# In the tf source code, you can see #include "third_party/...", so you need it
cp -r $SOURCE/third_party $DST

# 4. these headers are enough for me now.
# if your compiler complains missing headers, maybe you can find it in bazel-tensorflow/external
cp -RLf $SOURCE/bazel-tensorflow/external/eigen_archive/Eigen $DST
cp -RLf $SOURCE/bazel-tensorflow/external/eigen_archive/unsupported $DST
cp -RLf $SOURCE/bazel-tensorflow/external/protobuf_archive/src/google $DST
cp -RLf $SOURCE/bazel-tensorflow/external/com_google_absl/absl $DST

1
이것은 정말 도움이되는 스 니펫이었습니다. 디렉토리를 만드는 동안 문제가 있었으므로 mkdir -p $DST/tensorflow$target_dir전에 이것을 추가 해야했습니다.cp $line $DST/tensorflow/$target_dir
user969068

@hakunami 나는이 스크립트에서 요점을 만들었다 . 당신이 무슨 생각을하는지 제게 알려주세요. 당신이 당신의 자신의 요지를 만들고 싶다면, 나는 나의 것을 제거하고 당신의 것을 복제 할 것입니다.
Daisuke Aramaki '12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.