Lesen Sie unseren Artikel über

.

Dieser Artikel enthält eine Anleitung für die Bereitstellung des Stable Diffusion-Modells, eines beliebten Modells zur Bilderzeugung, auf Google Cloud mit Vertex AI. Die Anleitung umfasst 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 als Open Source veröffentlicht und hat aufgrund seiner Fähigkeit, qualitativ hochwertige Bilder aus Textbeschreibungen zu erzeugen, an Popularität gewonnen. Wie andere Modelle zur Bilderzeugung, z.B. Dall-E, verwendet Stable Diffusion Techniken des maschinellen Lernens, um Bilder auf der Grundlage einer vorgegebenen Eingabe zu erzeugen.

Moët Hennessy, die Wein- und Spirituosenabteilung des Luxuskonglomerats LVMH, verwaltet ein Portfolio von mehr als 26 ikonischen Marken wie Moët & Chandon, Hennessy und Veuve Clicquot. Moët Hennessy hat zusammengearbeitet mit Artefact um die Einsatzmöglichkeiten von Spitzentechnologie bei der Erstellung von Marketinginhalten zu untersuchen. Mit dem Schwerpunkt 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 so eine nahtlose Erfahrung von der Feinabstimmung des Modells bis zur API-Exposition zu bieten.

Bevor Sie beginnen, sollten Sie wissen, 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 die Modellregistrierung 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, empfehlen wir Ihnen, sich mit ihnen vertraut zu machen, bevor Sie fortfahren.
Um Stable Diffusion weights herunterladen zu können, benötigen Sie ein huggingface-Konto. Wenn Sie noch keines haben, können Sie es ganz einfach auf Website von huggingface.
Wenn das gesagt ist, lassen Sie uns beginnen!

Setup und Gewichte herunterladen

Ich empfehle das Klonen der github repository Ich habe mich vorbereitet, 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 verwenden wir Stabile Diffusion 1.5. Sie müssen die Lizenz auf der Modellseite akzeptieren, sonst treten beim Herunterladen der Modellgewichte Fehler auf.
Gehen Sie zu Ihrem Konto → Einstellungen → Zugriffstoken → neues Token (Lesezugriff)

Go to your account → settings → access token → new token (read access)

Sie können das Token als Umgebungsvariable hinzufügen. Ich persönlich empfehle die Verwendung einer .env-Datei und das Laden der Umgebungsvariablen mit dem Befehl python-dotenv Bibliothek.
Sie müssen zu `src/stable_diffusion` navigieren und es 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 die Modellversionierung und die Bereitstellung mehrerer Modelle. 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. Der Vertex-Endpunkt erwartet jedoch ein bestimmtes Format für die Anfragen, so dass wir die preprocess()-Methode des Handlers anpassen müssen, um das Vertex-Format zu berücksichtigen. Sie können die modifizierte Version des Handlers namens `stable_diffusion_handler.py` im Github-Repository dieses Artikels angegeben.

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 mit dem Model-Archiver-Tool in eine .mar-Datei packen. Das model-archiver Tool ist ein Befehlszeilen-Tool, mit dem Sie Ihr Modell, den 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 Rechner 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-Dateien stable_diffusion/external_files

3. Ausführen 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:

torchserve
- Start
- 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 festlegen, z. B. den Port für die Inferenz, die 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 ein paar Minuten warten, bis der Server initialisiert ist und der Worker das Modell geladen hat. 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:

Importanträge
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 funktionieren, so dass Sie vorerst keine Ausgabe haben. Sie können den torchserve-Server mit `torhcserve -stop` anhalten.

Dockerisieren Sie torchserve

Ihr TorchServe Server arbeitet lokal. Um Stable Diffusion auf Vertex AI einzusetzen, müssen Sie ihn andocken. Das bedeutet, dass Sie ein Docker-Image erstellen, das das Modell, den benutzerdefinierten Handler und alle erforderlichen Abhängigkeiten enthält. Dies sind einfach alle Schritte, die wir oben in einer Dockerdatei durchgeführt haben.
Zum Glück ist es hier bereits vorbereitet und einsatzbereit: Dockerdatei.

Es ist wichtig, dass Sie den Container lokal ausführen, um zu prüfen, ob er ordnungsgemäß funktioniert. Ich werde ihn lokal erstellen, aber Sie können ihn auch 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 Images dauert 20 bis 30 Minuten. Die Erstellungsphase ist lang, weil die Gewichte des Modells in das Image kopiert werden müssen, bevor es vom Model-Archiver verpackt wird.

Sie können einen Docker-Container starten und 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 die Dockerdatei 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 Sie einen Vertex AI Endpunkt
  • Verbinden Sie das Modell mit dem Endpunkt

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

bash deploy.sh

Die Bereitstellung dauert bei guter Internetgeschwindigkeit etwa 1 Stunde:

  • Das Senden der 8 GB Modellgewichte an Cloud Build kann je nach Ihrer Internetgeschwindigkeit einige Minuten bis 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 gereiften und exklusiven Cognac
steht auf einer spiegelnden Oberfläche, vor einer lebendigen Bar,
hyperdetailliert, 4K, Bokeh"""

def query_endpoint(endpoint, text_input):
Nutzlast =
response = endpoint.predict(instances=[payload])
Antwort zurückgeben

image = query_endpoint(endpoint, text_input)

Eine Flasche gealterten und exklusiven Cognacs steht auf einer spiegelnden Oberfläche, vor einer lebendigen Bar, hyperdetailliert, 4K, Bokeh - Stable 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. Sie können die Variable ACCELERATOR_TYPE in deploy.sh.

Optional: Wenn die Bildgröße für den Endpunkt zu groß ist oder Sie den Bildverlauf speichern möchten.

Vielleicht möchten Sie die Historie der Bilder verfolgen oder es treten Fehler auf, weil die Endpunktantwort nur 1,5 MB groß ist. In diesem Fall empfehle ich, die Nachbearbeitungsmethode des Handlers zu verwenden, um das Bild in GCS zu speichern und nur den GCS-Pfad des Bildes zurückzugeben.

Glücklicherweise habe ich bereits einen Handler vorbereitet, der genau dies für Sie erledigt. Wechseln Sie von stable_diffusion_handler.py zu stable_diffusion_handler_gcs.py sollte den Zweck erfüllen.

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-Eimers 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 der Berechtigung GCS OWNER.

Fazit

In diesem Artikel finden Sie eine umfassende Anleitung für die Bereitstellung des Stable Diffusion-Modells auf Google Cloud Platform mit Vertex AI.

Der Leitfaden enthält wichtige Schritte wie:

  • TorchServe für die Bereitstellung verwenden
  • Erstellen und Ändern eines benutzerdefinierten Handlers für Stable 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 könnte, 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 bestimmte Moet Hennessy Produkte, um die Fähigkeiten des Modells noch weiter zu verbessern.

Mittel Blog von Artefact.

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