Dùng CMake để tạo TensorFlow Lite

Trang này mô tả cách xây dựng và sử dụng thư viện TensorFlow Lite bằng công cụ CMake.

Các hướng dẫn sau đã được kiểm thử trên máy tính Ubuntu 16.04.3 64 bit (AMD64), macOS Catalina (x86_64), Windows 10 và hình ảnh Docker TensorFlow devel tensorflow/tensorflow:devel.

Bước 1. Cài đặt công cụ CMake

Tính năng này yêu cầu CMake 3.16 trở lên. Trên Ubuntu, bạn chỉ cần chạy lệnh sau.

sudo apt-get install cmake

Hoặc bạn có thể làm theo hướng dẫn cài đặt cmake chính thức

Bước 2. Bản sao kho lưu trữ TensorFlow

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

Bước 3. Tạo thư mục bản dựng CMake

mkdir tflite_build
cd tflite_build

Bước 4. Chạy công cụ CMake với cấu hình

Bản phát hành

Công cụ này tạo một tệp nhị phân phát hành được tối ưu hoá theo mặc định. Nếu muốn tạo cho máy trạm của mình, bạn chỉ cần chạy lệnh sau.

cmake ../tensorflow_src/tensorflow/lite

Bản gỡ lỗi

Nếu cần tạo một bản gỡ lỗi có thông tin về biểu tượng, bạn cần cung cấp tuỳ chọn -DCMAKE_BUILD_TYPE=Debug.

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

Bản dựng bằng kiểm thử đơn vị nhân

Để có thể chạy kiểm thử hạt nhân, bạn cần cung cấp cờ -DTFLITE_KERNEL_TEST=on. Bạn có thể tìm thấy thông tin cụ thể về quá trình biên dịch chéo kiểm thử đơn vị trong tiểu mục tiếp theo.

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

Tạo gói có thể cài đặt

Để tạo một gói có thể cài đặt mà một dự án CMake khác có thể sử dụng làm phần phụ thuộc bằng find_package(tensorflow-lite CONFIG), hãy sử dụng tuỳ chọn -DTFLITE_ENABLE_INSTALL=ON.

Tốt nhất bạn cũng nên cung cấp phiên bản phần phụ thuộc thư viện của riêng mình. Dự án phụ thuộc vào TF Lite cũng cần sử dụng các dữ liệu này. Bạn có thể sử dụng -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON và đặt các biến <PackageName>_DIR để trỏ đến các lượt cài đặt thư viện của mình.

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

Biên dịch chéo

Bạn có thể sử dụng CMake để tạo tệp nhị phân cho kiến trúc mục tiêu ARM64 hoặc Android.

Để biên dịch chéo TF Lite, cụ thể là bạn cần cung cấp đường dẫn đến SDK (ví dụ: SDK ARM64 hoặc NDK trong trường hợp của Android) với cờ -DCMAKE_TOOLCHAIN_FILE.

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Thông tin cụ thể về tính năng biên dịch chéo của Android

Để biên dịch chéo Android, bạn cần cài đặt Android NDK và cung cấp đường dẫn NDK có cờ -DCMAKE_TOOLCHAIN_FILE nêu trên. Bạn cũng cần đặt ABI mục tiêu bằng cờ -DANDROID_ABI.

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
Thông tin cụ thể về khả năng biên dịch chéo của hạt nhân (đơn vị)

Quá trình biên dịch chéo các kiểm thử đơn vị yêu cầu trình biên dịch phẳng cho cấu trúc máy chủ. Vì mục đích này, có một CMakeLists nằm trong tensorflow/lite/tools/cmake/native_tools/flatbuffers để tạo trước trình biên dịch phẳng bằng CMake trong một thư mục bản dựng riêng biệt bằng cách sử dụng chuỗi công cụ máy chủ lưu trữ.

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

Bạn cũng có thể cài đặt flatc vào một vị trí cài đặt tuỳ chỉnh (ví dụ: vào một thư mục chứa các công cụ được tạo nguyên gốc khác thay vì thư mục bản dựng CMake):

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

Đối với chính quá trình biên dịch chéo TF Lite, bạn cần cung cấp tham số bổ sung -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> trỏ đến thư mục chứa tệp nhị phân flatc gốc cùng với cờ -DTFLITE_KERNEL_TEST=on nêu trên.

cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} -DTFLITE_KERNEL_TEST=on -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ../tensorflow/lite/
Khởi chạy chương trình kiểm thử hạt nhân (đơn vị) được biên dịch chéo trên đích

Bạn có thể chạy kiểm thử đơn vị dưới dạng các tệp thực thi riêng biệt hoặc sử dụng tiện ích CTest. Theo như CTest, nếu ít nhất một trong các tham số TFLITE_ENABLE_XNNPACKorTFLITE_EXTERNAL_ nhánh} được bật cho bản dựng TF Lite, thì các bài kiểm thử thu được sẽ được tạo bằng 2 nhãn khác nhau (sử dụng cùng một tệp thực thi kiểm thử): – đơn thuần – cho biết những hoạt động kiểm thử chạy trên phần phụ trợ CPU – uỷ quyền – cho biết những hoạt động kiểm thử bổ sung được chạy trên phần phụ trợ CPU – uỷ quyền – cho biết những hoạt động kiểm thử bổ sung được sử dụng

Cả CTestTestfile.cmakerun-tests.cmake (như tham khảo bên dưới) đều có trong <build_dir>/kernels.

Ra mắt chương trình kiểm thử đơn vị với phần phụ trợ CPU (miễn là CTestTestfile.cmake có trên đích trong thư mục hiện tại):

ctest -L plain

Chạy ví dụ về kiểm thử đơn vị bằng cách sử dụng thực thể đại diện (miễn là tệp CTestTestfile.cmake cũng như tệp run-tests.cmake có trên mục tiêu trong thư mục hiện tại):

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

Một hạn chế đã biết của cách này cung cấp thêm các đối số khởi chạy liên quan đến uỷ quyền cho phương thức kiểm thử đơn vị là chỉ hỗ trợ hiệu quả những đối số có giá trị trả về dự kiến là 0. Nhiều giá trị trả về sẽ được báo cáo là lỗi kiểm thử.

Ủy quyền GPU OpenCL

Nếu máy mục tiêu của bạn có hỗ trợ OpenCL, thì bạn có thể sử dụng uỷ quyền GPU để có thể tận dụng nguồn GPU của bạn.

Để định cấu hình tính năng hỗ trợ uỷ quyền GPU OpenCL, hãy làm như sau:

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

Bước 5. Xây dựng TensorFlow Lite

Trong thư mục tflite_build,

cmake --build . -j

Bước 6. Ví dụ về cách xây dựng công cụ đo điểm chuẩn và hình ảnh nhãn TensorFlow Lite (Không bắt buộc)

Trong thư mục tflite_build,

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

Các tuỳ chọn có sẵn để xây dựng TensorFlow Lite

Dưới đây là danh sách các lựa chọn có sẵn. Bạn có thể ghi đè bằng -D<option_name>=[ON|OFF]. Ví dụ: -DTFLITE_ENABLE_XNNPACK=OFF để vô hiệu hoá XNNPACK (được bật theo mặc định).

Tên lựa chọn Tính năng Android Linux macOS Windows
TFLITE_ENABLE_RUY Bật thư viện nhân ma trận RUY ĐANG BẬT ĐÃ TẮT ĐÃ TẮT ĐÃ TẮT
TFLITE_ENABLE_GPU Bật tính năng uỷ quyền GPU ĐÃ TẮT ĐÃ TẮT Không áp dụng Không áp dụng
TFLITE_ENABLE_XNNPACK Bật uỷ quyền XNNPACK ĐANG BẬT ĐANG BẬT ĐANG BẬT ĐANG BẬT
TFLITE_ENABLE_MMAP Bật MMAP ĐANG BẬT ĐANG BẬT ĐANG BẬT Không áp dụng

Tạo một dự án CMake sử dụng TensorFlow Lite

Sau đây là tệp CMakeLists.txt trong ví dụ tối thiểu về TFLite.

Bạn cần phải có add_subdirectory() cho thư mục TensorFlow Lite và liên kết tensorflow-lite với target_link_Library().

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)

Xây dựng thư viện TensorFlow Lite C

Nếu bạn muốn xây dựng thư viện dùng chung TensorFlow Lite cho API C, trước tiên hãy làm theo bước 1 để đến bước 3. Sau đó, hãy chạy các lệnh sau.

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

Lệnh này tạo thư viện dùng chung sau đây trong thư mục hiện tại.

Nền tảng Tên thư viện
Linux libtensorflowlite_c.so
macOS libtensorflowlite_c.dylib
Windows tensorflowlite_c.dll