[PYTHON] Bereiten Sie ein Projektformat für maschinelles Lernen vor und führen Sie es in SageMaker aus

Hallo, das ist Ninomiya von LIFULL CO., LTD.

Projekte für maschinelles Lernen müssen bei der Analyse und Bewertung der Modellgenauigkeit erfolgreich sein und dann in vorhandenen Systemen erfolgreich verfügbar gemacht werden. Zu dieser Zeit war es für unser Team schwierig, die Rollen der für die Implementierung verantwortlichen Ingenieure aufzuteilen.

Mit dem Ziel "Wenn ein Datenwissenschaftler es in diesem Format erstellt, kann es leicht integriert werden!", Wrap Amazon SageMaker und dem allgemeinen Zweck in gewissem Umfang. Wir haben ein Entwicklungsformat und Tools vorbereitet, die als Standard verwendet werden können.

Was ist Amazon Sage Maker?

Amazon SageMaker bietet allen Entwicklern und Datenwissenschaftlern die Möglichkeit, Modelle für maschinelles Lernen zu erstellen, zu trainieren und bereitzustellen. Amazon SageMaker ist ein vollständig verwalteter Dienst, der den gesamten Workflow für maschinelles Lernen abdeckt. Beschriften und bereiten Sie Ihre Daten vor, wählen Sie Algorithmen aus, trainieren Sie Ihr Modell, optimieren und optimieren Sie die Bereitstellung, machen Sie Vorhersagen und führen Sie sie aus. Sie können Ihr Modell mit weniger Aufwand und Kosten in Produktion bringen.

Was die Hauptfunktionen betrifft, können Sie die folgenden Funktionen verwenden, wenn Sie ein Docker-Image vorbereiten, das bestimmten Spezifikationen entspricht.

In der offiziellen Dokumentation und im Artikel von @ taniyam (dasselbe Team wie ich) finden Sie Spezifikationen zur Erstellung Ihres eigenen Docker-Images mit SageMaker.

Projektformat für maschinelles Lernen

Zuerst bat ich den Datenwissenschaftler, die folgende Verzeichnisstruktur vorzubereiten.

.
├── README.md
├── Dockerfile
├── config.yml
├── pyproject.toml (Poesie-Konfigurationsdatei)
├── script
│   └── __init__.py
└── tests
    └── __init__.py

Der Hauptprozess ist in "script / __ init __. Py" geschrieben und das Skript ist wie folgt. Dies ist die von simple_sagemaker_manager erstellte Bibliothek.

import pandas as pd
from typing import List
from pathlib import Path
from sklearn import tree
from simple_sagemaker_manager.image_utils import AbstractModel


def train(training_path: Path) -> AbstractModel:
    """Lerne.

    Args:
        training_path (Path):Verzeichnis mit CSV-Dateien
    
    Returns:
        Model:Modellobjekt, das AbstractModel erbt
        
    """
    train_data = pd.concat([pd.read_csv(fname, header=None) for fname in training_path.iterdir()])
    train_y = train_data.iloc[:, 0]
    train_X = train_data.iloc[:, 1:] 

    # Now use scikit-learn's decision tree classifier to train the model.
    clf = tree.DecisionTreeClassifier(max_leaf_nodes=None)
    clf = clf.fit(train_X, train_y)
    return Model(clf)


class Model(AbstractModel):
    """Die Methode der Serialisierung ist in AbstractModel beschrieben.
    """

    def predict(self, matrix: List[List[float]]) -> List[List[str]]:
        """Inferenzverarbeitung.

        Args:
            matrix (List[List[float]]):Tabellendaten

        Returns:
            list:Inferenzergebnis

        """
        #Das hier zurückgegebene Ergebnis ist die Antwort der Inferenz-API.
        return [[x] for x in self.model.predict(pd.DataFrame(matrix))]

AbstractModel hat die folgende Definition, und das Ergebnis des Aufrufs der save -Methode (Ergebnis der Serialisierung durch pickle) wird gespeichert. Dies wird als Modell bei der Ausführung des Trainingsstapels verwendet (vom SageMaker-System verwendet). Es wird in S3 gespeichert. Die Serialisierungsmethode kann auch durch Überschreiben von "Speichern" und "Laden" umgeschaltet werden.

import pickle
from abc import ABC, abstractmethod
from dataclasses import dataclass


@dataclass
class AbstractModel(ABC):
    model: object

    @classmethod
    def load(cls, model_path):
        #Speichern Sie das Modell während des Trainingsstapels
        with open(model_path / 'model.pkl', 'rb') as f:
            model = pickle.load(f)
        return cls(model)

    def save(self, model_path):
        #Laden Sie das Modell während der Inferenz
        with open(model_path / 'model.pkl', 'wb') as f:
            pickle.dump(self.model, f)

    @abstractmethod
    def predict(self, json):
        pass

Ich versuche, mit cli zu arbeiten, indem ich mich auf Projekte wie Pythons Poesie beziehe. Der Entwicklungsablauf des Docker-Images von SageMaker ist wie folgt.

Außerdem habe ich es möglich gemacht, die Docker-Datei zu bearbeiten, da einige Bibliotheken für maschinelles Lernen nur mit Anaconda installiert werden können. Daher erhielt ich die Anfrage "Ich möchte, dass Sie sie durch ein anderes als das offizielle Image von Python3 ersetzen".

from simple_sagemaker_manager.executor import SageMakerExecutor
from simple_sagemaker_manager.executor.classes import TrainInstance, TrainSpotInstance, Image


client = SageMakerExecutor()

#
model = client.execute_batch_training(
    instance=TrainInstance(
        instance_type='ml.m4.xlarge',
        instance_count=1,
        volume_size_in_gb=10,
        max_run=100
    ),
    image=Image(
        name="decision-trees-sample",
        uri="xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/decision-trees-sample:latest"
    ),
    input_path="s3://xxxxxxxxxx/DEMO-scikit-byo-iris",
    output_path="s3://xxxxxxxxxx/output",
    role="arn:aws:iam::xxxxxxxxxx"
)


#
model = client.execute_batch_training(
    instance=TrainSpotInstance(
        instance_type='ml.m4.xlarge',
        instance_count=1,
        volume_size_in_gb=10,
        max_run=100,
        max_wait=1000
    ),
    image=Image(
        name="decision-trees-sample",
        uri="xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/decision-trees-sample:latest"
    ),
    input_path="s3://xxxxxxxxxx/DEMO-scikit-byo-iris",
    output_path="s3://xxxxxxxxxxx/output",
    role="arn:aws:iam::xxxxxxxxxxxxx"
)

Es ist schwierig, "boto3" direkt auszuführen, daher habe ich auch hier eine verpackte Bibliothek vorbereitet. Es gibt viele Operationen, aber in vielen Projekten möchten wir drei Dinge tun: "Lernen des Modells" und "Ausführen eines ODER-Stapelkonvertierungsjobs, der eine Inferenz-API einrichtet", sodass wir eine Schnittstelle haben, die das Verständnis erleichtert. Beim Lernen mit einer normalen Instanz Beim Lernen mit einer Spot-Instanz Die Inferenz-API wird wie folgt erstellt. Die Punkte, die ich mir ausgedacht habe, sind wie folgt. * Wenn der Endpunkt mit dem angegebenen Namen nicht vorhanden ist, erstellen Sie einen neuen Endpunkt. * Wenn vorhanden, aktualisieren Sie ihn. Anfragen werden während der Aktualisierung akzeptiert.

from simple_sagemaker_manager.executor import SageMakerExecutor
from simple_sagemaker_manager.executor.classes import EndpointInstance, Model

client = SageMakerExecutor()


#Bei der Bereitstellung eines bestimmten Modells
#Wenn Sie mehrere Modelle für Modelle angeben, wird ein Pipeline-Modell erstellt und verwendet.
client.deploy_endpoint(
    instance=EndpointInstance(
        instance_type='ml.m4.xlarge',
        initial_count=1,
        initial_variant_wright=1
    ),
    models=[
        Model(
            name='decision-trees-sample-191028-111309-538454',
            model_arn='arn:aws:sagemaker:ap-northeast-1:xxxxxxxxxx',
            image_uri='xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/decision-trees-sample:latest',
            model_data_url='s3://xxxxxxxxxx/model.tar.gz'
        )
    ],
    name='sample-endpoint',
    role="arn:aws:iam::xxxxxxxxxx"
)

# execute_batch_Sie können auch das Ergebnis des Trainings bestehen
model = client.execute_batch_training(
    #Argument wird weggelassen
) 

client.deploy_endpoint(
    instance=EndpointInstance(
        instance_type='ml.m4.xlarge',
        initial_count=1,
        initial_variant_wright=1
    ),
    models=[model],
    name='sample-endpoint',
    role="arn:aws:iam::xxxxxxxxxx"
)

Andere Namen als Endpunkte (z. B. Lern-Batch-Jobs) werden automatisch mit der aktuellen Zeitzeichenfolge hinzugefügt, um Doppelarbeit zu vermeiden. Nur der Endpunkt hat jedoch das Verhalten "Aktualisieren, wenn es einen mit demselben Namen gibt", um die Benutzerfreundlichkeit zu verbessern.

Obwohl weggelassen, wird die Stapelkonvertierungsjobmethode auf die gleiche Weise implementiert.

Zukünftige Herausforderungen

Ich habe es auf diese Weise implementiert und verwende es jetzt tatsächlich bei der Implementierung einiger Projekte. Es gibt jedoch einige Probleme, die noch nicht implementiert wurden, und es gibt noch andere Probleme innerhalb des Teams.

Wenn Sie es tatsächlich im Team verwenden, gibt es einige Teile, die nicht einfach zu verwenden sind. Daher werde ich versuchen, diese Probleme zu lösen und das Projekt für maschinelles Lernen effizienter zu gestalten.

Recommended Posts

Bereiten Sie ein Projektformat für maschinelles Lernen vor und führen Sie es in SageMaker aus
Bis Sie mit Python unter Windows 7 eine maschinelle Lernumgebung erstellen und ausführen
Schreiben wir ein Python-Programm und führen es aus
Führen Sie eine Pipeline für maschinelles Lernen mit Cloud Dataflow (Python) aus.
Erstellen Sie eine Python-Umgebung für maschinelles Lernen unter Mac OS
Installieren Sie Docker unter Arch Linux und führen Sie es remote aus
Windows10 (x64) Erstellen Sie nativ eine maschinelle Lernumgebung
Richten Sie Python- und maschinelle Lernbibliotheken unter Ubuntu ein
So zeichnen Sie interaktiv eine Pipeline für maschinelles Lernen mit scikit-learn und speichern sie in HTML
Erstellen Sie in einer Linux-Umgebung ein NuGet-Paket aus einem C # -Projekt und laden Sie es in ein anderes Projekt
Erstellen Sie mit macOS sierra eine Python-Lernumgebung für maschinelles Lernen
Erstellen Sie eine maschinelle Lernumgebung auf einem Mac (pyenv, deeplearning, opencv).
Erstellen Sie mit VirtualBox und Ubuntu eine Scikit-Lernumgebung für maschinelles Lernen
Erstellen Sie eine maschinelle Lernumgebung
Maschinelles Lernen und mathematische Optimierung
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
Installieren Sie Dropbox und führen Sie es unter Ubuntu 20.04 aus
Klassifikation und Regression beim maschinellen Lernen
Führen Sie Matplotlib auf einem Docker-Container aus
Inverse Analyse des maschinellen Lernmodells
Führen Sie Headless-Chrome auf einem Debian-basierten Image aus
Führen Sie TensorFlow2 auf dem VPS-Server aus
Beginnen Sie mit dem maschinellen Lernen mit SageMaker
Grundlegendes maschinelles Lernverfahren: ② Daten vorbereiten
Eine Geschichte, die es aufgegeben hat, JavaScripthon unter Windows auszuführen.
Installieren Sie das ROS- und ROS-Modul für Roomba auf Raspberry Pi 3 und versuchen Sie, es auszuführen
[Persönliches Memo] Holen Sie sich Daten im Web und machen Sie daraus einen DataFrame