Sprint ControlNet en JAX/Diffusers
Bienvenue au sprint communautaire en JAX/Diffusers ! Lâobjectif de ce sprint est de travailler sur des modĂšles de diffusion amusants et crĂ©atifs en utilisant JAX et Diffusers.
Lors de cet événement, nous créerons diverses applications avec des modÚles de diffusion en JAX/Flax et Diffusers en utilisant des heures TPU gratuites généreusement fournies par Google Cloud.
Ce document présente toutes les informations importantes pour faire une soumission au sprint.
Organisation
Les participants peuvent proposer des idées pour un projet intéressant impliquant des modÚles de diffusion. Des équipes de 3 à 5 personnes seront ensuite formées autour des projets les plus prometteurs et les plus intéressants. Assurez-vous de lire la section Communication pour savoir comment proposer des projets, commenter les idées de projet des autres participants et créer une équipe.
Pour aider chaque Ă©quipe Ă mener Ă bien son projet, nous organiserons des confĂ©rences donnĂ©es par des scientifiques et des ingĂ©nieurs de Google, de Hugging Face et de la communautĂ© open source. Les confĂ©rences auront lieu le 17 avril. Assurez-vous dâassister aux confĂ©rences pour tirer le meilleur parti de votre participation ! Consultez la section ConfĂ©rences pour avoir une vue dâensemble des confĂ©rences, y compris lâorateur et lâheure de la confĂ©rence.
Chaque Ă©quipe bĂ©nĂ©ficiera ensuite dâun accĂšs gratuit Ă une VM TPU v4-8 du 14 avril au 1er mai. De plus, nous fournirons un exemple dâentraĂźnement en JAX/Flax et Diffusers pour entraĂźner un ControlNet afin de lancer votre projet. Nous fournirons Ă©galement des exemples sur la façon de prĂ©parer les jeux de donnĂ©es. Pendant le sprint, nous nous assurerons de rĂ©pondre Ă toutes les questions que vous pourriez avoir sur JAX/Flax et Diffusers et nous aiderons chaque Ă©quipe autant que possible !
Nous ne distribuerons pas de TPU pour les Ă©quipes composĂ©es dâun seul membre. Nous vous encourageons donc Ă rejoindre une Ă©quipe ou Ă trouver des coĂ©quipiers pour votre idĂ©e.
Ă la fin du sprint, chaque soumission sera Ă©valuĂ©e par un jury et les trois meilleures dĂ©monstrations recevront un prix. Consultez la section Comment soumettre une dĂ©mo pour plus dâinformations et de suggestions sur la maniĂšre de soumettre votre projet.
Note : MĂȘme si nous fournissons un exemple pour entraĂźner ControlNet, les participants peuvent proposer des idĂ©es qui nâimpliquent pas du tout un ControlNet du moment quâelles sont centrĂ©es sur les modĂšles de diffusion.
Dates importantes
- 29/03 : Annonce officielle de la semaine de la communauté.
- 31/03 : Commencez Ă former des groupes dans le canal #jax-diffusers-ideas sur Discord.
- 10/04 : Collecte des données.
- 13/04 & 14/04 & 17/04 : Conférences de lancement sur YouTube.
- 14/04 Ă 17/04 : DĂ©but de lâaccĂšs aux TPU.
- 01/05 : Fermeture de lâaccĂšs aux TPU.
- 08/05 : Annonce des 10 meilleurs projets et des prix.
Note : Nous accepterons les candidatures tout au long du sprint.
Communication
Toutes les communications importantes auront lieu sur notre serveur Discord. Rejoignez le serveur en utilisant ce lien. AprĂšs avoir rejoint le serveur, prenez le rĂŽle Diffusers dans le canal #role-assignment et dirigez-vous vers le canal #jax-diffusers-ideas pour partager votre idĂ©e sous la forme dâun message de forum. Pour vous inscrire, remplissez le formulaire dâinscription et nous vous donnerons accĂšs Ă deux canaux Discord supplĂ©mentaires pour les discussions et le support technique, ainsi quâun accĂšs aux TPU.
Les annonces importantes de lâĂ©quipe Hugging Face, Flax/JAX et Google Cloud seront publiĂ©es sur le serveur.
Le serveur Discord sera le lieu central oĂč les participants pourront publier leurs rĂ©sultats, partager leurs expĂ©riences dâapprentissage, poser des questions et obtenir une assistance technique pour les divers obstacles quâils rencontrent.
Pour les problÚmes liés à Flax/JAX, Diffusers, Datasets ou pour des questions spécifiques à votre projet, nous interagirons à travers les dépÎts publics et les forums :
- Flax : Issues, Questions
- JAX : Issues, Questions
- đ€ Diffusers : Issues, Questions
- đ€ Dataset s: Issues, Questions
- Questions spĂ©cifiques aux projets : Elles peuvent ĂȘtre posĂ©es sur le canal #jax-diffusers-ideas sur Discord.
- Questions relatives au TPU : Canal
#jax-diffusers-tpu-supportsur Discord. - Discussion générale :
#jax-diffusers-sprint channelsur Discord. Vous aurez accÚs aux canaux#jax-diffusers-tpu-supportet#jax-diffusers-sprintune fois que vous aurez été accepté pour participer au sprint.
Lorsque vous demandez de lâaide, nous vous encourageons Ă poster le lien vers le forum sur le serveur Discord, plutĂŽt que de poster directement des issues ou des questions. De cette façon, nous nous assurons que tout le monde peut bĂ©nĂ©ficier de vos questions, mĂȘme aprĂšs la fin du sprint.
Note : AprĂšs le 10 avril, si vous vous ĂȘtes inscrit sur le formulaire Google, mais que vous nâĂȘtes pas dans le canal Discord, veuillez laisser un message sur lâannonce officielle du forum et envoyer un ping Ă
@mervenoyan,@sayakpaul, et@patrickvonplaten. Il se peut que nous prenions un jour pour traiter ces demandes.
Conférences
Nous avons invitĂ© dâĂ©minents chercheurs et ingĂ©nieurs de Google, Hugging Face, et de la communautĂ© open-source qui travaillent dans le domaine de lâIA gĂ©nĂ©rative. Nous mettrons Ă jour cette section avec des liens vers les confĂ©rences, alors gardez un Ćil ici ou sur Discord dans le canal diffusion models core-announcements et programmez vos rappels !
13 avril 2023
| Intervenant | Sujet | Horaire | Video |
|---|---|---|---|
| Emiel Hoogeboom, Google Brain | Pixel-Space Diffusion models for High Resolution Images | 4.00pm-4.40pm CEST / 7.00am-7.40am PST | |
| ApolinĂĄrio Passos, Hugging Face | Introduction to Diffusers library | 4.40pm-5.20pm CEST / 7.40am-08.20am PST | |
| Ting Chen, Google Brain | Diffusion++: discrete data and high-dimensional generation | 5.45pm-6.25pm CEST / 08.45am-09.25am PST |
14 avril 2023
| Intervenant | Sujet | Horaire | Video |
|---|---|---|---|
| Tim Salimans, Google Brain | Efficient image and video generation with distilled diffusion models | 4.00pm-4.40pm CEST / 7.00am-7.40am PST | |
| Suraj Patil, Hugging Face | Masked Generative Models: MaskGIT/Muse | 4.40pm-5.20pm CEST / 7.40am-08.20am PST | |
| Sabrina Mielke, John Hopkins University | From stateful code to purified JAX: how to build your neural net framework | 5.20pm-6.00pm CEST / 08.20am-09.00am PST |
17 avril 2023
| Intervenant | Sujet | Horaire | Video |
|---|---|---|---|
| Andreas Steiner, Google Brain | JAX & ControlNet | 4.00pm-4.40pm CEST / 7.00am-7.40am PST | |
| Boris Dayma, craiyon | DALL-E Mini | 4.40pm-5.20pm CEST / 7.40am-08.20am PST | |
| Margaret Mitchell, Hugging Face | Ethics of Text-to-Image | 5.20pm-6.00pm CEST / 08.20am-09.00am PST |
Données et prétraitement
Dans cette section, nous verrons comment construire votre propre jeu de données pour entraßner ControlNet.
Préparer un grand jeu de données local
Monter un disque
Si vous avez besoin dâespace supplĂ©mentaire, vous pouvez suivre ce guide pour crĂ©er un disque persistant, lâattacher Ă votre VM TPU et crĂ©er un rĂ©pertoire pour monter le disque. Vous pouvez ensuite utiliser ce rĂ©pertoire pour stocker votre jeu de donnĂ©es.
Par ailleurs, la VM TPU attribuĂ©e Ă votre Ă©quipe dispose dâun disque de stockage persistant de 3 To. Pour apprendre Ă lâutiliser, consultez ce guide.
Prétraitement des données
Nous montrons ici comment préparer un grand jeu de données pour entraßner un modÚle ControlNet avec filtre de Canny. Plus précisément, nous fournissons un exemple de script qui :
- SĂ©lectionne 1 million de paires image-texte Ă partir dâun jeu de donnĂ©es existant COYO-700M.
- TĂ©lĂ©charge chaque image et utilise le filtre de Canny pour gĂ©nĂ©rer lâimage de conditionnement.
- Crée un métafichier qui relie toutes les images et les images traitées à leurs légendes.
Utilisez la commande suivante pour exĂ©cuter le script de prĂ©traitement des donnĂ©es de lâexemple. Si vous avez montĂ© un disque sur votre TPU, vous devez placer vos fichiers train_data_dir et cache_dir sur le disque montĂ©.
python3 coyo_1m_dataset_preprocess.py \
--train_data_dir="/mnt/disks/persist/data" \
--cache_dir="/mnt/disks/persist" \
--max_train_samples=1000000 \
--num_proc=16
Une fois le script exécuté, vous trouverez un dossier de données dans le répertoire train_data_dir spécifié avec la structure de dossier ci-dessous :
data
âââ images
â âââ image_1.png
â âââ .......
â âââ image_1000000.jpeg
âââ processed_images
â âââ image_1.png
â âââ .......
â âââ image_1000000.jpeg
âââ meta.jsonl
Charger un jeu de données
Pour charger un jeu de donnĂ©es Ă partir du dossier de donnĂ©es que vous venez de crĂ©er, vous devez ajouter un script de chargement de jeu de donnĂ©es Ă votre dossier de donnĂ©es. Le script de chargement de donnĂ©es doit porter le mĂȘme nom que le dossier. Par exemple, si votre dossier de donnĂ©es est data, vous devez ajouter un script de chargement de donnĂ©es nommĂ© data.py. Nous fournissons un exemple de script de chargement de donnĂ©es que vous pouvez utiliser. Tout ce que vous avez Ă faire est de mettre Ă jour le DATA_DIR avec le chemin correct de votre dossier de donnĂ©es. Pour plus de dĂ©tails sur lâĂ©criture dâun script de chargement de donnĂ©es, reportez-vous Ă la documentation.
Une fois que le script de chargement de données est ajouté à votre dossier de données, vous pouvez le charger avec :
dataset = load_dataset("/mnt/disks/persist/data", cache_dir="/mnt/disks/persist" )
Notez que vous pouvez utiliser --train_data_dir pour passer le rĂ©pertoire de votre dossier de donnĂ©es au script dâentraĂźnement et gĂ©nĂ©rer votre jeu de donnĂ©es automatiquement pendant lâentraĂźnement.
Pour les grands jeux de donnĂ©es, nous recommandons de gĂ©nĂ©rer le jeu de donnĂ©es une seule fois et de le sauvegarder sur le disque Ă lâaide de la commande
dataset.save_to_disk("/mnt/disks/persist/dataset")
Vous pouvez ensuite réutiliser le jeu de données sauvegardé pour votre entraßnement en passant --load_from_disk.
Voici un exemple dâexĂ©cution dâun script dâentraĂźnement qui chargera le jeu de donnĂ©es depuis le disque.
export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="/mnt/disks/persist/canny_model"
export DATASET_DIR="/mnt/disks/persist/dataset"
export DISK_DIR="/mnt/disks/persist"
python3 train_controlnet_flax.py \
--pretrained_model_name_or_path=$MODEL_DIR \
--output_dir=$OUTPUT_DIR \
--train_data_dir=$DATASET_DIR \
--load_from_disk \
--cache_dir=$DISK_DIR \
--resolution=512 \
--learning_rate=1e-5 \
--train_batch_size=2 \
--revision="non-ema" \
--from_pt \
--max_train_steps=500000 \
--checkpointing_steps=10000 \
--dataloader_num_workers=16
Préparer un jeu de données avec MediaPipe et Hugging Face
Nous fournissons un notebook ( ) qui vous montre comment préparer un jeu de données pour entraßner ControlNet en utilisant MediaPipe et Hugging Face. Plus précisément, dans le notebook, nous montrons :
- Comment tirer parti des solutions MediaPipe pour extraire les articulations du corps de la pose Ă partir des images dâentrĂ©e.
- PrĂ©dire les lĂ©gendes en utilisant BLIP-2 Ă partir des images dâentrĂ©e en utilisant đ€ Transformers.
- Construire et pousser le jeu de donnĂ©es final vers le Hugging Face Hub en utilisant đ€ Datasets.
Vous pouvez vous rĂ©fĂ©rer au notebook pour crĂ©er vos propres jeux de donnĂ©es en utilisant dâautres solutions MediaPipe. Ci-dessous, nous listons toutes les solutions pertinentes :
EntraĂźner ControlNet
Câest peut-ĂȘtre la partie la plus amusante et la plus intĂ©ressante de ce document, car nous vous montrons ici comment entraĂźner un modĂšle ControlNet personnalisĂ©.
Note : Pour ce sprint, vous nâĂȘtes PAS limitĂ© Ă entraĂźner des ControlNets. Nous fournissons ce script dâentraĂźnement comme rĂ©fĂ©rence pour vous permettre de dĂ©marrer.
Pour un entraĂźnement plus rapide sur les TPU et les GPU, vous pouvez tirer parti de lâexemple dâentraĂźnement Flax. Suivez les instructions ci-dessus pour obtenir le modĂšle et le jeu de donnĂ©es avant dâexĂ©cuter le script.
Mise en place de la VM TPU
Avant de continuer avec le reste de cette section, vous devez vous assurer que lâadresse email que vous utilisez a Ă©tĂ© ajoutĂ©e au projet hf-flax sur Google Cloud Platform. Si ce nâest pas le cas, merci de nous le faire savoir sur le serveur Discord (vous pouvez taguer @sayakpaul, @merve, et @patrickvonplaten).
Dans ce qui suit, nous allons dĂ©crire comment le faire en utilisant une console standard, mais vous devriez Ă©galement ĂȘtre en mesure de vous connecter Ă la VM TPU via des IDE, comme Visual Studio Code, etc.
-
Vous devez installer le Google Cloud SDK. Veuillez suivre les instructions sur https://cloud.google.com/sdk.
-
Une fois le Google Cloud SDK installé, vous devez configurer votre compte en exécutant la commande suivante. Assurez-vous que
correspond à l'adresse gmail que vous avez utilisée pour vous inscrire à cet événement. gcloud config set account <your-email-adress> -
Assurons-nous Ă©galement que le bon projet est dĂ©fini au cas oĂč votre email serait utilisĂ© pour plusieurs projets gcloud :
gcloud config set project hf-flax -
Ensuite, vous devez vous authentifier. Vous pouvez le faire en exécutant la commande
gcloud auth loginVous devriez obtenir un lien vers un site web oĂč vous pouvez authentifier votre compte gmail.
-
Enfin, vous pouvez Ă©tablir un tunnel SSH dans la VM TPU ! Veuillez exĂ©cuter la commande suivante en rĂ©glant la ââzoneâ sur
us-central2-bet sur le nom de la TPU qui vous a Ă©tĂ© envoyĂ© par email par lâĂ©quipe de Hugging Face.gcloud alpha compute tpus tpu-vm ssh <tpu-name> --zone <zone> --project hf-flax
Cela devrait établir un tunnel SSH dans la VM TPU !
Note : Vous nâĂȘtes PAS supposĂ© avoir accĂšs Ă la console Google Cloud. Aussi, il se peut que vous ne receviez pas de lien dâinvitation pour rejoindre le projet
hf-flax. Mais vous devriez tout de mĂȘme pouvoir accĂ©der Ă la VM TPU en suivant les Ă©tapes ci-dessus .
Note : Les VM TPU sont dĂ©jĂ attachĂ©es Ă des disques de stockage persistants (de 3 TB). Cela sera utile au cas oĂč votre Ă©quipe souhaiterait entraĂźner localement un jeu de donnĂ©es volumineux. Le nom du disque de stockage devrait Ă©galement figurer dans lâe-mail que vous avez reçu. Suivez cette section pour plus de dĂ©tails.
Installation de JAX
Commençons par créer un environnement virtuel Python :
python3 -m venv <your-venv-name>
Nous pouvons activer lâenvironnement en lançant :
source ~/<your-venv-name>/bin/activate
Installez ensuite Diffusers et les dĂ©pendances dâentraĂźnement de la bibliothĂšque :
pip install git+https://github.com/huggingface/diffusers.git
Ensuite, clonez ce dépÎt et installez JAX, Flax et les autres dépendances :
git clone https://github.com/huggingface/community-events
cd community-events/jax-controlnet-sprint/training_scripts
pip install -U -r requirements_flax.txt
Pour vérifier que JAX a été correctement installé, vous pouvez exécuter la commande suivante :
import jax
jax.device_count()
Cela devrait afficher le nombre de cĆurs de la TPU, qui devrait ĂȘtre de 4 sur une VM TPUv4-8. Si Python nâest pas capable de dĂ©tecter le pĂ©riphĂ©rique TPU, veuillez consulter la section des erreurs possibles plus bas pour des solutions.
Si vous souhaitez utiliser le logging Weights and Biases, vous devez également installer wandb maintenant :
pip install wandb
Note : Weights & Biases est gratuit pour les Ă©tudiants, les Ă©ducateurs et les chercheurs universitaires. Tous les participants Ă notre Ă©vĂ©nement sont qualifiĂ©s pour obtenir un compte dâĂ©quipe acadĂ©mique Weights & Biases. Pour crĂ©er votre Ă©quipe, vous pouvez visiter le site https://wandb.ai/create-team et choisir le type dâĂ©quipe âAcademicâ. Pour plus dâinformations sur la crĂ©ation et la gestion dâune Ă©quipe Weights & Biases, vous pouvez consulter le site https://docs.wandb.ai/guides/app/features/teams.
ExĂ©cution du script dâentraĂźnement
Maintenant, tĂ©lĂ©chargeons deux images de conditionnement que nous utiliserons pour lancer la validation pendant lâentraĂźnement afin de suivre nos progrĂšs
wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_1.png
wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_2.png
Nous vous encourageons Ă stocker ou Ă partager votre modĂšle avec la communautĂ©. Pour utiliser le Hub, veuillez vous connecter Ă votre compte Hugging Face, ou (en crĂ©er un si vous nâen avez pas dĂ©jĂ un) :
huggingface-cli login
Assurez-vous que les variables dâenvironnement MODEL_DIR, OUTPUT_DIR et HUB_MODEL_ID sont dĂ©finies. Les variables OUTPUT_DIR et HUB_MODEL_ID spĂ©cifient oĂč sauvegarder le modĂšle sur le Hub :
export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="runs/fill-circle-{timestamp}"
export HUB_MODEL_ID="controlnet-fill-circle"
Et enfin, dĂ©marrez lâentraĂźnement (assurez-vous dâĂȘtre dans le rĂ©pertoire jax-controlnet-sprint/training_scripts) !
python3 train_controlnet_flax.py \
--pretrained_model_name_or_path=$MODEL_DIR \
--output_dir=$OUTPUT_DIR \
--dataset_name=fusing/fill50k \
--resolution=512 \
--learning_rate=1e-5 \
--validation_image "./conditioning_image_1.png" "./conditioning_image_2.png" \
--validation_prompt "red circle with blue background" "cyan circle with brown floral background" \
--validation_steps=1000 \
--train_batch_size=2 \
--revision="non-ema" \
--from_pt \
--report_to="wandb" \
--tracker_project_name=$HUB_MODEL_ID \
--num_train_epochs=11 \
--push_to_hub \
--hub_model_id=$HUB_MODEL_ID
Notez que lâargument --from_pt convertira votre point de contrĂŽle pytorch en flax. Cependant, il ne fonctionnera quâavec les points de contrĂŽle au format diffusers. Si votre MODEL_DIR ne contient pas de points de contrĂŽle au format diffusers, vous ne pouvez pas utiliser lâargument --from_pt. Vous pouvez convertir vos points de contrĂŽle ckpt ou safetensors au format diffusers en utilisant ce script.
Puisque nous avons passĂ© lâargument --push_to_hub, il va automatiquement crĂ©er un repo de modĂšle sous votre compte Hugging Face basĂ© sur $HUB_MODEL_ID. Ă la fin de lâentraĂźnement, le point de contrĂŽle final sera automatiquement stockĂ© sur le Hub. Vous pouvez trouver un exemple de modĂšle ici.
Notre script dâentraĂźnement fournit Ă©galement un support limitĂ© pour le streaming de grands jeux de donnĂ©es Ă partir du Hub. Afin dâactiver le streaming, il faut Ă©galement dĂ©finir --max_train_samples. Voici un exemple de commande (tirĂ© de cet article de blog) :
export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="runs/uncanny-faces-{timestamp}"
export HUB_MODEL_ID="controlnet-uncanny-faces"
python3 train_controlnet_flax.py \
--pretrained_model_name_or_path=$MODEL_DIR \
--output_dir=$OUTPUT_DIR \
--dataset_name=multimodalart/facesyntheticsspigacaptioned \
--streaming \
--conditioning_image_column=spiga_seg \
--image_column=image \
--caption_column=image_caption \
--resolution=512 \
--max_train_samples 100000 \
--learning_rate=1e-5 \
--train_batch_size=1 \
--revision="flax" \
--report_to="wandb" \
--tracker_project_name=$HUB_MODEL_ID
Notez cependant que les performances des TPUs peuvent ĂȘtre limitĂ©es car le streaming avec datasets nâest pas optimisĂ© pour les images. Pour assurer un dĂ©bit maximal, nous vous encourageons Ă explorer les options suivantes :
Lorsque vous travaillez avec un jeu de donnĂ©es plus important, vous pouvez avoir besoin dâexĂ©cuter le processus dâentraĂźnement pendant une longue pĂ©riode et il est utile dâenregistrer des points de contrĂŽle rĂ©guliers au cours du processus. Vous pouvez utiliser lâargument suivant pour activer les points de contrĂŽle intermĂ©diaires :
--checkpointing_steps=500
Cela permet dâenregistrer le modĂšle entraĂźnĂ© dans des sous-dossiers du dossier output_dir. Le nom des sous-dossiers correspond au nombre dâĂ©tapes effectuĂ©es jusquâĂ prĂ©sent ; par exemple : un point de contrĂŽle sauvegardĂ© aprĂšs 500 Ă©tapes dâentraĂźnement serait sauvegardĂ© dans un sous-dossier nommĂ© 500
Vous pouvez alors commencer votre entraßnement à partir de ce point de contrÎle sauvegardé avec
--controlnet_model_name_or_path="./control_out/500"
Nous soutenons lâentraĂźnement avec la stratĂ©gie de pondĂ©ration Min-SNR proposĂ©e dans Efficient Diffusion Training via Min-SNR Weighting Strategy qui permet dâobtenir une convergence plus rapide en rééquilibrant la perte. Pour lâutiliser, il faut dĂ©finir lâargument --snr_gamma. La valeur recommandĂ©e est 5.0.
Nous supportons Ă©galement lâaccumulation de gradient, technique qui vous permet dâutiliser une taille de batch plus grande que celle que votre machine serait normalement capable de mettre en mĂ©moire. Vous pouvez utiliser lâargument gradient_accumulation_steps pour dĂ©finir les Ă©tapes dâaccumulation du gradient. Lâauteur de ControlNet recommande dâutiliser lâaccumulation de gradient pour obtenir une meilleure convergence. Pour en savoir plus voir ici.
Vous pouvez profiler votre code avec :
--profile_steps==5
Reportez-vous à la documentation JAX sur le profilage. Pour inspecter la trace de profil, vous devez installer et démarrer Tensorboard avec le plugin de profil :
pip install tensorflow tensorboard-plugin-profile
tensorboard --logdir runs/fill-circle-100steps-20230411_165612/
Le profil peut alors ĂȘtre inspectĂ© Ă lâadresse http://localhost:6006/#profile.
Parfois vous obtiendrez des conflits de version (messages dâerreur comme Duplicate plugins for name projector), ce qui signifie que vous devez dĂ©sinstaller et rĂ©installer toutes les versions de Tensorflow/Tensorboard (par exemple avec pip uninstall tensorflow tf-nightly tensorboard tb-nightly tensorboard-plugin-profile && pip install tf-nightly tbp-nightly tensorboard-plugin-profile).
Notez que la fonctionnalitĂ© de dĂ©bogage du plugin Tensorboard profile est toujours en cours de dĂ©veloppement. Toutes les vues ne sont pas entiĂšrement fonctionnelles, et par exemple le trace_viewer coupe les Ă©vĂ©nements aprĂšs 1M (ce qui peut rĂ©sulter en la perte de toutes vos traces de pĂ©riphĂ©riques si par exemple vous profilez lâĂ©tape de compilation par accident).
Dépannage de votre VM TPU
TRES IMPORTANT : Un seul processus peut accĂ©der aux cĆurs de la TPU Ă la fois. Cela signifie que si plusieurs membres de lâĂ©quipe essaient de se connecter aux cĆurs de la TPU, vous obtiendrez des erreurs telles que :
libtpu.so already in used by another process. Not attempting to load libtpu.so in this process.
Nous recommandons Ă chaque membre de lâĂ©quipe de crĂ©er son propre environnement virtuel, mais une seule personne devrait exĂ©cuter les processus dâentraĂźnement lourds. De plus, veuillez vous relayer lors de lâinstallation de la TPUv4-8 afin que tout le monde puisse vĂ©rifier que JAX est correctement installĂ©.
Si les membres de votre Ă©quipe nâutilisent pas actuellement la TPU mais que vous obtenez toujours ce message dâerreur. Vous devez tuer le processus qui utilise la TPU avec :
kill -9 PID
vous devrez remplacer le terme « PID » par le PID du processus qui utilise TPU. Dans la plupart des cas, cette information est incluse dans le message dâerreur. Par exemple, si vous obtenez
The TPU is already in use by a process with pid 1378725. Not attempting to load libtpu.so in this process.
vous pouvez faire
kill -9 1378725
Vous pouvez Ă©galement utiliser la commande suivante pour trouver les processus utilisant chacune des puces TPU (par exemple, /dev/accel0 est lâune des puces TPU)
sudo lsof -w /dev/accel0
Pour tuer tous les processus Ă lâaide de /dev/accel0, il faut
sudo lsof -t /dev/accel0 | xargs kill -9
Si Python nâest pas capable de dĂ©tecter votre pĂ©riphĂ©rique TPU (i.e. quand vous faites jax.device_count() et quâil sort 0), cela peut ĂȘtre dĂ» au fait que vous nâavez pas les droits dâaccĂšs aux logs tpu, ou que vous avez un fichier tpu lock qui traĂźne. ExĂ©cutez les commandes suivantes pour rĂ©soudre le problĂšme
sudo rm -f /tmp/libtpu_lockfile
sudo chmod o+w /tmp/tpu_logs/
Comment faire une soumission
Pour faire une soumission complĂšte, vous devez avoir les Ă©lĂ©ments suivants sur le Hub dâHugging Face :
- Un dépÎt de modÚle avec les poids du modÚle et la carte du modÚle,
- (Facultatif) Un dépÎt de jeu de données avec une carte de jeu de données,
- Un Space qui permet aux autres dâinteragir avec votre modĂšle.
Pousser les poids du modĂšle et la carte du modĂšle vers le Hub
Si vous utilisez le script dâentraĂźnement (train_controlnet_flax.py) fourni dans ce rĂ©pertoire
Lâactivation de lâargument push_to_hub dans les arguments dâentraĂźnement va :
- Créer un dépÎt de modÚles localement et à distance sur le Hub,
- CrĂ©er une carte de modĂšle et lâĂ©crire dans le dĂ©pĂŽt de modĂšles local,
- Sauvegarder votre modÚle dans le référentiel de modÚles local,
- Pousser le dépÎt local vers le Hub.
Votre carte de modÚle générée automatiquement ressemblera à ceci :
.
Vous pouvez modifier la carte de modĂšle pour quâelle soit plus informative. Les cartes de modĂšle qui sont plus informatives que les autres auront plus de poids lors de lâĂ©valuation.
Si vous avez entraĂźnĂ© un modĂšle personnalisĂ© et que vous nâavez pas utilisĂ© le script
Vous devez vous authentifier avec huggingface-cli login comme indiqué ci-dessus. Si vous utilisez une des classes de modÚles disponibles dans diffusers, sauvegardez votre modÚle avec la méthode save_pretrained de votre modÚle.
model.save_pretrained("path_to_your_model_repository")
AprÚs avoir sauvegardé votre modÚle dans un dossier, vous pouvez simplement utiliser le script ci-dessous pour pousser votre modÚle vers le Hub :
from huggingface_hub import create_repo, upload_folder
create_repo("username/my-awesome-model")
upload_folder(
folder_path="path_to_your_model_repository",
repo_id="username/my-awesome-model"
)
Ceci poussera votre modĂšle vers Hub. AprĂšs avoir poussĂ© cela, vous devez crĂ©er la carte de modĂšle vous-mĂȘme.
Vous pouvez utiliser lâinterface graphique pour lâĂ©diter.

Chaque carte de modĂšle se compose de deux sections, les mĂ©tadonnĂ©es et le texte libre. Vous pouvez Ă©diter les mĂ©tadonnĂ©es Ă partir des sections dans lâinterface graphique. Si vous avez sauvegardĂ© votre modĂšle en utilisant save_pretrained, vous nâavez pas besoin de fournir pipeline_tag et library_name. Sinon, fournissez pipeline_tag, library_name et le jeu de donnĂ©es sâil existe sur Hugging Face Hub. En plus de cela, vous devez ajouter jax-diffusers-event Ă la section tags.
---
license: apache-2.0
library_name: diffusers
tags:
- jax-diffusers-event
datasets:
- red_caps
pipeline_tag: text-to-image
---

Créer notre Space
Rédiger notre application
Nous utiliserons Gradio pour crĂ©er nos applications. Gradio possĂšde deux API principales : Interface et Blocks. Interface est une API de haut niveau qui vous permet de crĂ©er une interface avec quelques lignes de code, et Blocks est une API de plus bas niveau qui vous donne plus de flexibilitĂ© sur les interfaces que vous pouvez construire. Le code doit ĂȘtre inclus dans un fichier appelĂ© app.py.
Essayons de crĂ©er une application ControlNet comme exemple. LâAPI Interface fonctionne simplement comme suit :
import gradio as gr
# La fonction d'inférence prend en compte le prompt, le prompt négatif et l'image
def infer(prompt, negative_prompt, image):
# implémentez votre fonction d'inférence ici
return output_image
# vous devez passer les entrées et les sorties en fonction de la fonction d'inférence
gr.Interface(fn = infer, inputs = ["text", "text", "image"], outputs = "image").launch()
Vous pouvez personnaliser votre interface en passant title, description et examples Ă la fonction Interface.
title = "ControlNet on Canny Filter"
description = "This is a demo on ControlNet based on canny filter."
# vous devez passer vos exemples en fonction de vos entrées
# chaque liste intérieure est un exemple, chaque élément de la liste correspondant à un composant des `inputs`.
examples = [["a cat with cake texture", "low quality", "cat_image.png"]]
gr.Interface(fn = infer, inputs = ["text", "text", "image"], outputs = "image",
title = title, description = description, examples = examples, theme='gradio/soft').launch()
Votre interface ressemblera Ă ceci :

Avec les blocs, vous pouvez ajouter des marques, des onglets, des composants sous les colonnes et les lignes, etc. Supposons que nous ayons deux ControlNets et que nous voulions les inclure dans un Space. Nous les placerons sous différents onglets dans une démo comme ci-dessous :
import gradio as gr
def infer_segmentation(prompt, negative_prompt, image):
# votre fonction d'inférence pour le contrÎle de la segmentation
return im
def infer_canny(prompt, negative_prompt, image):
# votre fonction d'inférence pour un contrÎle efficace
return im
with gr.Blocks(theme='gradio/soft') as demo:
gr.Markdown("## Stable Diffusion with Different Controls")
gr.Markdown("In this app, you can find different ControlNets with different filters. ")
with gr.Tab("ControlNet on Canny Filter "):
prompt_input_canny = gr.Textbox(label="Prompt")
negative_prompt_canny = gr.Textbox(label="Negative Prompt")
canny_input = gr.Image(label="Input Image")
canny_output = gr.Image(label="Output Image")
submit_btn = gr.Button(value = "Submit")
canny_inputs = [prompt_input_canny, negative_prompt_canny, canny_input]
submit_btn.click(fn=infer_canny, inputs=canny_inputs, outputs=[canny_output])
with gr.Tab("ControlNet with Semantic Segmentation"):
prompt_input_seg = gr.Textbox(label="Prompt")
negative_prompt_seg = gr.Textbox(label="Negative Prompt")
seg_input = gr.Image(label="Image")
seg_output = gr.Image(label="Output Image")
submit_btn = gr.Button(value = "Submit")
seg_inputs = [prompt_input_seg, negative_prompt_seg, seg_input]
submit_btn.click(fn=infer_segmentation, inputs=seg_inputs, outputs=[seg_output])
demo.launch()
La démo ci-dessus ressemblera à ce qui suit :

Créer notre Space
Une fois notre application Ă©crite, nous pouvons crĂ©er un espace Hugging Face pour hĂ©berger notre application. Vous pouvez aller sur huggingface.co, cliquer sur votre profil en haut Ă droite et sĂ©lectionner âNew Spaceâ.

Nous pouvons nommer notre Space, choisir une licence et sélectionner « Gradio » comme Space SDK.

AprĂšs avoir créé le Space, vous pouvez soit utiliser les instructions ci-dessous pour cloner le dĂ©pĂŽt localement, ajouter vos fichiers et pousser, soit utiliser lâinterface graphique pour crĂ©er les fichiers et Ă©crire le code dans le navigateur.

Pour télécharger votre fichier de candidature, cliquez sur « Add File » et faites glisser votre fichier.

Enfin, nous devons crĂ©er un fichier appelĂ© requirements.txt et ajouter les conditions requises pour notre projet. Assurez-vous dâinstaller les versions de jax, diffusers et autres dĂ©pendances comme ci-dessous.
-f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
jax[cuda11_cudnn805]
jaxlib
git+https://github.com/huggingface/diffusers@main
opencv-python
transformers
flax
Nous vous accorderons une dotation GPU afin que votre application puisse fonctionner sur GPU.
Nous avons un classement hébergé ici et nous distribuerons des prix à partir de ce classement. Pour que votre Space apparaisse sur le leaderboard, éditez simplement README.md de votre Space pour avoir le tag jax-diffusers-event sous les tags comme ci-dessous :
---
title: Canny Coyo1m
emoji: đ
...py
tags:
- jax-diffusers-event
---
Prix
Pour ce sprint, nous aurons de nombreux prix. Nous choisirons les dix premiers projets de ce classement, vous devez donc tagger votre Space pour le classement afin que votre soumission soit complĂšte, comme indiquĂ© dans la section ci-dessus. Les projets sont classĂ©s en fonction du nombre de jâaimes, nous augmenterons donc partagerons vos Spaces pour en augmenter la visibilitĂ© pour que les gens puissent voter en laissant un jâaime sur votre Space. Nous sĂ©lectionnerons les dix premiers projets du classement et le jury votera pour dĂ©terminer les trois premiĂšres places. Ces projets seront mis en valeur par Google et Hugging Face. Les interfaces Ă©laborĂ©es ainsi que les projets dont les bases de code et les modĂšles sont en libre accĂšs augmenteront probablement les chances de gagner des prix.
Les prix sont les suivants et sont remis Ă chaque membre de lâĂ©quipe :
PremiĂšre place : Un bon dâachat de 150 $ Ă dĂ©penser sur le Hugging Face Store, un abonnement dâun an Ă Hugging Face Hub PRO, le livre Natural Language Processing with Transformers.
DeuxiĂšme place : Un bon dâachat de 125$ Ă dĂ©penser sur le Hugging Face Store, un abonnement dâun an Ă Hugging Face Hub PRO.
TroisiĂšme place : Un bon dâachat de 100 $ Ă dĂ©penser sur le Hugging Face Store, un abonnement dâun an Ă Hugging Face Hub PRO.
Les dix premiers projets du classement (indĂ©pendamment de la dĂ©cision du jury) gagneront un kit de merch exclusivement conçu pour ce sprint par Hugging Face, ainsi quâun kit de merch sĂ©parĂ© JAX de Google.
Jury
Le jury de ce sprint était composé des personnes suivantes :
- Robin Rombach, Stability AI
- Huiwen Chang, Google Research
- Jun-Yan Zhu, Carnegie Mellon University
- Merve Noyan, Hugging Face
FAQ
Dans cette section, nous rassemblons les réponses aux questions fréquemment posées sur notre canal discord.
Comment utiliser VSCode avec TPU VM ?
Vous pouvez suivre ce guide gĂ©nĂ©ral sur la façon dâutiliser VSCode remote pour se connecter Ă Google Cloud VMs. Une fois que câest configurĂ©, vous pouvez dĂ©velopper sur la VM TPU en utilisant VSCode.
Pour obtenir votre IP externe, utilisez cette commande :
gcloud compute tpus tpu-vm describe <node_name> --zone=<zone>
Elle devrait ĂȘtre listĂ©e sous âaccessConfigâ -> âexternalIpâ
Comment tester votre code localement ?
Puisque les membres de lâĂ©quipe partagent la VM TPU, il peut ĂȘtre pratique dâĂ©crire et de tester votre code localement sur une unitĂ© centrale pendant que vos coĂ©quipiers exĂ©cutent le processus dâentraĂźnement sur la VM. Pour effectuer des tests locaux, il est important de mettre le drapeau xla_force_host_platform_device_count Ă 4. Pour en savoir plus, consultez la documentation.
Gagnants du sprint
Les 10 meilleurs projets (basĂ©s sur le nombre de likes sur leurs dĂ©mos) sont disponibles sur ce classement. Nous avons soumis ce classement Ă notre jury pour quâil juge les 10 meilleurs projets sur la base de plusieurs facteurs tels que les points de contrĂŽle du modĂšle, les jeux de donnĂ©es et les bases de code open-source, lâexhaustivitĂ© du modĂšle et des cartes de jeux de donnĂ©es, etc. En consĂ©quence, les trois projets suivants sont sortis vainqueurs :