iOS용 TensorFlow Lite 빌드

이 문서에서는 TensorFlow Lite iOS 라이브러리를 직접 빌드하는 방법을 설명합니다. 일반적으로 TensorFlow Lite iOS 라이브러리를 로컬에서 빌드할 필요가 없습니다. 그냥 사용하려는 경우 가장 쉬운 방법은 TensorFlow Lite CocoaPods의 사전 빌드된 안정화 버전 또는 나이틀리 출시 버전을 사용하는 것입니다. iOS 프로젝트에서 이를 사용하는 방법에 대한 자세한 내용은 iOS 빠른 시작을 참조하세요.

로컬에서 빌드

TensorFlow Lite를 로컬에서 변경하고 변경사항을 iOS 앱에서 테스트하려는 경우 또는 제공된 동적 프레임워크보다 정적 프레임워크를 사용하려는 경우 등 TensorFlow Lite의 로컬 빌드를 사용해야 하는 경우도 있습니다. 로컬에서 TensorFlow Lite용 범용 iOS 프레임워크를 만들려면 macOS 머신에서 Bazel을 사용하여 빌드해야 합니다.

Xcode 설치

Xcode 8 이상과 xcode-select를 사용하여 도구를 아직 설치하지 않았다면 설치해야 합니다.

xcode-select --install

새로 설치하는 경우 다음 명령어를 사용하여 모든 사용자의 라이선스 계약에 동의해야 합니다.

sudo xcodebuild -license accept

Bazel 설치

Bazel은 TensorFlow의 기본 빌드 시스템입니다. Bazel 웹사이트의 안내에 따라 Bazel을 설치합니다. tensorflow 저장소의 루트에 있는 configure.py 파일에서 _TF_MIN_BAZEL_VERSION에서 _TF_MAX_BAZEL_VERSION 사이의 버전을 선택해야 합니다.

WORKSPACE 및 .bazelrc 구성

루트 TensorFlow 결제 디렉터리에서 ./configure 스크립트를 실행하고 스크립트에서 iOS 지원으로 TensorFlow를 빌드할지 묻는 메시지가 표시되면 '예'라고 답합니다.

Bazel이 iOS 지원으로 올바르게 구성되면 다음 명령어를 사용하여 TensorFlowLiteC 프레임워크를 빌드할 수 있습니다.

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

이 명령어는 TensorFlow 루트 디렉터리의 bazel-bin/tensorflow/lite/ios/ 디렉터리에 TensorFlowLiteC_framework.zip 파일을 생성합니다. 기본적으로 생성된 프레임워크에는 armv7, arm64, x86_64가 포함된 'fat' 바이너리가 포함됩니다 (i386 제외). --config=ios_fat를 지정할 때 사용되는 빌드 플래그의 전체 목록을 보려면 .bazelrc 파일의 iOS 구성 섹션을 참고하세요.

TensorFlowLiteC 정적 프레임워크 빌드

기본적으로 Google은 Cocoapods를 통해서만 동적 프레임워크를 배포합니다. 대신 정적 프레임워크를 사용하려면 다음 명령어를 사용하여 TensorFlowLiteC 정적 프레임워크를 빌드할 수 있습니다.

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

이 명령어는 TensorFlow 루트 디렉터리 아래의 bazel-bin/tensorflow/lite/ios/ 디렉터리에 TensorFlowLiteC_static_framework.zip라는 파일을 생성합니다. 이 정적 프레임워크는 동적 프레임워크와 완전히 동일한 방식으로 사용할 수 있습니다.

선택적으로 TFLite 프레임워크 빌드

선택적 빌드를 사용하여 모델 집합만 타겟팅하는 소규모 프레임워크를 빌드할 수 있습니다. 이렇게 하면 모델 집합에서 사용되지 않는 작업을 건너뛰고 지정된 모델 집합을 실행하는 데 필요한 작업 커널만 포함합니다. 명령어는 다음과 같습니다.

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

위의 명령어는 TensorFlow Lite 내장 및 맞춤 작업을 위한 정적 프레임워크 bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip를 생성합니다. 모델에 TensorFlow 선택 작업이 포함된 경우 선택적으로 정적 프레임워크 bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip를 생성합니다. --target_archs 플래그를 사용하여 배포 아키텍처를 지정할 수 있습니다.

자체 애플리케이션에서 사용

CocoaPods 개발자

TensorFlow Lite용 CocoaPods는 세 가지가 있습니다.

  • TensorFlowLiteSwift: TensorFlow Lite용 Swift API를 제공합니다.
  • TensorFlowLiteObjC: TensorFlow Lite용 Objective-C API를 제공합니다.
  • TensorFlowLiteC: TensorFlow Lite 코어 런타임을 삽입하고 위의 두 포드에서 사용하는 기본 C API를 노출하는 공통 기본 포드 사용자가 직접 사용해서는 안 됩니다.

개발자는 앱이 작성된 언어에 따라 TensorFlowLiteSwift 또는 TensorFlowLiteObjC 포드를 선택해야 합니다. TensorFlow Lite의 로컬 빌드를 사용하는 정확한 단계는 빌드하려는 부분에 따라 다릅니다.

로컬 Swift 또는 Objective-C API 사용

CocoaPods를 사용하고 있고 TensorFlow Lite의 Swift API 또는 Objective-C API의 일부 로컬 변경사항만 테스트하려면 다음 단계를 따르세요.

  1. tensorflow 결제에서 Swift 또는 Objective-C API를 변경합니다.

  2. TensorFlowLite(Swift|ObjC).podspec 파일을 열고 다음 줄을 업데이트합니다.
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    다음과 같이 업데이트:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    사용 가능한 최신 야간 버전의 TensorFlowLiteC API(태평양 표준시 기준 매일 밤 오전 1시~4시 사이에 빌드됨)를 대상으로 Swift 또는 Objective-C API를 빌드하고 있는지 확인하기 위한 것입니다. 안정화 버전은 로컬 tensorflow 체크아웃에 비해 오래되었을 수 있습니다. 또는 자체 TensorFlowLiteC 버전을 게시하고 이 버전을 사용할 수도 있습니다 (아래의 로컬 TensorFlow Lite 코어 사용 섹션 참고).

  3. iOS 프로젝트의 Podfile에서 tensorflow 루트 디렉터리의 로컬 경로를 가리키도록 종속 항목을 다음과 같이 변경합니다.
    Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. iOS 프로젝트 루트 디렉터리에서 포드 설치를 업데이트합니다.
    $ pod update

  5. 생성된 작업공간 (<project>.xcworkspace)을 다시 열고 Xcode 내에서 앱을 다시 빌드합니다.

로컬 TensorFlow Lite Core 사용

비공개 CocoaPods 사양 저장소를 설정하고 커스텀 TensorFlowLiteC 프레임워크를 비공개 저장소에 게시할 수 있습니다. 이 podspec 파일을 복사하고 몇 가지 값을 수정할 수 있습니다.

  ...
  s.version      = <your_desired_version_tag>
  ...
  # Note the `///`, two from the `file://` and one from the `/path`.
  s.source       = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
  ...
  s.vendored_frameworks = 'TensorFlowLiteC.framework'
  ...

TensorFlowLiteC.podspec 파일을 직접 만든 후 비공개 CocoaPods 사용 안내에 따라 자체 프로젝트에서 사용할 수 있습니다. 맞춤 TensorFlowLiteC 포드를 가리키고 앱 프로젝트에서 Swift 또는 Objective-C 포드를 사용하도록 TensorFlowLite(Swift|ObjC).podspec를 수정할 수도 있습니다.

Bazel 개발자

Bazel을 기본 빌드 도구로 사용하는 경우 BUILD 파일의 타겟에 TensorFlowLite 종속 항목을 추가하기만 하면 됩니다.

Swift:

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

Objective-C:

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

앱 프로젝트를 빌드하면 TensorFlow Lite 라이브러리의 변경사항이 선택되어 앱에 빌드됩니다.

Xcode 프로젝트 설정 직접 수정

프로젝트에 TensorFlow Lite 종속 항목을 추가하려면 CocoaPods 또는 Bazel을 사용하는 것이 좋습니다. 여전히 TensorFlowLiteC 프레임워크를 수동으로 추가하려면 TensorFlowLiteC 프레임워크를 애플리케이션 프로젝트에 삽입된 프레임워크로 추가해야 합니다. 위 빌드에서 생성된 TensorFlowLiteC_framework.zip의 압축을 풀어 TensorFlowLiteC.framework 디렉터리를 가져옵니다. 이 디렉터리는 Xcode가 이해할 수 있는 실제 프레임워크입니다.

TensorFlowLiteC.framework가 준비되었으면 먼저 이를 앱 타겟에 삽입된 바이너리로 추가해야 합니다. 정확한 프로젝트 설정 섹션은 Xcode 버전에 따라 다를 수 있습니다.

  • Xcode 11: 앱 타겟의 프로젝트 편집기의 'General' 탭으로 이동하여 'Frameworks, Library, and Embedded Content'(프레임워크, 라이브러리, 삽입된 콘텐츠) 섹션에 TensorFlowLiteC.framework를 추가합니다.
  • Xcode 10 이하: 앱 타겟의 프로젝트 편집기의 'General(일반)' 탭으로 이동하여 'Embedded 바이너리(삽입된 바이너리)'에 TensorFlowLiteC.framework를 추가합니다. 또한 프레임워크는 '연결된 프레임워크 및 라이브러리' 섹션에 자동으로 추가됩니다.

프레임워크를 삽입된 바이너리로 추가하면 Xcode는 'Build Settings'(빌드 설정) 탭의 'Framework Search Paths(프레임워크 검색 경로)' 항목도 업데이트하여 프레임워크의 상위 디렉터리를 포함합니다. 이 작업이 자동으로 수행되지 않으면 TensorFlowLiteC.framework 디렉터리의 상위 디렉터리를 수동으로 추가해야 합니다.

이 두 가지 설정이 완료되면 TensorFlowLiteC.framework/Headers 디렉터리의 헤더 파일에 의해 정의된 TensorFlow Lite의 C API를 가져와 호출할 수 있습니다.