TensorFlow 연산자 선택

LiteRT 내장 연산자 라이브러리는 제한된 수의 TensorFlow 연산자만 지원하므로 모든 모델을 변환할 수 있는 것은 아닙니다. 자세한 내용은 연산자 호환성을 참고하세요.

변환을 허용하려면 사용자가 LiteRT 모델에서 특정 TensorFlow 작업의 사용을 사용 설정하면 됩니다. 하지만 TensorFlow 작업으로 LiteRT 모델을 실행하려면 핵심 TensorFlow 런타임을 가져와야 하므로 LiteRT 인터프리터 바이너리 크기가 증가합니다. Android의 경우 필요한 TensorFlow 작업만 선택적으로 빌드하여 이 문제를 방지할 수 있습니다. 자세한 내용은 바이너리 크기 줄이기를 참고하세요.

이 문서에서는 원하는 플랫폼에서 TensorFlow 작업이 포함된 LiteRT 모델을 변환하고 실행하는 방법을 설명합니다. 성능 및 크기 측정항목알려진 제한사항도 설명합니다.

모델 변환

다음 예는 선택한 TensorFlow 작업으로 LiteRT 모델을 생성하는 방법을 보여줍니다.

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable LiteRT ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

추론 실행

선택한 TensorFlow 작업 지원으로 변환된 LiteRT 모델을 사용하는 경우 클라이언트는 필요한 TensorFlow 작업 라이브러리가 포함된 LiteRT 런타임도 사용해야 합니다.

Android AAR

바이너리 크기를 줄이려면 다음 섹션에 안내된 대로 자체 맞춤 AAR 파일을 빌드하세요. 바이너리 크기가 크게 문제가 되지 않는다면 MavenCentral에 호스팅된 TensorFlow 작업이 포함된 사전 빌드 AAR을 사용하는 것이 좋습니다.

다음과 같이 표준 LiteRT AAR과 함께 추가하여 build.gradle 종속 항목에 이를 지정할 수 있습니다.

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

야간 스냅샷을 사용하려면 Sonatype 스냅샷 저장소를 추가해야 합니다.

종속 항목을 추가하면 그래프의 TensorFlow 작업을 처리하는 데 필요한 대리자가 필요한 그래프에 자동으로 설치됩니다.

참고: TensorFlow ops 종속 항목은 비교적 크므로 abiFilters를 설정하여 .gradle 파일에서 불필요한 x86 ABI를 필터링하는 것이 좋습니다.

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

Android AAR 빌드

바이너리 크기를 줄이거나 기타 고급 사례의 경우 라이브러리를 수동으로 빌드할 수도 있습니다. 작동하는 LiteRT 빌드 환경이 있다고 가정하고 다음과 같이 선택한 TensorFlow 작업으로 Android AAR을 빌드합니다.

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

이렇게 하면 LiteRT 내장 및 맞춤 작업의 AAR 파일 bazel-bin/tmp/tensorflow-lite.aar이 생성되고 TensorFlow 작업의 AAR 파일 bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar이 생성됩니다. 작동하는 빌드 환경이 없는 경우 Docker로 위 파일을 빌드할 수도 있습니다.

여기에서 AAR 파일을 프로젝트로 직접 가져오거나 커스텀 AAR 파일을 로컬 Maven 저장소에 게시할 수 있습니다.

mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite-select-tf-ops -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'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

CocoaPods 사용

LiteRT는 arm64용으로 미리 빌드된 일부 TF 작업 CocoaPods를 매일 제공하며, TensorFlowLiteSwift 또는 TensorFlowLiteObjC CocoaPods와 함께 사용할 수 있습니다.

참고: x86_64 시뮬레이터에서 특정 TF 작업을 사용해야 하는 경우 특정 작업 프레임워크를 직접 빌드하면 됩니다. 자세한 내용은 Bazel + Xcode 사용 섹션을 참고하세요.

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

pod install를 실행한 후 선택한 TF 작업 프레임워크를 프로젝트에 강제로 로드하는 추가 링커 플래그를 제공해야 합니다. Xcode 프로젝트에서 Build Settings -> Other Linker Flags로 이동하여 다음을 추가합니다.

버전 2.9.0 이상:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

2.9.0 미만 버전의 경우:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

그러면 iOS 앱에서 SELECT_TF_OPS로 변환된 모델을 실행할 수 있습니다. 예를 들어 이미지 분류 iOS 앱을 수정하여 선택한 TF 작업 기능을 테스트할 수 있습니다.

  • 모델 파일을 SELECT_TF_OPS가 사용 설정된 파일로 바꿉니다.
  • 안내에 따라 PodfileTensorFlowLiteSelectTfOps 종속 항목을 추가합니다.
  • 위와 같이 추가 링커 플래그를 추가합니다.
  • 예제 앱을 실행하고 모델이 올바르게 작동하는지 확인합니다.

Bazel + Xcode 사용

iOS용 TensorFlow 연산자를 선택하여 LiteRT를 Bazel을 사용하여 빌드할 수 있습니다. 먼저 iOS 빌드 안내에 따라 Bazel 작업공간과 .bazelrc 파일을 올바르게 구성합니다.

iOS 지원이 사용 설정된 작업공간을 구성한 후 다음 명령어를 사용하여 선택한 TF 작업 부가기능 프레임워크를 빌드할 수 있습니다. 이 프레임워크는 일반 TensorFlowLiteC.framework 위에 추가할 수 있습니다. 선택 TF 작업 프레임워크는 i386 아키텍처용으로 빌드할 수 없으므로 i386를 제외한 대상 아키텍처 목록을 명시적으로 제공해야 합니다.

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

그러면 bazel-bin/tensorflow/lite/ios/ 디렉터리 아래에 프레임워크가 생성됩니다. iOS 빌드 가이드의 Xcode 프로젝트 설정 섹션에 설명된 유사한 단계에 따라 이 새 프레임워크를 Xcode 프로젝트에 추가할 수 있습니다.

앱 프로젝트에 프레임워크를 추가한 후 선택한 TF 작업 프레임워크를 강제로 로드하도록 앱 프로젝트에 추가 링커 플래그를 지정해야 합니다. Xcode 프로젝트에서 Build Settings -> Other Linker Flags로 이동하여 다음을 추가합니다.

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C/C++

Bazel 또는 CMake를 사용하여 LiteRT 인터프리터를 빌드하는 경우 LiteRT Flex 대리자 공유 라이브러리를 연결하여 Flex 대리자를 사용 설정할 수 있습니다. 다음 명령어로 Bazel을 사용하여 빌드할 수 있습니다.

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

이 명령어는 bazel-bin/tensorflow/lite/delegates/flex에 다음 공유 라이브러리를 생성합니다.

플랫폼 라이브러리 이름
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

공유 라이브러리가 연결되어 있는 한 런타임에 인터프리터를 만들 때 필요한 TfLiteDelegate가 자동으로 설치됩니다. 다른 위임 유형에서 일반적으로 필요한 것처럼 위임 인스턴스를 명시적으로 설치할 필요가 없습니다.

참고: 이 기능은 버전 2.7부터 사용할 수 있습니다.

Python

선택된 TensorFlow 작업이 포함된 LiteRT는 TensorFlow pip 패키지와 함께 자동으로 설치됩니다. LiteRT 인터프리터 pip 패키지만 설치할 수도 있습니다.

측정항목

성능

내장 TensorFlow 작업과 선택 TensorFlow 작업을 혼합하여 사용하는 경우 변환된 모델에서 동일한 LiteRT 최적화 및 최적화된 내장 작업을 모두 사용할 수 있습니다.

다음 표에서는 Pixel 2에서 MobileNet의 추론을 실행하는 데 걸리는 평균 시간을 설명합니다. 나열된 시간은 100회 실행의 평균입니다. 이러한 타겟은 --config=android_arm64 -c opt 플래그를 사용하여 Android용으로 빌드되었습니다.

빌드 시간 (밀리초)
기본 제공 작업만 (TFLITE_BUILTIN) 260.7
TF 작업만 사용 (SELECT_TF_OPS) 264.5

바이너리 크기

다음 표에서는 각 빌드의 LiteRT 바이너리 크기를 설명합니다. 이러한 타겟은 --config=android_arm -c opt을 사용하여 Android용으로 빌드되었습니다.

빌드 C++ 바이너리 크기 Android APK 크기
내장 작업만 796 KB 561 KB
기본 제공 작업 + TF 작업 23.0 MB 8.0 MB
내장 작업 + TF 작업 (1) 4.1 MB 1.8 MB

(1) 이러한 라이브러리는 8개의 TFLite 내장 작업과 3개의 TensorFlow 작업이 있는 i3d-kinetics-400 모델용으로 선택적으로 빌드됩니다. 자세한 내용은 LiteRT 바이너리 크기 줄이기 섹션을 참고하세요.

알려진 제한사항

  • 지원되지 않는 유형: 특정 TensorFlow 작업은 일반적으로 TensorFlow에서 사용할 수 있는 전체 입력/출력 유형을 지원하지 않을 수 있습니다.

업데이트

  • 버전 2.6
    • GraphDef 속성 기반 연산자와 HashTable 리소스 초기화 지원이 개선되었습니다.
  • 버전 2.5
  • 버전 2.4
    • 하드웨어 가속 대리자와의 호환성이 개선되었습니다.