[PYTHON] Comment améliorer la surveillance des métriques de modèle avec Amazon SageMaker

Cet article est l'article du 9ème jour du Calendrier de l'Avent du Groupe Mixie 2019

Aperçu

(Résumé de 3 lignes)

Défi: innocent:

Amazon SageMaker fournit des graphiques basés sur des métriques CloudWatch pour la surveillance des métriques des tâches de formation (https://aws.amazon.com/jp/blogs/news/easily-monitor-and-visualize-metrics- while -training-models-on-amazon-sagemaker /) et apparaissent désormais également dans les détails du travail dans la console de gestion C'est facile à configurer, mais personnellement, c'est une impression difficile pour la surveillance des mesures d'algorithme, telles que la fluidité du journal (fréquence de sortie), l'échelle et la notation des unités.

Action 1: utilisez l'API SageMaker SDK (Python): détendue:

Utilisez le TrainingJobAnalytics du SDK SageMaker (https://sagemaker.readthedocs.io/en/stable/analytics.html#sagemaker.analytics.TrainingJobAnalytics) pour obtenir les données et contrôler le dessin vous-même La source de données reste CloudWatchLogs (pas fondamentalement résolue), mais ** la lisibilité peut être considérablement améliorée **

Vous pouvez le dessiner dans le bloc-notes Jupyter pendant l'entraînement, ou vous pouvez le dessiner dans le code de l'appelant Estimator à l'heure normale ou à l'heure de fin et l'enregistrer sur place.

analytics.py



metric_names = ['train:loss','validation:loss']

metrics_dataframe = sagemaker.analytics.TrainingJobAnalytics(
    training_job_name=training_job_name,
    metric_names=metric_names,
    period=60, #1 min est la valeur limite
).dataframe()

#Formatage du dataframe
...

plt = metrics_dataframe_fixed.plot(
    kind='line', 
    figsize=(20,15), 
    fontsize=18,
    x='timestamp', 
    y=[metric_names[0],metric_names[1]], 
    xlim=[0, 2000],
    ylim=[0.1, 0.5],
    style=['b.-','r+-'], 
    rot=45,
 )
plt.figure.savefig('metrics_training_job_xxx.png')
plt.clf()

Ce que tu peux faire

Cette méthode peut également être utilisée dans l'algorithme intégré de SageMaker

Choses impossibles

Action 2: Dessinez un graphique dans votre propre point d'entrée ou votre propre algorithme: blush:

SageMaker a officiellement 4 façons, mais cadre ML fourni par Amazon Container et [Case using original container](https://docs.aws.amazon.com/ja_jp/ Avec sagemaker / latest / dg / your-algorithms.html), vous pouvez périodiquement dessiner et générer un graphique de la situation d'entraînement avec votre propre code de programme et l'envoyer à S3.

J'ai bien peur d'utiliser SageMaker mais pas les fonctionnalités de surveillance fournies, mais si je ne peux pas l'obtenir dans le format que je veux, je dois le prendre dans le conteneur (car j'écris moi-même le script de point d'entrée et mon propre algorithme ML). , L'effort pour ajouter un dessin graphique au code que vous connaissez n'est pas si grand)

Ce que tu peux faire

Choses impossibles

Flux de processus

Il est étonnamment difficile «où envoyer le graphique dessiné à l'intérieur du conteneur et comment partager la destination de placement du graphique (chemin S3) à l'intérieur et à l'extérieur du conteneur», mais la méthode suivante peut être utilisée comme exemple.

  1. Définissez la destination de sortie du modèle ML pour chaque tâche d'entraînement sur S3
  2. Définissez un emplacement pour les «conditions» au même endroit et mettez un fichier JSON contenant des informations sur le modèle.
  3. Définissez un emplacement pour les «métriques» au même endroit et utilisez-le comme un emplacement pour placer les données de métriques et les graphiques dessinés.
  4. Passez le chemin «conditions» en tant que «entrées» à l'estimateur et commencez la formation
  5. Exécutez l'algorithme de formation dans le conteneur SageMaker
  6. Dans la tâche d'entraînement, reportez-vous au JSON dans conditions et assemblez le chemin de destination de sortie du modèle
  7. Exécutez la formation, sortez le journal de progression et dessinez un graphique
  8. Téléchargez les données du graphique dessiné (point fixe) vers la destination de placement du graphique S3 metrics
  9. Traitez le graphique téléchargé sur S3 comme vous le souhaitez
  10. Toujours surveiller, envoyer des notifications, etc.

Exemple de code

train_task.py



#génération de conditions, formation_job_Nom de l'enregistrement
dict_conditions = { "training_job_name" : training_job_name }
s3_conditions_path = '/model/{}/conditions/training_job_config.json'.format(training_job_name)
boto3.resource('s3').Object(bucket,s3_conditions_path).put(Body=json.dumps(dict_conditions))

#Remettre les conditions à la formation de sagemaker
Estimator.fit(
    job_name=training_job_name,
    inputs={'train_data':s3_train_data_path,'conditions':s3_conditions_path},
)

train_entrypoint.py



# Estimator.obtenir le nom du travail d'entraînement à partir des conditions transmises par l'appelant fit
#(Le chemin correspondant à la clé dict des entrées passées est généré et le fichier est placé)
input_conditions = '/opt/ml/input/data/conditions/training_job_config.json'
with open(input_conditions) as f:
    conditions = json.load(f)
    training_job_name = input_conditions['training_job_name']

#Définition du chemin du graphe
graph_name = 'training_history_{}.png'.format(metrics)
graph_outpath = '{}/{}'.format(output_path,graph_name)
s3_graph_outpath = '/model/{}/metrics/{}'.format(training_job_name,graph_name)

#Dessiner et enregistrer un graphique (exemple keras)
history = model.fit(...)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.legend(['training', 'validation'], loc='upper right')
plt.figure.savefig(graph_outpath)
plt.clf()

#S3 Envoyer (mettre à jour) le graphique au compartiment pour enregistrer les résultats de la tâche d'entraînement
boto3.resource('s3').Bucket(bucket).upload_file(graph_outpath,s3_graph_outpath)

Comme indiqué dans le code, permet de passer training_job_name avec json dans la partie qui appelle Estimator of sagemaker, et à partir des informations partagées, la destination de sortie de la métrique pour chaque travail d'entraînement est au format spécifié ( s3: // {bucket } / Model / {training_job_name} / metrics / {graph_name} .png)

À part: dessiner avec TensorBoard

Dans l'action 2, vous pouvez écrire le code librement, de sorte que vous pouvez générer le journal pour TensorBoard, le synchroniser avec le compartiment spécifié de S3 et le dessiner en vous référant au journal sur S3 de TensorBoard lancé avec Notebook Instance, etc. Masu

train_entrypoint_keras.py



tensorboard_log_outpath = '{}/{}'.format(output_path,tensorboard_log_name)

tensorboard_callback = keras.callbacks.TensorBoard(
    log_dir=tensorboard_log_outpath, 
    histogram_freq=1)
callbacks = [tensorboard_callback]

model.fit(..., callbacks=callbacks)

boto3.resource('s3').Bucket(bucket).upload_file(
    tensorboard_log_outpath, s3_tensorboard_log_outpath)

notebook.py


tensorboard --logdir={s3_tensorboard_log_outpath}

Il est possible de dessiner avec d'autres outils de votre choix, mais je pense qu'il vaut mieux prendre une méthode bien équilibrée basée sur le coût de gestion.

Résumé: blush:

Comme je l'ai mentionné à plusieurs reprises en cours de route, les options que vous pouvez prendre diffèrent selon Comment utiliser SageMaker.

Actions 1 et 2 Pour les deux, ** je pense qu'il est plus facile de gérer en téléchargeant les données métriques (Dataframe et log) et l'image graphique dessinée sur le même S3 que le stockage du modèle **.

Je souhaite organiser les métriques à comparer afin qu'elles puissent être jugées en un coup d'œil avec la même définition.

référence

Recommended Posts

Comment améliorer la surveillance des métriques de modèle avec Amazon SageMaker
Comment obtenir plusieurs objets de modèle au hasard dans Django
Comment effectuer un apprentissage avec SageMaker sans délai d'expiration de session
Comment utiliser le modèle appris dans Lobe en Python
Comment utiliser le modèle japonais Spacy avec Google Colaboratory
Comment développer en Python
[TF] Comment charger / enregistrer le modèle et le paramètre dans Keras
[Python] Comment faire PCA avec Python
Comment gérer une session dans SQLAlchemy
Comment utiliser les classes dans Theano
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Comment mettre à jour Spyder dans Anaconda
Comment utiliser SQLite en Python
Comment convertir 0,5 en 1056964608 en un seul coup
Comment refléter CSS dans Django
Comment tuer des processus en vrac
Comment utiliser Mysql avec python
Comment convertir le modèle Tensorflow en Lite
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment s'améliorer lorsque l'éditeur de Spyder est très lourd dans Mavericks
Comment exécuter du code TensorFlow 1.0 en 2.0
Comment gérer le japonais avec Python
Comment se connecter à Docker + NGINX
Comment appeler PyTorch dans Julia
Comment faire un modèle pour la détection d'objets avec YOLO en 3 heures
Comment stocker des données CSV dans Amazon Kinesis Streams avec une entrée standard
[Introduction à Python] Comment utiliser la classe en Python?
Comment supprimer l'erreur d'affichage dans matplotlib
Comment définir dynamiquement des variables en Python
Comment faire R chartr () en Python
Comment convertir csv en tsv dans la CLI
Comment supprimer des sessions expirées dans Django
[Itertools.permutations] Comment créer une séquence en Python
Comment utiliser Google Test en langage C
Comment implémenter un sérialiseur imbriqué avec drf-flex-fields
Comment utiliser BigQuery en Python
Comment mettre à jour PHP sur Amazon Linux 2
Comment exécuter des commandes avec Jupyter Notebook
Comment faire 'git fetch --tags' dans GitPython
Comment obtenir stacktrace en python
Comment afficher la table quatre-vingt-dix-neuf en python
Comment extraire une zone de polygone en Python
Comment réattribuer un index dans pandas dataframe
Comment vérifier la version d'opencv avec python
Comment activer SSL (TLS) dans Apache
Comment utiliser l'interpréteur d'Anaconda avec PyCharm
Comment spécifier une cible non vérifiée dans Flake8
Comment gérer des valeurs consécutives dans MySQL
Comment changer de version de Python dans cloud9
Comment régler le contraste de l'image en Python
Comment utiliser __slots__ dans la classe Python
Comment remplir dynamiquement des zéros avec Python
Comment faire des événements envoyés par le serveur dans Django
Comment utiliser les expressions régulières en Python