วิธีสร้างและใช้ Google TensorFlow C ++ api


168

ฉันกระตือรือร้นที่จะเริ่มใช้ห้องสมุด Tensorflow ใหม่ของ Google ใน C ++ เว็บไซต์และเอกสารไม่ชัดเจนจริงๆในแง่ของวิธีการสร้าง C ++ API ของโครงการและฉันไม่รู้ว่าจะเริ่มต้นอย่างไร

ใครบางคนที่มีประสบการณ์ช่วยด้วยการค้นพบและแบ่งปันคำแนะนำในการใช้ 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

มันเป็น C น้ำหนักเบา ++ ห่อหุ้มรอบTensorflow C API คุณได้รับไฟล์เรียกทำงานที่เล็กมากและมันเชื่อมโยงกับlibtensorflow.soไฟล์ที่คอมไพล์แล้ว นอกจากนี้ยังมีตัวอย่างการใช้งานและคุณใช้ CMAKE แทน Bazel


55

ในการเริ่มต้นคุณควรดาวน์โหลดซอร์สโค้ดจาก Github โดยทำตามคำแนะนำที่นี่ (คุณต้องมีBazelและ GCC รุ่นล่าสุด)

c ++ API (และแบ็กเอนด์ของระบบ) tensorflow/coreอยู่ใน ขณะนี้มีเพียงอินเทอร์เฟซเซสชัน C ++และC APIที่ได้รับการสนับสนุน คุณสามารถใช้สิ่งใดสิ่งหนึ่งเหล่านี้เพื่อดำเนินการกราฟ TensorFlow ที่สร้างขึ้นโดยใช้ Python API และต่อเนื่องเป็นGraphDefบัฟเฟอร์โปรโตคอล นอกจากนี้ยังมีฟีเจอร์การทดลองสำหรับการสร้างกราฟใน C ++ แต่ปัจจุบันไม่ได้มีคุณลักษณะครบถ้วนเช่น Python API (เช่นไม่มีการสนับสนุนสำหรับการสร้างความแตกต่างโดยอัตโนมัติในปัจจุบัน) คุณสามารถดูตัวอย่างโปรแกรมที่สร้างกราฟขนาดเล็กใน C ++ ที่นี่

ส่วนที่สองของ C ++ API คือ API สำหรับการเพิ่มใหม่OpKernelซึ่งเป็นคลาสที่มีการใช้งานของเคอร์เนลเชิงตัวเลขสำหรับ CPU และ GPU มีตัวอย่างมากมายของวิธีการที่จะสร้างในสิ่งเหล่านี้เป็นtensorflow/core/kernelsเช่นเดียวกับการกวดวิชาสำหรับการเพิ่ม op ใหม่ใน C ++


7
ไม่มีคำแนะนำในการติดตั้งสำหรับ C ++ ที่แสดงtensorflow.org/installแต่มีโปรแกรมตัวอย่างที่แสดงtensorflow.org/api_guides/cc/guideที่ใช้ C ++ api อย่างชัดเจน คุณติดตั้ง C ++ สำหรับ Tensorflow ได้อย่างไร
user3667089

@ user3667089 ตำแหน่งของขั้นตอนการติดตั้งตอนนี้อยู่ที่tensorflow.org/install/install_sources
Dwight

6
@ ดไวท์ฉันเห็นหน้านั้นมาก่อน แต่ฉันไม่เห็นข้อมูลใด ๆ เกี่ยวกับ C ++
user3667089

2
@ user3667089 ส่วนหัวหลังจากขั้นตอนการติดตั้งข้างต้นจะอยู่ภายในโฟลเดอร์ dist-packages ของการแจกจ่ายหลามที่คุณเลือกระหว่างขั้นตอนการติดตั้ง (เช่น /usr/local/lib/python2.7/dist-packages) ในโฟลเดอร์นั้นจะมีโฟลเดอร์ tensorflow / include ซึ่งจะมีส่วนหัวทั้งหมด คุณจะต้องทำงานเล็กน้อยเพื่อให้แน่ใจว่าสิ่งที่คุณกำลังสร้างนั้นอยู่บนเส้นทางนั้น ฉันใช้ CMAKE เป็นการส่วนตัวดังนั้นฉันจึงต้องผ่านสิ่งนี้ไป
Dwight

4
นี่ไม่ใช่คำตอบที่แท้จริงจนถึงวันนี้ มันเริ่มต้นด้วย "เริ่มต้นใช้งาน" จากนั้นลิงก์ไม่มีข้อมูลที่เกี่ยวข้องในสถานที่ที่ผู้คนมองหาคำแนะนำที่นี่จะค้นหาแล้ว จากนั้นจะไม่สามารถให้ขั้นตอนต่อไปเปลี่ยนหัวเรื่องได้
iantonuk

28

หากต้องการเพิ่มในโพสต์ของ @ mrry ฉันได้รวบรวมบทแนะนำที่อธิบายวิธีโหลดกราฟ TensorFlow ด้วย C ++ API มันน้อยมากและจะช่วยให้คุณเข้าใจว่าชิ้นส่วนทั้งหมดเข้าด้วยกันได้อย่างไร นี่คือเนื้อของมัน:

ที่ต้องการ:

  • ติดตั้งBazel
  • โคลน TensorFlow repo

โครงสร้างโฟลเดอร์:

  • 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 repo
  • ไบนารีที่รวบรวมนั้นมีขนาดใหญ่มาก (103MB)

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


1
สวัสดีจิม บทช่วยสอนนี้ยังคงเป็นวิธีที่ดีที่สุด / ง่ายที่สุดในการรวบรวมโครงการ c ++ กับ TF หรือไม่ หรือตอนนี้มีวิธีที่ง่ายกว่าที่คุณคาดการณ์ไว้ตอนท้ายโพสต์?
Sander

3
ฉันเชื่อว่าขณะนี้มีกฎการ build ในตัว ฉันส่ง PR ไปสักพักแล้ว ฉันไม่แน่ใจเกี่ยวกับคำเตือน ฉันคาดหวังว่าคนแรกจะยังคงอยู่เนื่องจากเป็นผลมาจาก Bazel ไม่ใช่ TF อาจมีการปรับปรุงที่สองเมื่อ
Jim

ผมทำตามที่กวดวิชา แต่เมื่อทำงานฉันได้รับข้อผิดพลาด:./loader Not found: models/train.pb
มิติที่ 9

3
มีวิธีที่จะมีโครงการของคุณนอกไดเรกทอรีรหัส TensorFlow หรือไม่
Seanny123

ใช่วิธีที่จะทำให้เป็นโมฆะเพราะคุณได้แบ่งปัน. so ไลบรารีของ tenorflow?
Xyz

15

หากคุณต้องการหลีกเลี่ยงการสร้างโครงการของคุณด้วย Bazel และสร้างไบนารีขนาดใหญ่ฉันได้รวบรวมที่เก็บข้อมูลเพื่อแนะนำการใช้งานห้องสมุด TensorFlow C ++ ด้วย CMake คุณสามารถค้นหาได้ที่นี่ แนวคิดทั่วไปมีดังนี้:

  • โคลนที่เก็บ TensorFlow
  • เพิ่มกฎการสร้างให้กับtensorflow/BUILD(สิ่งที่ให้ไว้ไม่รวมฟังก์ชัน C ++ ทั้งหมด)
  • สร้างไลบรารีที่แบ่งใช้ TensorFlow
  • ติดตั้งรุ่นเฉพาะของ Eigen และ Protobuf หรือเพิ่มเป็นการอ้างอิงภายนอก
  • กำหนดค่าโครงการ CMake ของคุณเพื่อใช้ไลบรารี TensorFlow

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 และ eigen การกำหนดค่าเวิร์กสเปซ bazel มีกฎเพื่อดาวน์โหลดและสร้างส่วนประกอบเหล่านั้น
4

ในที่สุดคู่มือการสร้างอย่างเป็นทางการบ้าที่tensorflow.org/install/sourceสำหรับการสร้างโมดูล pip, tks สำหรับตัวเลือกการสร้าง "tensorflow: libtensorflow_cc.so" มันไม่ได้บันทึกไว้ใน tensorflow.org
datdinhquoc

@lababidi การพึ่งพา c ++ อะไรควรอยู่ก่อนคำสั่ง 'bazel build' ฉันกำลังเผชิญกับปัญหาที่การสร้างล้มเหลวหลังจากผ่านไปหนึ่งชั่วโมงนี่เป็นเรื่องยากที่จะทดสอบการสร้างอีกครั้งและอีกครั้ง
datdinhquoc

15

หากคุณคิดที่จะใช้ Tensorflow c ++ api บนแพ็กเกจแบบสแตนด์อะโลนคุณอาจต้องใช้ tensorflow_cc.so (นอกจากนี้ยังมี ac api version tensorflow.so) เพื่อสร้างเวอร์ชัน c ++ ที่คุณสามารถใช้:

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

หมายเหตุ 1: หากคุณต้องการเพิ่มการสนับสนุนภายในคุณสามารถเพิ่มการตั้งค่าสถานะนี้เป็น: --copt=-msse4.2 --copt=-mavx

Note2: หากคุณมีความคิดในการใช้ 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

หมายเหตุด้านข้าง: เส้นทางที่สัมพันธ์กับ tensorflow เวอร์ชัน 1.5 (คุณอาจต้องตรวจสอบว่ามีอะไรเปลี่ยนแปลงในรุ่นของคุณหรือไม่)

นอกจากนี้ลิงค์นี้ยังช่วยให้ฉันค้นพบข่าวสารทั้งหมดนี้ได้ด้วย: ลิงค์


1
ฉันต้องการเส้นทางเพิ่มเติมนี้เพื่อสร้างด้วยเวอร์ชัน 1.11:tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S

8

คุณสามารถใช้ ShellScript นี้เพื่อติดตั้ง (ส่วนใหญ่) ของการพึ่งพา, โคลน, สร้าง, คอมไพล์และรวบรวมไฟล์ที่จำเป็นทั้งหมดลงใน../src/includesโฟลเดอร์:

https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh


8

หากคุณไม่สนใจการใช้ CMake ก็มีโครงการtenorflow_ccที่สร้างและติดตั้ง TF C ++ API สำหรับคุณพร้อมกับเป้าหมาย CMake ที่คุณสามารถเชื่อมโยงได้ โครงการ README มีตัวอย่างและ Dockerfiles ที่คุณสามารถติดตามได้อย่างง่ายดาย


8

หากคุณไม่ต้องการสร้าง Tensorflow ด้วยตัวเองและระบบปฏิบัติการของคุณคือ Debian หรือ Ubuntu คุณสามารถดาวน์โหลดแพ็คเกจที่สร้างไว้ล่วงหน้าด้วยไลบรารี Tensorflow C / C ++ การกระจายนี้สามารถใช้สำหรับการอนุมาน C / C ++ กับ CPU การสนับสนุน 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 นาที) พื้นที่ดิสก์การติดตั้งการพึ่งพา dev และขนาดของไบนารีที่ได้) ไม่ได้รับการสนับสนุนอย่างเป็นทางการ แต่ใช้งานได้ดีหากคุณต้องการกระโดดเข้ามาอย่างรวดเร็ว

ติดตั้ง TF ผ่าน pip ( pip install tensorflowหรือpip install tensorflow-gpu) จากนั้นค้นหาห้องสมุด_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มันอยู่ที่ จากนั้นสร้าง symlink ไปยังไลบรารีนี้ซึ่งเรียกว่าlib_pywrap_tensorflow.soที่ซึ่งระบบการสร้างของคุณพบ (เช่น/usr/lib/local) คำนำหน้าlibเป็นสิ่งสำคัญ! คุณสามารถlib*.soตั้งชื่ออื่นได้- ถ้าคุณเรียกมันว่าlibtensorflow.soคุณอาจเข้ากันได้ดีกับโปรแกรมอื่น ๆ ที่เขียนเพื่อใช้กับ TF

จากนั้นสร้างโครงการ C ++ ตามที่คุณคุ้นเคย (CMake, Make, Bazel, อะไรก็ได้ที่คุณชอบ)

จากนั้นคุณก็พร้อมที่จะเชื่อมโยงกับไลบรารีนี้เพื่อให้ TF พร้อมใช้งานสำหรับโครงการของคุณ (และคุณต้องเชื่อมโยงกับpython2.7ไลบรารี)! ใน CMake target_link_libraries(target _pywrap_tensorflow python2.7)คุณเช่นเพียงแค่เพิ่ม

c ++ ไฟล์ส่วนหัวตั้งอยู่รอบ ๆ /usr/local/lib/python2.7/dist-packages/tensorflow/include/ห้องสมุดนี้เช่นใน

อีกครั้ง: วิธีนี้ไม่ได้รับการสนับสนุนอย่างเป็นทางการและคุณอาจทำงานในปัญหาต่าง ๆ ดูเหมือนว่าห้องสมุดจะมีการเชื่อมโยงกับ static เช่น protobuf ดังนั้นคุณอาจทำงานในปัญหา link-time หรือ run-time คี่ แต่ฉันสามารถโหลดกราฟที่เก็บไว้คืนค่าน้ำหนักและเรียกใช้การอนุมานซึ่งเป็น IMO ฟังก์ชันที่ต้องการมากที่สุดใน C ++


ฉันทำงานนี้ไม่ได้ ฉันพบข้อผิดพลาดเกี่ยวกับการอ้างอิงที่ไม่ได้กำหนดของ python เช่น:undefined reference to 'PyType_IsSubtype'
0xcaff

โอ้ขอบคุณสำหรับการชี้ให้เห็น ... คุณต้องเชื่อมโยงกับpython2.7ห้องสมุด ... ฉันจะแก้ไขโพสต์ตาม
Martin Pecka

@MartinPecka ฉันลองใช้ Raspbian Buster กับ armv7l (Raspberry PI 2) Python 2.7 และ 3.7 ล้อล่าสุดที่มีอยู่สำหรับ 1.14.0 แต่ฉันกำหนดเป้าหมาย 2.0.0 ขอบคุณฉัน upvoted แฮ็คของคุณ
ไดสุเกะอารามากิ


2

คำตอบข้างต้นดีพอที่จะแสดงวิธีสร้างห้องสมุด แต่วิธีการรวบรวมส่วนหัวยังคงมีความยุ่งยาก ที่นี่ฉันแบ่งปันสคริปต์เล็กน้อยที่ฉันใช้เพื่อคัดลอกส่วนหัวที่จำเป็น

SOURCEเป็นพารามิเตอร์แรกซึ่งเป็นแหล่งเทนเซอร์โฟลว์ (บิลด์) ไดเร็คตี้;
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 ฉันทำส่วนสำคัญออกมาจากสคริปต์นี้ แจ้งให้เราทราบสิ่งที่คุณคิด. ถ้าคุณต้องการที่จะทำแก่นสารของคุณเองฉันจะลบของฉันและโคลนของคุณ
ไดสุเกะอารามากิ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.