Core ML – Inferenz unter IOS

Keine Kommentare

Beim maschinellen Lernen wird ein Modell für eine gewisse Aufgabe wie bspw. das Unterscheiden von Hunden und Katzen auf Bildern trainiert. Die Inferenz bezeichnet die Anwendung des Modells. Ein Großteil der Inferenz-Anwendungen wird über eine Client-Server API angesprochen oder im Batch-Modus verwendet. Im Vergleich dazu werden Applikationen (wie beispielsweise FaceID von Apple) direkt auf dem mobilen Endgerät ausgeführt. Dadurch werden die Latenzen so gering wie möglich gehalten und es wird eine optimale User Experience geschaffen. In diesen Anwendungsfällen gewinnt das Thema rund um die Inferenz auf mobilen Endgeräten immer mehr an Aufmerksamkeit. Neben Apple erforscht Google diverse Hardware-Möglichkeiten, um die ressourcenintensiven Modelle auf mobilen Geräten zu deployen. In diesem Artikel werden die Möglichkeiten unter iOS vorgestellt. Neben dem Framework Core ML wird auch die Hardware-Innovation Neural Engine vorgestellt.

Inferenz auf dem Endgerät

Bevor wir uns Core ML anschauen, betrachten wir die Vor- und Nachteile, die mit der Inbetriebnahme eines Modells auf einem mobilen Endgerät verbunden sind.

Vorteile

  • Latenz: Die Daten werden auf dem Gerät verarbeitet. Es wird dabei kein Netzwerk Traffic erzeugt und die Vorhersage kann direkt auf der Hardware erfolgen. Weiterhin wird es dadurch ermöglicht, die Applikation offline zu bedienen.
  • Datensicherheit: Dadurch dass die Applikation keine Netzwerkkommunikation für eine Berechnung verwendet, müssen die Daten nicht das Gerät verlassen, wodurch eine gewisse Datensicherheit gegeben ist.

Nachteile

  • Update der Modelle: Sobald ein Modell neu trainiert wird, muss eine neue Version der Applikation mit dem Modell veröffentlicht werden. Weiterhin muss bedacht werden, dass die Modelle meistens sehr viel Speicherplatz benötigen.
  • Geschwindigkeit der Hardware: Je nach verbauter Hardware kann die Rechenzeit der Modelle stark abweichen. Während neuere Geräte wie das iPhone XS spezielle Hardware für Maschinelles Lernen enthalten, kann es auf den älteren Geräte zu Performanceeinbußen kommen.

Sowohl die Latenz als auch die gegebene Datensicherheit sind sehr interessante Argumente, um sich mit dem Thema mobiles Maschinelles Lernen näher auseinander zu setzen. Einer der wichtigsten Faktoren für die erfolgreiche Anwendung der Modelle ist die Geschwindigkeit der Hardware. Apple hat den A11 und A12 Bionic Chip mit spezieller Hardware versehen, um neuronale Netze effizient auf dem iPhone ausführen zu lassen. Aus diesem Grund wollen wir uns tiefer mit der Thematik rund um das Maschinelle Lernen auf dem iPhone befassen.

Core ML

Core ML ist ein Framework für Maschinelles Lernen, das von Apple entwickelt wird. Im Vergleich zu PyTorch und TensorFlow, die u.a. zum Trainieren der Modelle verwendet werden, hat Core ML einen Fokus auf Deployment und Runtime der Modelle. Dies bedeutet, dass ein Entwickler ein Modell bereits trainiert haben muss, um dieses anschließend mit Core ML auszuführen bzw. in eine iOS App integrieren zu können. Dazu muss vor der Integration des Modells eine Konvertierung erfolgen. Hauptsächlich kann Core ML nur innerhalb des Apple-Ökosystems und nicht für Android-Applikationen verwendet werden.

Komponenten von Core ML, Accelerate, BNNS, MPS

Übersicht von Core ML – https://developer.apple.com/documentation/coreml

Core ML setzt auf den Bibliotheken Accelerate, Basic neural network subroutines (BNNS) und Metal Performance Shaders (MPS) auf, die im wesentlichen Low-Level-Operationen in den Bereichen neuronale Netze, Inferenz, CPU und GPU abdecken. Dadurch wird der Zugang zu Maschinellem Lernen unter iOS deutlich erleichtert. Weiterhin hat Apple die Frameworks Vision und Natural Language entwickelt, um Feature Extraction auf Bild- und Textdaten durchzuführen. Beispielsweise können mit bereits vorhandenen Modellen der Vision-Bibliothek Gesichter, Texte und Barcodes auf Bildern erkannt werden. Anschließend können diese Informationen als Features für die eigenen Modelle fungieren.  

Alternativen zu Core ML

Neben Core ML gibt es natürlich auch noch weitere Möglichkeiten, um ein Modell auf einem iOS-Endgerät in Betrieb zu nehmen, zum Beispiel TensorFlow Lite. Der große Vorteil hierbei ist, dass ein Modell direkt auf verschiedenen Plattformen wie Android verwendet werden kann. Jedoch sind damit einige Nachteile verbunden. Dadurch, dass Core ML direkt von Apple entwickelt wird, ist die Integration in XCode direkt gegeben und es müssen keine aufwendigen Setups durchgeführt werden. Weiterhin ist Core ML darauf optimiert, unter iOS zu laufen. Dies hat zur Folge, dass die Performance von Core ML im Vergleich zu TensorFlow Lite deutlich besser ist. Dazu lohnt sich ein Blick auf den Artikel von Andrey Logvinenko, der die Performance-Unterschiede im Detail untersucht hat.

Neural Engine

Nachdem wir einen Blick auf die Software-Aspekte geworfen haben, widmen wir uns den Hardware-Eigenschaften des im vergangenen Jahr vorgestellte iPhone XS. Hier ist der A12 Bionic Chip verbaut, der neben der Recheneinheit (sechs Kerne) und Grafikeinheit (vier Kerne) über eine neuronale Recheneinheit (auch bekannt als Neural Engine) verfügt. Die Neural Engine ist das Kernstück, um Modelle auszuführen. Beispielsweise verwenden FaceID und Siri die Neural Engine, um performant Vorhersagen zu treffen. Zwar könnten diese Anwendungen auch mit der CPU durchgeführt werden, dadurch wären die Rechenzeit und der Energieverbrauch allerdings deutlich erhöht. Die Neural Engine besteht aus acht Kernen und kann theoretisch bis zu 5 Billionen Berechnungen pro Sekunde durchführen. Als Entwickler haben wir Zugang zu der Neural Engine und können unserer Modelle auf ihr ausführen.

Betrachtet man die Entwicklung der A* Bionic Serie, wird deutlich, dass Apple viele Bemühungen in die Weiterentwicklung steckt. Auf dem A12 Bionic Chip ist Core ML bis zu 9 mal schneller als beim Vorgänger A11 Bionic. Verschiedene Experimente aus der Community wie Yolo und Core ML zeigen, dass eine ähnliche Verbesserung erreicht werden kann.

Bilderkennung mit Core ML

Wie bereits in der Einleitung beschrieben, wird Core ML nur für die Inferenz verwendet. Dies bedeutet, dass ein Modell mit einem anderen Framework trainiert und anschließend das Modell nach Core ML konvertiert werden muss. Für die Konvertierung kann auf das Python Package coremltools zurückgegriffen werden. Weiterhin gibt es Third Party Conversion Tools wie bspw. TensorFlow converter, die verwendet werden können.

In diesem Beispiel wird ein Modell, das in Keras trainiert wurde und anhand eines Bildes zwischen einem Hund und einer Katze unterscheiden kann, in eine App integriert. In der App kann entweder ein Bild mit der Kamera aufgenommen oder aus der Fotobibliothek entnommen werden.

Keras und Core ML Tools

Keras und Core ML Tools

Vor der Konvertierung muss das Keras-Modell mit model.save(“model.h5”) abgespeichert werden. Dazu wird in einer Python-Umgebung das Paket coremltools installiert. Mit der Methode coremltools.converters.keras.convert kann das Modell schließlich konvertiert werden. Dabei müssen verschiedene Metadaten wie beispielsweise die Klassen angegeben werden. Weiterhin können zusätzliche Vorverarbeitungsmethoden wie eine Normalisierung der Daten angegeben werden. In unserem Fall haben wir die beiden Klassen Cat (0) und Dogs (1). Durch die Felder image_scale, green_bias, red_bias und blue_bias werden die Werte für die Vorverarbeitung angegeben. In diesem Beispiel verwenden wir die MobileNet-Vorverarbeitung. Nach der Konvertierung muss das Modell als “.mlmodel” abgespeichert werden. Dies kann anschließend von Core ML in einer App ausgelesen werden.

import coremltools
model = coremltools.converters.keras.convert('model.h5', 
                                             input_names=['image'], 
                                             output_names=['output'], 
                                             class_labels=['0', '1'],
                                             image_input_names='image',
                                             red_bias = -1,
                                             green_bias = -1,
                                             blue_bias = -1,
                                             image_scale = 1.0/127.5)
model.save('model.mlmodel')

Für die Integration in eine App muss die Datei zum Xcode-Projekt hinzugefügt werden. In XCode kann eingesehen werden, welche Modellparameter für Input und Output der Daten vorgegeben sind. In unserem Fall benötigen wir als Input ein RGB-Bild mit 224×224 Pixel. Der Output des Modells ist das Label mit der höchsten Wahrscheinlichkeit und eine HashMap, die die Wahrscheinlichkeit für die Labels enthält.

XCode Model Parameter

XCode Model Parameter

Die Vorhersage funktioniert mit der model.prediction(image: features) Methode. Dazu muss zunächst das Modell geladen werden. Mit der Klasse UIImage können die Bilddaten verarbeitet werden. Zusätzlich haben wir die Klasse mit den Methoden resize und pixelBuffer ergänzt. Mithilfe der resize-Methode kann die Größe der Bilder auf 224×224 Pixel geändert werden, um die Vorbereitungen für die Vorhersage zu treffen. Der Pixelbuffer dient als Eingangsvektor für das Modell. Im Pseudocode sieht dies wie folgt aus:

// einlesen des Modells
let model = model()
// width und height aus Modell lesen
let inputImage = input.resize(to: CGSize(width: 224, height: 224))
guard let features = inputImage?.pixelBuffer() else {
    complete(nil, "Error while creating the pixel buffer.")
    return
}
guard let result = try? model.prediction(image: features) else {
    complete(nil, "Error while performing the prediction.")
    return
}
// outputs aus dem Modell lesen
print(result.classLabel)
print(result.output)

Der vollständige Code kann unter GitHub eingesehen werden.

Ansicht Demo App

Ansicht Demo App

Zusammenfassung

In diesem Artikel wurde Core ML sowie die Hardware-Innovationen von Apple vorgestellt, um Inferenz unter iOS zu ermöglich. Während mithilfe von Frameworks wie TensorFlow sowohl neue Modelle trainiert als auch die Inferenz der Modelle durchgeführt werden können, ist mit Core ML nur die Inferenz möglich. Dazu muss ein Modell, das mit einer TensorFlow oder einer anderen Third Party Library trainiert wurde, mit der Python-Bibliothek coremltools nach Core ML konvertiert werden. Anschließend kann das konvertierte Modell in eine App integriert und durch Core ML ausgeführt werden. Neben Core ML gibt es weitere Frameworks wie TensorFlow Lite, um Inferenz unter iOS durchzuführen. Einer der Hauptstärken von Core ML im Vergleich zu den anderen Frameworks ist die Performance. Core ML ist durch die Hardwareoptimierungen um ein Vielfaches schneller. Neben den softwareseitigen Entwicklungen investiert Apple in Hardware-Innovationen. Durch die Neural Engine wurde ein wichtiges Kernstück erschaffen, das die iOS-Geräte mit ausreichend Ressourcen versorgt, um Inferenz auf dem Endgerät zu ermöglichen. Dadurch kann die Privatsphäre der Daten gewährleistet werden, ohne dabei einen Tradeoff mit der Performanz der Modelle hinzunehmen. Abschließend sei gesagt, dass Apple durch Core ML und Hardware-Innovation ein Ökosystem geschaffen hat, wodurch in Apps nahtlos Maschinelles Lernen verwendet werden kann.

Nico Axtmann

Als Machine Learning Engineer entwickelt Nico datengetriebene Produkte und Lösungen. Derzeit konzentriert er sich vor allem auf die Kombination von Natural Language Processing und Deep Learning.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.