สร้าง LiteRT สำหรับ Android

เอกสารนี้จะอธิบายวิธีสร้างไลบรารี Android ของ LiteRT ในอุปกรณ์ ของตัวเอง โดยปกติ คุณไม่จำเป็นต้องสร้างไลบรารี Android LiteRT ในเครื่อง หากคุณเพียงแค่ต้องการใช้ โปรดดู คู่มือเริ่มใช้งาน Android ฉบับย่อ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ ไว้ในโปรเจ็กต์ Android ของคุณ

ใช้ Nightly Snapshot

หากต้องการใช้สแนปชอตยามค่ำคืน ให้เพิ่มที่เก็บต่อไปนี้ลงในบิลด์รูท 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 'com.google.ai.edge.litert:litert-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-support:0.0.0-nightly-SNAPSHOT'
    ...
}
...

สร้าง LiteRT ในเครื่อง

ในบางกรณี คุณอาจต้องการใช้ LiteRT บิลด์ในเครื่อง สำหรับ ตัวอย่างเช่น คุณอาจสร้างไบนารีที่กำหนดเองที่ประกอบด้วย การดำเนินการที่เลือกจาก TensorFlow หรืออาจต้องการเปลี่ยน LiteRT ในเครื่อง

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

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

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

วันที่ คุณต้องรับทราบข้อกำหนดในการให้บริการเพื่อดาวน์โหลด

  • คุณเลือกเปลี่ยนเวอร์ชัน 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 เพื่อสร้าง LiteRT ดั้งเดิม (C/C++) โค้ด เวอร์ชันที่แนะนำในปัจจุบันคือ 25b ซึ่งอาจพบ ที่นี่
  3. อาจรับ Android SDK และเครื่องมือสร้าง ที่นี่ หรือ หรือใช้เป็นส่วนหนึ่งของ Android Studio รังสรรค์ Tools API >= 23 คือเวอร์ชันที่แนะนำสำหรับการสร้าง LiteRT

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

นี่คือขั้นตอนการกำหนดค่าแบบครั้งเดียวซึ่งจำเป็นสำหรับการสร้าง LiteRT ห้องสมุด เรียกใช้สคริปต์ ./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 อย่างถูกต้องแล้ว คุณสามารถสร้าง LiteRT 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 โปรดดูรายละเอียดเพิ่มเติมที่ ลดขนาดไบนารี LiteRT

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

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

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 ของ LiteRT มาตรฐานด้วยเวอร์ชันที่รองรับ สำหรับการดำเนินการของ 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 ในเครื่องแล้ว คุณสามารถใช้มาตรฐาน LiteRT Java Inference API ในโค้ดของแอป