Dieser Artikel ist der 9. Tagesartikel von Mixie Group Adventskalender 2019
(Zusammenfassung von 3 Zeilen)
Amazon SageMaker bietet CloudWatch-Metrik-basierte Diagramme für die Überwachung von Jobmetriken (https://aws.amazon.com/jp/blogs/news/easily-monitor-and-visualize-metrics-while) -training-models-on-amazon-sagemaker /) und erscheinen nun auch in Jobdetails in der Managementkonsole Es ist einfach einzurichten, aber persönlich ist es ein schwieriger Eindruck für die Überwachung von Algorithmusmetriken, wie z. B. Protokollglätte (Ausgabefrequenz), Skalierung und Einheitennotation.
Verwenden Sie TrainingJobAnalytics des SageMaker SDK (https://sagemaker.readthedocs.io/en/stable/analytics.html#sagemaker.analytics.TrainingJobAnalytics), um die Daten abzurufen und die Zeichnung selbst zu steuern Die Datenquelle bleibt CloudWatchLogs (nicht grundlegend aufgelöst), aber die Lesbarkeit kann erheblich verbessert werden
Sie können es während des Trainings in das Jupyter-Notizbuch zeichnen oder Sie können es zur regulären Zeit oder zur Endzeit in den Code des Estimator-Anrufers zeichnen und an Ort und Stelle speichern.
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 ist der Grenzwert
).dataframe()
#Datenrahmen formatieren
...
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()
Diese Methode kann auch in SageMaker-Algorithmus verwendet werden.
SageMaker hat offiziell 4 Möglichkeiten, aber ML-Framework von Amazon bereitgestellt Container und [Fall mit Originalcontainer](https://docs.aws.amazon.com/ja_jp/ Mit sagemaker / latest / dg / your-algorithm.html) können Sie regelmäßig ein Diagramm der Trainingssituation mit Ihrem eigenen Programmcode zeichnen, ausgeben und an S3 senden.
Ich fürchte, ich verwende SageMaker, aber nicht die bereitgestellten Überwachungsfunktionen. Wenn ich es jedoch nicht in dem gewünschten Format erhalten kann, muss ich es in den Container aufnehmen (da ich das Einstiegspunktskript und meinen eigenen ML-Algorithmus selbst schreibe). , Der Aufwand, dem Code, den Sie kennen, eine Diagrammzeichnung hinzuzufügen, ist nicht so groß.)
Es ist überraschend schwierig, "wohin das im Container gezeichnete Diagramm gesendet werden soll und wie das Ziel der Diagrammplatzierung (S3-Pfad) innerhalb und außerhalb des Containers freigegeben wird", aber die folgende Methode kann als Beispiel verwendet werden.
train_task.py
#Bedingungen Erzeugung, Ausbildung_job_Datensatzname
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))
#Übergabe der Bedingungen an den Sagemaker-Ausbildungsjob
Estimator.fit(
job_name=training_job_name,
inputs={'train_data':s3_train_data_path,'conditions':s3_conditions_path},
)
train_entrypoint.py
# Estimator.Erhalten Sie den Namen des Schulungsjobs aus den Bedingungen, die vom Fit-Anrufer übergeben wurden
#(Der Pfad, der dem Diktatschlüssel der übergebenen Eingaben entspricht, wird generiert und die Datei wird platziert.)
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']
#Diagrammpfaddefinition
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)
#Diagramm zeichnen und speichern (Keras Beispiel)
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 Senden (Aktualisieren) des Diagramms an den Bucket, um die Ergebnisse des Trainingsjobs zu speichern
boto3.resource('s3').Bucket(bucket).upload_file(graph_outpath,s3_graph_outpath)
Wie im Code gezeigt, ermöglichen Sie die Übergabe von "training_job_name" mit json in dem Teil, der Estimator of sagemaker aufruft, und aus den gemeinsam genutzten Informationen hat das Metrikausgabeziel für jeden Trainingsjob das angegebene Format ("s3: // {Bucket") } / Model / {training_job_name} /metrics / {graph_name} .png`)
In Aktion 2 können Sie den Code frei schreiben, um das Protokoll für TensorBoard auszugeben, es mit dem angegebenen Bucket von S3 zu synchronisieren und es anhand des mit Notebook Instance usw. gestarteten Protokolls auf S3 von TensorBoard zu zeichnen. 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}
Es ist möglich, mit anderen Tools Ihrer Wahl zu zeichnen, aber ich denke, es ist besser, eine ausgewogene Methode zu wählen, die auf den Verwaltungskosten basiert.
Wie ich bereits mehrfach erwähnt habe, unterscheiden sich die Optionen je nach Verwendung von SageMaker.
Aktionen 1 und 2 Für beide ** ist es meiner Meinung nach einfacher, die Metrikdaten (Datenrahmen und Protokoll) und das gezeichnete Diagrammbild in denselben S3 wie den Modellspeicher hochzuladen **.
Ich möchte die zu vergleichenden Metriken so organisieren, dass sie mit derselben Definition auf einen Blick beurteilt werden können.
Recommended Posts