[PYTHON] So verbessern Sie die Überwachung von Modellmetriken mit Amazon SageMaker

Dieser Artikel ist der 9. Tagesartikel von Mixie Group Adventskalender 2019

Überblick

(Zusammenfassung von 3 Zeilen)

Herausforderung: unschuldig:

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.

Aktion 1: Verwenden Sie die SageMaker SDK-API (Python): entspannt:

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()

Was du tun kannst

Diese Methode kann auch in SageMaker-Algorithmus verwendet werden.

Dinge unmöglich

Aktion 2: Zeichnen Sie ein Diagramm in Ihrem eigenen Einstiegspunkt oder in Ihrem eigenen Algorithmus: erröten:

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ß.)

Was du tun kannst

Dinge unmöglich

Prozessablauf

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.

  1. Definieren Sie das Ausgabeziel des ML-Modells für jeden Trainingsjob in S3
  2. Definieren Sie einen Ort für "Bedingungen" an derselben Stelle und legen Sie eine JSON-Datei mit Informationen zum Modell ab.
  3. Definieren Sie einen Ort für "Metriken" an derselben Stelle und verwenden Sie ihn als Ort zum Platzieren von Metrikdaten und gezeichneten Diagrammen.
  4. Übergeben Sie den Pfad "Bedingungen" als "Eingaben" an den Schätzer und beginnen Sie mit dem Training
  5. Führen Sie den Trainingsalgorithmus im SageMaker-Container aus
  6. Beziehen Sie sich im Schulungsjob auf JSON unter "Bedingungen" und stellen Sie den Zielpfad für die Modellausgabe zusammen
  7. Führen Sie das Training durch, geben Sie das Fortschrittsprotokoll aus und zeichnen Sie ein Diagramm
  8. Laden Sie die gezeichneten Diagrammdaten (Festpunkt) in die S3-Diagrammplatzierungsziel-Metriken hoch
  9. Verarbeiten Sie das in S3 hochgeladene Diagramm nach Ihren Wünschen
  10. Überwachen, senden Sie immer Benachrichtigungen usw.

Codebeispiel

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`)

Nebenbei: Zeichnen Sie mit TensorBoard

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.

Zusammenfassung: erröten:

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.

Referenz

Recommended Posts

So verbessern Sie die Überwachung von Modellmetriken mit Amazon SageMaker
So erhalten Sie mehrere Modellobjekte zufällig in Django
So führen Sie das Lernen mit SageMaker ohne Sitzungszeitlimit durch
Verwendung des in Lobe in Python erlernten Modells
Verwendung des japanischen Spacy-Modells mit Google Colaboratory
Wie man in Python entwickelt
[TF] Laden / Speichern von Modell und Parameter in Keras
[Python] Wie man PCA mit Python macht
Umgang mit Sitzungen in SQLAlchemy
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
So aktualisieren Sie Spyder in Anaconda
Verwendung von SQLite in Python
So konvertieren Sie 0,5 in 1056964608 auf einmal
Wie man CSS in Django reflektiert
Wie man Prozesse in großen Mengen abbricht
Wie man MySQL mit Python benutzt
So konvertieren Sie das Tensorflow-Modell in Lite
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Wie man sich verbessert, wenn Spyders Editor in Mavericks sehr schwer ist
So führen Sie TensorFlow 1.0-Code in 2.0 aus
Umgang mit Japanisch mit Python
So melden Sie sich bei Docker + NGINX an
So rufen Sie PyTorch in Julia an
So erstellen Sie mit YOLO in 3 Stunden ein Modell für die Objekterkennung
Speichern von CSV-Daten in Amazon Kinesis Streams mit Standardeingabe
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So unterdrücken Sie Anzeigefehler in matplotlib
Dynamisches Definieren von Variablen in Python
So machen Sie R chartr () in Python
So konvertieren Sie csv in tsv in CLI
So löschen Sie abgelaufene Sitzungen in Django
[Itertools.permutations] So löschen Sie eine Sequenz in Python
Verwendung von Google Test in C-Sprache
So implementieren Sie einen verschachtelten Serializer mit drf-flex-Feldern
So arbeiten Sie mit BigQuery in Python
So aktualisieren Sie PHP unter Amazon Linux 2
So führen Sie Befehle mit einem Jupyter-Notebook aus
Wie man in GitPython '--gags fetch --tags' macht
Wie bekomme ich Stacktrace in Python?
So zeigen Sie die neunundneunzig Tabelle in Python an
So extrahieren Sie einen Polygonbereich in Python
So weisen Sie den Index im Pandas-Datenrahmen neu zu
So überprüfen Sie die Version von opencv mit Python
So aktivieren Sie SSL (TLS) in Apache
Verwendung von Anacondas Interpreter mit PyCharm
So legen Sie ein nicht geprüftes Ziel in Flake8 fest
Umgang mit aufeinanderfolgenden Werten in MySQL
So wechseln Sie die Python-Version in Cloud9
So passen Sie den Bildkontrast in Python an
Verwendung von __slots__ in der Python-Klasse
So füllen Sie mit Python dynamisch Nullen aus
So führen Sie vom Server gesendete Ereignisse in Django durch
Verwendung regulärer Ausdrücke in Python