Image par auteur
Diffusers est une bibliothèque Python développée et maintenue par HuggingFace. Il simplifie le développement et l’inférence de modèles de diffusion pour générer des images à partir d’invites définies par l’utilisateur. Le code est ouvertement disponible sur GitHub avec 22,4k étoiles sur le référentiel. HuggingFace maintient également une grande variété de diffusion stable et divers autres modèles de diffusion peuvent être facilement utilisés avec leur bibliothèque.
Installation et configuration
Il est bon de commencer avec un nouvel environnement Python pour éviter les conflits entre les versions de bibliothèque et les dépendances.
Pour configurer un nouvel environnement Python, exécutez les commandes suivantes :
python3 -m venv venv
source venv/bin/activate
L’installation de la bibliothèque Diffusers est simple. Il est fourni sous forme de package pip officiel et utilise en interne la bibliothèque PyTorch. De plus, de nombreux modèles de diffusion sont basés sur l’architecture Transformers, donc le chargement d’un modèle nécessitera également le package pip Transformers.
pip install 'diffusers[torch]' transformers
Utiliser des diffuseurs pour les images générées par l’IA
La bibliothèque de diffuseurs permet de générer extrêmement facilement des images à partir d’une invite à l’aide de modèles de diffusion stables. Ici, nous allons parcourir un simple code ligne par ligne pour voir différentes parties de la bibliothèque Diffusers.
Importations
import torch
from diffusers import AutoPipelineForText2Image
L’ensemble de torche sera requis pour l’installation et la configuration générales du pipeline diffuseur. AutoPipelineForText2Image est une classe qui identifie automatiquement le modèle en cours de chargement, par exemple StableDiffusion1-5, StableDiffusion2.1 ou SDXL, et charge les classes et modules appropriés en interne. Cela nous évite d’avoir à changer de pipeline chaque fois que nous voulons charger un nouveau modèle.
Chargement des modèles
Un modèle de diffusion est composé de plusieurs composants, notamment Text Encoder, UNet, Schedulers et Variational AutoEncoder. Nous pouvons charger séparément les modules, mais la bibliothèque diffusers fournit une méthode de création qui peut charger un modèle pré-entraîné à partir d’un répertoire de points de contrôle structuré. Pour un débutant, il peut être difficile de savoir quel pipeline utiliser. AutoPipeline facilite donc le chargement d’un modèle pour une tâche spécifique.
Dans cet exemple, nous allons charger un modèle SDXL ouvertement disponible sur ÉtreindreVisage, formé par Stability AI. Les fichiers du répertoire sont structurés en fonction de leurs noms et chaque répertoire possède son propre fichier safetensors. La structure des répertoires du modèle SDXL se présente comme ci-dessous :
Pour charger le modèle dans notre code, nous utilisons la classe AutoPipelineForText2Image et appelons la fonction from_pretrained.
pipeline = AutoPipelineForText2Image.from_pretrained(
"stability/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float32 # Float32 for CPU, Float16 for GPU,
)
Nous fournissons le chemin du modèle comme premier argument. Il peut s’agir du nom de la carte du modèle HuggingFace comme ci-dessus ou d’un répertoire local dans lequel vous avez préalablement téléchargé le modèle. De plus, nous définissons les précisions des pondérations du modèle comme argument mot-clé. Nous utilisons normalement une précision en virgule flottante de 32 bits lorsque nous devons exécuter le modèle sur un processeur. Cependant, exécuter un modèle de diffusion est coûteux en termes de calcul, et exécuter une inférence sur un périphérique CPU prendra des heures ! Pour le GPU, nous utilisons des types de données 16 bits ou 32 bits, mais 16 bits est préférable car il utilise moins de mémoire GPU.
La commande ci-dessus téléchargera le modèle depuis HuggingFace et cela peut prendre du temps en fonction de votre connexion Internet. La taille des modèles peut varier de 1 Go à plus de 10 Go.
Une fois qu’un modèle est chargé, nous devrons déplacer le modèle vers le périphérique matériel approprié. Utilisez le code suivant pour déplacer le modèle vers CPU ou GPU. Notez que pour les puces Apple Silicon, déplacez le modèle vers un appareil MPS pour exploiter le GPU sur les appareils MacOS.
# "mps" if on M1/M2 MacOS Device
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
pipeline.to(DEVICE)
Inférence
Nous sommes maintenant prêts à générer des images à partir d’invites textuelles en utilisant le modèle de diffusion chargé. Nous pouvons exécuter une inférence en utilisant le code ci-dessous :
prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
results = pipeline(
prompt=prompt,
height=1024,
width=1024,
num_inference_steps=20,
)
Nous pouvons utiliser l’objet pipeline et l’appeler avec plusieurs arguments de mots-clés pour contrôler les images générées. Nous définissons une invite comme un paramètre de chaîne décrivant l’image que nous voulons générer. En outre, nous pouvons définir la hauteur et la largeur de l’image générée, mais elles doivent être en multiples de 8 ou 16 en raison de l’architecture du transformateur sous-jacente. De plus, les étapes d’inférence totales peuvent être ajustées pour contrôler la qualité de l’image finale. Des étapes de débruitage plus nombreuses donnent des images de meilleure qualité, mais prennent plus de temps à générer.
Enfin, le pipeline renvoie une liste d’images générées. Nous pouvons accéder à la première image du tableau et la manipuler comme une image Pillow pour enregistrer ou afficher l’image.
img = results.images[0]
img.save('result.png')
img # To show the image in Jupyter notebook
Image générée
Utilisations avancées
L’exemple texte-2-image n’est qu’un didacticiel de base pour mettre en évidence l’utilisation sous-jacente de la bibliothèque Diffusers. Il fournit également plusieurs autres fonctionnalités, notamment la génération d’images Image-2, l’inpainting, l’outpainting et les réseaux de contrôle. De plus, ils permettent un contrôle fin de chaque module du modèle de diffusion. Ils peuvent être utilisés comme de petits éléments de base qui peuvent être intégrés de manière transparente pour créer vos pipelines de diffusion personnalisés. De plus, ils fournissent également des fonctionnalités supplémentaires pour entraîner des modèles de diffusion sur vos propres ensembles de données et cas d’utilisation.
Emballer
Dans cet article, nous avons passé en revue les bases de la bibliothèque Diffusers et comment faire une inférence simple à l’aide d’un modèle de diffusion. Il s’agit de l’un des pipelines d’IA générative les plus utilisés dans lequel des fonctionnalités et des modifications sont apportées quotidiennement. Il existe de nombreux cas d’utilisation et fonctionnalités différents que vous pouvez essayer. Documentation sur HuggingFace et Code GitHub est le meilleur endroit pour commencer.
Kanwal Mehreen Kanwal est un ingénieur en apprentissage automatique et un rédacteur technique passionné par la science des données et l’intersection de l’IA et de la médecine. Elle a co-écrit l’ebook « Maximiser la productivité avec ChatGPT ». En tant que Google Generation Scholar 2022 pour l’APAC, elle défend la diversité et l’excellence académique. Elle est également reconnue comme boursière Teradata Diversity in Tech, boursière Mitacs Globalink Research et boursière Harvard WeCode. Kanwal est un ardent défenseur du changement, ayant fondé FEMCodes pour autonomiser les femmes dans les domaines STEM.