Dit artikel biedt een handleiding voor het implementeren van het model Stable Diffusion, een populair model voor het genereren van afbeeldingen, op Google Cloud met behulp van Vertex AI. De handleiding behandelt het downloaden van instellingen en gewichten, TorchServe voor implementatie, TorchServe-server geïmplementeerd 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 open source gemaakt en heeft aan populariteit gewonnen door zijn vermogen om afbeeldingen van hoge kwaliteit te genereren op basis van tekstbeschrijvingen. Net als andere modellen voor het genereren van afbeeldingen, zoals Dall-E, maakt Stable Diffusion gebruik van machine-learningtechnieken om afbeeldingen te genereren op basis van een gegeven invoer.
Moët Hennessy, de wijn- en gedistilleerddivisie van luxeconglomeraat 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 het potentiële gebruik van geavanceerde technologie bij het genereren van marketingcontent te onderzoeken. Met een focus op privacy en veiligheid besloot het team om de inzet van Stable Diffusion op Google Cloud Platform (GCP) te onderzoeken, zodat Moët Hennessy het model binnen hun eigen infrastructuur kan afstemmen en uitvoeren, wat een naadloze ervaring oplevert van het afstemmen van het model tot de blootstelling aan API's.
Voordat je begint, is het belangrijk om te weten dat dit artikel ervan uitgaat dat je voorkennis hebt van Google Cloud Platform (GCP) en specifiek Vertex AI. Dit omvat concepten zoals modelregistry en Vertex endpoints. Daarnaast moet je ervaring hebben met Docker om sommige stappen te kunnen volgen. Als u niet bekend bent met deze concepten, is het raadzaam om u hiermee vertrouwd te maken voordat u verder gaat.
Om Stable Diffusion weights te downloaden moet je bovendien een huggingface account hebben. Als je die nog niet hebt, kun je die eenvoudig aanmaken op de website van huggingface.
Dat gezegd hebbende, laten we beginnen!
Instellingen en gewichten downloaden
Ik raad aan om de githubrepository die ik heb voorbereid te klonen om de stappen van het artikel te volgen.
Het is altijd belangrijk om een virtuele omgeving te maken om de pakketten te installeren. Persoonlijk gebruik ik anaconda en installeer ik de requirements.txt bij elke afhankelijkheid:
conda activeer stable_diffusion
pip installeer -r src/vereisten.txt
U bent nu klaar om de gewichten van Stable Diffusion te downloaden. In dit artikel gebruiken we Stable Diffusion 1.5. U moet de licentie accepteren op de modelpagina, anders krijgt u fouten bij het downloaden van de modelgewichten.
Ga naar uw 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 de python-dotenv bibliotheek.
Je moet navigeren naar `src/stable_diffusion` en uitvoeren:
Dit downloadt de gewichten in
Torchserve kader
Torchserve is een framework voor het serveren van PyTorch-modellen. Het stelt je in staat om PyTorch-modellen te implementeren in een productieomgeving en biedt functies zoals modelversiebeheer en het serveren van meerdere modellen. Het is ontworpen om gemakkelijk te gebruiken te zijn en stelt je in staat om je te concentreren op het bouwen en implementeren van je modellen, in plaats van je zorgen te maken over de infrastructuur.
1. Een handler maken die de TorchServe-indeling respecteert
Een aangepaste handler is een Python-klasse die definieert hoe de invoer moet worden voorbewerkt data, hoe het model moet worden uitgevoerd en hoe de uitvoer moet worden nabewerkt. Om een aangepaste handler voor uw model te maken, moet u een Python-klasse maken die de TorchServe-indeling volgt.
Een aangepaste handler voor Stable Diffusion is al beschikbaar 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 om rekening te houden met het Vertex formaat. U kunt de aangepaste versie van de handler met de naam `stable_diffusion_handler.py` gebruiken die in de github-repository van dit artikel staat.
2. Het .mar-bestand maken
Nadat je een aangepaste handler hebt gemaakt, moet je deze samen met eventuele afhankelijkheden en het model zelf verpakken in een .mar-bestand met het hulpprogramma model-archiver. De model-archiver tool is een opdrachtregel-tool waarmee je je model, handler en afhankelijkheden in één bestand kunt verpakken.
Dit maakt een .mar-bestand aan met de naam output.mar dat je model, handler en afhankelijkheden bevat.
Mogelijk moet u het pad bewerken op basis van waar de bestanden zich op uw computer bevinden:
-modelnaam stabiele-diffusie
-versie 1.0
-handler stable_diffusion/stable_diffusion_handler.py
-export-pad stable_diffusion/model-store
-extra-bestanden stable_diffusion/external_files
3. Uw TorchServe-server uitvoeren
Nadat je het .mar-bestand hebt gemaakt, kun je de TorchServe-server starten met de opdracht torchserve. Hiervoor moet je de volgende opdracht uitvoeren:
- beginnen
- ts-config=config.properties
- models=stable-diffusion.mar
- model-store=stable_diffusion/model-store
De config.properties laten je de configuraties van je TorchServe server specificeren, zoals de poort voor inferentie, gezondheidscontroles, aantal werkers, etc..
WAARSCHUWING: Alle scripts moeten worden uitgevoerd waar het bestand zich bevindt om padfouten te voorkomen.
Voer de TorchServe-server lokaal uit
Het is belangrijk om de code lokaal te testen voordat we beginnen met het dockeriseren van onze implementatie, ik heb al een bash script voorbereid dat het .mar bestand maakt en de TorchServe server start.
Je kunt het uitvoeren met :
Je moet een paar minuten wachten tot de server is geïnitialiseerd en de worker het model heeft geladen. Je kunt beginnen met inferentie als je het volgende logboek ziet:
org.pytorch.serve.wlm.WorkerThread- W-9000-stable-diffusion_1.0
Statusverandering WORKER_STARTED -> WORKER_MODEL_LOADED
U kunt dan de volgende code gebruiken om inferentieverzoeken aan uw model te doen:
prompt = "een foto van een astronaut te paard op mars".
URL = "http://localhost:7080/predictions/stable-diffusion"
antwoord = requests.post(URL, data=prompt)
Je kunt controleren of de server je verzoek heeft ontvangen door de logboeken van de server te bekijken:
MODEL_LOG - Backend inferentie ontvangen op: 1672929343
Stable Diffusion heeft een GPU nodig om soepel te kunnen draaien, dus op dit moment heb je geen uitvoer. Je kunt de torchserve-server stoppen met `torhcserve -stop`.
Torchserve Dockeriseren
Uw TorchServe-server werkt lokaal. Om Stable Diffusion op Vertex AI te implementeren, moet u het dockeriseren. Dit betekent dat er een Docker image gemaakt moet worden die het model, de aangepaste handler en alle benodigde afhankelijkheden bevat. Dit zijn gewoon alle stappen die we hierboven hebben gedaan in een Dockerfile.
Gelukkig is het hier al voorbereid en klaar voor gebruik: Dockerfile.
Het is belangrijk om de container lokaal te draaien om te controleren of hij goed werkt. Ik ga hem lokaal bouwen, maar je kunt hem bouwen met cloud build en hem op je machine zetten.
Bouw het image lokaal (Docker daemon moet draaien):
Het bouwen van de image duurt 20 tot 30 minuten. De bouwfase duurt lang omdat de gewichten van het model in de image moeten worden gekopieerd voordat ze worden ingepakt door de model-archiver.
Je kunt een docker container draaien en luisteren op poort 7080 met:
Om te controleren of alles goed werkt, kun je wachten tot de worker het model heeft geladen en dezelfde inferentiecode uitvoeren als voorheen, aangezien we dezelfde poort 7080 gebruiken.
Inzet op Vertex AI
Nu het Dockerbestand klaar is en werkt, moeten we:
Dit is precies wat het deploy.sh bash script gaat doen, je kunt het uitvoeren met:
De installatie duurt ongeveer 1 uur met een goede internetsnelheid:
Nadat het model succesvol aan het eindpunt is gekoppeld, kunt u het eindpunt bevragen met de volgende code:
PROJECT_NAAM = ""
REGIO = ""
EINDPUNT_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,
hyper gedetailleerd, 4K, bokeh"""
def query_endpoint(endpoint, text_input):
payload = {“data”: text_input}
response = endpoint.predict(instances=[payload])
return response

Een fles gerijpte en exclusieve cognac staat op een reflecterend oppervlak, voor een levendige bar, hypergedetailleerd, 4K, bokeh - Stable Diffusion 1.5
De inferentie zou tussen de 10 en 15 seconden moeten duren op een T4 GPU. Je kunt de snelheid verbeteren door een betere GPU te kiezen, je kunt de variabele ACCELERATOR_TYPE wijzigen in deploy.sh.
Optioneel: Als de afbeeldingsgrootte te groot is voor het eindpunt, of als u de afbeeldingsgeschiedenis wilt opslaan.
Misschien wil je de geschiedenis van de afbeeldingen bijhouden, of heb je fouten door de limiet van 1,5 MB voor de grootte van het antwoord van het eindpunt. In dit geval raad ik aan om 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 precies dit voor je doet. Als je overschakelt van stable_diffusion_handler.py naar stable_diffusion_handler_gcs.py, zou dat moeten werken.
WAARSCHUWING: Voordat je de implementatie met de nieuwe handler uitvoert, moet je:
Conclusie
In dit artikel wordt een uitgebreide handleiding gegeven voor het implementeren van het Stable Diffusion-model op Google Cloud Platform met behulp van Vertex AI.
De gids behandelt essentiële stappen zoals:
Het is belangrijk om te onthouden dat Vertex endpoint weliswaar een effectieve oplossing kan zijn, maar geen ondersteuning biedt voor het terugschalen naar 0 instanties, wat kan leiden tot hogere kosten omdat de GPU in gebruik blijft.
Nu het Stable Diffusion-model is geïmplementeerd, onderzoeken we verdere mogelijkheden, zoals het verfijnen van het model op specifieke Moet Hennessy-producten om de mogelijkheden van het model nog verder te verbeteren.