Android용 TensorFlow Lite 빌드

이 문서에서는 TensorFlow Lite Android 라이브러리를 직접 빌드하는 방법을 설명합니다. 일반적으로 TensorFlow Lite Android 라이브러리를 로컬에서 빌드할 필요가 없습니다. 이 API를 사용하려면 Android 빠른 시작에서 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 '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 스튜디오 및 Android Native Development Kit의 모든 사용에 https://developer.android.com/studio/terms에서 확인할 수 있는 Android 소프트웨어 개발 키트 라이선스 계약이 적용된다는 데 동의하는 것으로 간주됩니다 (이 URL은 Google에서 수시로 업데이트하거나 변경할 수 있음).

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

  • 선택적으로 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}"

이제 Configure WORKSPACE 및 .bazelrc 섹션으로 이동하여 빌드 설정을 구성해야 합니다.

라이브러리 빌드가 끝나면 컨테이너 내부의 /host_dir에 복사하여 호스트에서 액세스할 수 있습니다.

Docker 없이 빌드 환경 설정

Bazel 및 Android 기본 요건 설치

Bazel은 TensorFlow의 기본 빌드 시스템입니다. 이 라이브러리를 사용하여 빌드하려면 시스템에 Android NDK 및 SDK가 설치되어 있어야 합니다.

  1. 최신 버전의 Bazel 빌드 시스템을 설치합니다.
  2. Android NDK는 네이티브 (C/C++) TensorFlow Lite 코드를 빌드하는 데 필요합니다. 현재 권장되는 버전은 25b이며 여기에서 확인할 수 있습니다.
  3. Android SDK 및 빌드 도구는 여기에서 가져오거나 Android 스튜디오의 일부로 가져올 수 있습니다. Build Tools API 23 이상은 TensorFlow Lite를 빌드하는 데 권장되는 버전입니다.

WORKSPACE 및 .bazelrc 구성

이는 TF Lite 라이브러리를 빌드하는 데 필요한 일회성 구성 단계입니다. 루트 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이 올바르게 구성되었으면 다음과 같이 루트 결제 디렉터리에서 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

그러면 bazel-bin/tensorflow/lite/java/에 AAR 파일이 생성됩니다. 이렇게 하면 여러 아키텍처로 '뚱뚱한' 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 파일(선택사항)을 생성합니다. 자세한 내용은 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')
}

로컬 Maven 저장소에 AAR 설치

루트 결제 디렉터리에서 다음 명령어를 실행합니다.

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.gradlemavenLocal() 종속 항목이 있는지 확인하고 표준 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를 사용할 수 있습니다.