Zbuduj TensorFlow Lite na iOS

W tym dokumencie opisano, jak samodzielnie zbudować bibliotekę TensorFlow Lite iOS. Zwykle nie trzeba lokalnie budować biblioteki TensorFlow Lite iOS. Jeśli chcesz po prostu z niego skorzystać, najłatwiejszym sposobem jest skorzystanie z gotowych stabilnych lub nocnych wydań TensorFlow Lite CocoaPods. Zobacz przewodnik Szybki start dla systemu iOS , aby uzyskać więcej informacji na temat używania ich w projektach systemu iOS.

Budowanie lokalnie

W niektórych przypadkach możesz chcieć użyć lokalnej wersji TensorFlow Lite, na przykład gdy chcesz wprowadzić lokalne zmiany w TensorFlow Lite i przetestować te zmiany w swojej aplikacji na iOS lub wolisz używać platformy statycznej zamiast dostarczonej przez nas struktury dynamicznej. Aby lokalnie stworzyć uniwersalny framework iOS dla TensorFlow Lite, musisz go zbudować przy użyciu Bazela na maszynie z systemem macOS.

Zainstaluj Xcode

Jeśli jeszcze tego nie zrobiłeś, będziesz musiał zainstalować Xcode 8 lub nowszy i narzędzia używające 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 Bazela

Bazel to podstawowy system kompilacji dla TensorFlow. Zainstaluj Bazel zgodnie z instrukcjami na stronie internetowej 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ć środowisko 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ą konfiguracji iOS w pliku .bazelrc .

Zbuduj statyczną platformę TensorFlowLiteC

Domyślnie dystrybuujemy dynamiczny framework wyłącznie za pośrednictwem Cocoapods. Jeśli zamiast tego chcesz użyć struktury statycznej, możesz zbudować strukturę statyczną 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 katalogu bazel-bin/tensorflow/lite/ios/ w katalogu głównym TensorFlow. Tego statycznego frameworka można używać dokładnie w taki sam sposób, jak dynamicznego.

Selektywnie buduj frameworki TFLite

Możesz budować mniejsze struktury ukierunkowane tylko na zestaw modeli, korzystając z kompilacji selektywnej, która pominie nieużywane operacje w zestawie modeli i będzie zawierać tylko jądra operacji wymagane do uruchomienia danego zestawu modeli. Polecenie jest następujące:

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

Powyższe polecenie wygeneruje statyczną strukturę bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip dla wbudowanych i niestandardowych operacji TensorFlow Lite; i opcjonalnie generuje statyczną strukturę bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip jeśli Twoje modele zawierają operacje Select TensorFlow. Należy pamiętać, że flagi --target_archs można użyć do określenia architektur wdrażania.

Użyj we własnej aplikacji

Twórcy CocoaPods

Istnieją trzy CocoaPods dla TensorFlow Lite:

  • TensorFlowLiteSwift : zapewnia interfejsy API Swift dla TensorFlow Lite.
  • TensorFlowLiteObjC : zapewnia interfejsy API języka C dla TensorFlow Lite.
  • TensorFlowLiteC : wspólny moduł podstawowy, który osadza rdzeń wykonawczy 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życia przez użytkowników.

Jako programista powinieneś wybrać moduł TensorFlowLiteSwift lub TensorFlowLiteObjC w zależności od języka, w którym napisana jest Twoja aplikacja, ale nie oba. Dokładne kroki korzystania z lokalnych kompilacji TensorFlow Lite różnią się w zależności od dokładnej części, którą 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 API Objective-C TensorFlow Lite, wykonaj poniższe kroki.

  1. Wprowadź zmiany w interfejsach API Swift lub Objective-C w kasie tensorflow .

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

  3. W Podfile swojego projektu na iOS zmień zależność w następujący sposób, aby wskazywała lokalną ścieżkę do katalogu głównego tensorflow .
    Dla Swifta:
    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. Otwórz ponownie wygenerowany obszar roboczy ( <project>.xcworkspace ) i odbuduj aplikację w Xcode.

Korzystanie z lokalnego rdzenia TensorFlow Lite

Możesz skonfigurować prywatne repozytorium specyfikacji CocoaPods i opublikować niestandardową platformę 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 dotyczącymi korzystania z prywatnych CocoaPods w celu wykorzystania go we własnym projekcie. Możesz także zmodyfikować TensorFlowLite(Swift|ObjC).podspec , aby wskazywał na niestandardowy zasobnik TensorFlowLiteC i używać w projekcie aplikacji modułu Swift lub Objective-C.

Programiści Bazela

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

Dla Swifta:

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

Dla celu C:

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

Kiedy tworzysz projekt aplikacji, wszelkie zmiany w bibliotece TensorFlow Lite zostaną pobrane i wbudowane w Twoją aplikację.

Zmodyfikuj bezpośrednio ustawienia 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ć platformę TensorFlowLiteC , musisz dodać platformę TensorFlowLiteC jako osadzone środowisko do projektu aplikacji. Rozpakuj plik TensorFlowLiteC_framework.zip wygenerowany z powyższej kompilacji, aby uzyskać katalog TensorFlowLiteC.framework . Ten katalog jest rzeczywistym frameworkiem, który Xcode może zrozumieć.

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

  • Xcode 11: Przejdź do karty „Ogólne” w edytorze projektu docelowej aplikacji i dodaj plik TensorFlowLiteC.framework w sekcji „Frameworks, Libraries and Embedded Content”.
  • Xcode 10 i starsze wersje: Przejdź do karty „Ogólne” w edytorze projektu dla docelowej aplikacji i dodaj plik TensorFlowLiteC.framework w obszarze „Osadzone pliki binarne”. Struktura powinna być również dodana automatycznie w sekcji „Połączone struktury i biblioteki”.

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

Po wykonaniu tych dwóch ustawień powinno być możliwe zaimportowanie i wywołanie interfejsu API języka C TensorFlow Lite, zdefiniowanego przez pliki nagłówkowe w katalogu TensorFlowLiteC.framework/Headers .