[PYTHON] [Pour ceux qui veulent utiliser TPU] J'ai essayé d'utiliser l'API de détection d'objets Tensorflow 2

introduction

Voici Ichi Lab de RHEMS Giken. (* Veuillez noter que TPU dans le titre est une abréviation pour Tensor Processing Unit et ne signifie pas polyuréthane thermoplastique.)

L'article précédent est ici. [Pour les débutants] J'ai essayé d'utiliser l'API de détection d'objets Tensorflow

L'API de détection d'objets de TensorFlow (ci-après dénommée API) est très pratique pour créer une IA pour la détection d'objets. D'un autre côté, je pense qu'il y a beaucoup de gens qui ont les problèmes suivants.

Cette fois, je voudrais profiter de cette occasion pour laisser un mémorandum sur la façon dont j'ai pu utiliser Cloud TPU dans la mesure où je pouvais me permettre de payer même au niveau individuel. L'utilisation de l'API avec la méthode décrite dans cet article vous permet de rendre le Cloud TPU de GCP beaucoup moins cher que de l'utiliser du début à la fin.

Nous espérons que cela aidera tout le monde.

Préface

Méthode approximative

D'après la conclusion, je pense que ce qui suit est la meilleure façon d'utiliser l'API avec TPU au prix le plus bas possible.

  1. Apprenez avec l'offre gratuite de Google Colaboratory
  2. Si vous souhaitez apprendre tout en jouant à partir de l'offre gratuite, continuez avec la VM de GCP et Cloud TPU (tous deux préventifs)

Google Colaboratory a été présenté de nombreuses fois dans d'autres articles, je vais donc omettre les détails, mais

Au prix d'obtenir gratuitement un environnement performant et performant, vous ne pourrez peut-être pas utiliser votre GPU ou votre TPU pendant un certain temps si vous en abusez.

Dans un tel cas, si vous pouvez préparer vous-même un environnement similaire, cela vous coûtera de l'argent, mais vous pouvez gagner du temps en attendant de pouvoir l'utiliser à nouveau.

Il existe également un bon service appelé Google Colaboratory Pro pour 9,99 $ par mois, mais au moment de la rédaction de cet article (2020/06), il n'est disponible qu'aux États-Unis. Je vais. (Il y a un autre article que j'ai pu enregistrer même du Japon, mais je ne l'ai pas essayé à mes risques et périls car il pourrait enfreindre les règles)

Conditions préalables

L'explication ici est basée sur les conditions suivantes.

Précautions (histoire d'argent)

La méthode présentée ici utilise toujours le service de GCP. Et quelle que soit la méthode, vous serez certainement facturé pour les frais d'utilisation de Cloud Storage. Pour la première fois, GCP propose un niveau gratuit de 300 $, Le niveau gratuit n'inclut pas les frais d'utilisation du TPU, et il existe certaines restrictions sur le niveau gratuit de Cloud Storage, alors assurez-vous de vérifier le contenu vous-même avant de continuer. (Cloud ML a un niveau gratuit, mais je ne l'ai pas essayé)

Préparation commune

Pour s'entraîner à utiliser TPU, il doit être stocké dans Cloud Storage.

Ici, nous supposerons que les noms sont les suivants. ID du projet: gcp-project-123 Nom du bucket: my-bucket-123

N'oubliez pas l'option -m si vous souhaitez copier rapidement de votre PC local vers votre bucket!

Exemple de commande pour envoyer le dossier du répertoire courant vers le bucket avec zsh de Mac


gsutil -m cp -r \* gs://my-bucket-123/

La structure des dossiers dans le compartiment est la suivante. (* L'explication suivante se déroulera sur la base de cette configuration)

gs://my-bucket-123/
├── models
│     ├── ssd_mobilenet_v1_fpn (Modèle de données de source d'apprentissage par transfert)
│             └── .ckpt et bien d'autres
├── data
│     ├── save (Répertoire de stockage des données d'entraînement)
│     ├── train (Pour le stockage des données des enseignants~ tfrecord)
│     └── val (Pour le stockage des données à des fins de vérification~ tfrecord)
├── hoge.config (Données de configuration)
└── tf_label_map.pbtxt (Données d'étiquette)

Cette fois, j'ai utilisé [ssd_mobilenet_v1_fpn_coco](http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_fpn_shared_box_predictor_640x640_coco14_sync_2018_ learning. De plus, sur la page du zoo du modèle de détection Tensorflow, il y a une marque ☆ sur le modèle entraîné qui prend en charge le TPU. C'est sur.

Pour le contenu de la configuration, voir [Ce qui précède](https://qiita.com/IchiLab/items/fd99bcd92670607f8f9b#%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3 % 82% B0% E3% 83% 95% E3% 82% A1% E3% 82% A4% E3% 83% AB% E3% 81% AE% E7% B7% A8% E9% 9B% 86) Je vais l'omettre parce que je l'ai fait, Maintenant que les fichiers ci-dessus sont dans Cloud Storage, les éléments suivants doivent être mis en correspondance en conséquence.

fine_tune_checkpoint: "gs://my-bucket-123/models/ssd_mobilenet_v1_fpn/model.ckpt"
label_map_path: "gs://my-bucket-123/tf_label_map.pbtxt"
input_path: "gs://my-bucket-123/data/train/{filename}.tfrecord
input_path: "gs://my-bucket-123/data/val/{filename}.tfrecord

(* Comment écrire la partie {filename} est [ci-dessus](https://qiita.com/IchiLab/items/fd99bcd92670607f8f9b#%E3%82%B3%E3%83%B3%E3%83%95%E3% 82% A3% E3% 82% B0% E3% 83% 95% E3% 82% A1% E3% 82% A4% E3% 83% AB% E3% 81% AE% E7% B7% A8% E9% 9B% 86))

1. Comment le faire avec Google Colaboratory

Si vous pouvez le faire avec le niveau gratuit, faisons-le ici. Cependant, comme mentionné précédemment, des frais Cloud Storage seront facturés.

1-1. Mettez la source API sur le lecteur

Il peut être local ou conteneur, donc une fois que vous avez git clone, stockez-le dans votre lecteur Google.

Au fait, quand je l'ai fait avec le dernier maître, il y avait de nombreux problèmes tels que ne pas pouvoir faire diverses choses qui fonctionnaient bien, alors Les branches suivantes sont recommandées pour moi.

git clone -b tf_2_1_reference https://github.com/tensorflow/models.git

N'oubliez pas l'API coco.

git clone --depth 1 https://github.com/cocodataset/cocoapi.git

Ici, on suppose que le code source est placé dans le répertoire suivant.

/content/drive/My Drive/models/research
/content/drive/My Drive/cocoapi/PythonAPI

1-2. Créer un nouveau cahier

Sur le navigateur, depuis Google Drive, Sélectionnez Nouveau> Autre> Google Colaboratory.

Changez le titre de "Untitled0.ipynb" en un nom de votre choix. (Recommandation)

Dans le menu ci-dessus, sélectionnez "Runtime" -> "Change Runtime Type" -> Specify Hardware Accelerator comme "TPU" et "Save". Sélectionnez ensuite Se connecter.

1-3. Montez Google Drive

Tout d'abord, si vous ne pouvez pas lire la source de l'API, elle ne démarrera pas, alors montez-la.

from google.colab import drive
drive.mount('/content/drive')

1-4. Paramètres du projet GCP

Configurez le projet avec la commande gcloud pour qu'il fonctionne avec Cloud Storage.

from google.colab import auth
auth.authenticate_user()
project_id = 'gcp-project-123'
!gcloud config set project {project_id}
!gsutil ls my-bucket-123

C'est la même authentification que Google Drive. En cas de succès, vous pouvez vérifier le contenu du compartiment avec la commande ls.

1-5. Installation de cocoAPI (première fois uniquement)

%cd /content/drive/My\ Drive/cocoapi/PythonAPI
!make
!cp -r pycocotools /content/drive/My\ Drive/models/research/

1-6. Exécution du protocole (première fois uniquement)

Convertissez .proto en .py.

%cd /content/drive/My\ Drive/models/research
!protoc object_detection/protos/*.proto --python_out=.

1-7. Changer la version de tensorflow

L'API de détection d'objets Tensorflow ne prend pas en charge tensorflow 2.X. D'autre part, Google Colaboratory a installé la série 2.X depuis le début. Par conséquent, vous devez vérifier la version et réinstaller.

!pip list | grep tensor
!pip install tensorflow==1.15.0rc3

1-8. Définition des variables d'environnement

%env PYTHONPATH=/env/python:/content/drive/My Drive/models/research:/content/drive/My Drive/models/research/slim

1-9. Exécution du code de test API

Testons si l'environnement a été construit avec succès. Si tout se passe bien, vous verrez "OK" sur plusieurs lignes.  D'ailleurs, cet article utilise la source d'une branche légèrement plus ancienne, mais récemment elle a été renommée en model_builder_tf1_test.py.

%cd /content/drive/My Drive/models/research
!python object_detection/builders/model_builder_test.py

1-10. Démarrez Tensorboard (non requis)

Si vous spécifiez le répertoire dans lequel enregistrer les données d'entraînement et que vous le démarrez comme indiqué ci-dessous, vous pouvez vérifier le mouvement de perte et le nombre d'étapes d'apprentissage par seconde.

%load_ext tensorboard
%tensorboard --logdir gs://my-bucket-123/data/save

1-11. Commencer à apprendre

Utilisez model_tpu_main.py au lieu de model_main.py pour l'entraînement. Vous pouvez spécifier l'ID de projet GCP et le nom du TPU comme options, mais cela n'était pas nécessaire dans l'environnement de Google Colaboratory. Probablement parce que l'adresse TPU est initialement enregistrée dans la variable d'environnement (estimation). (Si vous vérifiez avec % env, l'adresse du TPU suivant grpc: // ʻest enregistrée avec le nom TPU_NAME`)

%cd /content/drive/My Drive/models/research
pipeline = 'gs://my-bucket-123/hoge.config'
save = 'gs://my-bucket-123/data/save'
train_step = 1000
mode = 'train'
batch_size = 64

!python object_detection/model_tpu_main.py \
 --pipeline_config_path={pipeline} \
 --mode={mode} \
 --num_train_steps={train_step} \
 --eval_training_data=True \
 --train_batch_size={batch_size} \
 --model_dir={save} \
 --alsologtostderra

1-12. Bonus (pratique à faire)

Google Colaboratory a une limite d'utilisation de moins de 12 heures, Je n'écris pas quelque part sur le nombre d'heures que je peux réellement utiliser. Vous pouvez le découvrir en exécutant le code ci-dessous.

import time, psutil
Start = time.time()- psutil.boot_time()
Left= 12*3600 - Start
print('remaining time: ', Left/3600)

Une fois que vous avez commencé à apprendre, les autres exécutions attendront la fin, donc Faisons ceci si quelque chose a été fait.

2. Comment lancer vous-même la VM GCP et Cloud TPU

En passant, si Google Colaboratory dit "Je ne peux pas l'utiliser pendant un certain temps, veuillez patienter" et que vous ne pouvez pas attendre, essayez cette méthode.

2-1. Lancer VM et Cloud TPU

Tout d'abord, vous devez activer Compute Engine et Cloud TPU. La première fois qu'il s'affiche comme suit (image au moment de l'écriture) Pour Compute Engine "Menu de navigation" -> "Compute Engine" -> "VM et instance" en haut à gauche ss001.png La préparation démarre automatiquement.

Pour Cloud TPU «Menu de navigation» -> «Compute Engine» -> «TPU» en haut à gauche

ss002.png La première fois, vous devez sélectionner "Activer l'API". (Soyez assuré que la facturation TPU ne commencera pas uniquement par cela)

Si vous les avez prêts ou déjà activés, ouvrez Cloud Shell. Cloud Shell a une icône comme celle ci-dessous dans le coin supérieur droit. ss003.png Après avoir attendu un moment et l'avoir ouvert, démarrez la VM et le TPU en même temps avec la ctpu command.

ctpu up --zone=us-central1-b --tf-version=1.15 --machine-type=n1-standard-4 --name=mytpu --preemptible --preemptible-vm

Le point important ici est de mettre «préemptif» dans les options VM et TPU, C'est à utiliser préventif.

Le tableau suivant montre les résultats calculés par l'outil de tarification officiel lorsque l'emplacement du TPU V2 est us-central1.

TPU Class Regular Preemptible
Par heure Environ 485 yens Environ 146 yens

Pour obtenir des informations préventives, veuillez consulter le Document officiel.

La même opération peut être effectuée à partir de la console ou de la commande gcloud. Les détails peuvent être trouvés dans la documentation officielle Création et suppression de TPU.

Lorsque vous exécutez la commande, une confirmation s'affiche comme indiqué ci-dessous.

  Name:                 mytpu
  Zone:                 us-central1-b
  GCP Project:          gcp-project-123
  TensorFlow Version:   1.15
  VM:
      Machine Type:     n1-standard-4
      Disk Size:        250 GB
      Preemptible:      true
  Cloud TPU:
      Size:             v2-8
      Preemptible:      true
      Reserved:         false
OK to create your Cloud TPU resources with the above configuration? [Yn]:

Entrez «y» et appuyez sur «Entrée / Retour» pour démarrer chaque création. La raison pour laquelle j'ai choisi «n1-standard-4» pour le type de machine est simplement parce qu'il est proche de la mémoire de l'environnement Google Colaboratory, alors changez-le si nécessaire.

En passant, si vous supprimez accidentellement le compte de service par défaut de Compute Engine, vous ne pourrez pas le créer avec la commande ctpu ci-dessus.

2020/06/20 00:00:00 Creating Compute Engine VM mytpu (this may take a minute)...
2020/06/20 00:00:07 TPU operation still running...
2020/06/20 00:00:07 error retrieving Compute Engine zone operation: 

(Pour une erreur comme celle-ci ... Quand l'avez-vous effacée?) Je ne connaissais pas la solution alors j'ai recréé un nouveau projet.

"... Remontons le temps."

2-2. Arrêtez le TPU qui vient de démarrer

Cloud TPU sera facturé en quelques secondes. Si vous pouvez confirmer qu'il a démarré en toute sécurité, arrêtons-le pour le moment.

2-3. Entrez l'instance de VM créée par SSH

Lorsque l'instance démarre avec succès, entrons à partir du "SSH" ci-dessous.

ss004.png

Une fois la connexion établie, l'écran de la console s'est ouvert comme indiqué ci-dessous. ss005.png

À partir de là, nous travaillerons là-dessus.

Vous pouvez également vérifier l'état du TPU avec la commande gcloud ici.


gcloud config set compute/zone us-central1-b
Updated property [compute/zone].

gcloud compute tpus list
NAME   ZONE           ACCELERATOR_TYPE  NETWORK_ENDPOINTS  NETWORK  RANGE          STATUS
mytpu  us-central1-b  v2-8              10.240.1.2:8470    default  10.240.1.0/29  STOPPING

En passant, l'état du TPU est affiché comme suit.

fabrication Au démarrage Commencez Arrêt Arrêtez
CREATING STARTING READY STOPPING STOPPED

2-4. Définir un alias (non obligatoire)

J'ai ajouté cet élément parce que je veux unifier clairement s'il s'agit de python ou de python3. Puisque python veut toujours utiliser 3.X, modifiez les paramètres comme suit.

ʻOuvrir .bashrc`

vi ~/.bashrc

ʻAjouter des paramètres à la dernière ligne`

alias python="python3" 
alias pip='pip3'

Refléter les paramètres

source ~/.bashrc

Maintenant, python est maintenant python3.

2-5. Installation des bibliothèques requises

À partir de là, ce sera presque la même chose que la construction de l'environnement API, mais je vais le décrire sans l'omettre.

sudo apt-get update
sudo apt-get install -y protobuf-compiler python-pil python-lxml python-tk
pip install -U pip && pip install Cython contextlib2 jupyter matplotlib tf_slim pillow

Ensuite, apportez le code source de l'API et cocoAPI.

git clone -b tf_2_1_reference https://github.com/tensorflow/models.git
git clone --depth 1 https://github.com/cocodataset/cocoapi.git

Encore une fois, le code source de l'API utilisé dans cet article est la branche ci-dessus.

2-6. Installation de l'API coco

Ensuite, installez l'API coco.

J'ai échoué avec make comme suit.

x86_64-linux-gnu-gcc: error: pycocotools/_mask.c: No such file or directory

Pour éviter cela, modifiez un peu le Makefile.

cd cocoapi/PythonAPI
vi Makefile

Après avoir ouvert le Makefile, changez la partie python en python3 (il y a deux endroits).

make
cp -r pycocotools /home/ichilab/models/research && cd ../../ && rm -rf cocoapi

2-7. Exécution du protocole

Convertissez .proto en .py.

cd models/research
protoc object_detection/protos/*.proto --python_out=.

2-8. Définition des variables d'environnement

Une fois que j'ai fermé l'écran SSH, j'ai dû refaire cette partie.

(pwd = models/research)
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
source ~/.bashrc

2-9. Exécution du code de test API

Testons si l'environnement a été construit avec succès. En cas de succès, "OK" sera affiché sur plusieurs lignes.

python object_detection/builders/model_builder_test.py

Il peut être bon de vous assurer que vous pouvez voir le contenu du seau.

gsutil ls gs://my-bucket-123

2-10. Reprendre le TPU arrêté

Vous ne pouvez pas apprendre avec l'arrêt, alors recommençons ici. Si vous pouvez confirmer le démarrage, c'est le suivant.

2-11. Commencer à apprendre

L'apprentissage a commencé.

python object_detection/model_tpu_main.py \ 
--tpu_name=mytpu \ 
--model_dir=gs://my-bucket-123/data/save \ 
--mode=train \ 
--pipeline_config_path=gs://my-bucket-123/hoge.config \ 
--alsologtostderra

Écrivez une brève description de l'option.

Au fait, si j'utilise la dernière source ici

tensorflow.python.framework.errors_impl.InvalidArgumentError: From /job:tpu_worker/replica:0/task:0:

J'ai été assez ennuyé par l'erreur. C'est la seule raison pour laquelle j'utilise le code source de la branche que j'ai mentionnée plus tôt. La configuration et les autres fichiers étaient exactement dans les mêmes conditions, donc la cause est inconnue pour le moment.

2-12. Arrêter / supprimer TPU et VM après l'apprentissage

Lorsque vous avez terminé, donnez la priorité à l'arrêt / la suppression du TPU.

Combien ça coûtera

Après avoir terminé l'explication de la construction de l'environnement, vous vous demandez combien cela coûtera.

Je suis désolé de ne pas pouvoir publier une comparaison correcte, Si vous formez 100 000 étapes avec Google Colaboratory, cela coûte moins de 400 yens. Lorsque j'ai démarré et utilisé VM et TPU dans mon projet, je n'ai jamais effectué 100000 étapes, mais Compte tenu des frais mentionnés ci-dessus à titre indicatif, le TPU était de 4 yens pour environ 6 heures d'utilisation par Compute Engine et de 1 yen pour les frais d'utilisation IP externe, qui étaient inférieurs à 10 yens au total.

Dans ce domaine, l'utilisation de l'outil de tarification officiel est plus proche de la bonne réponse que mon article.

en conclusion

Qu'as-tu pensé?

Étonnamment, je ne trouve pas d'article de synthèse sur la construction de l'environnement de Cloud TPU × Tensorflow Object Detection API, j'espère donc que plus de gens profiteront de cette opportunité pour apprendre avec TPU et que plus de gens seront intéressés par GCP. ..

Nous espérons sincèrement que vos recherches sur l'IA de détection d'objets seront accélérées à mesure que la vitesse d'apprentissage s'accélérera.

Recommended Posts

[Pour ceux qui veulent utiliser TPU] J'ai essayé d'utiliser l'API de détection d'objets Tensorflow 2
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
J'ai essayé d'utiliser NVDashboard (pour ceux qui utilisent le GPU dans l'environnement jupyter)
Pour le moment en utilisant FastAPI, je veux montrer comment utiliser l'API comme ça dans swagger
[TensorFlow] Je souhaite maîtriser l'indexation pour Ragged Tensor
J'ai essayé de porter le code écrit pour TensorFlow sur Theano
Pour ceux qui souhaitent démarrer l'apprentissage automatique avec TensorFlow2
Détection de logo à l'aide de l'API de détection d'objets TensorFlow
J'ai essayé d'utiliser l'API checkio
J'ai essayé tensorflow pour la première fois
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai analysé les données Airbnb pour ceux qui veulent rester à Amsterdam
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé d'utiliser l'API Google Cloud Vision
[Je veux classer les images à l'aide de Tensorflow] (2) Classifions les images
Je souhaite utiliser la fonction d'activation Mish
J'ai créé un jeu ○ ✕ avec TensorFlow
Rejoignez Azure avec Go ~ Pour ceux qui veulent démarrer et connaître Azure avec Go ~
Points à garder à l'esprit lors de l'utilisation de Python pour ceux qui utilisent MATLAB
J'ai essayé d'exécuter le didacticiel de détection d'objets en utilisant le dernier algorithme d'apprentissage en profondeur
J'ai essayé la détection d'objets avec YOLO v3 (TensorFlow 2.1) sur le GPU de windows!
Je veux utiliser self avec Backpropagation (tf.custom_gradient) (tensorflow)
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
J'ai essayé d'approcher la fonction sin en utilisant le chainer
Points ennuyeux pour ceux qui veulent présenter Ansible
J'ai essayé d'utiliser l'API de Sakenowa Data Project
Pour ceux qui veulent écrire Python avec vim
Je veux automatiser ssh en utilisant la commande expect!
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
Je veux utiliser le jeu de données R avec python
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de gratter YouTube, mais je peux utiliser l'API, alors ne le faites pas.
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
La première étape de l'apprentissage automatique ~ Pour ceux qui veulent essayer l'implémentation avec python ~
J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.
Je veux utiliser la dernière version de gcc même si je n'ai pas les privilèges sudo! !!
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Je veux déplacer le sélénium pour le moment [pour mac]
Je veux voir quelque chose de beau, alors j'ai essayé de visualiser la fonction utilisée pour comparer la fonction d'optimisation.
J'ai essayé de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
[Python] Je souhaite utiliser l'option -h avec argparse
Je ne savais pas comment utiliser l'instruction [python] for
Je souhaite utiliser l'environnement de bureau d'Ubuntu sur Android pour le moment (version Termux)
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
Je souhaite utiliser l'environnement de bureau d'Ubuntu sur Android pour le moment (version UserLAnd)
Notes diverses sur l'utilisation de python pour les projets
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé l'API Google Cloud Vision pour la première fois
Référence de référence pour ceux qui veulent coder avec Rhinoceros / Grasshopper
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé de trier les objets de l'image du plat de steak-① Détection d'objets