Cách xây dựng và sử dụng api Google TensorFlow C ++


168

Tôi thực sự mong muốn bắt đầu sử dụng thư viện Tensorflow mới của Google trong C ++. Trang web và tài liệu thực sự không rõ ràng về cách xây dựng API C ++ của dự án và tôi không biết bắt đầu từ đâu.

Ai đó có nhiều kinh nghiệm hơn có thể giúp đỡ bằng cách khám phá và chia sẻ hướng dẫn sử dụng API C ++ của tenorflow không?


4
+1 cho câu hỏi của bạn. Bất kỳ cơ hội để cài đặt / biên dịch trên Windows? Trang web chỉ hiển thị Linux / Mac. Một hướng dẫn để có bazel chạy là cần thiết. Ví dụ này có thể là điểm khởi đầu tốt để tìm hiểu: github.com/tensorflow/tensorflow/tree/master/tensorflow/
Kẻ

Câu hỏi này vẫn chưa có câu trả lời. Cách cài đặt chỉ các thư viện API C ++ tenorflow C ++ không có hướng dẫn về nó và câu trả lời được chấp nhận không đưa ra bất kỳ lý do nào về cách đó, thậm chí thông qua bất kỳ liên kết nào được cung cấp.
iantonuk

Đối với Windows, tôi thấy câu hỏi này và câu trả lời được chấp nhận của nó hữu ích nhất. Bằng cách xây dựng dự án trainer trainer, bạn xây dựng toàn bộ dự án TensorFlow như một thư viện tĩnh, sau đó liên kết với nó. Bạn có thể thực hiện các dự án của riêng mình và liên kết TensorFlow theo cùng một cách.
omatai

Câu trả lời:


2

Một cách khác để sử dụng API Tensorflow C ++ mà tôi tìm thấy là sử dụng cppflow .

Đó là một trình bao bọc C ++ nhẹ xung quanh API C của Tensorflow . Bạn nhận được các tệp thực thi rất nhỏ và nó liên kết với libtensorflow.sotệp đã được biên dịch. Ngoài ra còn có các ví dụ về việc sử dụng và bạn sử dụng CMAKE thay vì Bazel.


55

Để bắt đầu, bạn nên tải xuống mã nguồn từ Github, bằng cách làm theo các hướng dẫn tại đây (bạn sẽ cần Bazel và một phiên bản GCC gần đây).

API C ++ (và phần phụ trợ của hệ thống) nằm trong tensorflow/core. Ngay bây giờ, chỉ có giao diện Phiên C ++API C đang được hỗ trợ. Bạn có thể sử dụng một trong hai cách này để thực thi các biểu đồ TensorFlow đã được xây dựng bằng API Python và được tuần tự hóa thành GraphDefbộ đệm giao thức. Ngoài ra còn có một tính năng thử nghiệm để xây dựng biểu đồ trong C ++, nhưng hiện tại nó không hoàn toàn đầy đủ tính năng như API Python (ví dụ: hiện tại không hỗ trợ phân biệt tự động). Bạn có thể thấy một chương trình ví dụ xây dựng một biểu đồ nhỏ trong C ++ tại đây .

Phần thứ hai của API C ++ là API để thêm một cái mới OpKernel, đây là lớp chứa các triển khai hạt nhân số cho CPU và GPU. Có rất nhiều ví dụ về cách xây dựng những thứ này tensorflow/core/kernels, cũng như một hướng dẫn để thêm một op mới trong C ++ .


7
Không có hướng dẫn cài đặt nào cho C ++ được hiển thị tenorflow.org/install , nhưng có những chương trình ví dụ được hiển thị tenorflow.org/api_guides/cc/guide rõ ràng đang sử dụng api C ++. Chính xác thì bạn đã cài đặt C ++ cho Tensorflow như thế nào?
dùng3667089

@ user3667089 Vị trí của quy trình cài đặt hiện được đặt tại tenorflow.org/install/install_source
Dwight

6
@Dwight Tôi đã thấy trang đó trước đây nhưng tôi không thấy bất kỳ thông tin nào về C ++
user3667089

2
@ user3667089 Các tiêu đề, sau quy trình cài đặt ở trên, sẽ nằm trong thư mục dist-gói của bản phân phối python mà bạn chọn trong quy trình cài đặt (chẳng hạn như /usr/local/lib/python2.7/dist-packages). Trong thư mục đó sẽ có một thư mục tenorflow / include, sẽ có tất cả các tiêu đề. Bạn sẽ cần phải làm một chút công việc để đảm bảo bất cứ thứ gì bạn đang xây dựng đều có trên đường đi. Cá nhân tôi sử dụng CMAKE, vì vậy tôi đang cố gắng vượt qua điều này .
Dwight

4
Đây không phải là một câu trả lời thực sự cho đến ngày nay. Nó bắt đầu bằng "Để bắt đầu" và sau đó liên kết không có thông tin liên quan ở một nơi mà mọi người tìm kiếm hướng dẫn ở đây sẽ tìm kiếm. Sau đó nó không cung cấp bước tiếp theo, thay đổi chủ đề.
iantonuk

28

Để thêm vào bài đăng của @ mrry, tôi tập hợp một hướng dẫn giải thích cách tải biểu đồ TensorFlow bằng API C ++. Nó rất tối thiểu và sẽ giúp bạn hiểu làm thế nào tất cả các mảnh khớp với nhau. Đây là thịt của nó:

Yêu cầu:

  • Đã cài đặt
  • Bản sao hàng chục

Cấu trúc thư mục:

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

XÂY DỰNG:

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

Hai thông báo có thể có cách giải quyết:

  • Ngay bây giờ, việc xây dựng mọi thứ cần phải xảy ra trong repo TensorFlow.
  • Nhị phân biên dịch là rất lớn (103MB).

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


1
Xin chào Jim. Hướng dẫn này có còn là cách tốt nhất / dễ nhất để biên dịch dự án c ++ với TF không? Hoặc có một cách dễ dàng hơn bây giờ như bạn dự đoán ở cuối bài viết của bạn?
Sander

3
Tôi tin rằng bây giờ đã có một quy tắc xây dựng tích hợp. Tôi đã gửi một PR cho nó một thời gian trở lại. Tôi không chắc chắn về sự cẩn thận. Tôi hy vọng người đầu tiên sẽ vẫn là kết quả của Bazel chứ không phải TF. Thứ hai có thể có thể được cải thiện theo.
Jim

Tôi đã làm theo hướng dẫn đó, nhưng khi chạy ./loadertôi gặp lỗi : Not found: models/train.pb.
Kích thước thứ 9 ngày

3
Bây giờ có cách nào để dự án của bạn nằm ngoài thư mục mã nguồn TensorFlow không?
Seanny123

vâng, làm thế nào để làm cho nó oustide cho bạn đã chia sẻ .so thư viện của tenorflow?
Xyz

15

Nếu bạn muốn tránh cả việc xây dựng các dự án của mình với Bazel và tạo ra một nhị phân lớn, tôi đã tập hợp một kho lưu trữ hướng dẫn việc sử dụng thư viện TensorFlow C ++ với CMake. Bạn có thể tìm thấy nó ở đây . Các ý tưởng chung như sau:

  • Nhân bản kho lưu trữ TensorFlow.
  • Thêm quy tắc xây dựng vào tensorflow/BUILD(những quy tắc được cung cấp không bao gồm tất cả các chức năng của C ++).
  • Xây dựng thư viện chia sẻ TensorFlow.
  • Cài đặt các phiên bản cụ thể của Eigen và Protobuf hoặc thêm chúng dưới dạng phụ thuộc bên ngoài.
  • Định cấu hình dự án CMake của bạn để sử dụng thư viện TensorFlow.

15

Đầu tiên, sau khi cài đặt protobufeigen, bạn muốn xây dựng Tensorflow:

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

Sau đó Sao chép phần sau bao gồm các tiêu đề và thư viện chia sẻ động vào /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/

Cuối cùng, biên dịch bằng một ví dụ:

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

Tôi tin rằng không cần thiết phải cài đặt protobuf và eigen. Cấu hình không gian làm việc của bazel bao gồm các quy tắc để tải xuống và xây dựng các thành phần đó.
4dan

cuối cùng, hướng dẫn xây dựng CHÍNH THỨC điên rồ tại tenorflow.org/install/source dành cho xây dựng mô-đun pip, tks cho tùy chọn xây dựng "tenorflow: libtensorflow_cc.so", nó thậm chí không được ghi lại trên tenorflow.org
datdinhquoc

@lababidi phụ thuộc c ++ nên là gì trước lệnh 'bazel build'? Tôi đang đối mặt với vấn đề rằng bản dựng bị lỗi sau một giờ, điều này rất khó để kiểm tra bản dựng nhiều lần
datdinhquoc

15

Nếu bạn đang suy nghĩ về việc sử dụng api Tensorflow c ++ trên một gói độc lập, có lẽ bạn sẽ cần có tenorflow_cc.so (Ngoài ra còn có phiên bản ac api tenorflow.so) để xây dựng phiên bản c ++ bạn có thể sử dụng:

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

Lưu ý1: Nếu bạn muốn thêm hỗ trợ nội tại, bạn có thể thêm các cờ này dưới dạng: --copt=-msse4.2 --copt=-mavx

Lưu ý2: Nếu bạn đang suy nghĩ về việc sử dụng OpenCV cho dự án của mình, thì có một vấn đề khi sử dụng cả hai lib cùng nhau ( vấn đề căng thẳng ) và bạn nên sử dụng --config=monolithic.

Sau khi xây dựng thư viện, bạn cần thêm nó vào dự án của bạn. Để làm điều đó bạn có thể bao gồm các đường dẫn này:

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

Và liên kết thư viện với dự án của bạn:

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

Và khi bạn đang xây dựng dự án của mình, bạn cũng nên xác định cho trình biên dịch của mình rằng bạn sẽ sử dụng các tiêu chuẩn c ++ 11.

Lưu ý bên lề: Các đường dẫn liên quan đến phiên bản kéo căng 1.5 (Bạn có thể cần kiểm tra xem trong phiên bản của mình có gì thay đổi không).

Ngoài ra liên kết này đã giúp tôi rất nhiều trong việc tìm kiếm tất cả các thông tin này: liên kết


1
Tôi cần bổ sung này bao gồm đường dẫn để xây dựng với phiên bản 1.11:tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S


8

Nếu bạn không phiền khi sử dụng CMake, thì cũng có dự án tenorflow_cc xây dựng và cài đặt API TF C ++ cho bạn, cùng với các mục tiêu CMake thuận tiện mà bạn có thể liên kết. Dự án README chứa một ví dụ và Dockerfiles bạn có thể dễ dàng theo dõi.


8

Nếu bạn không muốn tự mình xây dựng Tensorflow và hệ điều hành của bạn là Debian hoặc Ubuntu, bạn có thể tải xuống các gói dựng sẵn với các thư viện Tensorflow C / C ++. Phân phối này có thể được sử dụng cho suy luận C / C ++ với CPU, không hỗ trợ GPU:

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

Có các hướng dẫn được viết về cách đóng băng một điểm kiểm tra trong Tensorflow (TFLearn) và tải mô hình này để suy luận với API C / C ++:

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

Coi chừng: Tôi là nhà phát triển dự án Github này.


5

Tôi sử dụng hack / cách khắc phục để tránh phải tự xây dựng toàn bộ thư viện TF (giúp tiết kiệm cả thời gian (được thiết lập trong 3 phút), dung lượng đĩa, cài đặt phụ thuộc dev và kích thước của tệp nhị phân kết quả). Nó chính thức không được hỗ trợ, nhưng hoạt động tốt nếu bạn chỉ muốn nhanh chóng nhảy vào.

Cài đặt TF thông qua pip ( pip install tensorflowhoặc pip install tensorflow-gpu). Sau đó tìm thư viện của nó _pywrap_tensorflow.so(TF 0. * - 1.0) hoặc _pywrap_tensorflow_internal.so(TF 1.1+). Trong trường hợp của tôi (Ubuntu), nó nằm ở /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so. Sau đó, tạo một liên kết tượng trưng đến thư viện này được gọi lib_pywrap_tensorflow.soở đâu đó nơi hệ thống xây dựng của bạn tìm thấy nó (ví dụ /usr/lib/local). Tiền tố liblà quan trọng! Bạn cũng có thể đặt cho nó một lib*.sotên khác - nếu bạn gọi nó libtensorflow.so, bạn có thể có khả năng tương thích tốt hơn với các chương trình khác được viết để làm việc với TF.

Sau đó, tạo một dự án C ++ như bạn đã quen (CMake, Make, Bazel, bất cứ điều gì bạn thích).

Và sau đó, bạn đã sẵn sàng chỉ liên kết với thư viện này để có sẵn TF cho các dự án của bạn (và bạn cũng phải liên kết với python2.7các thư viện)! Trong CMake, bạn ví dụ chỉ cần thêm target_link_libraries(target _pywrap_tensorflow python2.7).

Các tệp tiêu đề C ++ được đặt xung quanh thư viện này, ví dụ như trong /usr/local/lib/python2.7/dist-packages/tensorflow/include/ .

Một lần nữa: cách này chính thức không được hỗ trợ và bạn có thể chạy trong nhiều vấn đề khác nhau. Thư viện dường như được liên kết tĩnh với ví dụ như protobuf, vì vậy bạn có thể chạy trong các vấn đề thời gian liên kết hoặc thời gian chạy lẻ. Nhưng tôi có thể tải một biểu đồ được lưu trữ, khôi phục các trọng số và chạy suy luận, đó là IMO chức năng mong muốn nhất trong C ++.


Tôi không thể làm việc này. Tôi đã nhận được một loạt các lỗi thời gian liên kết về các tham chiếu không xác định đến nội dung python như:undefined reference to 'PyType_IsSubtype'
0xcaff

Ồ, cảm ơn vì đã chỉ ra ... Bạn cũng phải liên kết với python2.7thư viện ... Tôi sẽ chỉnh sửa bài đăng cho phù hợp.
Martin Pecka

@MartinPecka Tôi đã thử điều này trên Raspbian Buster với armv7l (Raspberry PI 2). Các bánh xe Python 2.7 và 3.7 mới nhất hiện có là 1.14.0, nhưng tôi đang nhắm mục tiêu 2.0.0. Dù sao cũng cảm ơn, tôi đã nâng cấp hack của bạn.
Daisuke Aramaki

2

Bản thân Tensorflow chỉ cung cấp các ví dụ rất cơ bản về API C ++.
Đây là một tài nguyên tốt bao gồm các ví dụ về bộ dữ liệu, rnn, lstm, cnn và các ví dụ c ++ căng thẳng hơn


2

câu trả lời ở trên là đủ tốt để chỉ ra cách xây dựng thư viện, nhưng làm thế nào để thu thập các tiêu đề vẫn còn khó khăn. Ở đây tôi chia sẻ tập lệnh nhỏ mà tôi sử dụng để sao chép các tiêu đề cần thiết.

SOURCElà thông số đầu tiên, đó là direcoty nguồn tenorflow (build);
DSTlà thông số thứ hai, là phần include directorygiữ các tiêu đề được thu thập. (ví dụ: tính bằng 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
đây thực sự là đoạn trích hữu ích, đã xảy ra sự cố khi tạo thư mục, vì vậy tôi phải thêm phần này mkdir -p $DST/tensorflow$target_dirtrướccp $line $DST/tensorflow/$target_dir
user969068

@hakunami Mình đã làm một ý chính trong kịch bản này . Cho tôi biết bạn nghĩ gì. Nếu bạn muốn tạo ra ý chính của riêng mình, tôi sẽ xóa cái của tôi và sao chép của bạn.
Daisuke Aramaki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.