Biên dịch chéo TensorFlow Lite bằng CMake

Trang này mô tả cách xây dựng thư viện TensorFlow Lite cho nhiều thiết bị ARM.

Các hướng dẫn sau đã được kiểm thử trên máy tính 64 bit Ubuntu 16.04.3 (AMD64), hình ảnh docker của TensorFlow devel tensorflow/tensorflow:devel.

Điều kiện tiên quyết

Bạn cần cài đặt CMake và tải mã nguồn TensorFlow xuống. Vui lòng xem trang Tạo TensorFlow Lite bằng CMake để biết thông tin chi tiết.

Kiểm tra môi trường mục tiêu

Các ví dụ sau đây được kiểm thử trong Rappberry Pi OS, Ubuntu Server 20.04 LTS và Mendel Linux 4.0. Tuỳ thuộc vào phiên bản glibc mục tiêu và khả năng của CPU, bạn có thể cần sử dụng phiên bản chuỗi công cụ và tham số bản dựng khác nhau.

Đang kiểm tra phiên bản glibc

ldd --version
ldd (Debian GLIBC 2.28-10) 2.28
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

Kiểm tra khả năng tương thích với ABI

Nếu mục tiêu của bạn là ARM 32 bit, thì có 2 ABI tuỳ thuộc vào lịch phát sóng VFP: armhfarmel. Tài liệu này cho thấy ví dụ về armhf, bạn cần sử dụng một chuỗi công cụ khác nhau cho các mục tiêu armel.

Kiểm tra chức năng của CPU

Đối với ARMv7, bạn nên biết phiên bản VFP được hỗ trợ của mục tiêu và khả năng sử dụng NEON.

cat /proc/cpuinfo
processor   : 0
model name  : ARMv7 Processor rev 3 (v7l)
BogoMIPS    : 108.00
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xd08
CPU revision    : 3

Bản dựng cho AArch64 (ARM64)

Hướng dẫn này cho biết cách tạo tệp nhị phân AArch64 tương thích với Coral Mendel Linux 4.0, Rspberry Pi (đã cài đặt Ubuntu Server 20.04.01 LTS 64 bit).

Tải chuỗi công cụ xuống

Các lệnh này sẽ cài đặt chuỗi công cụ gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu trong ${HOME}/toolchains.

curl -LO https://storage.googleapis.com/mirror.tensorflow.org/developer.arm.com/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
mkdir -p ${HOME}/toolchains
tar xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C ${HOME}/toolchains

Chạy CMake

ARMCC_PREFIX=${HOME}/toolchains/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-
ARMCC_FLAGS="-funsafe-math-optimizations"
cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \
  -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \
  -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
  ../tensorflow/lite/

Đã bật bản dựng cho ARMv7 NEON

Hướng dẫn này trình bày cách tạo ARMv7 với tệp nhị phân hỗ trợ VFPv4 và NEON, tương thích với RASPberry Pi 3 và 4.

Tải chuỗi công cụ xuống

Các lệnh này sẽ cài đặt chuỗi công cụ gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf trong ${HOME}/toolchains.

curl -LO https://storage.googleapis.com/mirror.tensorflow.org/developer.arm.com/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
mkdir -p ${HOME}/toolchains
tar xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C ${HOME}/toolchains

Chạy CMake

ARMCC_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -funsafe-math-optimizations -mfp16-format=ieee"
ARMCC_PREFIX=${HOME}/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \
  -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \
  -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=armv7 \
  ../tensorflow/lite/

Bản dựng cho Rspberry Pi Zero (ARMv6)

Hướng dẫn này trình bày cách tạo tệp nhị phân ARMv6 tương thích với Rappberry Pi Zero.

Tải chuỗi công cụ xuống

Các lệnh này sẽ cài đặt chuỗi công cụ gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf trong ${HOME}/toolchains.

curl -LO https://storage.googleapis.com/mirror.tensorflow.org/developer.arm.com/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
mkdir -p ${HOME}/toolchains
tar xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C ${HOME}/toolchains

Chạy CMake

ARMCC_FLAGS="-march=armv6 -mfpu=vfp -mfloat-abi=hard -funsafe-math-optimizations"
ARMCC_PREFIX=${HOME}/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \
  -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \
  -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=armv6 \
  -DTFLITE_ENABLE_XNNPACK=OFF \
  ../tensorflow/lite/