Lees ons artikel over

class="lazyload

.

Dit artikel biedt een handleiding voor het implementeren van het Stable Diffusion-model, een populair model voor het genereren van afbeeldingen, op Google Cloud Vertex AI. De handleiding behandelt de installatie en het downloaden van gewichten, TorchServe voor de implementatie, het opzetten van een TorchServe-server op een Vertex-eindpunt en het automatisch opslaan van de afbeeldingsgeschiedenis op GCS.

Inleiding

Stable Diffusion is een model voor het genereren van afbeeldingen. Het werd in 2022 als open source vrijgegeven en is populair geworden vanwege zijn vermogen om op basis van tekstbeschrijvingen afbeeldingen van hoge kwaliteit te genereren. Net als andere modellen voor het genereren van afbeeldingen, zoals Dall-E, maakt Stable Diffusion gebruik van machine learning-technieken om afbeeldingen te genereren op basis van een bepaalde invoer.

Moët Hennessy, de wijn- en sterkedrankdivisie van luxeconcern LVMH, beheert een portfolio van meer dan 26 iconische merken, zoals Moët & Chandon, Hennessy en Veuve Clicquot. Moët Hennessy heeft samengewerkt met Artefact om de mogelijke toepassingen van geavanceerde technologie bij het genereren van marketingcontent te onderzoeken. Met de nadruk op privacy en beveiliging besloot het team de implementatie van Stable Diffusion op Google Cloud (GCP) te verkennen, zodat Moët Hennessy het model binnen hun eigen infrastructuur kan afstemmen en uitvoeren, wat een naadloze ervaring biedt, van het afstemmen van het model tot de API-blootstelling.

Voordat je begint, is het belangrijk om te weten dat dit artikel ervan uitgaat dat je al enige kennis hebt van Google Cloud (GCP) en met name van Vertex AI. Dit omvat begrippen zoals het modelregister en Vertex-eindpunten. Daarnaast moet je enige ervaring hebben met Docker om bepaalde stappen te kunnen volgen. Als je niet bekend bent met deze begrippen, is het raadzaam je hier eerst in te verdiepen voordat je verdergaat.
Om Stable Diffusion-gewichten te downloaden, moet je bovendien een Hugging Face-account hebben. Als je er nog geen hebt, kun je er eenvoudig een aanmaken opde website van Hugging Face.
Dat gezegd hebbende, laten we beginnen!

Download installatie- en gewichtsgegevens

Ik raad je aan deGitHub-repositorydie ik heb aangemaakt te klonen, zodat je de stappen in het artikel kunt volgen.

Het is altijd belangrijk om een virtuele omgeving te creëren om de pakketten te installeren. Zelf gebruik ik Anaconda en installeer ik het bestand requirements.txt met alle afhankelijkheden:

conda create -n stable_diffusion — no-default-packages python=3.8 -y
conda activate stable_diffusion
pip install -r src/requirements.txt

Je bent nu klaar om de modelgewichten van Stable Diffusion te downloaden. In dit artikel gebruiken weStable Diffusion 1.5. Je moet de licentie op de modelpagina accepteren, anders krijg je foutmeldingen bij het downloaden van de modelgewichten.
Ga naar je account → instellingen → toegangstoken → nieuw token (leestoegang)

Ga naar je account → instellingen → toegangstoken → nieuw token (leestoegang)

Je kunt het token als omgevingsvariabele toevoegen. Persoonlijk raad ik aan om een .env-bestand te gebruiken en de omgevingsvariabele te laden met behulp van depython-dotenv-bibliotheek.
Je moet naar `src/stable_diffusion` gaan en het volgende uitvoeren:

python download_model.py

Hiermee worden de gewichten gedownload

`src/stable_diffusion/external_files/model_weights`.

Torchserve-framework

Torchserveis een framework voor het aanbieden van PyTorch-modellen. Hiermee kun je PyTorch-modellen in een productieomgeving implementeren en beschik je over functies zoals modelversiebeheer en het aanbieden van meerdere modellen. Het is ontworpen om gebruiksvriendelijk te zijn, zodat je je kunt concentreren op het bouwen en implementeren van je modellen, in plaats van je zorgen te maken over de infrastructuur.

1. Een handler maken die voldoet aan het TorchServe-formaat

Een aangepaste handler is een Python-klasse die bepaalt hoe data moeten worden voorbewerkt, hoe het model moet worden uitgevoerd en hoe de uitvoer moet worden nabewerkt. Om een aangepaste handler voor je model te maken, moet je een Python-klasse aanmaken die voldoet aan het TorchServe-formaat.
Een aangepaste handler voor Stable Diffusion is al opgenomen in de TorchServe-repository. Maar het Vertex-eindpunt verwacht een specifiek formaat voor de verzoeken, dus we moeten de preprocess()-methode van de handler aanpassen aan het Vertex-formaat. U kunt de aangepaste versie van de handler met de naam `stable_diffusion_handler.py` gebruiken die is opgenomen in de GitHub-repository van dit artikel.

2. Het .mar-bestand aanmaken

Zodra je je aangepaste handler hebt gemaakt, moet je deze samen met eventuele afhankelijkheden en het model zelf met behulp van de tool `model-archiver` in een .mar-bestand verpakken. De tool `model-archiver` is een opdrachtregelprogramma waarmee je je model, handler en afhankelijkheden in één enkel bestand kunt verpakken.

Hierdoor wordt een .mar-bestand met de naam output.mar aangemaakt dat je model, handler en afhankelijkheden bevat.

Het kan zijn dat je het pad moet aanpassen, afhankelijk van waar de bestanden op je computer staan:

torch-model-archiver
–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. Je TorchServe-server starten

Zodra je je .mar-bestand hebt aangemaakt, kun je de TorchServe-server starten met het commando torchserve. Hiervoor moet je het volgende commando uitvoeren:

torchserve
— start
— ts-config=config.properties
— models=stable-diffusion.mar
— model-store=stable_diffusion/model-store

In het bestand `config.properties` kunt u de configuratie van uw TorchServe-server instellen, zoals de poort voor inferentie, statuscontroles, het aantal workers, enz.
WAARSCHUWING: Alle scripts moeten worden uitgevoerd vanuit de map waar het bestand zich bevindt om padfouten te voorkomen.

Start de TorchServe-server lokaal

Het is belangrijk om de code lokaal te testen voordat we beginnen met het omzetten van onze implementatie naar Docker. Ik heb al een Bash-script opgesteld dat het .mar-bestand aanmaakt en de TorchServe-server start.

Je kunt het uitvoeren met:


bash serve_locally.sh

Je moet een paar minuten wachten totdat de server is opgestart en de worker het model heeft geladen. Je kunt beginnen met het uitvoeren van inferentie zodra je het volgende logbericht ziet:

2023–01–05T15:34:52,842 [DEBUG] W-9000-stable-diffusion_1.0
org.pytorch.serve.wlm.WorkerThread— W-9000-stable-diffusion_1.0
Statuswijziging WORKER_STARTED -> WORKER_MODEL_LOADED

Je kunt vervolgens de volgende code gebruiken om inferentieverzoeken naar je model te sturen:

import requests
prompt = “een foto van een astronaut die op Mars paardrijdt”
URL = “http://localhost:7080/predictions/stable-diffusion”
response = requests.post(URL, data)

Je kunt controleren of de server je verzoek heeft ontvangen door de serverlogboeken te bekijken:

2023-01-05 15:35:43,765 [INFO ] W-9000-stable-diffusion_1.0-stdout
MODEL_LOG — Backend heeft inferentie ontvangen om: 1672929343

Stable Diffusion heeft een GPU nodig om soepel te werken, dus je krijgt voorlopig geen uitvoer te zien. Je kunt de torchserve-server stoppen met `torchserve –stop`.

Torchserve in Docker zetten

Je TorchServe-server werkt lokaal. Om Stable Diffusion op Vertex AI te implementeren, moet je het in Docker verpakken. Dit houdt in dat je een Docker-image moet maken dat het model, de aangepaste handler en alle benodigde afhankelijkheden bevat. Dit zijn simpelweg alle stappen die we hierboven hebben doorlopen, maar dan in een Dockerfile.
Gelukkig is het hier al klaargemaakt en klaar voor gebruik:Dockerfile.

Het is belangrijk om de container lokaal uit te voeren om te controleren of deze goed werkt. Ik ga hem lokaal bouwen, maar je kunt hem ook met cloud bouwen en vervolgens naar je computer ophalen.

Bouw de image lokaal (hiervoor moet de Docker-daemon actief zijn):

build -t serve_sd .

Het bouwen van de image duurt 20 tot 30 minuten; deze fase duurt lang omdat de gewichten van het model eerst naar de image moeten worden gekopieerd voordat deze door de model-archiver kan worden verpakt.

Je kunt een Docker-container starten en luisteren op poort 7080 met:

docker run -p 7080:7080 serve_sd

Om te controleren of alles goed werkt, kun je wachten tot de worker het model heeft geladen en vervolgens dezelfde inferentiecode uitvoeren als eerder, aangezien we dezelfde poort 7080 gebruiken.

Implementatie op Vertex AI

Nu het Dockerfile klaar is en werkt, moeten we het volgende doen:

  • Bouw de image met behulp van Cloud binnen Google Container Registry (GCR)
  • Upload de afbeelding van ons aangepaste model naar het Vertex AI

  • Maak een Vertex AI aan
  • Bevestig het model aan het eindpunt

Dit is precies wat het bash-script`deploy.sh` gaat doen; je kunt het uitvoeren met:

bash deploy.sh

De installatie duurt ongeveer 1 uur bij een goede internetverbinding:

  • Het verzenden van de 8 GB aan modelgewichten naar Cloud kan enkele minuten tot uren duren, afhankelijk van je internetsnelheid
  • Het genereren van de afbeelding duurt ongeveer 20 minuten

  • Het uploaden van het model duurt ongeveer 5 minuten

  • Het aanmaken van het eindpunt duurt ongeveer 5 minuten

  • Het koppelen van het model aan het eindpunt duurt 30 tot 40 minuten

Nadat het model met succes aan het eindpunt is gekoppeld, kunt u het eindpunt opvragen met de volgende code:

van google.cloud aiplatform als aip

PROJECT_NAME = ""
REGION = ""
ENDPOINT_ID = ""
aip.init(project=PROJECT_NAME, location=REGION)
endpoint = aip.Endpoint(endpoint_name=ENDPOINT_ID)
text_input = """Een fles gerijpte en exclusieve cognac
staat op een reflecterend oppervlak, voor een levendige bar,
hypergedetailleerd, 4K, bokeh"""

def query_endpoint(endpoint, text_input):
payload =
response = endpoint.predict(instances=[payload])
return response

image = query_endpoint(endpoint, text_input)
class="lazyload

Een fles gerijpte en exclusieve cognac staat op een glanzend oppervlak, voor een levendige bar, hypergedetailleerd, 4K, bokeh — Stable Diffusion 1.5

De inferentie duurt op een T4-GPU tussen de 10 en 15 seconden. Je kunt de snelheid verhogen door een krachtigere GPU te kiezen; hiervoor kun je de variabele `ACCELERATOR_TYPE` in ` deploy.sh` aanpassen.

Optioneel: als de afbeelding te groot is voor het eindpunt, of als u de afbeeldingsgeschiedenis wilt opslaan.

Misschien wilt u de geschiedenis van de afbeeldingen bijhouden, of ondervindt u problemen vanwege de maximale bestandsgrootte van 1,5 MB voor het antwoord van het eindpunt. In dat geval raad ik u aan de post-process-methode van de handler te gebruiken om de afbeelding op te slaan in GCS en alleen het GCS-pad van de afbeelding terug te sturen.

Gelukkig heb ik al een handler gemaakt die dit voor je regelt; als je overschakelt van `stable_diffusion_handler.py` naar `stable_diffusion_handler_gcs.py`, zou dat moeten werken.

WAARSCHUWING: Voordat u de implementatie met de nieuwe handler uitvoert, moet u het volgende doen:

  • Maak een GCS-opslagbucket aan waarin de afbeeldingen worden opgeslagen

  • Wijzig de naam van de nieuwe GCS-bucket en -map in src/stable_diffusion/external_files/config.py

  • Wijzig het serviceaccount dat door het eindpunt wordt gebruikt in het bestand `deploy.sh`. Je hebt een serviceaccount nodig met GCS OWNER-rechten.

Conclusie

In dit artikel wordt een uitgebreide handleiding gegeven voor het implementeren van het Stable Diffusion-model op Google Cloud met behulp van Vertex AI.

De gids behandelde essentiële stappen zoals:

  • TorchServe gebruiken voor implementatie
  • Een aangepaste handler voor Stable Diffusion maken en aanpassen
  • Het model implementeren met behulp van het Vertex-modelregister en Vertex Endpoints

Het is belangrijk om te onthouden dat, hoewel het Vertex-eindpunt een effectieve oplossing kan zijn, het geen schaalverkleining tot 0 instanties ondersteunt, wat tot hogere kosten kan leiden omdat de GPU in gebruik blijft.

Nu de implementatie van het Stable Diffusion-model is voltooid, onderzoeken we momenteel verdere mogelijkheden, zoals het afstemmen van het model op specifieke producten van Moët Hennessy, om de mogelijkheden van het model nog verder te verbeteren.

class="lazyload

Medium-blog van Artefact.

Dit artikel is oorspronkelijk gepubliceerd op Medium.com.
Volg ons op onze Medium-blog!