!pip install openai
Pour tester les exemples présentés dans ce chapitre:
Note
L’utilisation de ce tutoriel est assez exigeante en termes d’infrastructure car il est nécessaire de disposer de GPU. Les GPU sont des ressources rares et assez chères, elle ne sont donc pas mises à disposition de façon aussi aisées que les CPU dans les cloud providers. Il s’agit de plus de ressources plus polluantes que les CPU.
Des GPU sont disponibles sur Google Colab
, la procédure pour les activer
est expliquée ci-dessous. Des GPU sont également disponibles sur le SSPCloud
mais sont à utiliser avec parcimonie. Elles ne sont pas mises à disposition
par défaut car il s’agit d’une ressource rare. Ce chapitre, lancé depuis le
bouton en début de chapitre, active cette option pour permettre la réplication
des exemples.
Hint
Par défaut, Colab
n’utilise pas de GPU mais de la CPU. Il est donc nécessaire
d’éditer les paramètres d’exécution du Notebook
- Dans le menu
Exécution
, cliquer surModifier le type d'exécution
; - Sélectionner
GPU
sousAccélérateur matériel
.
Contexte
La publication en avril 2022 par l’organisation Open AI de
son modèle de génération de contenu créatif Dall-E-2
(un jeu de mot mélangeant Dali et Wall-E) a créé un bruit inédit dans
le monde de la data science.
A propos de Dall-E
, le bloggeur tech Casey Newton a pu parler d’une
révolution créative dans le monde de l’IA.
The Economist a par consacré
un numéro au sujet de l’émergence de ces intelligences artificielles
créatrices de contenu.
Ce bruit sur la capacité des
intelligences artificielle à générer du contenu créatif
a d’ailleurs été amplifié plus récemment
avec la publication du chatbot chatGPT
(voir cet éditorial du Guardian).
L’inconvénient principal de Dall-E
pour générer facilement du contenu
est que le nombre de contenu pouvant être créé
avec un accès gratuit est limité (50 crédits gratuits par mois).
Depuis le 22 Août 2022, un générateur de contenu
similaire est disponible gratuitement,
avec une licence plus permissive1. Ce générateur, développé
par une équipe de chercheurs (Rombach et al. 2022),
s’appelle Stable Diffusion
(dépôt Github
pour le code source et
dépôt HuggingFace
pour le modèle mis à disposition2).
Un excellent article de blog décrit la démarche de Stable Diffusion
. La plupart des exemples originaux
dans cette partie seront basés sur Stable Diffusion
.
HuggingFace
Huggingface
est une plateforme de partage de modèles de type réseau de neurone. Les utilisateurs de réseaux de neurones peuvent
ainsi mettre à disposition le résultat de leurs travaux sous forme d’API pour faciliter la réutilisation de leurs
modèles ou réutiliser facilement des modèles, ce qui évite de les ré-entraîner (ce qui aurait un coût écologique non
négligeable comme expliqué dans le chapitre introductif).
Dall-E-2
et StableDiffusion
sont des modèles généralistes.
D’autres modèles, plus spécialisés,
existent également.
Le modèle Midjourney
(produit propriétaire de la société du même nom)
permet la production de contenu
artistique, DreamBooth (développé par Google)
est spécialisé dans la génération de contenu dans un nouveau
contexte.
Le principe de tous ces modèles est le même: un utilisateur donne une instruction (une ou plusieurs phrases) et l’intelligence artificielle l’interprète et génère une image censée être cohérente avec l’instruction.
Voici par exemple l’une des productions possibles de DALL-E-2
“A Shiba Inu dog wearing a beret and black turtleneck”
Midjourney
, spécialisé dans le contenu esthétique,
génèrera l’image suivante avec l’instruction “mechanical dove” :
StableDiffusion
, modèle généraliste comme Dall-E
,
crééra le contenu suivant avec
l’instruction “A photograph of an astronaut riding a horse” :
Enfin, DreamBooth
pourra lui introduire un chien dans une grande variété
de contextes:
Un compte Twitter (Weird AI Generations) propose de nombreuses générations de contenu drôles ou incongrues. Voici un premier exemple de production humoristique faite à partir de Mini Dall-E, la version publique:
— Weird Ai Generations (@weirddalle) August 6, 2022
Ainsi qu’un deuxième:
— Weird Ai Generations (@weirddalle) August 8, 2022
Les modèles Dall-E-2
et Stable Diffusion
s’appuient sur des réseaux de neurones à différents niveaux :
- le contenu de la phrase est analysé par un réseau de neurones similaire (mais bien sûr plus évolué) que ceux que nous avons présenté dans la partie NLP
- les éléments importants de la phrase (recontextualisés) sont ensuite transformés en image à partir de modèles entraînés à reconnaître des images
Illustration du fonctionnement de ce type de générateur d’image (ici à partir de Stable Diffusion
)
Générer du contenu avec Dall-E via l’API d’OpenAI
Les services d’OpenAI
ne sont gratuits que dans une certaine
limite. Votre clé d’API est donc assez précieuse car si elle
est usurpée, elle peut permettre à certaines personnes
d’épuiser vos crédits gratuits voire d’utiliser des crédits
payants à votre place.
Si vous êtes enregistrés récemment dans le service d’API
d’OpenAI
, vous avez accès à des crédits gratuits. Ne les
utilisez néanmoins pas avec trop de légèreté en ne contrôlant
pas les paramètres de vos appels aux API car ces crédits
sont pour l’ensemble des services d’OpenAI
(chatGPT
,
Dall-E
, DaVinci
…)
Le contenu de cette partie s’appuie sur
le tutoriel du site realpython
L’utilisation de Dall-E
sera faite via le package openai
qui donne
accès à l’API d’OpenAI.
Pour l’installer depuis la cellule d’un Notebook
:
Après avoir obtenu votre clé d’API, on va supposer que celle-ci
est stockée dans une variable key
:
= "sk-XXXXXXXXXX" #remplacer avec votre clé key
Ensuite, l’utilisation de l’API est assez directe:
= key
openai.api_key
openai.Image.create(="Teddy bears working on new AI research underwater with 1990s technology",
prompt=2,
n="1024x1024"
size )
L’output est un JSON avec les URL des images générées. Voici les deux images générées :
Pour aller plus loin, vous pouvez consulter
le tutoriel de realpython
Générer une image
On va créer l’image suivante :
“Chuck Norris fighting against Zeus on Mount Olympus in an epic Mortal Kombat scene”
Pas mal comme scénario, non ?!
Note
Pour que les résultats soient reproductibles entre différentes sessions, nous allons fixer la racine du générateur aléatoire.
import torch
= torch.Generator("cuda").manual_seed(123) generator
Si vous voulez vous amuser à explorer différents résultats
pour un même texte, vous pouvez ne pas fixer de racine aléatoire.
Dans ce cas, retirer l’argument generator
des codes présentés
ultérieurement.
Nous allons donc utiliser l’instruction suivante :
= "Chuck Norris fighting against Zeus on Mount Olympus in an epic Mortal Kombat scene" prompt
L’initialisation du modèle se fait de la manière suivante :
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline
= "CompVis/stable-diffusion-v1-4"
model_id = "cuda"
device
= torch.Generator("cuda").manual_seed(1024) generator
Enfin, pour générer l’image:
= StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=HF_TOKEN, generator=generator)
pipe = pipe.to(device)
pipe
with autocast("cuda"):
= pipe(prompt, guidance_scale=7.5, generator = generator)["images"][0]
image
"featured.png") image.save(
Qui peut être visualisé avec le code suivant, dans un notebook
:
from IPython.display import Image
= Image(filename="featured.png")
pil_img display(pil_img)
C’est une représentation assez fidèle du pitch “Chuck Norris fighting against Zeus on Mount Olympus in an epic Mortal Kombat scene” :boom:. Y a un petit côté Les Dix Commandements que j’aime bien.
En voici une autre que j’aime bien (mais malheureusement je ne peux la reproduire car je n’ai pas gardé en mémoire la racine l’ayant généré :sob:)
Il est également possible de générer plusieurs images du même texte (voir
la note de blog de l’équipe
à l’origine de Stable Diffusion
). Cependant, c’est assez exigeant en
mémoire et cela risque d’être impossible sur Colab
(y compris
en réduisant le poids des vecteurs numériques comme proposé dans le post)
Bonus
Pour le plaisir, voici PuppyMan
, le dernier né du Marvel Universe:
= "In a new Marvel film we discover puppyman a new super hero that is half man half bulldog" prompt
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline
= "CompVis/stable-diffusion-v1-4"
model_id = "cuda"
device
= torch.Generator("cuda").manual_seed(1024)
generator
= StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=HF_TOKEN, generator=generator)
pipe = pipe.to(device)
pipe
with autocast("cuda"):
= pipe(prompt, guidance_scale=7.5, generator = generator)["images"][0]
image
"puppyman.png") image.save(
La moitié humain semble être son costume de super-héros, pas la bipédie. Mais le rendu est quand même épatant !
A vous de jouer :hugging_face:
Références
Footnotes
Il est notamment possible de réutiliser l’image générée à des fins commerciales. En revanche, il est interdit de chercher à nuire à une personne. Pour cette raison, il est fréquent que les visages de personnes célèbres soient floutés pour éviter la création de contenu nuisant à leur réputation.↩︎
Comme les autres plateformes du monde de la data science,
HuggingFace
a adopté l’utilisation standardisée des jetons (token) comme méthode d’authentification. Le jeton est comme un mot de passe sauf qu’il n’est pas inventé par l’utilisateur (ce qui permet qu’il ne soit pas partagé avec d’autres sites web potentiellement moins sécurisés), est révocable (date d’expiration ou choix de l’utilisateur) et dispose de droits moins importants qu’un mot de passe qui vous permet, potentiellement, de changer tous les paramètres de votre compte. Je recommande vivement l’utilisation d’un gestionnaire de mot de passe pour stocker vos token (si vous utilisezGit
,Docker
, etc. vous en avez potentiellement beaucoup) plutôt que stocker ces jetons dans des fichiers non sécurisés.↩︎Comme les autres plateformes du monde de la data science,
HuggingFace
a adopté l’utilisation standardisée des jetons (token) comme méthode d’authentification. Le jeton est comme un mot de passe sauf qu’il n’est pas inventé par l’utilisateur (ce qui permet qu’il ne soit pas partagé avec d’autres sites web potentiellement moins sécurisés), est révocable (date d’expiration ou choix de l’utilisateur) et dispose de droits moins importants qu’un mot de passe qui vous permet, potentiellement, de changer tous les paramètres de votre compte. Je recommande vivement l’utilisation d’un gestionnaire de mot de passe pour stocker vos token (si vous utilisezGit
,Docker
, etc. vous en avez potentiellement beaucoup) plutôt que stocker ces jetons dans des fichiers non sécurisés.↩︎
Citation
@book{galiana2023,
author = {Galiana, Lino},
title = {Python Pour La Data Science},
date = {2023},
url = {https://pythonds.linogaliana.fr/},
doi = {10.5281/zenodo.8229676},
langid = {en}
}
Comment utiliser
Stable Diffusion
?Stable Diffusion
est une intelligence artificielle créatrice de contenu qui permet de générer du contenu à partir d’une phrase - ce pour quoi nous allons l’utiliser - mais aussi modifier des images à partir d’instructions.Stable Diffusion
est un modèle plus pratique à utiliser depuisPython
queDall-E
. Celui-ci est open-source et peut être téléchargé et réutilisé directement depuisPython
. La méthode la plus pratique est d’utiliser le modèle mis à disposition surHuggingFace
. Le modèle est implémenté à travers le frameworkPyTorch
.PyTorch
, librairie développée parMeta
, n’est pas implementé directement enPython
pour des raisons de performance mais enC++
-Python
étant un langage lent, le revers de la médaille de sa facilité d’usage. A traversPython
, on va utiliser une API haut niveau qui va contrôler la structure des réseaux de neurones ou créer une interface entre des données (sous forme d’arrayNumpy
) et le modèle. Pour ce type de packages qui utilisent un langage compilé, l’installation viaPandas
Configuration spécifique à
Colab
👇Sur
Colab
,conda
n’est pas disponible par défaut. Pour pouvoir installer un package en utilisantconda
surColab
, on utilise donc l’astuce suivante :Installation de
PyTorch
Pour installer
PyTorch
, la librairie de Deep Learning développée parMeta
, il suffit de suivre les recommandations sur le site web officiel. Dans unNotebook
, cela prendra la forme suivante :Note
Je propose ici d’utiliser
mamba
pour accélérer l’installation. Des éléments surmamba
sont disponibles dans l’introduction de ce cours.Accès à
HuggingFace
La question - non négligeable - de l’accès à de la GPU mise à part, la réutilisation des modèles de
Stable Diffusion
est très facile car la documentation mise à disposition surHuggingFace
est très bien faite.La première étape est de se créer un compte sur
HuggingFace
et se créer un token3. Ce token sera donné à l’API deHuggingFace
pour s’authentifier.L’API d’
HuggingFace
nécessite l’installation du packagediffusers
. Dans unNotebook
, le code suivant permet d’installer la librairie requise:Note
On va supposer que le token est stocké dans une variable d’environnement
HF_PAT
. Cela évite d’écrire le token dans un Notebook qu’on va potentiellement partager, alors que le token est un élément à garder secret. Pour l’importer dans la sessionPython
:Si vous n’avez pas la possibilité de rentrer le token dans les variables d’environnement, créez une cellule qui crée la variable
HF_TOKEN
et supprimez là de suite pour ne pas l’oublier avant de partager votre token.