Schritt 2. Erstellen Sie die Runtime-Skripten - AWS Präskriptive Leitlinien

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Schritt 2. Erstellen Sie die Runtime-Skripten

Erstellung der Runtime-Skripten.

In diesem Schritt integrieren Sie das Modell, das Sie in Schritt 1 entwickelt haben, und den zugehörigen Hilfscode in eine ML-Plattform für produktionsbereites Training und Inferenz. Konkret beinhaltet dies die Entwicklung von Runtime-Skripten, damit das Modell in KI integriert werden kann. SageMaker Diese eigenständigen Python-Skripte enthalten vordefinierte SageMaker KI-Callback-Funktionen und Umgebungsvariablen. Sie werden in einem SageMaker KI-Container ausgeführt, der auf einer Amazon Elastic Compute Cloud (Amazon EC2) -Instance gehostet wird. Die Amazon SageMaker AI Python SDK-Dokumentation enthält detaillierte Informationen darüber, wie diese Callbacks und die Hilfseinstellungen für Training und Inferenz zusammenarbeiten. (Weitere Informationen finden Sie in der KI-Dokumentation beispielsweise unter Vorbereiten eines Scikit-Learn-Trainingsskripts und Bereitstellen eines Scikit-Learn-Modells.) SageMaker Die folgenden Abschnitte enthalten zusätzliche Empfehlungen für die Entwicklung von ML-Runtime-Skripten, die auf unseren Erfahrungen in der Zusammenarbeit mit Kunden basieren. AWS

Verwendung von Verarbeitungsaufträgen

SageMaker KI bietet zwei Optionen für die Durchführung von Modellinferenzen im Batch-Modus. Sie können einen SageMaker KI-Verarbeitungsjob oder einen Batch-Transformationsjob verwenden. Jede Option hat Vor- und Nachteile.

Ein Verarbeitungsjob besteht aus einer Python-Datei, die in einem SageMaker AI-Container ausgeführt wird. Der Verarbeitungsjob besteht aus der Logik, die Sie in Ihre Python-Datei einfügen. Er hat folgende Vorteile:

  • Wenn Sie die grundlegende Logik eines Schulungsjobs verstehen, sind Verarbeitungsjobs einfach einzurichten und leicht zu verstehen. Sie haben dieselben Abstraktionen wie Trainingsjobs (z. B. die Optimierung der Anzahl der Instanzen und der Datenverteilung).

  • Datenwissenschaftler und ML-Ingenieure haben die volle Kontrolle über die Optionen zur Datenmanipulation.

  • Der Datenwissenschaftler muss keine I/O-Komponentenlogik verwalten, mit Ausnahme der vertrauten Lese-/Schreibfunktionen.

  • Es ist etwas einfacher, die Dateien in Umgebungen ohne SageMaker KI auszuführen, was eine schnelle Entwicklung und lokale Tests unterstützt.

  • Wenn ein Fehler auftritt, schlägt ein Verarbeitungsauftrag fehl, sobald das Skript fehlschlägt, und es wird nicht unerwartet auf einen erneuten Versuch gewartet.

Andererseits sind Batch-Transformationsjobs eine Erweiterung des Konzepts eines SageMaker KI-Endpunkts. Zur Laufzeit importieren diese Jobs Callback-Funktionen, die dann die I/O für das Lesen der Daten, das Laden des Modells und das Treffen der Vorhersagen übernehmen. Batch-Transformationsjobs haben folgende Vorteile:

  • Sie verwenden eine Abstraktion der Datenverteilung, die sich von der Abstraktion unterscheidet, die bei Trainingsjobs verwendet wird.

  • Sie verwenden dieselbe Kerndatei- und Funktionsstruktur sowohl für Batch-Inferenz als auch für Echtzeit-Inferenz, was praktisch ist.

  • Sie verfügen über einen integrierten, auf Wiederholungsversuchen basierenden Fehlertoleranzmechanismus. Wenn beispielsweise bei einem Stapel von Datensätzen ein Fehler auftritt, wird der Vorgang mehrmals wiederholt, bevor der Job als Fehler beendet wird.

Aufgrund seiner Transparenz, seiner Benutzerfreundlichkeit in mehreren Umgebungen und seiner gemeinsamen Abstraktion mit Trainingsjobs haben wir uns in der Referenzarchitektur, die in diesem Handbuch vorgestellt wird, entschieden, den Verarbeitungsjob anstelle des Batch-Transformationsjobs zu verwenden.

Sie sollten Python-Runtime-Skripten lokal ausführen, bevor Sie sie in der Cloud bereitstellen. Insbesondere empfehlen wir, dass Sie die Main Guard-Klausel verwenden, wenn Sie Ihre Python-Skripte strukturieren und Unit-Tests durchführen.

Verwenden Sie die Main Guard-Klausel

Verwenden Sie eine Haupt-Guard-Klausel, um den Modulimport zu unterstützen und Ihr Python-Skript auszuführen. Das individuelle Ausführen von Python-Skripten ist für das Debuggen und Isolieren von Problemen in der ML-Pipeline von Vorteil. Wir empfehlen die folgenden Schritte:

  • Verwenden Sie einen Argumentparser in den Python-Verarbeitungsdateien, um Eingabe-/Ausgabedateien und ihre Speicherorte anzugeben.

  • Stellen Sie eine Hauptanleitung und Testfunktionen für jede Python-Datei bereit.

  • Nachdem Sie eine Python-Datei getestet haben, integrieren Sie sie in die verschiedenen Phasen der ML-Pipeline, unabhängig davon, ob Sie ein AWS Step Functions Modell oder einen SageMaker KI-Verarbeitungsjob verwenden.

  • Verwenden Sie Assert-Anweisungen in kritischen Abschnitten des Skripts, um das Testen und Debuggen zu erleichtern. Sie können beispielsweise eine Assert-Anweisung verwenden, um sicherzustellen, dass die Anzahl der Datensatz-Features nach dem Laden konsistent ist.

Komponententests

Unit-Tests von Runtime-Skripten, die für die Pipeline geschrieben wurden, sind eine wichtige Aufgabe, die bei der Entwicklung von ML-Pipelines häufig ignoriert wird. Dies liegt daran, dass maschinelles Lernen und Datenwissenschaft relativ neue Bereiche sind und etablierte Methoden der Softwareentwicklung wie Unit-Tests nur langsam eingeführt haben. Da die ML-Pipeline in der Produktionsumgebung verwendet wird, ist es wichtig, den Pipeline-Code zu testen, bevor das ML-Modell auf reale Anwendungen angewendet wird.

Unit-Tests des Runtime-Skripts bieten außerdem die folgenden einzigartigen Vorteile für ML-Modelle:

  • Es verhindert unerwartete Datentransformationen. Die meisten ML-Pipelines beinhalten viele Datentransformationen. Daher ist es wichtig, dass diese Transformationen erwartungsgemäß funktionieren.

  • Es bestätigt die Reproduzierbarkeit des Codes. Jede Zufälligkeit im Code kann durch Komponententests mit unterschiedlichen Anwendungsfällen erkannt werden.

  • Es erzwingt die Modularität des Codes. Unit-Tests werden in der Regel mit dem Maß für die Testabdeckung in Verbindung gebracht. Dabei handelt es sich um den Grad, in dem eine bestimmte Testsuite (eine Sammlung von Testfällen) den Quellcode eines Programms ausführt. Um eine hohe Testabdeckung zu erreichen, modularisieren Entwickler den Code, da es schwierig ist, Komponententests für eine große Menge Code zu schreiben, ohne ihn in Funktionen oder Klassen zu unterteilen.

  • Dadurch wird verhindert, dass minderwertiger Code oder Fehler in die Produktion einfließen.

Wir empfehlen Ihnen, ein ausgereiftes Unit-Test-Framework wie pytest zu verwenden, um die Unit-Test-Fälle zu schreiben, da es einfacher ist, umfangreiche Unit-Tests innerhalb eines Frameworks zu verwalten.

Wichtig

Unit-Tests können nicht garantieren, dass alle Eckfälle getestet werden, aber sie können Ihnen helfen, Fehler proaktiv zu vermeiden, bevor Sie das Modell bereitstellen. Wir empfehlen, das Modell auch nach der Implementierung zu überwachen, um eine optimale Betriebsführung zu gewährleisten.