Vordenker
Vermeidung der versteckten Gefahren: Navigation durch nicht offensichtliche Fallstricke in ML auf iOS

Brauchen Sie ML?
Machine Learning ist hervorragend darin, Muster zu erkennen. Wenn es Ihnen gelingt, eine saubere Datenmenge für Ihre Aufgabe zu sammeln, ist es normalerweise nur eine Frage der Zeit, bevor Sie in der Lage sind, ein ML-Modell mit übermenschlicher Leistung zu erstellen. Dies gilt besonders für klassische Aufgaben wie Klassifizierung, Regression und Anomalie-Erkennung.
Wenn Sie bereit sind, einige Ihrer Geschäftsprobleme mit ML zu lösen, müssen Sie berücksichtigen, wo Ihre ML-Modelle ausgeführt werden. Für einige macht es Sinn, eine Server-Infrastruktur auszuführen. Dies hat den Vorteil, dass Ihre ML-Modelle privat bleiben, sodass es für Wettbewerber schwieriger ist, nachzuziehen. Darüber hinaus können Server eine Vielzahl von Modellen ausführen. Zum Beispiel benötigen GPT-Modelle (die mit ChatGPT berühmt wurden) moderne GPUs, sodass Consumer-Geräte ausgeschlossen sind. Andererseits ist die Wartung Ihrer Infrastruktur sehr teuer, und wenn ein Consumer-Gerät Ihr Modell ausführen kann, warum mehr bezahlen? Zusätzlich können auch Datenschutzbedenken bestehen, bei denen Sie Benutzerdaten nicht an einen Remote-Server für die Verarbeitung senden können.
Nehmen wir jedoch an, es macht Sinn, die iOS-Geräte Ihrer Kunden zum Ausführen eines ML-Modells zu verwenden. Was könnte schiefgehen?
Plattform-Einschränkungen
Speicherlimits
iOS-Geräte haben viel weniger verfügbaren Video-Speicher als ihre Desktop-Pendants. Zum Beispiel hat die aktuelle Nvidia RTX 4080 Ti 20 GB verfügbaren Speichers. iPhones hingegen haben Video-Speicher, der mit dem Rest des RAM in dem, was sie “unified memory” nennen, geteilt wird. Zum Vergleich: Das iPhone 14 Pro hat 6 GB RAM. Darüber hinaus ist iOS sehr wahrscheinlich, die App zu beenden, um sicherzustellen, dass das Betriebssystem reaktionsfähig bleibt, wenn Sie mehr als die Hälfte des Speichers zuweisen. Dies bedeutet, dass Sie nur mit 2-3 GB verfügbarem Speicher für die neuronale Netzwerkinferenz rechnen können.
Forscher trainieren ihre Modelle normalerweise, um die Genauigkeit über den Speicherbedarf zu optimieren. Es gibt jedoch auch Forschungsergebnisse über Möglichkeiten, die Geschwindigkeit und den Speicherbedarf zu optimieren, sodass Sie entweder nach weniger anspruchsvollen Modellen suchen oder selbst eines trainieren können.
Netzwerkschichten (Operationen) Unterstützung
Die meisten ML- und neuronalen Netze stammen aus bekannten Deep-Learning-Frameworks und werden dann in CoreML-Modelle mit Core ML Tools konvertiert. CoreML ist ein Inferenz-Engine, der von Apple geschrieben wurde und der verschiedene Modelle auf Apple-Geräten ausführen kann. Die Schichten sind für die Hardware optimiert und die Liste der unterstützten Schichten ist sehr lang, sodass dies ein hervorragender Ausgangspunkt ist. Es gibt jedoch auch andere Optionen wie Tensorflow Lite.
Der beste Weg, um zu sehen, was mit CoreML möglich ist, ist, einige bereits konvertierte Modelle mit Viewern wie Netron zu betrachten. Apple listet einige der offiziell unterstützten Modelle auf, aber es gibt auch community-getriebene Model-Zoos. Die vollständige Liste der unterstützten Operationen ändert sich ständig, sodass es hilfreich ist, den Quellcode von Core ML Tools zu betrachten. Zum Beispiel können Sie, wenn Sie ein PyTorch-Modell konvertieren möchten, versuchen, die notwendige Schicht hier zu finden.
Darüber hinaus können bestimmte neue Architekturen handgeschriebenen CUDA-Code für einige der Schichten enthalten. In solchen Situationen können Sie nicht erwarten, dass CoreML eine vordefinierte Schicht bereitstellt. Sie können jedoch eine eigene Implementierung bereitstellen, wenn Sie einen erfahrenen Ingenieur haben, der mit der Erstellung von GPU-Code vertraut ist.
Insgesamt ist der beste Rat hier, Ihr ML-Modell frühzeitig in CoreML zu konvertieren, sogar bevor Sie es trainieren. Wenn Sie ein Modell haben, das nicht sofort konvertiert wurde, ist es möglich, die neuronale Netzwerksdefinition in Ihrem DL-Framework oder dem Quellcode des Core ML Tools-Konverters zu ändern, um ein gültiges CoreML-Modell ohne die Notwendigkeit, eine benutzerdefinierte Schicht für CoreML-Inferenz zu schreiben, zu generieren.
Validierung
Inferenz-Engine-Bugs
Es gibt keine Möglichkeit, jede mögliche Kombination von Schichten zu testen, sodass der Inferenz-Engine immer einige Fehler haben wird. Zum Beispiel ist es häufig zu sehen, dass dilated Konvolutionen mit CoreML viel zu viel Speicher verbrauchen, was wahrscheinlich auf eine schlecht geschriebene Implementierung mit einem großen Kernel, der mit Nullen gepaddet ist, hinweist. Ein weiterer häufiger Fehler ist die falsche Modellausgabe für einige Modell-Architekturen.
In diesem Fall kann die Reihenfolge der Operationen eine Rolle spielen. Es ist möglich, falsche Ergebnisse zu erhalten, je nachdem, ob die Aktivierung mit Konvolution oder die Residualverbindung zuerst kommt. Der einzige echte Weg, um sicherzustellen, dass alles ordnungsgemäß funktioniert, ist, Ihr Modell zu nehmen, es auf dem beabsichtigten Gerät auszuführen und das Ergebnis mit einer Desktop-Version zu vergleichen. Für diesen Test ist es hilfreich, mindestens ein halb trainiertes Modell zur Verfügung zu haben, da der numerische Fehler für schlecht initialisierte Modelle akkumulieren kann. Obwohl das endgültig trainierte Modell ordnungsgemäß funktioniert, können die Ergebnisse zwischen Gerät und Desktop für ein zufällig initialisiertes Modell sehr unterschiedlich sein.
Präzisionsverlust
Das iPhone verwendet halbpräzise Genauigkeit umfassend für Inferenz. Während einige Modelle keine bemerkbare Genauigkeitsverschlechterung aufgrund der geringeren Anzahl von Bits in der Gleitkommazahlendarstellung aufweisen, können andere Modelle leiden. Sie können den Präzisionsverlust approximieren, indem Sie Ihr Modell auf dem Desktop mit halbpräziser Genauigkeit auswerten und eine Testmetrik für Ihr Modell berechnen. Eine noch bessere Methode ist, es auf einem tatsächlichen Gerät auszuführen, um herauszufinden, ob das Modell so genau ist, wie beabsichtigt.
Profiling
Unterschiedliche iPhone-Modelle haben unterschiedliche Hardware-Fähigkeiten. Die neuesten Modelle haben verbesserte Neural Engine-Verarbeitungseinheiten, die die Gesamtleistung erheblich steigern können. Sie sind für bestimmte Operationen optimiert und CoreML kann die Arbeit intelligent zwischen CPU, GPU und Neural Engine verteilen. Apple-GPUs haben sich auch im Laufe der Zeit verbessert, sodass es normal ist, schwankende Leistungen zwischen verschiedenen iPhone-Modellen zu sehen. Es ist eine gute Idee, Ihre Modelle auf minimal unterstützten Geräten zu testen, um die maximale Kompatibilität und akzeptable Leistung für ältere Geräte sicherzustellen.
Es ist auch erwähnenswert, dass CoreML einige der Zwischenschichten und Berechnungen an Ort und Stelle optimieren kann, was die Leistung erheblich verbessern kann. Ein weiterer Faktor, der berücksichtigt werden sollte, ist, dass manchmal ein Modell, das auf dem Desktop schlechter abschneidet, tatsächlich die Inferenz auf iOS schneller ausführen kann. Dies bedeutet, dass es sich lohnt, Zeit damit zu verbringen, mit verschiedenen Architekturen zu experimentieren.
Für weitere Optimierung hat Xcode ein schönes Instruments-Tool mit einer Vorlage speziell für CoreML-Modelle, das einen tieferen Einblick in das gibt, was Ihre Modellinferenz verlangsamt.
Schlussfolgerung
Niemand kann alle möglichen Fallstricke vorhersehen, wenn er ML-Modelle für iOS entwickelt. Es gibt jedoch einige Fehler, die vermieden werden können, wenn man weiß, worauf man achten muss. Beginnen Sie damit, Ihre ML-Modelle frühzeitig zu konvertieren, zu validieren und zu profilieren, um sicherzustellen, dass Ihr Modell ordnungsgemäß funktioniert und Ihren Geschäftsanforderungen entspricht, und folgen Sie den oben genannten Tipps, um Erfolg so schnell wie möglich zu erzielen.












