Android용 TensorFlow Lite 빌드

이 문서에서는 TensorFlow Lite Android 라이브러리를 직접 빌드하는 방법을 설명합니다. 일반적으로 TensorFlow Lite 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를 사용할 수 있습니다.