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-support sur Discord.
  • Discussion gĂ©nĂ©rale : #jax-diffusers-sprint channel sur Discord. Vous aurez accĂšs aux canaux #jax-diffusers-tpu-support et #jax-diffusers-sprint une 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 Youtube
ApolinĂĄrio Passos, Hugging Face Introduction to Diffusers library 4.40pm-5.20pm CEST / 7.40am-08.20am PST Youtube
Ting Chen, Google Brain Diffusion++: discrete data and high-dimensional generation 5.45pm-6.25pm CEST / 08.45am-09.25am PST Youtube

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 Youtube
Suraj Patil, Hugging Face Masked Generative Models: MaskGIT/Muse 4.40pm-5.20pm CEST / 7.40am-08.20am PST Youtube
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 Youtube

17 avril 2023

Intervenant Sujet Horaire Video
Andreas Steiner, Google Brain JAX & ControlNet 4.00pm-4.40pm CEST / 7.00am-7.40am PST Youtube
Boris Dayma, craiyon DALL-E Mini 4.40pm-5.20pm CEST / 7.40am-08.20am PST Youtube
Margaret Mitchell, Hugging Face Ethics of Text-to-Image 5.20pm-6.00pm CEST / 08.20am-09.00am PST Youtube

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 ( Open In Colab) 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.

  1. Vous devez installer le Google Cloud SDK. Veuillez suivre les instructions sur https://cloud.google.com/sdk.

  2. 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>
    
  3. 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
    
  4. Ensuite, vous devez vous authentifier. Vous pouvez le faire en exécutant la commande

     gcloud auth login
    

    Vous devriez obtenir un lien vers un site web oĂč vous pouvez authentifier votre compte gmail.

  5. 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-b et 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 : Carte de modÚle.

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. Edit Model Card

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
---

Edit Metadata

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 : ControlNet

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 : Gradio Blocks

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”.

New Space

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

Space Configuration

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.

Spaces Landing

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

New Space Landing

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 :

  1. Robin Rombach, Stability AI
  2. Huiwen Chang, Google Research
  3. Jun-Yan Zhu, Carnegie Mellon University
  4. 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 :

  1. ControlNet pour la décoration intérieure
  2. ControlNet pour le réglage de la luminosité
  3. Stable Diffusion avec contrĂŽle manuel