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

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

ใช้ภาพถ่ายกลางคืน

หากต้องการใช้สแนปชอตตอนกลางคืน ให้เพิ่ม repo ต่อไปนี้ลงในการกำหนดค่ารูท Gradle build ของคุณ

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

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

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

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

  • คุณสามารถเลือกเปลี่ยนเวอร์ชัน Android SDK หรือ NDK ได้ วางไฟล์ Docker ที่ดาวน์โหลดมาไว้ในโฟลเดอร์ว่างและสร้างอิมเมจนักเทียบท่าของคุณโดยเรียกใช้:
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • เริ่มคอนเทนเนอร์นักเทียบท่าแบบโต้ตอบโดยติดตั้งโฟลเดอร์ปัจจุบันของคุณไปที่ /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 build เวอร์ชันล่าสุด
  2. ต้องใช้ Android NDK เพื่อสร้างโค้ดเนทิฟ (C/C++) TensorFlow Lite เวอร์ชันที่แนะนำปัจจุบันคือ 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="26"
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 ของแอปของคุณเพื่ออ้างอิงไดเรกทอรีใหม่และแทนที่การพึ่งพา 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 ของแอป ตรวจสอบให้แน่ใจว่าคุณมีการพึ่งพา mavenLocal() และแทนที่การพึ่งพา TensorFlow Lite มาตรฐานด้วยอันที่รองรับตัวเลือก TensorFlow ops:

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 ในเครื่องแล้ว คุณจะใช้ API การอนุมาน TensorFlow Lite Java มาตรฐานในโค้ดของแอปได้