Lisez notre article sur

class="lazyload

.

Cet article propose un guide pour le déploiement du modèle Stable Diffusion, un modèle de génération d'images très populaire, sur Google Cloud Vertex AI. Ce guide aborde la configuration et le téléchargement des poids, l'utilisation de TorchServe pour le déploiement, le déploiement du serveur TorchServe sur un point de terminaison Vertex, ainsi que l'enregistrement automatique de l'historique des images sur GCS.

Introduction

Stable Diffusion est un modèle de génération d'images. Il a été mis en open source en 2022 et a gagné en popularité grâce à sa capacité à générer des images de haute qualité à partir de descriptions textuelles. À l'instar d'autres modèles de génération d'images, tels que Dall-E, Stable Diffusion utilise des techniques d'apprentissage automatique pour générer des images à partir d'une entrée donnée.

Moët Hennessy, la division vins et spiritueux du groupe de luxe LVMH, gère un portefeuille de plus de 26 marques emblématiques telles que Moët & Chandon, Hennessy et Veuve Clicquot. Moët Hennessy a collaboré avec Artefact afin d'étudier les applications potentielles des technologies de pointe dans la création de contenu marketing. En mettant l'accent sur la confidentialité et la sécurité, l'équipe a décidé d'explorer le déploiement de Stable Diffusion sur Google Cloud (GCP) afin de permettre à Moët Hennessy d'ajuster et d'exécuter le modèle au sein de sa propre infrastructure, offrant ainsi une expérience fluide, de l'ajustement du modèle à l'exposition de l'API.

Avant de commencer, il est important de noter que cet article part du principe que vous disposez déjà de connaissances sur Google Cloud (GCP) et plus particulièrement sur Vertex AI. Cela inclut des concepts tels que le registre de modèles et les points de terminaison Vertex. De plus, vous devez avoir une expérience préalable de Docker pour suivre certaines étapes. Si vous n’êtes pas familier avec ces concepts, il est recommandé de vous familiariser avec eux avant de poursuivre.
De plus, pour télécharger les poids de Stable Diffusion, vous devez disposer d'un compte Hugging Face. Si vous n'en avez pas encore, vous pouvez en créer un facilement surle site web de Hugging Face.
Cela étant dit, commençons !

Téléchargement des configurations et des poids

Je vous recommande de cloner ledépôt GitHubque j'ai préparé afin de suivre les étapes décrites dans l'article.

Il est toujours important de créer un environnement virtuel pour installer les paquets. Pour ma part, j'utiliserai Anaconda et j'installerai le fichier requirements.txt avec toutes les dépendances :

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

Vous êtes désormais prêt à télécharger les poids de Stable Diffusion ; dans cet article, nous utiliseronsla version 1.5 de Stable Diffusion. Vous devez accepter la licence sur la page du modèle, sinon vous rencontrerez des erreurs lors du téléchargement des poids du modèle.
Accédez à votre compte → paramètres → jeton d'accès → nouveau jeton (accès en lecture)

Accédez à votre compte → Paramètres → Jeton d'accès → Nouveau jeton (accès en lecture)

Vous pouvez ajouter le jeton en tant que variable d'environnement. Personnellement, je recommande d'utiliser un fichier .env et de charger la variable d'environnement à l'aide de labibliothèque python-dotenv.
Vous devez vous rendre dans le répertoire `src/stable_diffusion` et exécuter :

python download_model.py

Cela permettra de télécharger les poids à l'intérieur

`src/stable_diffusion/external_files/model_weights`.

Cadre Torchserve

Torchserveest un framework permettant de mettre en service des modèles PyTorch. Il vous permet de déployer des modèles PyTorch dans un environnement de production et offre des fonctionnalités telles que la gestion des versions de modèles et la mise en service de plusieurs modèles. Conçu pour être simple d'utilisation, il vous permet de vous concentrer sur la création et le déploiement de vos modèles, sans avoir à vous soucier de l'infrastructure.

1. Création d'un gestionnaire respectant le format TorchServe

Un gestionnaire personnalisé est une classe Python qui définit comment prétraiter data d'entrée, comment exécuter le modèle et comment post-traiter les données de sortie. Pour créer un gestionnaire personnalisé pour votre modèle, vous devrez créer une classe Python conforme au format TorchServe.
Un gestionnaire personnalisé pour Stable Diffusion est déjà fourni dans le référentiel TorchServe. Cependant, le point de terminaison Vertex attend un format spécifique pour les requêtes ; nous devons donc adapter la méthode preprocess() du gestionnaire pour tenir compte du format Vertex. Vous pouvez utiliser la version modifiée du gestionnaire nommée `stable_diffusion_handler.py` fournie dans le référentiel GitHub de cet article.

2. Création du fichier .mar

Une fois que vous avez créé votre gestionnaire personnalisé, vous devrez le regrouper avec toutes les dépendances et le modèle lui-même dans un fichier .mar à l'aide de l'outil model-archiver. L'outil model-archiver est un outil en ligne de commande qui vous permet de regrouper votre modèle, votre gestionnaire et vos dépendances dans un seul fichier.

Cela créera un fichier .mar nommé output.mar contenant votre modèle, votre gestionnaire et vos dépendances.

Vous devrez peut-être modifier le chemin d'accès en fonction de l'emplacement des fichiers sur votre ordinateur :

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. Lancer votre serveur TorchServe

Une fois votre fichier .mar créé, vous pouvez démarrer le serveur TorchServe à l'aide de la commande torchserve. Pour ce faire, vous devez exécuter la commande suivante :

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

Le fichier config.properties vous permetde définir les paramètres de votre serveur TorchServe, tels que le port utilisé pour l'inférence, les contrôles d'intégrité, le nombre de workers, etc.
AVERTISSEMENT : tous les scripts doivent être exécutés à l'emplacement où se trouve le fichier afin d'éviter toute erreur de chemin d'accès.

Lancer le serveur TorchServe en local

Il est important de tester le code en local avant de commencer à mettre en place notre déploiement sur Docker. J'ai déjà préparé un script Bash qui créera le fichier .mar et lancera le serveur TorchServe.

Vous pouvez l'exécuter avec :


bash serve_locally.sh

Vous devez patienter quelques minutes le temps que le serveur s'initialise et que le worker charge le modèle ; vous pouvez commencer à exécuter l'inférence dès que le message suivant apparaît dans le journal :

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

Vous pouvez ensuite utiliser le code suivant pour envoyer des requêtes d'inférence à votre modèle :

import requests
prompt = « une photo d'un astronaute à cheval sur Mars »
URL = « http://localhost:7080/predictions/stable-diffusion »
response = requests.post(URL, data)

Vous pouvez vérifier que le serveur a bien reçu votre requête en consultant les journaux du serveur :

2023-01-05T15:35:43,765 [INFO ] W-9000-stable-diffusion_1.0-stdout
MODEL_LOG — Le backend a reçu une requête d'inférence à l'adresse : 1672929343

Stable Diffusion nécessite un GPU pour fonctionner correctement ; vous n'obtiendrez donc aucun résultat pour le moment. Vous pouvez arrêter le serveur torchserve à l'aide de la commande `torchserve –stop`.

Mettre Torchserve en Docker

Votre serveur TorchServe fonctionne en local. Pour déployer Stable Diffusion sur Vertex AI, vous devrez le « dockeriser ». Cela implique de créer une image Docker contenant le modèle, le gestionnaire personnalisé et toutes les dépendances nécessaires. Il s'agit simplement de regrouper toutes les étapes que nous avons effectuées ci-dessus dans un fichier Dockerfile.
Heureusement, tout est déjà prêt à l'emploi ici :Dockerfile.

Il est important d'exécuter le conteneur localement pour vérifier qu'il fonctionne correctement. Je vais le compiler localement, mais vous pouvez le compiler via cloud et le récupérer sur votre machine.

Créez l'image localement (le démon Docker doit être en cours d'exécution) :

build -t serve_sd .

La création de l'image prendra entre 20 et 30 minutes ; cette phase est longue car les poids du modèle doivent être copiés dans l'image avant que celle-ci ne soit compressée par l'outil de compression.

Vous pouvez exécuter un conteneur Docker et écouter sur le port 7080 à l'aide de la commande suivante :

docker run -p 7080:7080 serve_sd

Pour vérifier que tout fonctionne correctement, vous pouvez attendre que le worker ait chargé le modèle, puis exécuter le même code d'inférence que précédemment, puisque nous utilisons le même port 7080.

Déploiement sur Vertex AI

Maintenant que le fichier Dockerfile est prêt et fonctionne, nous devons :

  • Créez l'image à l'aide de Cloud dans Google Container Registry (GCR)
  • Téléchargez l'image de notre modèle personnalisé dans le registre de modèles Vertex AI

  • Créer un point de terminaison Vertex AI
  • Fixez le modèle à l'extrémité

C'est exactement ce que va faire le script Bash« deploy.sh» ; vous pouvez l'exécuter avec :

bash deploy.sh

Le déploiement prend environ une heure avec une bonne connexion Internet :

  • L'envoi des 8 Go de poids de modèle vers Cloud peut prendre de quelques minutes à plusieurs heures, selon votre débit Internet
  • La création de l'image prend environ 20 minutes

  • Le téléchargement du modèle prend environ 5 minutes

  • La création du point de terminaison prend environ 5 minutes

  • La fixation du modèle au point d'extrémité prend entre 30 et 40 minutes

Une fois le modèle correctement associé au point de terminaison, vous pouvez interroger ce dernier à l'aide du code suivant :

from google.cloud aiplatform as aip

PROJECT_NAME = ""
REGION = ""
ENDPOINT_ID = ""
aip.init(project=PROJECT_NAME, location=REGION)
endpoint = aip.Endpoint(endpoint_name=ENDPOINT_ID)
text_input = """Une bouteille de cognac vieilli et exclusif
trône sur une surface réfléchissante, devant un bar animé,
hyper détaillé, 4K, bokeh"""

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

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

Une bouteille de cognac vieilli et exclusif trône sur une surface réfléchissante, devant un bar aux couleurs vives, avec un niveau de détail exceptionnel, en 4K et avec un effet bokeh — Stable Diffusion 1.5

L'inférence devrait prendre entre 10 et 15 secondes sur un GPU T4. Vous pouvez améliorer la vitesse en choisissant un GPU plus performant ; pour cela, modifiez la variable ACCELERATOR_TYPE dans le fichier deploy.sh.

Facultatif : si la taille de l'image est trop importante pour le point de terminaison, ou si vous souhaitez conserver l'historique des images.

Vous souhaitez peut-être conserver l'historique des images, ou vous rencontrez des erreurs en raison de la limite de taille de 1,5 Mo imposée pour la réponse du point de terminaison. Dans ce cas, je vous recommande d'utiliser la méthode de post-traitement du gestionnaire pour enregistrer l'image dans GCS et ne renvoyer que le chemin d'accès GCS de l'image.

Heureusement, j'ai déjà préparé un gestionnaire qui s'en charge pour vous ; il suffit de passer de stable_diffusion_handler.py àstable_diffusion_handler_gcs.pypour que cela fonctionne.

AVERTISSEMENT : Avant de lancer le déploiement avec le nouveau gestionnaire, vous devez :

  • Créez un compartiment GCS destiné à stocker les images

  • Modifiez le nom du nouveau compartiment GCS et du dossier correspondant dans le fichier src/stable_diffusion/external_files/config.py

  • Modifiez le compte de service utilisé par le point de terminaison dans le fichier deploy.sh. Vous devez disposer d'un compte de service doté des autorisations GCS OWNER.

Conclusion

Cet article propose un guide complet pour le déploiement du modèle Stable Diffusion sur Google Cloud à l'aide de Vertex AI.

Ce guide abordait des étapes essentielles telles que :

  • Utilisation de TorchServe pour le déploiement
  • Créer et modifier un gestionnaire personnalisé pour Stable Diffusion
  • Déploiement du modèle à l'aide du registre de modèles Vertex et des points de terminaison Vertex

Il est important de garder à l'esprit que, même si l'endpoint Vertex peut constituer une solution efficace, il ne permet pas de réduire le nombre d'instances à 0, ce qui pourrait entraîner une augmentation des coûts puisque le GPU reste en service.

De plus, maintenant que le déploiement du modèle Stable Diffusion est achevé, nous explorons actuellement d'autres possibilités, telles que l'affinage du modèle sur des produits Moët Hennessy spécifiques, afin d'améliorer encore davantage ses capacités.

class="lazyload

Blog Medium Blog Artefact.

Cet article a été initialement publié sur Medium.com.
Suivez-nous sur notre Blog Medium Blog