Cet article est l'article du 9ème jour du Calendrier de l'Avent du Groupe Mixie 2019
(Résumé de 3 lignes)
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.
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()
Cette méthode peut également être utilisée dans l'algorithme intégré de SageMaker
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)
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.
conditions
et assemblez le chemin de destination de sortie du modèlemetrics
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
)
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.
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.
Recommended Posts