Zbuduj TensorFlow Lite na iOS

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Ten dokument opisuje, jak samodzielnie zbudować bibliotekę TensorFlow Lite iOS. Zwykle nie musisz lokalnie budować biblioteki TensorFlow Lite iOS. Jeśli chcesz po prostu z niego korzystać, najłatwiejszym sposobem jest skorzystanie z gotowych, stabilnych lub nocnych wersji TensorFlow Lite CocoaPods. Zobacz Szybki start dla iOS , aby uzyskać więcej informacji na temat ich używania w projektach iOS.

Budowanie lokalnie

W niektórych przypadkach możesz chcieć użyć lokalnej kompilacji TensorFlow Lite, na przykład, gdy chcesz wprowadzić lokalne zmiany w TensorFlow Lite i przetestować te zmiany w swojej aplikacji na iOS lub wolisz korzystać ze statycznej struktury zamiast dostarczonej przez nas dynamicznej. Aby utworzyć uniwersalną platformę iOS dla TensorFlow Lite lokalnie, musisz ją zbudować przy użyciu Bazel na komputerze z systemem macOS.

Zainstaluj Xcode

Jeśli jeszcze tego nie zrobiłeś, będziesz musiał zainstalować Xcode 8 lub nowszy oraz narzędzia za pomocą xcode-select :

xcode-select --install

Jeśli jest to nowa instalacja, musisz zaakceptować umowę licencyjną dla wszystkich użytkowników za pomocą następującego polecenia:

sudo xcodebuild -license accept

Zainstaluj Bazel

Bazel to podstawowy system kompilacji dla TensorFlow. Zainstaluj Bazel zgodnie z instrukcjami na stronie Bazel . Upewnij się, że wybrałeś wersję pomiędzy _TF_MIN_BAZEL_VERSION i _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 kasowym TensorFlow i odpowiedz "Tak", gdy skrypt zapyta, czy chcesz zbudować TensorFlow z obsługą iOS.

Po prawidłowym skonfigurowaniu Bazela z obsługą iOS, możesz zbudować framework TensorFlowLiteC za pomocą następującego 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 wygenerowany framework zawiera "gruby" plik binarny, zawierający armv7, arm64 i x86_64 (ale nie i386). Aby zobaczyć pełną listę flag kompilacji używanych po określeniu --config=ios_fat , zapoznaj się z sekcją iOS configs w pliku .bazelrc .

Zbuduj statyczny framework TensorFlowLiteC

Domyślnie dystrybuujemy ramy dynamiczne tylko za pośrednictwem Cocoapods. Jeśli zamiast tego chcesz użyć statycznego frameworka, możesz zbudować statyczny framework TensorFlowLiteC za pomocą następującego 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 bazel-bin/tensorflow/lite/ios/ w katalogu głównym TensorFlow. Ta statyczna struktura może być używana dokładnie w taki sam sposób, jak dynamiczna.

Selektywnie buduj frameworki TFLite

Możesz budować mniejsze struktury ukierunkowane tylko na zestaw modeli za pomocą kompilacji selektywnej, która pomija nieużywane operacje w zestawie modeli i zawiera tylko jądra op wymagane do uruchomienia danego zestawu modeli. Polecenie wygląda następująco:

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

Powyższe polecenie wygeneruje statyczny framework bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip dla wbudowanych i niestandardowych operacji TensorFlow Lite; i opcjonalnie generuje statyczny framework bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip , jeśli modele zawierają operacje Select TensorFlow. Zwróć uwagę, że flaga --target_archs może służyć do określenia architektury wdrożenia.

Użyj we własnej aplikacji

Deweloperzy CocoaPods

Istnieją trzy CocoaPods dla TensorFlow Lite:

  • TensorFlowLiteSwift : udostępnia interfejsy API Swift dla TensorFlow Lite.
  • TensorFlowLiteObjC : udostępnia interfejsy API Objective-C dla TensorFlow Lite.
  • TensorFlowLiteC : wspólny podstawowy zasobnik, który osadza podstawowe środowisko uruchomieniowe TensorFlow Lite i udostępnia podstawowe interfejsy API języka C używane przez powyższe dwa zasobniki. Nie jest przeznaczony do bezpośredniego użytku przez użytkowników.

Jako programista powinieneś wybrać TensorFlowLiteSwift lub TensorFlowLiteObjC w zależności od języka, w którym napisana jest Twoja aplikacja, ale nie obu. Dokładne kroki korzystania z lokalnych kompilacji TensorFlow Lite różnią się w zależności od tego, którą konkretną część chcesz zbudować.

Korzystanie z lokalnych interfejsów API Swift lub Objective-C

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

  1. Wprowadź zmiany w interfejsach API Swift lub Objective-C w procesie realizacji transakcji tensorflow .

  2. Otwórz TensorFlowLite(Swift|ObjC).podspec i zaktualizuj ten wiersz:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    być:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Ma to na celu upewnienie się, że kompilujesz interfejsy API Swift lub Objective-C w oparciu o najnowszą dostępną nocną wersję interfejsów API TensorFlowLiteC (budowaną co noc między 1-4 rano czasu pacyficznego), a nie wersję stabilną, która może być przestarzała w porównaniu z lokalnym tensorflow Sprawdź. Alternatywnie możesz opublikować własną wersję TensorFlowLiteC i użyć tej wersji (patrz sekcja Korzystanie z lokalnego rdzenia TensorFlow Lite poniżej).

  3. W Podfile projektu iOS zmień zależność w następujący sposób, aby wskazać ścieżkę lokalną do katalogu głównego tensorflow .
    Dla jerzyków:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Dla celu C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

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

  5. Ponownie otwórz wygenerowany obszar roboczy ( <project>.xcworkspace ) i odbuduj swoją aplikację w Xcode.

Korzystanie z lokalnego rdzenia TensorFlow Lite

Możesz skonfigurować prywatne repozytorium specyfikacji CocoaPods i opublikować swoją niestandardową TensorFlowLiteC w swoim prywatnym repozytorium. Możesz skopiować ten plik podspec i zmodyfikować 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 postępować zgodnie z instrukcjami korzystania z prywatnych CocoaPods , aby użyć go we własnym projekcie. Możesz również zmodyfikować TensorFlowLite(Swift|ObjC).podspec , aby wskazywał niestandardowy TensorFlowLiteC i używać modułu Swift lub Objective-C w projekcie aplikacji.

Deweloperzy Bazela

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

Dla jerzyków:

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

Dla celu C:

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

Podczas kompilowania projektu aplikacji wszelkie zmiany w bibliotece TensorFlow Lite zostaną pobrane i wbudowane w aplikację.

Bezpośrednia modyfikacja ustawień projektu Xcode

Zdecydowanie zaleca się użycie CocoaPods lub Bazel w celu dodania zależności TensorFlow Lite do swojego projektu. Jeśli nadal chcesz ręcznie dodać framework TensorFlowLiteC , musisz dodać framework TensorFlowLiteC jako platformę osadzoną do projektu aplikacji. Rozpakuj TensorFlowLiteC_framework.zip wygenerowany z powyższej kompilacji, aby uzyskać katalog TensorFlowLiteC.framework . Ten katalog jest rzeczywistą strukturą, którą Xcode może zrozumieć.

Po przygotowaniu TensorFlowLiteC.framework , najpierw musisz dodać go jako osadzony plik binarny do celu aplikacji. Dokładna sekcja ustawień projektu w tym przypadku może się różnić w zależności od wersji Xcode.

  • Xcode 11: Przejdź do zakładki „Ogólne” edytora projektu dla celu aplikacji i dodaj TensorFlowLiteC.framework w sekcji „Frameworks, Libraries i Embedded Content”.
  • Xcode 10 i poniżej: Przejdź do zakładki „Ogólne” edytora projektu dla docelowej aplikacji i dodaj TensorFlowLiteC.framework w sekcji „Osadzone pliki binarne”. Framework powinien być również dodany automatycznie w sekcji 'Linked Frameworks and Libraries'.

Gdy dodasz platformę jako osadzony plik binarny, Xcode zaktualizuje również wpis „Ścieżki wyszukiwania struktury” w zakładce „Ustawienia kompilacji”, aby uwzględnić katalog nadrzędny struktury. Jeśli nie dzieje się to automatycznie, należy ręcznie dodać katalog nadrzędny katalogu TensorFlowLiteC.framework .

Po wykonaniu tych dwóch ustawień powinieneś być w stanie zaimportować i wywołać API C TensorFlow Lite, zdefiniowane przez pliki nagłówkowe w katalogu TensorFlowLiteC.framework/Headers .