สร้าง TensorFlow Lite ด้วย CMake

หน้านี้อธิบายวิธีสร้างและใช้ไลบรารี TensorFlow Lite ด้วยเครื่องมือ CMake

วิธีการต่อไปนี้ได้รับการทดสอบใน Ubuntu 16.04.3 64-bit PC (AMD64) , macOS Catalina (x86_64), Windows 10 และ TensorFlow devel Docker อิมเมจ tensorflow/tensorflow:devel

ขั้นตอนที่ 1 ติดตั้งเครื่องมือ CMake

ต้องใช้ CMake 3.16 ขึ้นไป บน Ubuntu คุณสามารถเรียกใช้คำสั่งต่อไปนี้

sudo apt-get install cmake

หรือคุณจะทำตามคู่มือการติดตั้งอย่างเป็นทางการของ cmake ก็ได้

ขั้นตอนที่ 2 โคลนที่เก็บ TensorFlow

git clone https://github.com/tensorflow/tensorflow.git tensorflow_src

ขั้นตอนที่ 3 สร้างไดเรกทอรีบิลด์ CMake

mkdir tflite_build
cd tflite_build

ขั้นตอนที่ 4 เรียกใช้เครื่องมือ CMake ด้วยการกำหนดค่า

รุ่นที่เผยแพร่

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

cmake ../tensorflow_src/tensorflow/lite

แก้ไขข้อบกพร่องของบิลด์

หากต้องการสร้างบิลด์การแก้ไขข้อบกพร่องที่มีข้อมูลสัญลักษณ์ คุณต้องระบุตัวเลือก -DCMAKE_BUILD_TYPE=Debug

cmake ../tensorflow_src/tensorflow/lite -DCMAKE_BUILD_TYPE=Debug

สร้างด้วยการทดสอบหน่วยเคอร์เนล

คุณต้องระบุแฟล็ก -DTFLITE_KERNEL_TEST=on เพื่อเรียกใช้การทดสอบเคอร์เนล ข้อมูลจำเพาะของการคอมไพล์การทดสอบ 1 หน่วยจะอยู่ในส่วนย่อยถัดไป

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_KERNEL_TEST=on

สร้างแพ็กเกจที่ติดตั้งได้

หากต้องการสร้างแพ็กเกจแบบติดตั้งได้ที่ใช้เป็นทรัพยากร Dependency โดยโปรเจ็กต์ CMake อื่นที่มี find_package(tensorflow-lite CONFIG) ให้ใช้ตัวเลือก -DTFLITE_ENABLE_INSTALL=ON

นอกจากนี้คุณควรระบุทรัพยากร Dependency ของไลบรารีในเวอร์ชันของคุณเองด้วย ซึ่งโปรเจ็กต์ที่ต้องใช้ TF Lite จะต้องใช้ข้อมูลดังกล่าว คุณใช้ -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON และตั้งค่าตัวแปร <PackageName>_DIR ให้ชี้ไปยังการติดตั้งไลบรารีได้

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_INSTALL=ON \
  -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON \
  -DSYSTEM_FARMHASH=ON \
  -DSYSTEM_PTHREADPOOL=ON \
  -Dabsl_DIR=<install path>/lib/cmake/absl \
  -DEigen3_DIR=<install path>/share/eigen3/cmake \
  -DFlatBuffers_DIR=<install path>/lib/cmake/flatbuffers \
  -Dgemmlowp_DIR=<install path>/lib/cmake/gemmlowp \
  -DNEON_2_SSE_DIR=<install path>/lib/cmake/NEON_2_SSE \
  -Dcpuinfo_DIR=<install path>/share/cpuinfo \
  -Druy_DIR=<install path>/lib/cmake/ruy
find_package

การคอมไพล์แบบข้ามระบบ

คุณใช้ CMake เพื่อสร้างไบนารีสำหรับสถาปัตยกรรมเป้าหมายของ ARM64 หรือ Android ได้

ในคอมไพล์ TF Lite แบบข้ามแพลตฟอร์ม คุณต้องระบุเส้นทางไปยัง SDK (เช่น ARM64 SDK หรือ NDK ในกรณีของ Android) พร้อมแฟล็ก -DCMAKE_TOOLCHAIN_FILE

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
ข้อมูลจำเพาะของการคอมไพล์แบบข้ามระบบ Android

สำหรับการคอมไพล์ข้ามแพลตฟอร์มของ Android คุณต้องติดตั้ง Android NDK และระบุเส้นทาง NDK พร้อม -DCMAKE_TOOLCHAIN_FILE Flag ที่กล่าวถึงข้างต้น นอกจากนี้ คุณยังต้องตั้งค่า ABI เป้าหมายด้วย -DANDROID_ABI อีกด้วย

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
ข้อมูลจำเพาะของเคอร์เนล (หน่วย) ทดสอบการคอมไพล์ข้าม

การคอมไพล์การทดสอบ 1 หน่วยข้ามหน่วยต้องใช้คอมไพเลอร์แฟลตสำหรับสถาปัตยกรรมของโฮสต์ สำหรับวัตถุประสงค์นี้ จะมี CMakeLists อยู่ใน tensorflow/lite/tools/cmake/native_tools/flatbuffers เพื่อสร้างคอมไพเลอร์ Flatc ด้วย CMake ก่อนล่วงหน้าในไดเรกทอรีบิลด์ที่แยกต่างหากโดยใช้ Toolchain ของโฮสต์

mkdir flatc-native-build && cd flatc-native-build
cmake ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .

นอกจากนี้คุณยังสามารถติดตั้ง flatc ในตำแหน่งการติดตั้งที่กำหนดเอง (เช่น ไปยังไดเรกทอรีที่มีเครื่องมืออื่นๆ ที่สร้างขึ้นมาในตัวแทนไดเรกทอรี CMakebuild) ดังนี้

cmake -DCMAKE_INSTALL_PREFIX=<native_tools_dir> ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .

สำหรับการคอมไพล์ข้ามของ TF Lite คุณต้องระบุพารามิเตอร์เพิ่มเติม -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ที่ชี้ไปยังไดเรกทอรีที่มีไบนารี flatc เนทีฟพร้อมกับแฟล็ก -DTFLITE_KERNEL_TEST=on ที่ระบุไว้ข้างต้น

cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} -DTFLITE_KERNEL_TEST=on -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ../tensorflow/lite/
เปิดตัวการทดสอบเคอร์เนล (หน่วย) ที่คอมไพล์ข้ามเป้าหมาย

คุณจะทดสอบ 1 หน่วยเป็นไฟล์ปฏิบัติการแยกต่างหากหรือจะใช้ยูทิลิตี CTest ก็ได้ ตามที่ CTest กังวล หากมีพารามิเตอร์อย่างน้อย 1 รายการ TFLITE_ENABLE_XNNPACKorTFLITE_EXTERNAL_DELEGATE" เปิดใช้อยู่สำหรับบิลด์ TF Lite ระบบจะสร้างการทดสอบผลลัพธ์ด้วยป้ายกำกับ 2 แบบ (โดยใช้ไฟล์ดำเนินการทดสอบเดียวกัน) ได้แก่ - ทั่วไป - แสดงการทดสอบที่ใช้ซึ่งเปิดใช้ใน CPU - ระบุการทดสอบเพิ่มเติมซึ่งทำงานบน CPU

ทั้ง CTestTestfile.cmake และ run-tests.cmake (ดังที่ระบุด้านล่าง) มีให้บริการในภาษา<build_dir>/kernels

การเปิดตัวการทดสอบหน่วยด้วยแบ็กเอนด์ CPU (หากมี CTestTestfile.cmake อยู่ในเป้าหมายในไดเรกทอรีปัจจุบัน):

ctest -L plain

ตัวอย่างการทดสอบหน่วยโดยใช้ผู้รับมอบสิทธิ์ (หากมีไฟล์ CTestTestfile.cmake และ run-tests.cmake อยู่ในเป้าหมายในไดเรกทอรีปัจจุบัน)

cmake -E env TESTS_ARGUMENTS=--use_xnnpack=true ctest -L delegate
cmake -E env TESTS_ARGUMENTS=--external_delegate_path=<PATH> ctest -L delegate

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

การมอบสิทธิ์ OpenCL GPU

หากเครื่องเป้าหมายรองรับ OpenCL คุณจะใช้การมอบสิทธิ์ GPU ได้ ซึ่งจะใช้ประโยชน์จากพลังของ GPU

วิธีกำหนดค่าการรองรับการมอบสิทธิ์ GPU ของ OpenCL มีดังนี้

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_GPU=ON

ขั้นตอนที่ 5 สร้าง TensorFlow Lite

ในไดเรกทอรี tflite_build

cmake --build . -j

ขั้นตอนที่ 6 เครื่องมือการเปรียบเทียบ TensorFlow Lite และตัวอย่างรูปภาพป้ายกำกับ (ไม่บังคับ)

ในไดเรกทอรี tflite_build

cmake --build . -j -t benchmark_model
cmake --build . -j -t label_image

ตัวเลือกที่พร้อมใช้งานในการสร้าง TensorFlow Lite

รายการตัวเลือกที่ใช้ได้มีดังนี้ คุณจะลบล้างได้ด้วย -D<option_name>=[ON|OFF] ตัวอย่างเช่น -DTFLITE_ENABLE_XNNPACK=OFF เพื่อปิดใช้ XNNPACK ซึ่งจะเปิดใช้โดยค่าเริ่มต้น

ชื่อตัวเลือก ฟีเจอร์ Android Linux macOS Windows
TFLITE_ENABLE_RUY เปิดใช้ไลบรารีการคูณ เมทริกซ์ RUY เปิด ปิด ปิด ปิด
TFLITE_ENABLE_GPU เปิดใช้การมอบสิทธิ์ GPU ปิด ปิด ไม่มีข้อมูล ไม่มีข้อมูล
TFLITE_ENABLE_XNNPACK เปิดใช้ผู้รับมอบสิทธิ์ XNNPACK เปิด เปิด เปิด เปิด
TFLITE_ENABLE_MMAP เปิดใช้ MMAP เปิด เปิด เปิด ไม่มีข้อมูล

สร้างโปรเจ็กต์ CMake ที่ใช้ TensorFlow Lite

ต่อไปนี้เป็น CMakeLists.txt ของตัวอย่าง TFLite Mini

คุณต้องมี add_subdirectory() สำหรับไดเรกทอรีและลิงก์ TensorFlow Lite tensorflow-lite ด้วย target_link_libraries()

cmake_minimum_required(VERSION 3.16)
project(minimal C CXX)

set(TENSORFLOW_SOURCE_DIR "" CACHE PATH
  "Directory that contains the TensorFlow project" )
if(NOT TENSORFLOW_SOURCE_DIR)
  get_filename_component(TENSORFLOW_SOURCE_DIR
    "${CMAKE_CURRENT_LIST_DIR}/../../../../" ABSOLUTE)
endif()

add_subdirectory(
  "${TENSORFLOW_SOURCE_DIR}/tensorflow/lite"
  "${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite" EXCLUDE_FROM_ALL)

add_executable(minimal minimal.cc)
target_link_libraries(minimal tensorflow-lite)

ไลบรารีของบิลด์ TensorFlow Lite C

หากต้องการสร้างไลบรารีที่ใช้ร่วมกันของ TensorFlow Lite สำหรับ C API ให้ทำตามขั้นตอนที่ 1 ไปยังขั้นตอนที่ 3 ก่อน หลังจากนั้น ให้เรียกใช้คำสั่งต่อไปนี้

cmake ../tensorflow_src/tensorflow/lite/c
cmake --build . -j

คำสั่งนี้จะสร้างไลบรารีที่ใช้ร่วมกันต่อไปนี้ในไดเรกทอรีปัจจุบัน

แพลตฟอร์ม ชื่อห้องสมุด
Linux libtensorflowlite_c.so
macOS libtensorflowlite_c.dylib
Windows tensorflowlite_c.dll