Dieser Artikel enthält eine Anleitung zur Bereitstellung des beliebten Bildgenerierungsmodells „Stable Diffusion“ in Google Cloud Vertex AI. Die Anleitung behandelt die Einrichtung und den Download der Gewichte, die Bereitstellung mit TorchServe, die Bereitstellung des TorchServe-Servers auf einem Vertex-Endpunkt sowie das automatische Speichern des Bildverlaufs in Google Cloud Storage (GCS).
Einleitung
Stable Diffusion ist ein Modell zur Bilderzeugung. Es wurde 2022 als Open-Source-Projekt veröffentlicht und hat aufgrund seiner Fähigkeit, aus Textbeschreibungen hochwertige Bilder zu generieren, an Beliebtheit gewonnen. Wie andere Modelle zur Bilderzeugung, beispielsweise Dall-E, nutzt Stable Diffusion Techniken des maschinellen Lernens, um auf der Grundlage einer vorgegebenen Eingabe Bilder zu generieren.
Moët Hennessy, die Wein- und Spirituosensparte des Luxuskonzerns LVMH, verwaltet ein Portfolio von mehr als 26 Kultmarken wie Moët & Chandon, Hennessy und Veuve Clicquot. Moët Hennessy hat mit Artefact zusammengearbeitet, um die Einsatzmöglichkeiten modernster Technologien bei der Erstellung von Marketinginhalten zu untersuchen. Mit dem Fokus auf Datenschutz und Sicherheit entschied sich das Team, den Einsatz von Stable Diffusion auf Cloud Google Cloud (GCP) zu prüfen, damit Moët Hennessy das Modell innerhalb der eigenen Infrastruktur feinabstimmen und betreiben kann, was einen nahtlosen Ablauf von der Modelloptimierung bis zur API-Bereitstellung ermöglicht.
Bevor Sie beginnen, sollten Sie beachten, dass dieser Artikel voraussetzt, dass Sie über Vorkenntnisse zur Google Cloud (GCP) und insbesondere zu Vertex AI verfügen. Dazu gehören Konzepte wie die Modellregistrierung und Vertex-Endpunkte. Zudem benötigen Sie Vorkenntnisse in Docker, um einige der Schritte nachvollziehen zu können. Wenn Sie mit diesen Konzepten nicht vertraut sind, empfehlen wir Ihnen, sich zunächst damit vertraut zu machen, bevor Sie fortfahren.
Um die Stable Diffusion-Gewichte herunterzuladen, benötigen Sie außerdem ein HuggingFace-Konto. Falls Sie noch keines haben, können Sie ganz einfach eines aufder Website von HuggingFace erstellen.
Nachdem das geklärt ist, können wir loslegen!
Einstellungen und Gewichte herunterladen
Ich empfehle, das von mir bereitgestellteGitHub-Repositoryzu klonen, um die Schritte des Artikels nachvollziehen zu können.
Es ist immer wichtig, eine virtuelle Umgebung einzurichten, um die Pakete zu installieren. Ich persönlich verwende Anaconda und installiere die Datei „requirements.txt“ mit allen Abhängigkeiten:
conda activate stable_diffusion
pip install -r src/requirements.txt
Sie können nun die Gewichte von Stable Diffusion herunterladen. In diesem Artikel verwenden wirStable Diffusion 1.5. Sie müssen die Lizenz auf der Modellseite akzeptieren, da es sonst beim Herunterladen der Modellgewichte zu Fehlern kommt.
Gehen Sie zu Ihrem Konto → Einstellungen → Zugriffstoken → Neues Token (Lesezugriff)

Sie können das Token als Umgebungsvariable hinzufügen. Ich persönlich empfehle, eine .env-Datei zu verwenden und die Umgebungsvariable mithilfe derBibliothek „python-dotenv“ zu laden.
Sie müssen in das Verzeichnis `src/stable_diffusion` wechseln und folgenden Befehl ausführen:
Dadurch werden die Gewichte heruntergeladen
Torchserve-Framework
Torchserveist ein Framework für den Betrieb von PyTorch-Modellen. Es ermöglicht Ihnen, PyTorch-Modelle in einer Produktionsumgebung bereitzustellen, und bietet Funktionen wie Modellversionierung und den Betrieb mehrerer Modelle. Es ist auf Benutzerfreundlichkeit ausgelegt und ermöglicht es Ihnen, sich auf die Entwicklung und Bereitstellung Ihrer Modelle zu konzentrieren, anstatt sich um die Infrastruktur kümmern zu müssen.
1. Erstellen eines Handlers, der das TorchServe-Format berücksichtigt
Ein benutzerdefinierter Handler ist eine Python-Klasse, die festlegt, wie data vorverarbeitet, das Modell ausgeführt und die Ausgabe nachbearbeitet werden. Um einen benutzerdefinierten Handler für Ihr Modell zu erstellen, müssen Sie eine Python-Klasse erstellen, die dem TorchServe-Format entspricht.
Ein benutzerdefinierter Handler für Stable Diffusion ist bereits im TorchServe-Repository enthalten. Da der Vertex-Endpunkt jedoch ein bestimmtes Format für die Anfragen erwartet, müssen wir die Methode `preprocess()` des Handlers an das Vertex-Format anpassen. Sie können die modifizierte Version des Handlers namens `stable_diffusion_handler.py` verwenden, die im GitHub-Repository dieses Artikels bereitgestellt wird.
2. Erstellen der .mar-Datei
Sobald Sie Ihren benutzerdefinierten Handler erstellt haben, müssen Sie ihn zusammen mit allen Abhängigkeiten und dem Modell selbst mithilfe des Tools „model-archiver“ in eine .mar-Datei verpacken. Das Tool „model-archiver“ ist ein Befehlszeilentool, mit dem Sie Ihr Modell, Ihren Handler und Ihre Abhängigkeiten in einer einzigen Datei zusammenfassen können.
Dadurch wird eine .mar-Datei namens „output.mar“ erstellt, die Ihr Modell, Ihren Handler und die Abhängigkeiten enthält.
Möglicherweise müssen Sie den Pfad entsprechend dem Speicherort der Dateien auf Ihrem Computer anpassen:
–model-name stable-diffusion
–version 1.0
–handler stable_diffusion/stable_diffusion_handler.py
–export-path stable_diffusion/model-store
–extra-files stable_diffusion/external_files
3. Starten Ihres 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:
— start
— ts-config=config.properties
— models=stable-diffusion.mar
— model-store=stable_diffusion/model-store
In der Datei „config.properties“ können Sie die Konfigurationen Ihres TorchServe-Servers festlegen, wie z. B. den Port für die Inferenz, Zustandsprüfungen, die Anzahl der Worker usw.
WARNUNG: Alle Skripte müssen in dem Verzeichnis ausgeführt werden, in dem sich die Datei befindet, um Pfadfehler zu vermeiden.
Starten Sie den TorchServe-Server lokal
Es ist wichtig, den Code lokal zu testen, bevor wir mit der Dockerisierung unserer Bereitstellung beginnen. Ich habe bereits ein Bash-Skript vorbereitet, das die .mar-Datei erstellt und den TorchServe-Server startet.
Du kannst es wie folgt ausführen:
Sie müssen einige Minuten warten, bis der Server initialisiert ist und der Worker das Modell geladen hat. Sobald Sie den folgenden Log-Eintrag sehen, können Sie mit der Inferenz beginnen:
org.pytorch.serve.wlm.WorkerThread— W-9000-stable-diffusion_1.0
Statusänderung WORKER_STARTED -> WORKER_MODEL_LOADED
Mit dem folgenden Code können Sie dann Inferenzanfragen an Ihr Modell stellen:
prompt = „ein Foto eines Astronauten, der auf dem Mars reitet“
URL = „http://localhost:7080/predictions/stable-diffusion“
response = requests.post(URL, data)
Sie können in den Serverprotokollen überprüfen, ob der Server Ihre Anfrage erhalten hat:
MODEL_LOG — Backend hat Inferenz um 1672929343 empfangen
Stable Diffusion benötigt eine GPU, um reibungslos zu laufen, daher wird vorerst keine Ausgabe angezeigt. Du kannst den Torchserve-Server mit `torchserve –stop` beenden.
Torchserve in Docker integrieren
Ihr TorchServe-Server läuft lokal. Um Stable Diffusion auf Vertex AI bereitzustellen, müssen Sie ihn dockerisieren. Das bedeutet, dass Sie ein Docker-Image erstellen müssen, das das Modell, den benutzerdefinierten Handler und alle erforderlichen Abhängigkeiten enthält. Dabei handelt es sich einfach um alle Schritte, die wir oben in einer Dockerfile-Datei durchgeführt haben.
Glücklicherweise steht diese hier bereits fertig vorbereitet und einsatzbereit zur Verfügung:Dockerfile.
Es ist wichtig, den Container lokal auszuführen, um zu überprüfen, ob er ordnungsgemäß funktioniert. Ich werde ihn lokal erstellen, aber du kannst ihn auch mit cloud erstellen und auf deinen Rechner herunterladen.
Erstellen Sie das Image lokal (dazu muss der Docker-Daemon laufen):
Die Erstellung des Images dauert 20 bis 30 Minuten. Die Erstellungsphase ist lang, da die Gewichte des Modells in das Image kopiert werden müssen, bevor es vom Model-Archiver gepackt wird.
Mit dem folgenden Befehl kannst du einen Docker-Container starten und auf Port 7080 lauschen:
Um zu überprüfen, ob alles ordnungsgemäß funktioniert, kannst du warten, bis der Worker das Modell geladen hat, und dann denselben Inferenzcode wie zuvor ausführen, da wir denselben Port 7080 verwenden.
Bereitstellung auf Vertex AI
Nachdem das Dockerfile nun fertig ist und funktioniert, müssen wir Folgendes tun:
Genau das wird das Bash-Skript„deploy.sh“tun. Du kannst es wie folgt ausführen:
Die Bereitstellung dauert bei guter Internetverbindung etwa eine Stunde:
Nachdem das Modell erfolgreich mit dem Endpunkt verbunden wurde, können Sie den Endpunkt mit dem folgenden Code abfragen:
PROJECT_NAME = ""
REGION = ""
ENDPOINT_ID = ""
aip.init(project=PROJECT_NAME, location=REGION)
endpoint = aip.Endpoint(endpoint_name=ENDPOINT_ID)
text_input = """Eine Flasche gereifter und exklusiver Cognac
steht auf einer reflektierenden Oberfläche vor einer lebhaften Bar,
hyperdetailliert, 4K, Bokeh"""
def query_endpoint(endpoint, text_input):
payload =
response = endpoint.predict(instances=[payload])
return response

Eine Flasche gereifter, exklusiver Cognac steht auf einer spiegelnden Oberfläche vor einer lebhaften Bar – hyperdetailliert, in 4K, mit Bokeh-Effekt – Stable Diffusion 1.5
Die Inferenz sollte auf einer T4-GPU zwischen 10 und 15 Sekunden dauern. Sie können die Geschwindigkeit verbessern, indem Sie eine leistungsstärkere GPU wählen; dazu können Sie die Variable `ACCELERATOR_TYPE` in der Datei `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 nachverfolgen, oder es treten Fehler aufgrund der Größenbeschränkung von 1,5 MB für die Endpunktantwort auf. In diesem Fall empfehle ich, die Post-Process-Methode des Handlers zu verwenden, um das Bild in GCS zu speichern und nur den GCS-Pfad des Bildes zurückzugeben.
Zum Glück habe ich bereits einen Handler vorbereitet, der genau das für dich erledigt; ein Wechsel von `stable_diffusion_handler.py` zu `stable_diffusion_handler_gcs.py` sollte das Problem lösen.
WARNUNG: Bevor Sie die Bereitstellung mit dem neuen Handler ausführen, müssen Sie Folgendes tun:
Fazit
Dieser Artikel enthält eine umfassende Anleitung zur Bereitstellung des Stable Diffusion-Modells auf Cloud Google Cloud mithilfe von Vertex AI.
Der Leitfaden behandelte wichtige Schritte wie:
Man sollte bedenken, dass der Vertex-Endpunkt zwar eine effektive Lösung sein kann, jedoch keine Skalierung auf 0 Instanzen unterstützt, was zu höheren Kosten führen kann, da die GPU weiterhin im Einsatz bleibt.
Nachdem die Implementierung des Stable-Diffusion-Modells abgeschlossen ist, prüfen wir derzeit weitere Möglichkeiten, wie beispielsweise die Feinabstimmung des Modells auf bestimmte Produkte von Moët Hennessy, um die Leistungsfähigkeit des Modells noch weiter zu verbessern.

BLOG






