Android용 LiteRT 빌드

이 문서에서는 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'
        }
    }
}

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 파일을 다운로드하면 다음 서비스 약관이 사용에 적용된다는 데 동의하는 것으로 간주됩니다.

동의를 클릭하면 https://developer.android.com/studio/terms에서 확인할 수 있는 Android 소프트웨어 개발 키트 라이선스 계약 (Google에서 수시로 업데이트하거나 변경할 수 있는 URL)에 따라 Android 스튜디오 및 Android 네이티브 개발 키트의 모든 사용이 관리된다는 데 동의하는 것으로 간주됩니다.

파일을 다운로드하려면 서비스 약관에 동의해야 합니다.

  • 원하는 경우 Android SDK 또는 NDK 버전을 변경할 수 있습니다. 다운로드한 Docker 파일을 빈 폴더에 넣고 다음을 실행하여 Docker 이미지를 빌드합니다.
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • 컨테이너 내부의 /host_dir에 현재 폴더를 마운트하여 대화형으로 Docker 컨테이너를 시작합니다. /tensorflow_src는 컨테이너 내부의 TensorFlow 저장소입니다.
docker run -it -v $PWD:/host_dir tflite-builder bash

Windows에서 PowerShell을 사용하는 경우 '$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. 네이티브 (C/C++) LiteRT 코드를 빌드하려면 Android NDK가 필요합니다. 현재 권장 버전은 25b이며 여기에서 확인할 수 있습니다.
    1. Android SDK 및 빌드 도구는 여기에서 다운로드하거나 Android 스튜디오의 일부로 다운로드할 수 있습니다. 빌드 도구 API 23 이상은 LiteRT 빌드에 권장되는 버전입니다.

WORKSPACE 및 .bazelrc 구성

이는 LiteRT 라이브러리를 빌드하는 데 필요한 일회성 구성 단계입니다. 루트 TensorFlow 체크아웃 디렉터리에서 ./configure 스크립트를 실행하고 스크립트에서 Android 빌드를 위해 ./WORKSPACE를 대화형으로 구성하라는 메시지가 표시되면 '예'라고 답합니다. 스크립트는 다음 환경 변수를 사용하여 설정을 구성하려고 시도합니다.

  • 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

그러면 bazel-bin/tensorflow/lite/java/에 AAR 파일이 생성됩니다. 이렇게 하면 여러 아키텍처가 포함된 'fat' 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 작업을 사용하는 경우 선택적으로 tensorflow-lite-select-tf-ops.aar 파일을 생성합니다. 자세한 내용은 LiteRT 바이너리 크기 줄이기 섹션을 참고하세요.

프로젝트에 직접 AAR 추가

tensorflow-lite.aar 파일을 프로젝트의 libs 디렉터리로 이동합니다. 새 디렉터리를 참조하도록 앱의 build.gradle 파일을 수정하고 기존 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에서 mavenLocal() 종속 항목이 있는지 확인하고 표준 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 추론 API를 사용할 수 있습니다.