Lesen Sie unseren Artikel über

class="img-responsive

.

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 create -n stable_diffusion - no-default-packages python=3.8 -y
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)

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:

python download_model.py

Dadurch werden die Gewichte im Inneren heruntergeladen

src/stable_diffusion/external_files/model_weights".

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:

torch-model-archiver
-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:

Fackelservice
- 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 :


bash serve_locally.sh

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:

2023-01-05T15:34:52,842 [DEBUG] W-9000-stable-diffusion_1.0
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:

Anfragen importieren
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:

2023-01-05T15:35:43,765 [INFO ] W-9000-stable-diffusion_1.0-stdout
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):

build -t serve_sd .

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:

docker run -p 7080:7080 serve_sd

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:

  • Erstellen Sie das Image mit Cloud Build innerhalb der Google Container Registry (gcr)
  • Laden Sie das Bild unseres benutzerdefinierten Modells in die Vertex AI Modellregistrierung hoch.

  • Erstellen eines Vertex AI Endpunkts
  • Befestigen Sie das Modell am Endpunkt

Dies ist genau das, was das Bash-Skript deploy.sh tun wird, Sie können es mit ausführen:

bash deploy.sh

Bei guter Internetgeschwindigkeit dauert die Bereitstellung etwa 1 Stunde:

  • Das Senden der 8 GB Modellgewichte an Cloud Build kann je nach Internetgeschwindigkeit zwischen einigen Minuten und Stunden dauern.
  • Die Erstellung des Bildes dauert etwa 20 Minuten.

  • Das Hochladen des Modells dauert etwa 5 Minuten.

  • Die Erstellung des Endpunkts dauert etwa 5 Minuten.

  • Das Anbringen des Modells am Endpunkt dauert zwischen 30 und 40 Minuten.

Nachdem das Modell erfolgreich mit dem Endpunkt verbunden wurde, können Sie den Endpunkt mit dem folgenden Code abfragen:

from google.cloud import aiplatform as aip

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

image = query_endpoint(endpoint, text_input)
class="img-responsive

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:

  • Erstellen Sie einen GCS-Bucket, in dem die Bilder gespeichert werden sollen

  • Bearbeiten Sie den Namen des neuen GCS-Buckets und den Ordner in src/stable_diffusion/external_files/config.py

  • Ändern Sie das vom Endpunkt verwendete Dienstkonto in der Datei deploy.sh. Sie benötigen ein Dienstkonto mit GCS OWNER-Berechtigungen.

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:

  • TorchServe für die Bereitstellung verwenden
  • Erstellen und Ändern eines benutzerdefinierten Handlers für Stabile Diffusion
  • Bereitstellung des Modells mithilfe der Vertex-Modellregistrierung und der Vertex-Endpunkte

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.

class="img-responsive

Medium Blog von Artefact.

Dieser Artikel wurde ursprünglich auf Medium.com veröffentlicht.
Folgen Sie uns auf unserem Medium Blog!