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

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

ใช้สแนปชอตรายคืน

หากต้องการใช้สแนปชอตเวอร์ชันทดลอง ให้เพิ่มที่เก็บต่อไปนี้ลงในการกำหนดค่าการสร้าง 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 (หรือแก้ไขตามต้องการ) ใน build.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 (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}"

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

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

ตั้งค่าสภาพแวดล้อมการสร้างโดยไม่ต้องใช้ Docker

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

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

  1. ติดตั้งระบบบิลด์ Bazel เวอร์ชันล่าสุด
  2. ต้องใช้ Android NDK เพื่อสร้างโค้ด LiteRT แบบเนทีฟ (C/C++) เวอร์ชันที่แนะนำในปัจจุบันคือ 25b ซึ่งดูได้ที่นี่
    1. คุณสามารถรับ Android SDK และเครื่องมือบิลด์ได้ที่นี่ หรือเป็นส่วนหนึ่งของ Android Studio เครื่องมือบิลด์ 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 อย่างถูกต้องแล้ว คุณจะสร้าง AAR ของ LiteRT จากไดเรกทอรีการชำระเงินรูทได้โดยทำดังนี้

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 แบบ "Fat" ที่มีสถาปัตยกรรมที่แตกต่างกันหลายแบบ หากไม่ต้องการ ทั้งหมด ให้ใช้ชุดย่อยที่เหมาะสมกับสภาพแวดล้อมการติดตั้งใช้งาน

คุณสร้างไฟล์ 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 โปรดดูรายละเอียดเพิ่มเติมในส่วนลดขนาดไบนารี LiteRT

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

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

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 มาตรฐานด้วยทรัพยากร Dependency ที่รองรับการดำเนินการ 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 มาตรฐานในโค้ดแอปได้