TensorFlow 연산자 선택

TensorFlow Lite 기본 제공 연산자 라이브러리는 제한된 수의 TensorFlow 연산자만 지원하므로 변환할 수 없는 모델도 있습니다. 자세한 내용은 연산자 호환성을 참고하세요.

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

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

모델 변환

다음 예에서는 일부 TensorFlow 작업으로 TensorFlow Lite 모델을 생성하는 방법을 보여줍니다.

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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

추론 실행

일부 TensorFlow 작업 지원과 함께 변환된 TensorFlow Lite 모델을 사용하는 경우 클라이언트는 TensorFlow 작업의 필수 라이브러리가 포함된 TensorFlow Lite 런타임도 사용해야 합니다.

Android AAR

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

다음과 같이 표준 TensorFlow Lite 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 빌드

바이너리 크기나 다른 고급 사례를 줄이기 위해 라이브러리를 수동으로 빌드할 수도 있습니다. 작동하는 TensorFlow Lite 빌드 환경을 가정하고 다음과 같이 일부 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

이렇게 하면 TensorFlow Lite 기본 제공 및 맞춤 작업을 위한 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.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'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

CocoaPods 사용

TensorFlow Lite는 TensorFlowLiteSwift 또는 TensorFlowLiteObjC CocoaPods와 함께 사용할 수 있는 arm64용 야간 사전 빌드된 TF 작업 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가 사용 설정된 상태로 변환된 파일로 바꿉니다.
  • 안내에 따라 TensorFlowLiteSelectTfOps 종속 항목을 Podfile에 추가합니다.
  • 위와 같이 추가 링커 플래그를 추가합니다.
  • 예시 앱을 실행하고 모델이 올바르게 작동하는지 확인합니다.

Bazel + Xcode 사용

일부 iOS용 TensorFlow 작업이 포함된 TensorFlow Lite는 Bazel을 사용하여 빌드할 수 있습니다. 먼저 iOS 빌드 안내에 따라 Bazel 작업공간과 .bazelrc 파일을 올바르게 구성합니다.

iOS 지원이 사용 설정된 작업공간을 구성한 후에는 다음 명령어를 사용하여 엄선된 TF 작업 부가기능 프레임워크를 빌드할 수 있습니다. 이 프레임워크는 일반 TensorFlowLiteC.framework 위에 추가할 수 있습니다. TF Ops 프레임워크는 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를 사용하여 TensorFlow Lite 인터프리터를 빌드하는 경우 TensorFlow Lite 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 작업이 포함된 TensorFlow Lite는 TensorFlow pip 패키지와 함께 자동으로 설치됩니다. TensorFlow Lite 인터프리터 pip 패키지만 설치하도록 선택할 수도 있습니다.

측정항목

성능

기본 제공 작업과 일부 TensorFlow 작업을 혼합하여 사용하면 변환된 모델에서 동일한 TensorFlow Lite 최적화 및 최적화된 내장 작업을 모두 사용하고 사용할 수 있습니다.

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

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

바이너리 크기

다음 표에서는 빌드별 TensorFlow Lite의 바이너리 크기를 설명합니다. 이러한 타겟은 --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-kintics-400 모델용으로 선별적으로 빌드됩니다. 자세한 내용은 TensorFlow Lite 바이너리 크기 줄이기 섹션을 참조하세요.

알려진 제한사항

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

업데이트

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