สร้าง TensorFlow Lite สำหรับ Android

เอกสารนี้จะอธิบายวิธีสร้างไลบรารี Android ของ TensorFlow Lite ด้วยตัวคุณเอง โดยปกติแล้ว คุณไม่จำเป็นต้องสร้างไลบรารี Android ของ TensorFlow Lite ภายในเครื่อง

ใช้สแนปชอตตอนกลางคืน

หากต้องการใช้สแนปชอตตอนกลางคืน ให้เพิ่มที่เก็บต่อไปนี้ลงในการกำหนดค่าบิลด์ของ Gradle ระดับรูท

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'
        }
    }
}

เพิ่มสแนปชอตตอนกลางคืนไปยังทรัพยากร Dependency (หรือแก้ไขตามความจำเป็น) ไปยัง create.gradle ของคุณ

...
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'
    ...
}
...

สร้าง TensorFlow Lite ภายในเครื่อง

ในบางกรณี คุณอาจต้องการใช้บิลด์ภายในของ TensorFlow Lite ตัวอย่างเช่น คุณอาจสร้างไบนารีที่กำหนดเองซึ่งมีการดำเนินการที่เลือกจาก TensorFlow หรือทำการเปลี่ยนแปลง TensorFlow Lite ภายในเครื่อง

ตั้งค่าสภาพแวดล้อมของบิลด์โดยใช้ Docker

  • ดาวน์โหลดไฟล์ Docker การดาวน์โหลดไฟล์ Docker หมายความว่าคุณยอมรับว่าข้อกำหนดในการให้บริการต่อไปนี้มีผลบังคับใช้กับการใช้งานไฟล์ดังกล่าว

การคลิกยอมรับหมายความว่าคุณยอมรับว่าการใช้งาน Android Studio และชุดพัฒนาซอฟต์แวร์สำหรับ Android ทั้งหมดจะอยู่ในบังคับของข้อตกลงใบอนุญาตชุดพัฒนาซอฟต์แวร์ Android ซึ่งระบุไว้ที่ https://developer.android.com/studio/terms (Google อาจอัปเดตหรือเปลี่ยนแปลง URL ดังกล่าวเป็นครั้งคราว)

คุณต้องรับทราบข้อกำหนดในการให้บริการในการดาวน์โหลดไฟล์

  • คุณจะเปลี่ยนเวอร์ชัน Android SDK หรือ NDK ก็ได้ วางไฟล์ Docker ที่ดาวน์โหลดลงในโฟลเดอร์เปล่าแล้วสร้างอิมเมจ Docker โดยเรียกใช้
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • เริ่มต้นคอนเทนเนอร์ Docker แบบอินเทอร์แอกทีฟโดยต่อเชื่อมโฟลเดอร์ปัจจุบันเข้ากับ /host_dir ภายในคอนเทนเนอร์ (โปรดทราบว่า /tensorflow_src คือที่เก็บ TensorFlow ภายในคอนเทนเนอร์)
docker run -it -v $PWD:/host_dir tflite-builder bash

หากใช้ PowerShell ใน Windows ให้แทนที่ "$PWD" ด้วย "pwd"

หากต้องการใช้ที่เก็บ TensorFlow บนโฮสต์ ให้ต่อเชื่อมไดเรกทอรีโฮสต์ดังกล่าวแทน (-v hostDir:/host_dir)

  • เมื่อคุณอยู่ในคอนเทนเนอร์แล้ว คุณสามารถเรียกใช้สิ่งต่อไปนี้เพื่อดาวน์โหลดเครื่องมือและไลบรารี Android เพิ่มเติม (โปรดทราบว่าคุณอาจต้องยอมรับใบอนุญาต)
sdkmanager \
  "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
  "platform-tools" \
  "platforms;android-${ANDROID_API_LEVEL}"

ในขั้นตอนนี้ คุณควรไปที่ส่วนกำหนดค่าพื้นที่ทำงานและ .bazelrc เพื่อกำหนดการตั้งค่าของบิลด์

หลังจากสร้างไลบรารีเสร็จแล้ว คุณสามารถคัดลอกไลบรารีเหล่านี้ไปที่ /host_dir ในคอนเทนเนอร์เพื่อให้คุณสามารถเข้าถึงไลบรารีในโฮสต์ได้

ตั้งค่าสภาพแวดล้อมของบิลด์โดยไม่ใช้ Docker

ข้อกำหนดเบื้องต้นสำหรับการติดตั้ง Bazel และ Android

Bazel เป็นระบบบิลด์หลักสำหรับ TensorFlow คุณต้องมีแอปนี้และ Android NDK และ SDK ติดตั้งไว้ในระบบ

  1. ติดตั้งระบบบิลด์ของ Bazel เวอร์ชันล่าสุด
  2. ต้องใช้ Android NDK เพื่อสร้างโค้ด TensorFlow Lite แบบเนทีฟ (C/C++) เวอร์ชันปัจจุบันที่แนะนำคือ 25b ซึ่งอาจดูได้ ที่นี่
  3. รับ Android SDK และเครื่องมือบิลด์ได้ที่นี่ หรือเป็นส่วนหนึ่งของ Android Studio ก็ได้ Build tools API >= 23 คือเวอร์ชันที่แนะนำสำหรับการสร้าง TensorFlow Lite

กำหนดค่า WORKSPACE และ .bazelrc

นี่เป็นขั้นตอนการกำหนดค่าแบบครั้งเดียวที่จำเป็นสำหรับการสร้างไลบรารี TF Lite เรียกใช้สคริปต์ ./configure ในไดเรกทอรีการชำระเงิน TensorFlow รูท และตอบว่า "ใช่" เมื่อสคริปต์ขอให้กำหนดค่า ./WORKSPACE แบบอินเทอร์แอกทีฟสำหรับบิลด์ของ Android สคริปต์จะพยายามกำหนดการตั้งค่าโดยใช้ตัวแปรสภาพแวดล้อมต่อไปนี้

  • ANDROID_SDK_HOME
  • ANDROID_SDK_API_LEVEL
  • ANDROID_NDK_HOME
  • ANDROID_NDK_API_LEVEL

หากไม่ได้ตั้งค่าตัวแปรเหล่านี้ไว้ ต้องระบุตัวแปรดังกล่าวในข้อความแจ้งสคริปต์ การกำหนดค่าที่ประสบความสำเร็จควรแสดงรายการที่คล้ายกับไฟล์ .tf_configure.bazelrc ในโฟลเดอร์รูทต่อไปนี้

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"

สร้างและติดตั้ง

เมื่อกำหนดค่า Bazel อย่างถูกต้องแล้ว คุณจะสร้าง TensorFlow Lite AAR จากไดเรกทอรีการชำระเงินรากได้ดังนี้

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

การดำเนินการนี้จะสร้างไฟล์ AAR ใน bazel-bin/tensorflow/lite/java/ โปรดทราบว่าวิธีนี้จะสร้าง AAR "ไขมัน" ที่มีสถาปัตยกรรมต่างๆ มากมาย หากไม่จำเป็นต้องใช้ทั้งหมด ให้ใช้ชุดย่อยที่เหมาะกับสภาพแวดล้อมการทำให้ใช้งานได้ของคุณ

คุณสามารถสร้างไฟล์ AAR ที่เล็กลงซึ่งกำหนดเป้าหมายเฉพาะชุดรูปแบบได้ดังนี้

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

สคริปต์ด้านบนจะสร้างไฟล์ tensorflow-lite.aar และไฟล์ tensorflow-lite-select-tf-ops.aar (ไม่บังคับ) หากโมเดลใดโมเดลหนึ่งใช้ Tensorflow Ops โปรดดูรายละเอียดเพิ่มเติมที่ส่วนลดขนาดไบนารีของ TensorFlow Lite

เพิ่ม AAR ในโปรเจ็กต์โดยตรง

ย้ายไฟล์ tensorflow-lite.aar ไปยังไดเรกทอรีที่ชื่อ libs ในโปรเจ็กต์ แก้ไขไฟล์ build.gradle ของแอปเพื่ออ้างอิงไดเรกทอรีใหม่และแทนที่ทรัพยากร Dependency ของ TensorFlow Lite ที่มีอยู่ด้วยไลบรารีใหม่ในเครื่อง เช่น

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')
}

ติดตั้ง AAR ไปยังที่เก็บ Maven ในเครื่อง

เรียกใช้คำสั่งต่อไปนี้จากไดเรกทอรีการชำระเงินรูท

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

ใน build.gradle ของแอป ให้ตรวจสอบว่าคุณมีทรัพยากร Dependency mavenLocal() และแทนที่ทรัพยากร Dependency ของ TensorFlow Lite มาตรฐานด้วยทรัพยากรที่มีการรองรับสำหรับการดำเนินการ 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'
}

โปรดทราบว่าเวอร์ชัน 0.1.100 ในที่นี้ใช้เพื่อจุดประสงค์ในการทดสอบ/การพัฒนาเท่านั้น เมื่อติดตั้ง AAR ภายในแล้ว คุณจะใช้ TensorFlow Lite API มาตรฐานสำหรับการอนุมาน ในโค้ดของแอปได้