Xây dựng TensorFlow Lite cho Android

Tài liệu này mô tả cách tự xây dựng thư viện Android TensorFlow Lite. Thông thường, bạn không cần tạo thư viện Android TensorFlow Lite cục bộ.

Sử dụng ảnh chụp nhanh vào ban đêm

Để sử dụng bản tổng quan nhanh hằng đêm, hãy thêm kho lưu trữ sau vào cấu hình bản dựng Gradle gốc.

allprojects {
    repositories {      // should be already there
        mavenCentral()  // should be already there
        maven {         // add this repo to use snapshots
          name 'ossrh-snapshot'
          url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
    }
}

thêm ảnh chụp nhanh hằng đêm vào phần phụ thuộc (hoặc chỉnh sửa nếu cần) vào build.gradle của bạn

...
dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
    ...
}
...

Xây dựng TensorFlow Lite cục bộ

Trong một số trường hợp, bạn có thể muốn sử dụng bản dựng cục bộ của TensorFlow Lite. Ví dụ: bạn có thể đang tạo một tệp nhị phân tuỳ chỉnh bao gồm các thao tác được chọn từ TensorFlow hoặc bạn có thể muốn thực hiện các thay đổi cục bộ cho TensorFlow Lite.

Thiết lập môi trường tạo bản dựng bằng Docker

  • Tải tệp Docker xuống. Bằng việc tải tệp Docker xuống, bạn đồng ý rằng các điều khoản dịch vụ sau đây sẽ điều chỉnh việc bạn sử dụng tệp này:

Bằng việc nhấp để chấp nhận, bạn đồng ý rằng mọi hoạt động sử dụng Android Studio và Bộ phát triển gốc Android đều chịu sự điều chỉnh của Thoả thuận cấp phép cho Bộ phát triển phần mềm Android có tại https://developer.android.com/studio/terms (Google có thể cập nhật hoặc thay đổi URL này tuỳ từng thời điểm).

Bạn phải xác nhận điều khoản dịch vụ thì mới tải được tệp xuống.

  • Bạn có thể tuỳ ý thay đổi phiên bản NDK hoặc SDK Android. Đặt tệp Docker đã tải xuống vào một thư mục trống và tạo hình ảnh Docker bằng cách chạy:
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • Khởi động vùng chứa Docker theo cách tương tác bằng cách gắn thư mục hiện tại của bạn vào /host_dir bên trong vùng chứa (lưu ý rằng /tensorflow_src là kho lưu trữ TensorFlow bên trong vùng chứa):
docker run -it -v $PWD:/host_dir tflite-builder bash

Nếu bạn sử dụng PowerShell trên Windows, hãy thay thế "$PWD" bằng "pwd".

Nếu bạn muốn sử dụng một kho lưu trữ TensorFlow trên máy chủ lưu trữ, hãy gắn kết thư mục máy chủ đó (-v hostDir:/host_dir).

  • Sau khi đã ở bên trong vùng chứa, bạn có thể chạy lệnh sau để tải các công cụ và thư viện Android bổ sung xuống (lưu ý rằng bạn có thể phải chấp nhận giấy phép):
sdkmanager \
  "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
  "platform-tools" \
  "platforms;android-${ANDROID_API_LEVEL}"

Bây giờ, bạn nên chuyển đến phần Configure WORKSPACE và .bazelrc để định cấu hình các chế độ cài đặt bản dựng.

Sau khi xây dựng xong các thư viện, bạn có thể sao chép các thư viện đó vào /host_dir bên trong vùng chứa để có thể truy cập vào các thư viện đó trên máy chủ lưu trữ.

Thiết lập môi trường tạo bản dựng mà không cần Docker

Cài đặt Bazel và Điều kiện tiên quyết của Android

Bazel là hệ thống xây dựng chính cho TensorFlow. Để tạo bằng API này, bạn phải cài đặt Android NDK cũng như SDK và Android NDK trên hệ thống của mình.

  1. Cài đặt phiên bản mới nhất của hệ thống xây dựng Bazel.
  2. Bạn cần có Android NDK để tạo mã TensorFlow Lite gốc (C/C++). Bạn có thể xem phiên bản đề xuất hiện tại là 25b tại đây.
  3. Bạn có thể tải SDK Android và các công cụ bản dựng tại đây hoặc dưới dạng một phần trong Android Studio. API công cụ xây dựng >= 23 là phiên bản được đề xuất để xây dựng TensorFlow Lite.

Định cấu hình WORKSPACE và .bazelrc

Đây là bước định cấu hình một lần cần thiết để tạo thư viện TF Lite. Chạy tập lệnh ./configure trong thư mục thanh toán TensorFlow gốc và trả lời "Có" khi tập lệnh yêu cầu định cấu hình ./WORKSPACE cho các bản dựng Android theo cách tương tác. Tập lệnh sẽ cố gắng định cấu hình các chế độ cài đặt bằng cách sử dụng các biến môi trường sau:

  • ANDROID_SDK_HOME
  • ANDROID_SDK_API_LEVEL
  • ANDROID_NDK_HOME
  • ANDROID_NDK_API_LEVEL

Nếu bạn không đặt các biến này, thì bạn phải cung cấp các biến này theo cách có tính tương tác trong lời nhắc tập lệnh. Cấu hình thành công sẽ tạo ra các mục tương tự như sau trong tệp .tf_configure.bazelrc ở thư mục gốc:

build --action_env ANDROID_NDK_HOME="/usr/local/android/android-ndk-r25b"
build --action_env ANDROID_NDK_API_LEVEL="21"
build --action_env ANDROID_BUILD_TOOLS_VERSION="30.0.3"
build --action_env ANDROID_SDK_API_LEVEL="30"
build --action_env ANDROID_SDK_HOME="/usr/local/android/android-sdk-linux"

Xây dựng và cài đặt

Sau khi Bazel được định cấu hình đúng cách, bạn có thể tạo TensorFlow Lite AAR từ thư mục thanh toán gốc như sau:

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm64 \
  --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
  --define=android_dexmerger_tool=d8_dexmerger \
  --define=android_incremental_dexing_tool=d8_dexbuilder \
  //tensorflow/lite/java:tensorflow-lite

Thao tác này sẽ tạo một tệp AAR trong bazel-bin/tensorflow/lite/java/. Xin lưu ý rằng thao tác này sẽ tạo một AAR "chất lượng" với một số cấu trúc khác nhau. Nếu bạn không cần tất cả cấu trúc, hãy sử dụng tập hợp con phù hợp với môi trường triển khai của bạn.

Bạn có thể tạo các tệp AAR nhỏ hơn chỉ nhắm đến một tập hợp mô hình như sau:

bash tensorflow/lite/tools/build_aar.sh \
  --input_models=model1,model2 \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

Tập lệnh phía trên sẽ tạo tệp tensorflow-lite.aar và tệp tensorflow-lite-select-tf-ops.aar (không bắt buộc) nếu một trong các mô hình đang sử dụng hoạt động của Tensorflow. Để biết thêm thông tin chi tiết, vui lòng xem nội dung Giảm kích thước tệp nhị phân TensorFlow Lite.

Thêm trực tiếp AAR vào dự án

Di chuyển tệp tensorflow-lite.aar vào thư mục có tên libs trong dự án. Sửa đổi tệp build.gradle của ứng dụng để tham chiếu thư mục mới và thay thế phần phụ thuộc TensorFlow Lite hiện có bằng thư viện cục bộ mới, ví dụ:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        flatDir {
            dirs 'libs'
        }
    }
}

dependencies {
    compile(name:'tensorflow-lite', ext:'aar')
}

Cài đặt AAR vào kho lưu trữ Maven cục bộ

Thực thi lệnh sau từ thư mục checkout gốc:

mvn install:install-file \
  -Dfile=bazel-bin/tensorflow/lite/java/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar

Trong build.gradle của ứng dụng, hãy đảm bảo bạn có phần phụ thuộc mavenLocal() và thay thế phần phụ thuộc tiêu chuẩn của TensorFlow Lite bằng một phần phụ thuộc hỗ trợ việc chọn các hoạt động của TensorFlow:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
}

Xin lưu ý rằng phiên bản 0.1.100 ở đây chỉ dành cho mục đích kiểm thử/phát triển. Sau khi cài đặt AAR cục bộ, bạn có thể sử dụng API dự đoán Java của TensorFlow Lite tiêu chuẩn trong mã ứng dụng.