Dieser Artikel enthält eine Anleitung für die Bereitstellung des Stable Diffusion-Modells, eines beliebten Bilderzeugungsmodells, auf Google Cloud mit Vertex AI. Der Leitfaden behandelt die Einrichtung und den Download von Gewichten, TorchServe für die Bereitstellung, den Einsatz des TorchServe-Servers auf einem Vertex-Endpunkt und das automatische Speichern des Bildverlaufs auf GCS
Einführung
Stable Diffusion ist ein Modell zur Bilderzeugung. Es wurde 2022 veröffentlicht und hat aufgrund seiner Fähigkeit, qualitativ hochwertige Bilder aus Textbeschreibungen zu erzeugen, an Popularität gewonnen. Wie andere Bilderzeugungsmodelle, z. B. Dall-E, verwendet Stable Diffusion maschinelle Lerntechniken, um Bilder auf der Grundlage einer bestimmten Eingabe zu erzeugen.
Moët Hennessy, die Wein- und Spirituosenabteilung des Luxuskonzerns LVMH, verwaltet ein Portfolio von mehr als 26 Kultmarken wie Moët & Chandon, Hennessy und Veuve Clicquot. Moët Hennessy hat in Zusammenarbeit mit Artefact zusammengearbeitet, um die Möglichkeiten des Einsatzes von Spitzentechnologie bei der Erstellung von Marketinginhalten zu erforschen. Mit dem Fokus auf Datenschutz und Sicherheit entschied sich das Team, den Einsatz von Stable Diffusion auf der Google Cloud Platform (GCP) zu untersuchen, um Moët Hennessy die Feinabstimmung und den Betrieb des Modells innerhalb der eigenen Infrastruktur zu ermöglichen und eine nahtlose Erfahrung von der Feinabstimmung des Modells bis zur API-Exposition zu bieten.
Bevor Sie beginnen, ist es wichtig zu beachten, dass dieser Artikel voraussetzt, dass Sie über Vorkenntnisse der Google Cloud Platform (GCP) und insbesondere von Vertex AI verfügen. Dazu gehören Konzepte wie Model Registry und Vertex-Endpunkte. Außerdem müssen Sie über Vorkenntnisse im Umgang mit Docker verfügen, um einige der Schritte nachvollziehen zu können. Wenn Sie mit diesen Konzepten nicht vertraut sind, sollten Sie sich mit ihnen vertraut machen, bevor Sie fortfahren.
Um Stable Diffusion Weights herunterzuladen, benötigen Sie außerdem ein huggingface-Konto. Wenn Sie noch keines haben, können Sie es ganz einfach auf der huggingface-Website erstellen.
Wenn das gesagt ist, lasst uns beginnen!
Setup und Gewichte herunterladen
Ich empfehle, das von mir vorbereiteteGithub-Repository zu klonen, um die Schritte des Artikels zu befolgen.
Es ist immer wichtig, eine virtuelle Umgebung für die Installation der Pakete zu erstellen. Ich persönlich verwende anaconda und installiere die requirements.txt mit allen Abhängigkeiten:
conda activate stable_diffusion
pip install -r src/requirements.txt
Sie sind nun bereit, die Gewichte von Stable Diffusion herunterzuladen. In diesem Artikel werden wir Stable Diffusion 1.5 verwenden. Sie müssen die Lizenz auf der Modellseite akzeptieren, sonst treten beim Herunterladen der Modellgewichte Fehler auf.
Gehen Sie zu Ihrem Konto → Einstellungen → Zugangstoken → neues Token (Lesezugriff)

Sie können das Token als Umgebungsvariable hinzufügen. Ich persönlich empfehle die Verwendung einer .env-Datei und das Laden der Umgebungsvariablen mithilfe der Python-Dotenv-Bibliothek.
Sie müssen zu `src/stable_diffusion` navigieren und ausführen:
Dadurch werden die Gewichte im Inneren heruntergeladen
Torchserve-Rahmen
Torchserve ist ein Framework für die Bereitstellung von PyTorch-Modellen. Es ermöglicht Ihnen die Bereitstellung von PyTorch-Modellen in einer Produktionsumgebung und bietet Funktionen wie Modellversionierung und Multi-Modell-Serving. Es ist einfach zu bedienen und ermöglicht es Ihnen, sich auf die Erstellung und Bereitstellung Ihrer Modelle zu konzentrieren, anstatt sich um die Infrastruktur zu kümmern.
1. Erstellen eines Handlers, der das TorchServe-Format respektiert
Ein benutzerdefinierter Handler ist eine Python-Klasse, die definiert, wie die Eingabe data vorverarbeitet wird, wie das Modell ausgeführt wird und wie die Ausgabe nachverarbeitet wird. Um einen Custom Handler für Ihr Modell zu erstellen, müssen Sie eine Python-Klasse erstellen, die dem TorchServe-Format folgt.
Ein benutzerdefinierter Handler für Stable Diffusion ist bereits im TorchServe Repository enthalten. Aber der Vertex-Endpunkt erwartet ein bestimmtes Format für die Anfragen, daher müssen wir die preprocess()-Methode des Handlers anpassen, um das Vertex-Format zu berücksichtigen. Sie können die modifizierte Version des Handlers mit dem Namen `stable_diffusion_handler.py` aus dem Github-Repository dieses Artikels verwenden.
2. Erstellen der .mar-Datei
Nach der Erstellung Ihres benutzerdefinierten Handlers müssen Sie diesen zusammen mit allen Abhängigkeiten und dem Modell selbst in eine .mar-Datei packen, indem Sie das model-archiver-Tool verwenden. Das model-archiver-Tool ist ein Befehlszeilen-Tool, mit dem Sie Ihr Modell, Ihren Handler und die Abhängigkeiten in eine einzige Datei packen können.
Dadurch wird eine .mar-Datei namens output.mar erstellt, die Ihr Modell, Ihren Handler und Ihre Abhängigkeiten enthält.
Möglicherweise müssen Sie den Pfad ändern, je nachdem, wo sich die Dateien auf Ihrem Computer befinden:
-Modell-Name: stabile-Diffusion
-Version 1.0
-handler stable_diffusion/stable_diffusion_handler.py
-export-Pfad stable_diffusion/model-store
-extra-files stable_diffusion/external_files
3. Betrieb des TorchServe-Servers
Sobald Sie Ihre .mar-Datei erstellt haben, können Sie den TorchServe-Server mit dem Befehl torchserve starten. Dazu müssen Sie den folgenden Befehl ausführen:
- starten
- ts-config=config.properties
- models=stable-diffusion.mar
- model-store=stable_diffusion/model-store
In den config.properties können Sie die Konfigurationen Ihres TorchServe-Servers angeben, z. B. den Port für Inferenzen, Gesundheitsprüfungen, die Anzahl der Arbeiter usw.
WARNUNG: Alle Skripte müssen dort ausgeführt werden, wo sich die Datei befindet, um Pfadfehler zu vermeiden.
Führen Sie den TorchServe-Server lokal aus
Es ist wichtig, den Code lokal zu testen, bevor wir mit der Dockerisierung unseres Einsatzes beginnen. Ich habe bereits ein Bash-Skript vorbereitet, das die .mar-Datei erstellt und den TorchServe-Server startet.
Sie können es mit :
Sie müssen einige Minuten warten, bis der Server initialisiert ist und der Worker das Modell lädt. Sie können mit der Inferenz beginnen, wenn Sie das folgende Protokoll sehen:
org.pytorch.serve.wlm.WorkerThread- W-9000-stable-diffusion_1.0
Zustandsänderung WORKER_STARTED -> WORKER_MODEL_LOADED
Sie können dann den folgenden Code verwenden, um Inferenzanforderungen an Ihr Modell zu stellen:
prompt = "ein Foto von einem Astronauten, der auf einem Pferd auf dem Mars reitet"
URL = "http://localhost:7080/predictions/stable-diffusion"
response = requests.post(URL, data=prompt)
Sie können überprüfen, ob der Server Ihre Anfrage erhalten hat, indem Sie sich die Serverprotokolle ansehen:
MODEL_LOG - Backend hat Inferenz empfangen bei: 1672929343
Stable Diffusion benötigt einen Grafikprozessor, um reibungslos zu laufen, daher werden Sie im Moment keine Ausgabe haben. Sie können den torchserve-Server mit `torhcserve -stop` anhalten.
Dockerize torchserve
Ihr TorchServe-Server funktioniert lokal. Um Stable Diffusion auf Vertex AI zu implementieren, müssen Sie es doktern. Das bedeutet, dass Sie ein Docker-Image erstellen, das das Modell, den Custom Handler und alle erforderlichen Abhängigkeiten enthält. Dies sind einfach alle Schritte, die wir oben in einer Dockerdatei durchgeführt haben.
Glücklicherweise ist es hier bereits vorbereitet und einsatzbereit: Dockerfile.
Es ist wichtig, den Container lokal auszuführen, um zu prüfen, ob er richtig funktioniert. Ich werde ihn lokal erstellen, aber Sie können ihn mit Cloud Build erstellen und auf Ihren Rechner ziehen.
Erstellen Sie das Image lokal (Sie benötigen einen laufenden Docker-Daemon):
Die Erstellung des Bildes dauert 20 bis 30 Minuten. Die Erstellungsphase ist lang, weil die Gewichte des Modells in das Bild kopiert werden müssen, bevor es vom Modellarchivierer verpackt wird.
Sie können einen Docker-Container ausführen und den Port 7080 mit abhören:
Um zu überprüfen, ob alles ordnungsgemäß funktioniert, können Sie warten, bis der Worker das Modell geladen hat, und denselben Inferenzcode wie zuvor ausführen, da wir denselben Port 7080 verwenden.
Einsatz auf Vertex AI
Nun, da das Dockerfile fertig ist und funktioniert, müssen wir:
Dies ist genau das, was das Bash-Skript deploy.sh tun wird, Sie können es mit ausführen:
Bei guter Internetgeschwindigkeit dauert die Bereitstellung etwa 1 Stunde:
Nachdem das Modell erfolgreich mit dem Endpunkt verbunden wurde, können Sie den Endpunkt mit dem folgenden Code abfragen:
PROJEKT_NAME = ""
REGION = ""
ENDPOINT_ID = ""
aip.init(projekt=PROJEKT_NAME, ort=REGION)
endpoint = aip.Endpoint(endpoint_name=ENDPOINT_ID)
text_input = """Eine Flasche gealterten und exklusiven Cognacs
steht auf einer spiegelnden Oberfläche, vor einer lebendigen Bar,
hyperdetailliert, 4K, Bokeh""
def query_endpoint(endpoint, text_input):
payload = {“data”: text_input}
response = endpoint.predict(instances=[payload])
return response

Eine Flasche gealterten und exklusiven Cognacs steht auf einer reflektierenden Oberfläche, vor einer lebendigen Bar, hyperdetailliert, 4K, Bokeh - Stabile Diffusion 1.5
Die Inferenz sollte auf einem T4-GPU zwischen 10 und 15 Sekunden dauern. Sie können die Geschwindigkeit verbessern, indem Sie einen besseren Grafikprozessor wählen und die Variable ACCELERATOR_TYPE in deploy.sh ändern.
Optional: Wenn die Bildgröße für den Endpunkt zu groß ist oder Sie den Bildverlauf speichern möchten.
Möglicherweise möchten Sie den Verlauf der Bilder verfolgen, oder es treten Fehler aufgrund der Größenbeschränkung von 1,5 MB für die Endpunktantwort auf. In diesem Fall empfehle ich, die Nachbearbeitungsmethode des Handlers zu verwenden, um das Bild im GCS zu speichern und nur den GCS-Pfad des Bildes zurückzugeben.
Glücklicherweise habe ich bereits einen Handler vorbereitet, der genau das für Sie tut. Ein Wechsel von stable_diffusion_handler.py zu stable_diffusion_handler_gcs.py sollte den Trick erledigen.
WARNUNG: Bevor Sie die Bereitstellung mit dem neuen Handler ausführen, müssen Sie:
Schlussfolgerung
In diesem Artikel wird eine umfassende Anleitung für die Bereitstellung des Stable Diffusion-Modells auf der Google Cloud Platform mit Vertex AI gegeben.
Der Leitfaden enthielt wichtige Schritte wie:
Es ist wichtig, daran zu denken, dass der Vertex-Endpunkt zwar eine effektive Lösung sein kann, aber keine Skalierung auf 0 Instanzen unterstützt, was zu höheren Kosten führen kann, da die GPU weiterhin in Gebrauch bleibt.
Nachdem die Einführung des Stable Diffusion Modells abgeschlossen ist, untersuchen wir derzeit weitere Möglichkeiten, wie z.B. die Feinabstimmung des Modells auf spezifische Moet Hennessy Produkte, um die Fähigkeiten des Modells noch weiter zu verbessern.