Kompilacja TensorFlow Lite na iOS

Ten dokument opisuje, jak samodzielnie utworzyć bibliotekę iOS TensorFlow Lite na iOS. Standardowo nie trzeba lokalnie tworzyć biblioteki TensorFlow Lite na iOS. Jeśli chcesz po prostu korzystać z tej funkcji, najprostszym sposobem jest użycie gotowej wersji stabilnej lub nocnej wersji TensorFlow Lite CocoaPods. Więcej informacji o korzystaniu z nich w projektach na iOS znajdziesz w krótkim wprowadzeniu na iOS.

Tworzę lokalnie

W niektórych przypadkach możesz użyć lokalnej kompilacji TensorFlow Lite, na przykład gdy chcesz wprowadzić lokalne zmiany w TensorFlow Lite i przetestować je w swojej aplikacji na iOS lub wolisz użyć platformy statycznej zamiast naszej dynamicznej. Aby lokalnie utworzyć uniwersalną platformę iOS dla TensorFlow Lite, trzeba to zrobić w Bazel na komputerze z macOS.

Zainstaluj Xcode

Jeśli nie masz jeszcze zainstalowanego języka Xcode 8 lub nowszego, musisz zainstalować narzędzia, korzystając z xcode-select:

xcode-select --install

Jeśli jest to nowa instalacja, konieczne będzie zaakceptowanie umowy licencyjnej dla wszystkich użytkowników za pomocą tego polecenia:

sudo xcodebuild -license accept

Zainstaluj aplikację Bazel

Bazel to podstawowy system kompilacji dla TensorFlow. Zainstaluj Bazel zgodnie z instrukcjami na stronie Bazel. Pamiętaj, aby wybrać wersję od _TF_MIN_BAZEL_VERSION do _TF_MAX_BAZEL_VERSION w pliku configure.py w katalogu głównym repozytorium tensorflow.

Skonfiguruj WORKSPACE i .bazelrc

Uruchom skrypt ./configure w głównym katalogu płatności TensorFlow i odpowiedz „Tak”, gdy skrypt zapyta, czy chcesz skompilować TensorFlow z obsługą iOS.

Po prawidłowym skonfigurowaniu aplikacji Bazel pod kątem obsługi iOS możesz utworzyć platformę TensorFlowLiteC za pomocą tego polecenia.

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

To polecenie wygeneruje plik TensorFlowLiteC_framework.zip w katalogu bazel-bin/tensorflow/lite/ios/ w katalogu głównym TensorFlow. Domyślnie wygenerowana platforma zawiera „tłuszczowy” plik binarny zawierający Armv7, arm64 i x86_64 (ale nie i386). Pełną listę flag kompilacji używanych, gdy określasz --config=ios_fat, znajdziesz w sekcji konfiguracji iOS w pliku .bazelrc.

Tworzenie statycznej platformy TensorFlowLiteC

Domyślnie rozpowszechniamy dynamiczną platformę tylko za pomocą Cocoapods. Jeśli chcesz użyć platformy statycznej, możesz utworzyć statyczną platformę TensorFlowLiteC za pomocą tego polecenia:

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

Polecenie wygeneruje plik o nazwie TensorFlowLiteC_static_framework.zip w katalogu bazel-bin/tensorflow/lite/ios/ w katalogu głównym TensorFlow. Tej statycznej platformy można używać dokładnie w taki sam sposób jak platformy dynamicznej.

Selektywne tworzenie platform TFLite

Mniejsze platformy kierowane tylko na zestaw modeli możesz tworzyć za pomocą selektywnej kompilacji, która pomija nieużywane operacje w zbiorze modeli i uwzględnia tylko jądra operacji wymagane do uruchomienia danego zestawu modeli. Oto polecenie:

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

Powyższe polecenie wygeneruje statyczną platformę bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip na potrzeby wbudowanych i niestandardowych operacji TensorFlow Lite. Opcjonalnie wygeneruje platformę statyczną bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip, jeśli Twoje modele zawierają operacje Select TensorFlow. Pamiętaj, że flaga --target_archs może służyć do określania architektur wdrożeń.

Wykorzystaj we własnej aplikacji

Programiści CocoaPods

Dla TensorFlow Lite dostępne są 3 komponenty CocoaPods:

  • TensorFlowLiteSwift: udostępnia interfejsy API Swift dla TensorFlow Lite.
  • TensorFlowLiteObjC: udostępnia interfejsy API Objective-C dla TensorFlow Lite.
  • TensorFlowLiteC: wspólny pod podstawowy, który zawiera podstawowe środowisko wykonawcze TensorFlow Lite i udostępnia podstawowe interfejsy API C używane przez 2 powyższe pody. Nie są przeznaczone bezpośrednie dla użytkowników.

Jako deweloper wybierz TensorFlowLiteSwift lub TensorFlowLiteObjC blok w zależności od języka aplikacji, ale nie oba te rodzaje naraz. Dokładne kroki, które musisz wykonać, aby użyć lokalnych kompilacji TensorFlow Lite, zależą od tego, którą część chcesz utworzyć.

Używanie lokalnych interfejsów API Swift lub Objective-C

Jeśli używasz CocoaPods i chcesz przetestować tylko pewne lokalne zmiany w interfejsach API Swift lub interfejsach API Objective-C TensorFlow Lite, wykonaj te czynności.

  1. Wprowadź zmiany w interfejsach API Swift lub Objective-C podczas procesu płatności tensorflow.

  2. Otwórz plik TensorFlowLite(Swift|ObjC).podspec i zaktualizuj ten wiersz:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    na:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Dzięki temu masz pewność, że tworzysz interfejsy API Swift lub Objective-C przy użyciu najnowszej dostępnej nocnej wersji interfejsów API TensorFlowLiteC (uruchamianych co noc między 1:00 a 4:00 czasu pacyficznego), a nie wersji stabilnej, która może być nieaktualna w porównaniu z lokalną wersją płatności tensorflow. Możesz też opublikować własną wersję systemu TensorFlowLiteC i użyć jej (patrz sekcja Korzystanie z lokalnego rdzenia TensorFlow Lite poniżej).

  3. W Podfile projektu na iOS zmień zależność w ten sposób, aby wskazywała ścieżkę lokalną do katalogu głównego tensorflow.
    W przypadku Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    W przypadku elementu Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Zaktualizuj instalację podów z katalogu głównego projektu na iOS.
    $ pod update

  5. Otwórz ponownie wygenerowany obszar roboczy (<project>.xcworkspace) i odtwórz aplikację w Xcode.

Użycie lokalnego rdzenia TensorFlow Lite

Możesz skonfigurować prywatne repozytorium specyfikacji CocoaPods i opublikować własną platformę TensorFlowLiteC w swoim prywatnym repozytorium. Możesz skopiować ten plik podspec i zmienić kilka wartości:

  ...
  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'
  ...

Po utworzeniu własnego pliku TensorFlowLiteC.podspec możesz wykonać instrukcje korzystania z prywatnych CocoaPods, aby użyć go we własnym projekcie. Możesz też zmodyfikować TensorFlowLite(Swift|ObjC).podspec, aby wskazywał Twój niestandardowy pod TensorFlowLiteC, a następnie użyć poda Swift lub Objective-C w projekcie aplikacji.

Deweloperzy baz danych

Jeśli używasz Bazel jako głównego narzędzia do kompilacji, możesz po prostu dodać zależność TensorFlowLite do celu w pliku BUILD.

W przypadku Swift:

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

W przypadku Objective-C:

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

Gdy tworzysz projekt aplikacji, wszelkie zmiany w bibliotece TensorFlow Lite są wychwytywane i wbudowane w aplikację.

Bezpośrednio modyfikuj ustawienia projektu Xcode

Zdecydowanie zalecamy użycie CocoaPods lub Bazel w celu dodania zależności TensorFlow Lite do projektu. Jeśli nadal chcesz ręcznie dodać platformę TensorFlowLiteC, musisz dodać platformę TensorFlowLiteC jako osadzoną platformę do projektu aplikacji. Rozpakuj plik TensorFlowLiteC_framework.zip wygenerowany w ramach powyższej kompilacji, aby uzyskać katalog TensorFlowLiteC.framework. Jest to rzeczywista platforma zrozumiała dla Xcode.

Po przygotowaniu pliku TensorFlowLiteC.framework musisz najpierw dodać go jako osadzony plik binarny do miejsca docelowego aplikacji. Dokładne ustawienia projektu mogą się różnić w zależności od wersji Xcode.

  • Xcode 11: w edytorze projektu otwórz kartę „General” (Ogólne) dla miejsca docelowego aplikacji i dodaj TensorFlowLiteC.framework w sekcji „Frameworks, Libraries andnę Content”.
  • Xcode 10 i starsze: w edytorze projektu otwórz kartę „General” (Ogólne) miejsca docelowego aplikacji i dodaj TensorFlowLiteC.framework w sekcji „Osadzone pliki binarne”. Platformę tę należy też dodać automatycznie w sekcji „Połączone platformy i biblioteki”.

Gdy dodasz platformę jako osadzony plik binarny, Xcode zaktualizuje też wpis „Framework Search Paths” na karcie „Build Settings” (Ustawienia kompilacji), aby uwzględnić katalog nadrzędny Twojej platformy. Jeśli nie dzieje się to automatycznie, musisz ręcznie dodać katalog nadrzędny katalogu TensorFlowLiteC.framework.

Gdy skonfigurujesz te 2 ustawienia, możesz zaimportować i wywołać interfejs C API TensorFlow Lite, zdefiniowany przez pliki nagłówka w katalogu TensorFlowLiteC.framework/Headers.