Diese Anleitung als Notebook in Colab ausführen | Notebook auf GitHub ansehen |
Übersicht
In dieser Anleitung wird gezeigt, wie Sie ein trainiertes scikit-learn-Modell in AI Platform Prediction bereitstellen und Vorhersagen mithilfe einer benutzerdefinierten Vorhersageroutine treffen. Auf diese Weise können Sie anpassen, wie AI Platform Prediction auf die einzelnen Vorhersageanfragen reagiert.
In diesem Beispiel verwenden Sie eine benutzerdefinierte Vorhersageroutine, um die Vorhersageeingabe durch Skalierung vorzuverarbeiten und die Vorhersageausgabe nachzubearbeiten. Dazu konvertieren Sie Klassennummern in Labelstrings.
Die Anleitung umfasst mehrere Schritte:
- Lokales Training eines einfachen scikit-learn-Modells (in diesem Notebook)
- Erstellung und Bereitstellung einer benutzerdefinierten Vorhersageroutine in AI Platform Prediction
- Bearbeitung von Vorhersageanfragen in dieser Bereitstellung
Dataset
In dieser Anleitung wird das Iris-Dataset von R.A. Fisher verwendet, ein kleines Dataset, das häufig zum Testen von Techniken des maschinellen Lernens eingesetzt wird. Jede Instanz hat vier numerische Merkmale, bei denen es sich um verschiedene Messwerte einer Blume handelt, und ein Ziel-Label, das sie als einen von drei Schwertlilienarten kennzeichnet: Iris setosa, Iris versicolour oder Iris virginica.
In dieser Anleitung wird die Kopie des in der scikit-learn-Bibliothek enthaltenen Iris-Datasets verwendet.
Ziel
Das Ziel besteht darin, ein Modell zu trainieren, das die Messwerte einer Blume als Eingabe verwendet, um vorherzusagen, um welche Art von Schwertlilie es sich handelt.
Der Schwerpunkt dieser Anleitung liegt mehr auf der Verwendung des Modells mit AI Platform Prediction als auf dem eigentlichen Modelldesign.
Kosten
In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet.
- AI Platform Prediction
- Cloud Storage
Informieren Sie sich über die Preise von AI Platform Prediction und die Preise von Cloud Storage. Mit dem Preisrechner können Sie die voraussichtlichen Kosten anhand der geplanten Nutzung kalkulieren.
Hinweise
Bevor Sie ein Modell in AI Platform Prediction trainieren und bereitstellen können, müssen Sie einige Schritte ausführen:
- Lokale Entwicklungsumgebung einrichten
- Google Cloud-Projekt einrichten, für das die Abrechnungsfunktion und die erforderlichen APIs aktiviert sind
- Cloud Storage-Bucket zum Speichern des Trainingspakets und des trainierten Modells erstellen
Lokale Entwicklungsumgebung einrichten
Für diese Anleitung benötigen Sie Folgendes:
- Python 3
- virtualenv
- Das Google Cloud SDK
Der Google Cloud-Leitfaden zum Einrichten einer Python-Entwicklungsumgebung enthält detaillierte Anweisungen zur Erfüllung dieser Anforderungen. Die folgenden Schritte sind eine Zusammenfassung dieser Anweisungen:
Installieren Sie virtualenv und erstellen Sie eine virtuelle Umgebung, die Python 3 verwendet.
Aktivieren Sie die Umgebung.
Führen Sie die Schritte im folgenden Abschnitt aus, um das Google Cloud SDK zu installieren.
Google Cloud-Projekt einrichten
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
GCP-Konto authentifizieren
Für die Einrichtung der Authentifizierung müssen Sie einen Dienstkontoschlüssel erstellen und eine Umgebungsvariable für den Dateipfad zum Dienstkontoschlüssel festlegen.
-
Erstellen Sie ein Dienstkonto:
-
Wechseln Sie in der Google Cloud Console zur Seite Dienstkonto erstellen.
- Geben Sie im Feld Dienstkontoname einen Namen ein.
- Optional: Geben Sie im Feld Dienstkontobeschreibung eine Beschreibung ein.
- Klicken Sie auf Erstellen.
- Klicken Sie auf das Feld Rolle auswählen. Wählen Sie unter Alle Rollen die Option AI Platform > AI Platform-Administrator aus.
- Klicken Sie auf Weitere Rolle hinzufügen.
-
Klicken Sie auf das Feld Rolle auswählen. Wählen Sie unter Alle Rollen die Option Storage > Storage-Objekt-Administrator.
-
Klicken Sie auf Fertig, um das Dienstkonto zu erstellen.
Schließen Sie das Browserfenster nicht. Sie verwenden es in der nächsten Aufgabe.
-
-
Erstellen Sie einen Dienstkontoschlüssel für die Authentifizierung:
- Klicken Sie in der Google Cloud Console auf die E-Mail-Adresse des von Ihnen erstellten Dienstkontos.
- Klicken Sie auf Schlüssel.
- Klicken Sie auf Schlüssel hinzufügen > Neuen Schlüssel erstellen.
- Klicken Sie auf Erstellen. Daraufhin wird eine JSON-Schlüsseldatei auf Ihren Computer heruntergeladen.
- Klicken Sie auf Schließen.
-
Legen Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS auf den Pfad der JSON-Datei fest, die Ihren Dienstkontoschlüssel enthält. Diese Variable gilt nur für Ihre aktuelle Shell-Sitzung. Wenn Sie eine neue Sitzung öffnen, müssen Sie die Variable noch einmal festlegen.
Cloud Storage-Bucket erstellen
Zum Bereitstellen einer benutzerdefinierten Vorhersageroutine müssen Sie die trainierten Modellartefakte und den benutzerdefinierten Code in Cloud Storage hochladen.
Legen Sie den Namen Ihres Cloud Storage-Buckets als Umgebungsvariable fest. Der Name muss in allen Cloud Storage-Buckets eindeutig sein:
BUCKET_NAME="your-bucket-name"
Wählen Sie eine Region aus, in der AI Platform Prediction verfügbar ist, und erstellen Sie eine weitere Umgebungsvariable.
REGION="us-central1"
Erstellen Sie in dieser Region einen Cloud Storage-Bucket und verwenden Sie später dieselbe Region für Training und Vorhersage. Führen Sie den folgenden Befehl aus, wenn noch kein Bucket vorhanden ist:
gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION
scikit-learn-Modell erstellen und trainieren
Häufig können Sie Daten nicht in ihrer Rohform verwenden, um ein Modell für maschinelles Lernen zu trainieren. Selbst wenn dies möglich ist, kann das Modell oft verbessert werden, wenn Sie die Daten vor der Verwendung für das Training vorverarbeiten.
Wenn Sie davon ausgehen, dass die Eingabe für die Vorhersage dasselbe Format wie Ihre Trainingsdaten hat, müssen Sie während des Trainings und der Vorhersage eine identische Vorverarbeitung anwenden, um zu gewährleisten, dass Ihr Modell konsistente Vorhersagen liefert.
In diesem Abschnitt erstellen Sie ein Vorverarbeitungsmodul, das Sie im Rahmen des Trainings verwenden. Dann exportieren Sie einen Präprozessor mit während des Trainings erlernten Eigenschaften, um diesen später in Ihrer benutzerdefinierten Vorhersageroutine zu verwenden.
Abhängigkeiten für lokales Training installieren
Lokales Training erfordert mehrere Abhängigkeiten:
pip install numpy>=1.16.0 scikit-learn==0.20.2
Präprozessor schreiben
Wenn Sie die Trainingsdaten so skalieren, dass jede numerische Merkmalspalte einen Mittelwert von 0 und eine Standardabweichung von 1 enthält, lässt sich das Modell möglicherweise verbessern.
Erstellen Sie die Datei preprocess.py
, die eine Klasse für diese Skalierung enthält:
import numpy as np
class MySimpleScaler(object):
def __init__(self):
self._means = None
self._stds = None
def preprocess(self, data):
if self._means is None: # during training only
self._means = np.mean(data, axis=0)
if self._stds is None: # during training only
self._stds = np.std(data, axis=0)
if not self._stds.all():
raise ValueError('At least one column has standard deviation of 0.')
return (data - self._means) / self._stds
Eine Instanz von MySimpleScaler
speichert die Mittelwerte und Standardabweichungen der einzelnen Feature-Spalten bei der ersten Verwendung. Danach nutzt es diese zusammenfassenden Statistiken zur Skalierung von Daten, die später neu hinzukommen.
Dadurch können Sie Eigenschaften der Trainingsdistribution speichern und für die identische Vorverarbeitung zur Vorhersagezeit verwenden.
Modell trainieren
Verwenden Sie als Nächstes preprocess.MySimpleScaler
, um die Iris-Daten vorzuverarbeiten, und trainieren Sie dann ein Modell mit scikit-learn.
Zum Abschluss exportieren Sie Ihr trainiertes Modell als joblib-Datei (.joblib
) und Ihre MySimpleScaler
-Instanz als Pickle-Datei (.pkl
):
import pickle
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib
from preprocess import MySimpleScaler
iris = load_iris()
scaler = MySimpleScaler()
X = scaler.preprocess(iris.data)
y = iris.target
model = RandomForestClassifier()
model.fit(X, y)
joblib.dump(model, 'model.joblib')
with open ('preprocessor.pkl', 'wb') as f:
pickle.dump(scaler, f)
Benutzerdefinierte Vorhersageroutine bereitstellen
Zum Bereitstellen einer benutzerdefinierten Vorhersageroutine für Vorhersagen mit Ihrem trainierten Modell müssen Sie folgende Schritte ausführen:
- Benutzerdefinierten Predictor zur Verarbeitung von Anfragen erstellen
- Paket mit dem Predictor und dem Vorverarbeitungsmodul erstellen
- Modellartefakte und benutzerdefinierten Code in Cloud Storage hochladen
- Benutzerdefinierte Vorhersageroutine in AI Platform Prediction bereitstellen
Benutzerdefinierten Predictor erstellen
Zum Bereitstellen einer benutzerdefinierten Vorhersageroutine müssen Sie eine Klasse erstellen, die die Predictor-Schnittstelle implementiert. Dadurch wird AI Platform Prediction mitgeteilt, wie Ihr Modell geladen und Vorhersageanfragen verarbeitet werden sollen.
Schreiben Sie den folgenden Code in predictor.py
:
import os
import pickle
import numpy as np
from sklearn.datasets import load_iris
from sklearn.externals import joblib
class MyPredictor(object):
def __init__(self, model, preprocessor):
self._model = model
self._preprocessor = preprocessor
self._class_names = load_iris().target_names
def predict(self, instances, **kwargs):
inputs = np.asarray(instances)
preprocessed_inputs = self._preprocessor.preprocess(inputs)
if kwargs.get('probabilities'):
probabilities = self._model.predict_proba(preprocessed_inputs)
return probabilities.tolist()
else:
outputs = self._model.predict(preprocessed_inputs)
return [self._class_names[class_num] for class_num in outputs]
@classmethod
def from_path(cls, model_dir):
model_path = os.path.join(model_dir, 'model.joblib')
model = joblib.load(model_path)
preprocessor_path = os.path.join(model_dir, 'preprocessor.pkl')
with open(preprocessor_path, 'rb') as f:
preprocessor = pickle.load(f)
return cls(model, preprocessor)
Neben der Verwendung des Präprozessors, den Sie während des Trainings definiert haben, führt dieser Predictor einen Nachbearbeitungsschritt aus, bei dem die Vorhersageausgabe von Klassenindexen (0
, 1
, 2
) in Label-Strings (den Namen der Blumenart) konvertiert wird.
Wenn der Predictor jedoch ein probabilities
-Schlüsselwortargument mit dem Wert True
empfängt, gibt er stattdessen ein Wahrscheinlichkeitsarray zurück. Darin wird die Wahrscheinlichkeit dafür angegeben, dass jede der drei Klassen (gemäß dem Modell) das richtige Label ist.
Im letzten Teil dieser Anleitung wird gezeigt, wie Sie während der Vorhersage ein Schlüsselwortargument angeben.
Paket mit benutzerdefiniertem Code erstellen
Sie müssen predictor.py
und preprocess.py
als .tar.gz
-Quelldistributionspaket verpacken und das Paket in AI Platform Prediction bereitstellen, damit der benutzerdefinierte Code für Vorhersagen verwendet werden kann.
Schreiben Sie folgende setup.py
-Datei, um Ihr Paket zu definieren:
from setuptools import setup
setup(
name='my_custom_code',
version='0.1',
scripts=['predictor.py', 'preprocess.py'])
Führen Sie dann den folgenden Befehl aus, um dist/my_custom_code-0.1.tar.gz
zu erstellen:
python setup.py sdist --formats=gztar
Modellartefakte und benutzerdefinierten Code in Cloud Storage hochladen
Bevor Sie Ihr Modell für Vorhersagen bereitstellen können, benötigt AI Platform Prediction Zugriff auf die folgenden Dateien in Cloud Storage:
model.joblib
(Modellartefakt)preprocessor.pkl
(Modellartefakt)my_custom_code-0.1.tar.gz
(benutzerdefinierter Code)
Modellartefakte müssen zusammen in einem Modellverzeichnis gespeichert werden, auf das der Predictor als model_dir
-Argument in seiner Klassenmethode from_path
zugreifen kann.
Der benutzerdefinierte Code muss sich nicht im selben Verzeichnis befinden. Führen Sie die folgenden Befehle aus, um Ihre Dateien hochzuladen:
gcloud storage cp ./dist/my_custom_code-0.1.tar.gz gs://$BUCKET_NAME/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz
gcloud storage cp model.joblib preprocessor.pkl gs://$BUCKET_NAME/custom_prediction_routine_tutorial/model/
Benutzerdefinierte Vorhersageroutine bereitstellen
Erstellen Sie eine Modellressource und eine Versionsressource, um die benutzerdefinierte Vorhersageroutine bereitzustellen. Definieren Sie zuerst Umgebungsvariablen mit Ihren Ressourcennamen:
MODEL_NAME='IrisPredictor'
VERSION_NAME='v1'
Erstellen Sie dann das Modell:
gcloud ai-platform models create $MODEL_NAME \
--regions $REGION
Als Nächstes erstellen Sie eine Version. Geben Sie in diesem Schritt Pfade zu den Artefakten und dem benutzerdefinierten Code an, die Sie in Cloud Storage hochgeladen haben:
gcloud components install beta
gcloud beta ai-platform versions create $VERSION_NAME \
--model $MODEL_NAME \
--runtime-version 1.13 \
--python-version 3.5 \
--origin gs://$BUCKET_NAME/custom_prediction_routine_tutorial/model/ \
--package-uris gs://$BUCKET_NAME/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz \
--prediction-class predictor.MyPredictor
Weitere Informationen zu den Optionen, die Sie beim Bereitstellen einer benutzerdefinierten Vorhersageroutine angeben müssen, finden Sie hier.
Onlinevorhersagen bereitstellen
Testen Sie Ihre Bereitstellung mit einer Anfrage für eine Onlinevorhersage. Dafür installieren Sie zuerst die Google API-Clientbibliothek für Python:
pip install --upgrade google-api-python-client
Senden Sie dann zwei Instanzen von Iris-Daten an die bereitgestellte Version:
import googleapiclient.discovery
instances = [
[6.7, 3.1, 4.7, 1.5],
[4.6, 3.1, 1.5, 0.2],
]
service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}/versions/{}'.format(PROJECT_ID, MODEL_NAME, VERSION_NAME)
response = service.projects().predict(
name=name,
body={'instances': instances}
).execute()
if 'error' in response:
raise RuntimeError(response['error'])
else:
print(response['predictions'])
['versicolor', 'setosa']
Schlüsselwortargumente senden
Wenn Sie eine Vorhersageanfrage an eine benutzerdefinierte Vorhersageroutine senden, können Sie zusätzliche Felder im Anfragetext angeben.
Die Methode predict
des Predictors empfängt diese als Felder des **kwargs
-Wörterbuchs.
Mit dem folgenden Code wird dieselbe Anfrage wie zuvor gesendet. Dieses Mal wird im Anfragetext jedoch das Feld probabilities
hinzugefügt:
response = service.projects().predict(
name=name,
body={'instances': instances, 'probabilities': True}
).execute()
if 'error' in response:
raise RuntimeError(response['error'])
else:
print(response['predictions'])
[[0.0, 1.0, 0.0], [1.0, 0.0, 0.0]]
Bereinigen
Wenn Sie alle für dieses Projekt verwendeten GCP-Ressourcen bereinigen möchten, können Sie das GCP-Projekt löschen, das Sie für diese Anleitung verwendet haben.
Alternativ können Sie mit den folgenden Befehlen einzelne Ressourcen bereinigen:
# Delete version resource
gcloud ai-platform versions delete $VERSION_NAME --quiet --model $MODEL_NAME
# Delete model resource
gcloud ai-platform models delete $MODEL_NAME --quiet
# Delete Cloud Storage objects that were created
gcloud storage rm gs://$BUCKET_NAME/custom_prediction_routine_tutorial --recursive
Weitere Informationen
- Benutzerdefinierte Vorhersageroutinen
- Modell exportieren, um Vorhersagen ohne benutzerdefinierte Vorhersageroutine bereitzustellen