בניית LiteRT באמצעות CMake

בדף זה נסביר איך לבנות את ספריית LiteRT ולהשתמש בה עם CMake.

ההוראות הבאות נבדקו ב-Ubuntu 16.04.3 64-bit PC (AMD64) , macOS Catalina (x86_64), Windows 10 ו-TensorFlow קובץ אימג' של 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 build

mkdir tflite_build
cd tflite_build

שלב 4. הפעלת כלי CMake באמצעות הגדרות

גרסת ה-build

היא יוצרת קובץ בינארי של גרסה שעבר אופטימיזציה כברירת מחדל. אם רוצים ליצור עבור את תחנת העבודה, פשוט מריצים את הפקודה הבאה.

cmake ../tensorflow_src/tensorflow/lite

גרסת build של ניפוי באגים

אם צריך ליצור גרסת build של ניפוי באגים שיש בה מידע על סמלים, עליכם: לספק את האפשרות -DCMAKE_BUILD_TYPE=Debug.

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

פיתוח באמצעות בדיקות של יחידת ליבה (kernel)

כדי שתוכלו להריץ בדיקות ליבה, צריך לספק סימון -DTFLITE_KERNEL_TEST=on. מפרטים של בדיקות יחידות בשילוב עם הידור מסוים יכולים להיות שנמצא בסעיף המשנה הבא.

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

בניית חבילה שניתנת להתקנה

כדי לבנות חבילה ניתנת להתקנה שיכולה לשמש כתלות של גורם אחר CMake פרויקט באמצעות find_package(tensorflow-lite CONFIG), משתמשים אפשרות -DTFLITE_ENABLE_INSTALL=ON.

רצוי גם לספק גרסאות משלכם של יחסי תלות בספרייה. גם הפרויקט שתלוי ב-LiteRT צריך להשתמש בהם. אפשר יש להשתמש ב--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

אוסף מוצלב

אפשר להשתמש ב-CMake כדי ליצור קבצים בינאריים לארכיטקטורות יעד של ARM64 או של Android.

כדי לבצע הידור צולב של ה-LiteRT, עליכם לספק את הנתיב אל את ה-SDK (למשל, ARM64 SDK או NDK במקרה של Android) עם -DCMAKE_TOOLCHAIN_FILE לסמן.

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
פרטים ספציפיים לגבי הידור משולב ב-Android

אם רוצים להשתמש בהידור בין מכשירים ב-Android, צריך להתקין את האפליקציה Android NDK ולספק את נתיב ה-NDK עם סימון -DCMAKE_TOOLCHAIN_FILE שהוזכר למעלה. צריך גם להגדיר יעד ABI עם הדגל -DANDROID_ABI.

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
הנחיות ספציפיות לגבי בדיקות ליבה (unit) של הידור (cross-compilation)

לצורך הידור מוצלב של בדיקות היחידה נדרש מהדר שטוח (flatc מהדר) עבור המארח של הארכיטקטורה, למטרה הזו, יש רשימת CMakeList שנמצאת ב- tensorflow/lite/tools/cmake/native_tools/flatbuffers כדי לבנות את ה-Flatc מהדר עם CMake מראש בספריית build נפרדת באמצעות המארח בכלי.

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

אפשר גם להתקין את ה-flat במיקום מותאם אישית להתקנה. (לדוגמה, לספרייה שמכילה כלים שפותחו באופן טבעי במקום ה-CMake ):

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

עבור ההידור של LiteRT בהידור עצמו, פרמטר נוסף -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/
השקת בדיקות ליבה (kernel) (יחידה) שעברו הידור סביב היעד

אפשר להריץ בדיקות יחידה כקובצי הפעלה נפרדים או להשתמש בכלי CTest. עד עכשיו מאחר שיש בעיה ב-CTest, אם לפחות אחד מהפרמטרים TFLITE_ENABLE_XNNPACKorTFLITE_EXTERNAL_DELEGATE` מופעל עבור LiteRT build, הבדיקות שמתקבלות נוצרות עם שתי תוויות שונות (באמצעות אותו קובץ הפעלה לבדיקה): - פשוט – ציון הבדיקות שבהן מריצים הקצה העורפי של המעבד (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 הוא 0. ערכי החזרה שונים ידווחו בתור כשל בבדיקה.

משתמש שקיבל הרשאה ל-OpenCL GPU

אם במחשב היעד יש תמיכה ב-OpenCL, אפשר להשתמש מקבל הגישה ל-GPU שיכול לנצל את עוצמת ה-GPU.

כדי להגדיר תמיכה בהענקת גישה ל-OpenCL GPU:

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

שלב 5. בניית LiteRT

בספרייה tflite_build,

cmake --build . -j
.

שלב 6. דוגמה ליצירת כלי השוואה לשוק LiteRT ולתמונה של תווית (אופציונלי)

בספרייה tflite_build,

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

האפשרויות הזמינות לבניית LiteRT

בהמשך מופיעה רשימה של האפשרויות הזמינות. אפשר לשנות את ההגדרה הזו באמצעות -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 המשתמש ב-LiteRT

הנה CMakeLists.txt של דוגמה ל-TFLite מינימלי.

יש צורך ב-add_subdirectory() עבור ספריית LiteRT וקישור 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)

יצירת ספריית LiteRT C

אם רוצים ליצור ספרייה משותפת של LiteRT עבור 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