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.
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.
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.
smcli new project name
)smcli build
)smcli push
)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.
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