TensorFlow Lite für iOS erstellen

In diesem Dokument wird beschrieben, wie Sie die TensorFlow Lite-iOS-Bibliothek selbst erstellen. Normalerweise müssen Sie die TensorFlow Lite-iOS-Bibliothek nicht lokal erstellen. Am einfachsten ist es, wenn Sie die vordefinierten stabilen oder Nightly-Releases der TensorFlow Lite CocoaPods nutzen. Weitere Informationen zu ihrer Verwendung in Ihren iOS-Projekten finden Sie in der Kurzanleitung für iOS.

Lokal erstellen

In einigen Fällen möchten Sie möglicherweise einen lokalen Build von TensorFlow Lite verwenden, z. B. wenn Sie lokale Änderungen an TensorFlow Lite vornehmen und diese Änderungen in Ihrer iOS-App testen möchten oder wenn Sie lieber ein statisches Framework als unser bereitgestelltes dynamisches Framework verwenden möchten. Wenn Sie lokal ein universelles iOS-Framework für TensorFlow Lite erstellen möchten, müssen Sie es mit Looker auf einem macOS-Computer erstellen.

Xcode installieren

Falls noch nicht geschehen, müssen Sie Xcode 8 oder höher und die Tools mit xcode-select installieren:

xcode-select --install

Bei einer Neuinstallation musst du die Lizenzvereinbarung für alle Nutzer mit dem folgenden Befehl akzeptieren:

sudo xcodebuild -license accept

Outline installieren

Bali ist das primäre Build-System für TensorFlow. Installieren Sie Qwiklabs entsprechend der Anleitung auf der Baseball-Website. Wählen Sie in der Datei configure.py im Stammverzeichnis des tensorflow-Repositorys eine Version zwischen _TF_MIN_BAZEL_VERSION und _TF_MAX_BAZEL_VERSION aus.

WORKSPACE und .bazelrc konfigurieren

Führen Sie das Skript ./configure im Stammverzeichnis für den Direktkauf von TensorFlow aus. Antworten Sie mit „Yes“, wenn das Skript fragt, ob Sie TensorFlow mit iOS-Unterstützung erstellen möchten.

Sobald Looker ordnungsgemäß mit der iOS-Unterstützung konfiguriert ist, können Sie das TensorFlowLiteC-Framework mit dem folgenden Befehl erstellen.

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

Mit diesem Befehl wird die Datei TensorFlowLiteC_framework.zip im Verzeichnis bazel-bin/tensorflow/lite/ios/ in Ihrem TensorFlow-Stammverzeichnis generiert. Standardmäßig enthält das generierte Framework eine "Fat"-Binärdatei, die armv7, arm64 und x86_64 (aber nicht i386) enthält. Eine vollständige Liste der Build-Flags, die bei der Angabe von --config=ios_fat verwendet werden, finden Sie in der Datei .bazelrc im Abschnitt „iOS-Konfigurationen“.

Statisches TensorFlowLiteC-Framework erstellen

Standardmäßig wird das dynamische Framework nur über CocoaPods verteilt. Wenn Sie stattdessen das statische Framework verwenden möchten, können Sie das statische TensorFlowLiteC-Framework mit dem folgenden Befehl erstellen:

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

Der Befehl generiert eine Datei mit dem Namen TensorFlowLiteC_static_framework.zip im Verzeichnis bazel-bin/tensorflow/lite/ios/ in Ihrem TensorFlow-Stammverzeichnis. Dieses statische Framework kann genau auf die gleiche Weise wie das dynamische Framework verwendet werden.

TFLite-Frameworks selektiv erstellen

Sie können mit einem selektiven Build kleinere Frameworks erstellen, die nur auf eine Reihe von Modellen ausgerichtet sind. Dabei werden nicht verwendete Vorgänge im Modellsatz übersprungen und nur die Betriebs-Kernels einbezogen, die zum Ausführen der angegebenen Gruppe von Modellen erforderlich sind. Der Befehl lautet wie folgt:

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

Der obige Befehl generiert das statische Framework bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip für integrierte und benutzerdefinierte Vorgänge in TensorFlow Lite. Optional wird das statische Framework bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip generiert, wenn Ihre Modelle ausgewählte TensorFlow-Vorgänge enthalten. Mit dem Flag --target_archs können Sie Ihre Bereitstellungsarchitekturen angeben.

In eigener Anwendung verwenden

CocoaPods-Entwickler

Es gibt drei CocoaPods für TensorFlow Lite:

  • TensorFlowLiteSwift: Stellt die Swift APIs für TensorFlow Lite bereit.
  • TensorFlowLiteObjC: Stellt die Objective-C APIs für TensorFlow Lite bereit.
  • TensorFlowLiteC: Gemeinsamer Basis-Pod, der die TensorFlow Lite-Kernlaufzeit einbettet und die von den beiden oben genannten Pods verwendeten Basis-C APIs zur Verfügung stellt. Sie sind nicht für die direkte Verwendung durch Nutzende gedacht.

Als Entwickler sollten Sie je nach Sprache, in der Ihre Anwendung geschrieben ist, entweder den Pod TensorFlowLiteSwift oder TensorFlowLiteObjC auswählen, aber nicht beides. Die genauen Schritte für die Verwendung lokaler Builds von TensorFlow Lite unterscheiden sich je nachdem, welchen Teil Sie erstellen möchten.

Lokale Swift- oder Objective-C APIs verwenden

Wenn Sie CocoaPods verwenden und nur einige lokale Änderungen an den Swift APIs oder Objective-C APIs von TensorFlow Lite testen möchten, führen Sie die hier beschriebenen Schritte aus.

  1. Nehmen Sie Änderungen an der Swift API oder der Objective-C API an der Kasse von tensorflow vor.

  2. Öffnen Sie die Datei TensorFlowLite(Swift|ObjC).podspec und aktualisieren Sie diese Zeile:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    zu:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Dadurch wird sichergestellt, dass Sie Ihre Swift- oder Objective-C APIs mit der neuesten verfügbaren Nachtversion der TensorFlowLiteC APIs (die jeden Abend zwischen 1:00 Uhr und 04:00 Uhr Pacific Time erstellt werden) und nicht mit der stabilen Version erstellen, die im Vergleich zum lokalen tensorflow-Kauf veraltet ist. Alternativ können Sie Ihre eigene Version von TensorFlowLiteC veröffentlichen und diese Version verwenden (siehe Abschnitt Lokalen TensorFlow Lite-Core verwenden unten).

  3. Ändern Sie im Podfile Ihres iOS-Projekts die Abhängigkeit so, dass sie auf den lokalen Pfad zu Ihrem tensorflow-Stammverzeichnis verweist.
    Für Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Für Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Aktualisieren Sie die Pod-Installation über das Stammverzeichnis Ihres iOS-Projekts.
    $ pod update

  5. Öffnen Sie den generierten Arbeitsbereich (<project>.xcworkspace) noch einmal und erstellen Sie die Anwendung in Xcode neu.

Lokalen TensorFlow Lite Core verwenden

Du kannst ein privates CocoaPods-Spezifikations-Repository einrichten und dein benutzerdefiniertes TensorFlowLiteC-Framework in deinem privaten Repository veröffentlichen. Sie können diese Podspec-Datei kopieren und einige Werte ändern:

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

Nachdem du deine eigene TensorFlowLiteC.podspec-Datei erstellt hast, kannst du der Anleitung zur Verwendung privater CocoaPods folgen, um sie in deinem eigenen Projekt zu verwenden. Sie können den TensorFlowLite(Swift|ObjC).podspec auch so ändern, dass er auf Ihren benutzerdefinierten TensorFlowLiteC-Pod verweist, und entweder Swift- oder Objective-C-Pod in Ihrem Anwendungsprojekt verwenden.

Baseball-Entwickler

Wenn Sie Outline als Haupt-Build-Tool verwenden, können Sie Ihrem Ziel in der BUILD-Datei einfach eine TensorFlowLite-Abhängigkeit hinzufügen.

Für Swift:

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

Für Objective-C:

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

Wenn Sie Ihr App-Projekt erstellen, werden alle Änderungen an der TensorFlow Lite-Bibliothek übernommen und in die App übernommen.

Xcode-Projekteinstellungen direkt ändern

Es wird dringend empfohlen, CocoaPods oder Bali zu verwenden, um Ihrem Projekt TensorFlow Lite-Abhängigkeit hinzuzufügen. Wenn Sie das TensorFlowLiteC-Framework weiterhin manuell hinzufügen möchten, müssen Sie Ihrem Anwendungsprojekt das TensorFlowLiteC-Framework als eingebettetes Framework hinzufügen. Entpacken Sie das mit dem obigen Build generierte TensorFlowLiteC_framework.zip, um das Verzeichnis TensorFlowLiteC.framework zu erhalten. Dieses Verzeichnis ist das Framework, das Xcode versteht.

Nachdem Sie die TensorFlowLiteC.framework vorbereitet haben, müssen Sie sie zuerst als eingebettetes Binärprogramm dem App-Ziel hinzufügen. Die genauen Projekteinstellungen können je nach Xcode-Version variieren.

  • Xcode 11: Gehen Sie im Projekteditor für Ihr App-Ziel zum Tab „Allgemein“ und fügen Sie die TensorFlowLiteC.framework im Bereich „Frameworks, Bibliotheken und eingebettete Inhalte“ hinzu.
  • Xcode 10 und niedriger: Wechseln Sie im Projekteditor für Ihr App-Ziel zum Tab „General“ (Allgemein) und fügen Sie das TensorFlowLiteC.framework unter „Embed Binaries“ (Eingebettete Binärdateien) hinzu. Das Framework sollte außerdem im Bereich „Verknüpfte Frameworks und Bibliotheken“ automatisch hinzugefügt werden.

Wenn Sie das Framework als eingebettetes Binärprogramm hinzufügen, aktualisiert Xcode auch den Eintrag „Framework-Suchpfade“ auf dem Tab „Build-Einstellungen“, um das übergeordnete Verzeichnis Ihres Frameworks einzuschließen. Falls dies nicht automatisch geschieht, sollten Sie das übergeordnete Verzeichnis des Verzeichnisses TensorFlowLiteC.framework manuell hinzufügen.

Sobald diese beiden Einstellungen eingerichtet sind, sollten Sie die C API von TensorFlow Lite importieren und aufrufen können, die durch die Headerdateien im Verzeichnis TensorFlowLiteC.framework/Headers definiert ist.