Ist es schwierig, Stable Diffusion auf dem iPhone auszuführen? In dem Artikel, den wir heute vorstellen, gibt der Autor die Antwort: Es ist nicht schwierig und das iPhone hat immer noch 50 % Leistung übrig.
Wie wir alle wissen, bringt Apple jedes Jahr ein neues iPhone auf den Markt, das angeblich in jeder Hinsicht schneller und besser ist, was vor allem auf die rasante Entwicklung neuer visueller Modelle und Bildsensoren zurückzuführen ist. Nehmen Sie die Fotografie als Beispiel: Können Sie mit einem iPhone qualitativ hochwertige Bilder aufnehmen? der Handyfotografie.
Aufgrund dieses (fortschreitenden) Entwicklungsmusters der Technologie wird es eine Zeit geben, in der einige Programme selbst auf den besten Computergeräten nahezu unbrauchbar werden. Aber diese neuen Programme mit neu aktivierten Szenarien erregten die Aufmerksamkeit einiger Benutzer und die Leute waren bereit, sie zu studieren.
Der Autor dieses Artikels ist einer von ihnen. In den letzten 3 Wochen hat der Autor eine Anwendung entwickelt, die durch Stable Diffusion Bilder generieren (abrufen) und diese dann nach Ihren Wünschen bearbeiten kann. Die App benötigt nur eine Minute, um Bilder auf dem neuesten iPhone 14 Pro zu generieren, wobei sie etwa 2 GB App-Speicher benötigt. Außerdem müssen etwa 2 GB anfänglicher Daten heruntergeladen werden, um loszulegen.
App-Store-Link: https://apps.apple.com/us/app/draw-things-ai-generation/id6444050820
Dieses Ergebnis hat viele Internetnutzer zum Diskutieren angeregt, und einige Leute haben damit begonnen Sie machen sich Sorgen über das Problem mit dem Batterieverbrauch ihres Mobiltelefons und sagten scherzhaft: „Das ist cool, aber das scheint eine gute Möglichkeit zu sein, den Akku des Telefons zu entladen.“
„Ich war noch nie so glücklich, die Wärme meines iPhones zu spüren wie jetzt.“
„In diesem kalten Winter können Sie Ihr Telefon als Handwärmer verwenden.“
Aber alle machen sich über die Hitze des Telefons lustig. Gleichzeitig haben sie dieser Arbeit auch eine sehr hohe Bewertung gegeben.„Das ist unglaublich. Es dauert etwa 45 Sekunden, um ein vollständiges Bild auf meinem iPhone SE3 zu erstellen – das ist fast so schnell wie die Originalversion auf meinem M1 Pro MacBook!“
Speicher- und Hardwareoptimierung bei gleichzeitig
Wie geht das? Schauen wir uns als Nächstes den Implementierungsprozess des Autors an:Wenn Sie Stable Diffusion vollständig auf dem iPhone ausführen und trotzdem 50 % der Leistung einsparen möchten, besteht eine große Herausforderung darin, das Programm auf einem iPhone-Gerät mit 6 GB auszuführen RAM. 6GiB klingt nach viel, aber wenn Sie mehr als 2,8GiB auf einem 6GiB-Gerät oder 2GiB auf einem 4GiB-Gerät verwenden, beendet iOS Ihre App.
Wie viel Speicher benötigt das Stable Diffusion-Modell für die Inferenz?
Das beginnt auch beim Aufbau des Modells. Normalerweise besteht das Stable Diffusion-Modell aus 4 Teilen: 1. Text-Encoder, der Textmerkmalsvektoren generiert, um die Bilderzeugung zu steuern; 3. Optionaler Bild-Encoder, der Bilder in den latenten Raum codiert (für die Bild-zu-Bild-Generierung); , der die latente Darstellung des Bildes langsam vom Rauschen entrauscht; 4. Bilddecoder, der das Bild von der latenten Darstellung dekodiert.
Das 1., 2. und 4. Modul werden während der Inferenz einmal ausgeführt und erfordern maximal etwa 1 GB. Das Denoiser-Modell benötigt etwa 3,2 GB (voller Gleitkommawert) und muss mehrmals ausgeführt werden, sodass der Autor das Modul länger im RAM belassen möchte.
Das ursprüngliche Stable Diffusion-Modell benötigte fast 10 GB, um eine Einzelbildinferenz durchzuführen. Zwischen einer einzelnen Eingabe (2x4x64x64) und einer Ausgabe (2x4x64x64) sind viele Ausgabeschichten eingestreut. Nicht alle Layer-Ausgaben können sofort wiederverwendet werden, einige von ihnen müssen einige Parameter für die spätere Verwendung beibehalten (Restnetzwerke).
Seit einiger Zeit optimieren Forscher die Stable Diffusion von PyTorch. Sie haben temporären Speicherplatz für die von PyTorch verwendeten NVIDIA CUDNN- und CUBLAS-Bibliotheken reserviert, damit das Stable Diffusion-Modell mit Karten ausgeführt werden kann niedrig wie 4GiB. Aber es hat die Erwartungen des Autors dennoch übertroffen. Daher begann der Autor, sich auf Apple-Hardware und -Optimierung zu konzentrieren. Zuerst dachte der Autor über 3,2 GB oder 1,6 GB halbe Gleitkommazahl nach, wenn er Apples OOM (Out of Memory) nicht auslösen wollte, was bedeutet, dass der von der App belegte Speicher die Obergrenze des belegten Speichers erreicht Durch eine einzelne App durch das iOS-System würde es zu System Force Kill kommen), stehen dem Autor etwa 500 MB Speicherplatz zur Verfügung. Die erste Frage: Wie groß ist die jeweilige Zwischenausgabe? Es stellt sich heraus, dass die meisten von ihnen relativ klein sind, jeweils unter 6 MB (2 x 320 x 64 x 64). Das vom Autor verwendete Framework (s4nnc) kann sie zur Wiederverwendung sinnvoll in weniger als 50 MB packen. Es ist erwähnenswert, dass der Denoiser über einen Selbstaufmerksamkeitsmechanismus verfügt, der seine eigene latente Darstellung des Bildes als Eingabe verwendet. Während der Selbstaufmerksamkeitsberechnung gibt es eine Batch-Matrix der Größe 16x4096x4096, die nach der Anwendung von Softmax in FP16 etwa 500 MB groß ist und „inplace“ durchgeführt werden kann, was bedeutet, dass ihre Eingabe sicher neu geschrieben werden kann, ohne dass sie beschädigt wird. Glücklicherweise bieten sowohl Apple- als auch NVIDIA-Low-Level-Bibliotheken direkte Softmax-Implementierungen, während High-Level-Bibliotheken wie PyTorch dies nicht tun. Kann das also wirklich mit etwa 550 MB + 1,6 GB Speicher bewerkstelligt werden? Auf Apple-Hardware ist die Verwendung des MPSGraph-Frameworks eine gängige Option zur Implementierung von Backends für neuronale Netzwerke. Daher versuchte der Autor zunächst, MPSGraph zur Implementierung aller neuronalen Netzwerkoperationen zu verwenden. Die maximale Speichernutzung bei FP16-Präzision beträgt etwa 6 GB, was offensichtlich viel mehr ist als die erwartete Speichernutzung. Was ist los? Der Autor hat die Gründe im Detail analysiert. Erstens hat er MPSGraph nicht auf die übliche TensorFlow-Art verwendet. MPSGraph erfordert die Codierung des gesamten Rechendiagramms, die anschließende Nutzung von Eingabe-/Ausgabetensoren, die Handhabung interner Zuweisungen und die Möglichkeit, dass der Benutzer das gesamte Diagramm zur Ausführung übermittelt. Die Art und Weise, wie der Autor MPSGraph verwendet, ist PyTorch sehr ähnlich – als Operationsausführungs-Engine. Um Inferenzaufgaben auszuführen, werden viele kompilierte MPSGraphExecutables in der Metal-Befehlswarteschlange ausgeführt, von denen jede einen zugewiesenen Zwischenspeicher enthalten kann. Wenn alle diese Befehle auf einmal übermittelt werden, behalten sie den zugewiesenen Speicher, bis sie die Ausführung abschließen. Eine einfache Möglichkeit, dieses Problem zu lösen, besteht darin, die Übermittlungsgeschwindigkeit anzupassen. Es ist nicht erforderlich, alle Befehle auf einmal zu übermitteln. Tatsächlich gibt es bei Metal ein Limit von 64 gleichzeitigen Einreichungen pro Warteschlange. Der Autor hat versucht, auf die gleichzeitige Übermittlung von 8 Vorgängen umzusteigen, und der Spitzenspeicher wurde auf 4 GB reduziert. Allerdings sind das immer noch 2 GiB mehr, als das iPhone verarbeiten kann. Um die Selbstaufmerksamkeit mit CUDA zu berechnen, gibt es in der ursprünglichen Stable Diffusion-Codeimplementierung einen gängigen Trick: Verwenden Sie Verschiebung statt Transponierung. Dieser Trick funktioniert, weil CUBLAS permutierte Strided-Tensoren direkt verarbeiten kann, sodass kein dedizierter Speicher zum Transponieren des Tensors verwendet werden muss. Aber MPSGraph bietet keine Strided-Tensor-Unterstützung, ein permutierter Tensor wird ohnehin intern transponiert, was eine Zwischenspeicherzuweisung erfordert. Durch die explizite Transponierung werden Zuweisungen von übergeordneten Ebenen abgewickelt, wodurch MPSGraph-interne Ineffizienzen vermieden werden. Mit diesem Trick liegt die Speichernutzung bei nahezu 3 GB. Es stellt sich heraus, dass MPSGraph ab iOS 16.0 keine optimalen Allokationsentscheidungen für Softmax mehr treffen kann. Auch wenn sowohl der Eingabe- als auch der Ausgabetensor auf dieselben Daten verweisen, weist MPSGraph einen zusätzlichen Ausgabetensor zu und kopiert das Ergebnis dann an die Stelle, auf die verwiesen wird. Der Autor stellte fest, dass die Verwendung der Metal Performance Shaders-Alternative genau das Richtige war und die Speichernutzung ohne Leistungseinbußen auf 2,5 GB reduzierte. Andererseits erfordert der GEMM-Kernel von MPSGraph eine interne Transposition. Explizite Transponierungen helfen hier auch nicht weiter, da es sich bei diesen Transponierungen nicht um „Inplace“-Operationen höherer Ebenen handelt und diese zusätzliche Zuweisung für einen bestimmten Tensor mit einer Größe von 500 MB unvermeidbar ist. Durch den Wechsel zu Metal Performance Shaders gewannen die Projektautoren weitere 500 MB mit einer Leistungseinbuße von etwa 1 % zurück, wodurch die Speichernutzung letztendlich auf die idealen 2 GB reduziert wurde.
Das obige ist der detaillierte Inhalt vonSetzen Sie das Stable Diffusion-Modell in das iPhone ein und verwandeln Sie es in eine APP, um Bilder in einer Minute zu erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!