C ++에서 Google의 새로운 Tensorflow 라이브러리를 사용하기를 정말로 간절히 원합니다. 웹 사이트와 문서는 프로젝트의 C ++ API를 빌드하는 방법에 대해 정말로 불분명하며 어디서부터 시작 해야할지 모르겠습니다.
더 많은 경험을 가진 사람이 tensorflow의 C ++ API 사용에 대한 안내서를 발견하고 공유하여 도움을 줄 수 있습니까?
C ++에서 Google의 새로운 Tensorflow 라이브러리를 사용하기를 정말로 간절히 원합니다. 웹 사이트와 문서는 프로젝트의 C ++ API를 빌드하는 방법에 대해 정말로 불분명하며 어디서부터 시작 해야할지 모르겠습니다.
더 많은 경험을 가진 사람이 tensorflow의 C ++ API 사용에 대한 안내서를 발견하고 공유하여 도움을 줄 수 있습니까?
답변:
내가 찾은 Tensorflow C ++ API를 사용하는 한 가지 대안은 cppflow 를 사용하는 것 입니다.
Tensorflow C API 주위의 경량 C ++ 래퍼 입니다. 매우 작은 실행 파일이 있으며 libtensorflow.so
이미 컴파일 된 파일 과 연결 됩니다. 사용 예도 있으며 Bazel 대신 CMAKE를 사용합니다.
시작하려면 여기 지침 에 따라 Github에서 소스 코드를 다운로드 해야합니다 ( Bazel 및 최신 버전의 GCC 가 필요함 ).
C ++ API (및 시스템의 백엔드)는에 tensorflow/core
있습니다. 현재 C ++ 세션 인터페이스 및 C API 만 지원됩니다. 이 중 하나를 사용하여 Python API를 사용하여 빌드하고 GraphDef
프로토콜 버퍼로 직렬화 된 TensorFlow 그래프를 실행할 수 있습니다 . C ++로 그래프를 작성하는 실험적인 기능도 있지만 현재는 Python API만큼 기능이 충분하지 않습니다 (예 : 현재 자동 차별화 기능이 지원되지 않음). C ++로 작은 그래프 를 작성 하는 예제 프로그램을 여기서 볼 수 있습니다 .
C ++ API의 두 번째 부분은 OpKernel
CPU 및 GPU에 대한 숫자 커널 구현을 포함하는 클래스 인 new를 추가하기위한 API입니다 . C ++에서 새로운 op를 추가하기위한 튜토리얼tensorflow/core/kernels
뿐만 아니라 이들을 빌드하는 방법에 대한 많은 예제가 있습니다 .
@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",
]
)
해결 방법이있을 수있는 두 가지주의 사항 :
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
./loader
하면 오류가 발생 Not found: models/train.pb
합니다.
Bazel로 프로젝트를 빌드하고 큰 바이너리를 생성하지 않으려면 CMake와 함께 TensorFlow C ++ 라이브러리의 사용법을 지시하는 저장소를 조립했습니다. 여기에서 찾을 수 있습니다 . 일반적인 아이디어는 다음과 같습니다.
tensorflow/BUILD
(제공된 규칙 에는 모든 C ++ 기능이 포함되지 않음).먼저, 설치 한 후 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
독립형 패키지에서 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에 상대적인 경로 (버전에서 변경된 사항이 있는지 확인해야 할 수도 있음).
또한이 링크는이 모든 정보를 정기적으로 찾는으로 나에게 많은 도움이 : 링크를
tensorflow/bazel-tensorflow/external/com_google_absl
이 ShellScript를 사용하여 대부분의 종속성을 설치, 복제, 빌드, 컴파일 및 필요한 모든 파일을 ../src/includes
폴더 로 가져올 수 있습니다 .
https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
CMake를 사용하는 것이 마음에 들지 않으면 TF C ++ API를 빌드하고 설치하는 tensorflow_cc 프로젝트와 연결할 수있는 편리한 CMake 대상이 있습니다. 프로젝트 README에는 쉽게 따라갈 수있는 예제와 Dockerfile이 포함되어 있습니다.
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 프로젝트의 개발자입니다.
해킹 / 해결 방법을 사용하여 전체 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.so
TF와 함께 작동하도록 작성된 다른 프로그램과의 호환성이 향상 될 수 있습니다.
그런 다음 익숙한대로 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'
python2.7
라이브러리에 연결해야합니다 ... 나는 그에 따라 게시물을 편집합니다.
Tensorflow 자체는 C ++ API에 대한 매우 기본적인 예만 제공합니다.
다음은 데이터 세트, rnn, lstm, cnn 및 더 많은 tensorflow c ++ 예제 를 포함하는 좋은 리소스입니다.
위의 답변은 라이브러리를 작성하는 방법을 보여주기에 충분하지만 헤더를 수집하는 방법은 여전히 까다 롭습니다. 여기서 필요한 헤더를 복사하는 데 사용하는 작은 스크립트를 공유합니다.
SOURCE
tensorflow 소스 (빌드) 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
mkdir -p $DST/tensorflow$target_dir
전에 이것을 추가 해야했습니다.cp $line $DST/tensorflow/$target_dir