Convertir un ensemble de données de classification d'images à utiliser avec les TPU Cloud
Ce tutoriel explique comment utiliser le script d'exemple de convertisseur de données de classification d'images pour convertir un ensemble de données de classification d'images brutes vers le format TFRecord utilisé pour l'entraînement des modèles Cloud TPU.
Le format TFRecord rend la lecture de fichiers volumineux depuis Google Cloud Storage plus efficace que la lecture de chaque image en tant que fichier individuel. Vous pouvez utiliser des fichiers TFRecord partout où vous utilisez un pipeline tf.data.Dataset
.
Pour en savoir plus sur l'utilisation de TFRecord, consultez les documents TensorFlow suivants :
- TFRecord et tf.train.Example
- tf.data.Dataset
- tf.data : créer des pipelines d'entrée TensorFlow
- Lecteur et rédacteur TFRecord pour PyTorch
Si vous utilisez les frameworks PyTorch ou JAX et que vous n'utilisez pas l'espace de stockage Google Cloud pour le stockage de vos ensembles de données, il est possible que vous ne retiriez pas autant d'avantages de l'utilisation du format TFRecord.
Vue d'ensemble des conversions
Le dossier de classification d'images au sein du dépôt du convertisseur des données sur GitHub contient le script converter
, image_classification_data.py
, ainsi qu'un exemple d'implémentation, simple_example.py
, que vous pouvez copier et modifiez pour effectuer votre propre opération de conversion de données.
L'exemple de convertisseur de données de classification d'images définit deux classes, ImageClassificationConfig
et ImageClassificationBuilder
. Ces classes sont définies dans tpu/tools/data_converter/image_classification_data.py
.
ImageClassificationConfig
est une classe de base abstraite. Vous créez une sous-classe de ImageClassificationConfig
afin de définir la configuration nécessaire pour instancier un ImageClassificationBuilder
.
ImageClassificationBuilder
est un générateur d'ensembles de données TensorFlow pour les ensembles de données de classification d'images. Il s'agit d'une sous-classe de tdfs.core.GeneratorBasedBuilder
.
Il extrait des exemples de données de votre ensemble de données et les convertit en fichiers TFRecord. Les fichiers TFRecord sont écrits dans un chemin spécifié par le paramètre data_dir
transmis à la méthode __init__
de ImageClassificationBuilder
.
Dans simple_example.py, SimpleDatasetConfig
crée une sous-classe de ImageClassificationConfig
tout en implémentant des propriétés pour définir les modes compatibles, le nombre de classes d'images et un générateur d'exemples dont le rôle est de fournir un dictionnaire contenant des données d'images et une classe d'images pour chaque exemple de l'ensemble de données.
La fonction main()
crée un ensemble de données composé de données d'image générées de manière aléatoire et instancie un objet SimpleDatasetConfig
spécifiant le nombre de classes et le chemin d'accès à l'ensemble de données sur le disque. main()
instancie ensuite un objet ImageClassificationBuilder
en transmettant l'instance SimpleDatasetConfig
. Enfin, main()
appelle download_and_prepare()
. Lorsque cette méthode est appelée, l'instance ImageClassificationBuilder
utilise l'exemple de générateur de données implémenté par SimpleDatasetConfig
pour charger chacun des exemples, et enregistre ceux-ci dans une série de fichiers TFRecord.
Pour obtenir des explications plus détaillées, consultez le notebook sur le convertisseur de classification.
Modifier l'exemple de conversion de données pour charger votre ensemble de données
Pour convertir votre ensemble de données au format TFRecord, créez une sous-classe de la classe ImageClassificationConfig
en définissant les propriétés suivantes :
- num_labels : affiche le nombre de classes d'image.
- supported_modes : affiche une liste des modes acceptés par votre ensemble de données (par exemple, test, entraînement et validation).
- text_label_map : renvoie un dictionnaire qui modélise le mappage entre une étiquette de classe de texte et une étiquette de classe d'entier. SimpleDatasetConfig ne nécessite pas de mappage et, par conséquent, n'utilise pas cette propriété.
- download_path : chemin d'accès à partir duquel télécharger votre ensemble de données (SimpleDatasetConfig n'utilise pas cette propriété, example_generator charge les données depuis le disque)
Implémentez la fonction de générateur example_generator. Cette méthode doit générer un dictionnaire contenant les données d'image et le nom de la classe d'image pour chaque exemple.
ImageClassificationBuilder
utilise la fonction example_generator()
pour récupérer tous les exemple et les écrire sur le disque au format TFRecord.
Exécuter l'exemple de conversion des données
Créez un bucket Cloud Storage à l'aide de la commande suivante :
gcloud storage buckets create gs://bucket-name --project=your-project-id --location=us-central2
Lancez un Cloud TPU à l'aide de la commande
gcloud
.$ gcloud compute tpus tpu-vm create tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-8 \ --version=tpu-vm-tf-2.17.1-pjrt
Description des options de commande
zone
- Zone dans laquelle vous prévoyez de créer votre Cloud TPU.
accelerator-type
- Le type d'accélérateur spécifie la version et la taille du Cloud TPU que vous souhaitez créer. Pour en savoir plus sur les types d'accélérateurs compatibles avec chaque version de TPU, consultez Versions de TPU.
version
- Version logicielle du Cloud TPU.
Connectez-vous au TPU via SSH :
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Lorsque vous vous connectez au TPU, votre invite shell passe de
username@projectname
àusername@vm-name
.Installez les packages requis.
(vm)$ pip3 install opencv-python-headless pillow (vm)$ pip3 install tensorflow-datasets
Créez les variables d'environnement suivantes, qui sont utilisées par le script.
(vm)$ export STORAGE_BUCKET=gs://bucket-name (vm)$ export CONVERTED_DIR=$HOME/tfrecords (vm)$ export GENERATED_DATA=$HOME/data (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
Téléchargez le dépôt TensorFlow TPU.
(vm)$ cd /usr/share/ (vm)$ git clone https://github.com/tensorflow/tpu.git (vm)$ cd tpu/tools/data_converter
Exécuter le convertisseur de données sur un ensemble de données fictif
Le script simple_example.py
se trouve dans le dossier image_classification
de l'exemple de convertisseur de données. L'exécution du script avec les paramètres suivants génère un ensemble d'images fictives et les convertit en enregistrements TFRecord.
(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GENERATED_DATA \ --generate=True \ --num_examples_per_class_low=10 \ --num_examples_per_class_high=11 \ --save_dir=$CONVERTED_DIR
Exécuter le convertisseur de données sur l'un de nos ensembles de données bruts
Créez une variable d'environnement pour l'emplacement des données brutes.
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
Exécutez le script
simple_example.py
.(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
Le script simple_example.py
utilise les paramètres suivants :
num_classes
: fait référence au nombre de classes de l'ensemble de données. Nous utilisons ici 1 000 pour nous conformer au format ImageNet.generate
: détermine si les données brutes doivent être générées ou non.data_path
: fait référence au chemin où les données sont générées sigenerate=True
, ou au chemin où les données brutes sont stockées sigenerate=False
.num_examples_per_class_low
etnum_examples_per_class_high
: déterminent le nombre d'exemples à générer par classe. Le script génère un nombre aléatoire d'exemples dans cette plage.save_dir
: correspond à l'emplacement où les fichiers TFRecord sont enregistrés. Pour que vous puissiez entraîner un modèle sur Cloud TPU, les données doivent être stockées sur Cloud Storage. Le stockage peut s'effectuer sur un espace Cloud Storage, ou directement sur la VM.
Renommer les enregistrements TFRecord et les déplacer dans Cloud Storage
L'exemple suivant utilise les données converties avec le modèle ResNet.
Renommez les enregistrements TFRecord en utilisant le même format que pour les enregistrements TFRecord ImageNet :
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt update (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
Copiez les enregistrements TFRecord dans Cloud Storage :
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
Effectuer un nettoyage
Déconnectez-vous de l'instance Cloud TPU, si vous ne l'avez pas déjà fait :
(vm)$ exit
Votre invite de commande doit maintenant être
user@projectname
, ce qui indique que vous êtes dans Cloud Shell.Dans Cloud Shell, exécutez
gcloud
pour supprimer la ressource de VM.$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
Vérifiez que la VM a été supprimée en exécutant la commande
gcloud compute tpus tpu-vm list
. La suppression peut prendre plusieurs minutes. Une réponse semblable à la suivante indique que vos instances ont bien été supprimées.$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
Exécutez la gcloud CLI comme indiqué, en remplaçant bucket-name par le nom du bucket Cloud Storage que vous avez créé pour ce tutoriel :
$ gcloud storage rm gs://bucket-name --recursive