[C++] Google TensorFlow C ++ API를 빌드하고 사용하는 방법


Answers

@ mrry의 게시물에 추가하기 위해 C ++ API로 TensorFlow 그래프를로드하는 방법을 설명하는 자습서를 작성했습니다. 아주 작으며 모든 조각이 어떻게 맞는지 이해하는 데 도움이됩니다. 여기에 그것의 고기가있다.

요구 사항 :

  • Bazel 설치
  • 복제 Tensor 플로우 레포

폴더 구조 :

  • tensorflow/tensorflow/|project name|/
  • tensorflow/tensorflow/|project name|/|project name|.cc (eg 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

Question

C ++로 Google의 새로운 Tensorflow 라이브러리를 사용하기를 정말로 열망합니다. 웹 사이트와 워드 프로세서는 프로젝트의 C ++ API를 빌드하는 방법이 정말 명확하지 않으며 어디서부터 시작해야할지 모르겠습니다.

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







해킹 / 해결 방법을 사용하여 전체 TF 라이브러리를 직접 작성하지 않아도됩니다 (3 분 안에 설정 됨, 디스크 공간, dev 종속성 설치 및 결과 바이너리 크기). 공식적으로는 지원되지 않지만 빨리 뛰어 들려는 경우 잘 작동합니다.

TF를 통해 pip를 pip install tensorflow ( pip install tensorflow 또는 pip install tensorflow-gpu ). 그런 다음 라이브러리 _pywrap_tensorflow.so (TF 0. * - 1.0) 또는 _pywrap_tensorflow_internal.so (TF _pywrap_tensorflow_internal.so )를 _pywrap_tensorflow_internal.so . 내 경우에는 (우분투) /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so 있습니다. 그런 다음 빌드 시스템이 찾은 곳 (예 : /usr/lib/local )의 lib_pywrap_tensorflow.so 라는 라이브러리에 대한 심볼릭 링크를 만듭니다. 접두사 lib 는 중요합니다! 또 다른 lib*.so 이름을 줄 수 있습니다. libtensorflow.so 라고하면 TF로 작업하도록 작성된 다른 프로그램과의 호환성이 향상 될 수 있습니다.

그런 다음 C ++ 프로젝트를 만드십시오 (CMake, Make, Bazel, 원하는대로).

그리고 python2.7 라이브러리에 링크하여 프로젝트에 TF를 사용할 수있게 할 준비가되었습니다 (또한 python2.7 라이브러리와 링크해야합니다)! CMake에서, 예를 들어 target_link_libraries(target _pywrap_tensorflow python2.7) 추가하면됩니다.

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

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




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

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

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

참고 2 : 프로젝트에서 OpenCV를 사용할 생각이라면 libs를 함께 사용할 때 ( 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 표준을 사용하도록 지정해야합니다.

사이드 노트 : 텐센트 플로 버전 1.5와 관련된 경로 (버전이 바뀌 었는지 확인해야 할 수도 있음).

또한이 링크는이 모든 정보를 찾는 데 많은 도움이되었습니다. link




Links