Routine di previsione personalizzate

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Le routine di previsione personalizzate ti consentono di determinare quale codice viene eseguito quando invii una richiesta di previsione online ad AI Platform Prediction.

Quando esegui il deployment di una risorsa di versione in AI Platform Prediction senza utilizzare una routine di previsione personalizzata, gestisce le richieste di previsione eseguendo l'operazione di previsione del framework di machine learning utilizzato per l'addestramento.

Ma quando esegui il deployment di una routine di previsione personalizzata come risorsa di versione, puoi indicare ad AI Platform Prediction di eseguire codice Python personalizzato in risposta a ogni richiesta di previsione ricevuta. Puoi pre-elaborare l'input della previsione prima che il modello addestrato esegua la previsione oppure puoi elaborare post-previsione della previsione del modello prima di inviare il risultato della previsione.

Per creare una routine di previsione personalizzata, devi fornire due parti in AI Platform Prediction quando crei la versione del modello:

  • Una directory del modello in Cloud Storage, che contiene gli artefatti che devono essere utilizzati per la previsione.

  • Un pacchetto di distribuzione di origine Python .tar.gz in Cloud Storage contenente l'implementazione dell'interfaccia del predittore e di qualsiasi altro codice personalizzato che vuoi utilizzare con AI Platform Prediction al momento della previsione.

Puoi eseguire il deployment di una routine di previsione personalizzata solo se utilizzi un tipo di macchina legacy (MLS1) per la versione del tuo modello.

Carica artefatti modello nella directory dei modelli

Segui la guida al deployment dei modelli per caricare il tuo modello addestrato in Cloud Storage, insieme agli altri file che forniscono dati o statefulfulness per consentire a AI Platform Prediction di utilizzare durante la previsione.

La dimensione totale del file degli artefatti del modello di cui esegui il deployment in AI Platform Prediction deve essere 500 MB o inferiore.

Puoi caricare il modello di machine learning addestrato nella directory dei modelli come TensorFlow SavedModel, file model.joblib, file model.pkl o file model.bst, ma puoi anche fornire il modello come file HDF5 contenente un modello tf.kerasaddestrato o in un formato serializzato diverso.

Puoi anche includere un file pickle con un'istanza di una classe di pre-responsabile personalizzata che contiene lo stato serializzato dell'addestramento.

Ad esempio, considera il seguente preprocessore, definito nel file denominato preprocess.py:

import numpy as np

class ZeroCenterer(object):
    """Stores means of each column of a matrix and uses them for preprocessing.
    """

    def __init__(self):
        """On initialization, is not tied to any distribution."""
        self._means = None

    def preprocess(self, data):
        """Transforms a matrix.

        The first time this is called, it stores the means of each column of
        the input. Then it transforms the input so each column has mean 0. For
        subsequent calls, it subtracts the stored means from each column. This
        lets you 'center' data at prediction time based on the distribution of
        the original training data.

        Args:
            data: A NumPy matrix of numerical data.

        Returns:
            A transformed matrix with the same dimensions as the input.
        """
        if self._means is None:  # during training only
            self._means = np.mean(data, axis=0)
        return data - self._means

Durante l'addestramento su un set di dati numerico, il preprocessore centra i dati intorno a 0 sottraendo la media di ogni colonna da ogni valore nella colonna. Quindi, puoi esportare l'istanza del pre-responsabile come file di pickle, preprocessor.pkl, che conserva i mezzi di ogni colonna calcolata dai dati di addestramento.

Durante la previsione, una routine di previsione personalizzata può caricare il preprocessore da questo file per eseguire una trasformazione identica nell'input della previsione.

Per scoprire come utilizzare un preprocessore stateful come questo nella tua routine di previsione personalizzata, leggi la sezione successiva, in cui viene descritto come implementare l'interfaccia Predittore.

Per vedere un esempio completo di utilizzo di un preprocessore stateful durante l'addestramento e la previsione, leggi Creare una routine di previsione personalizzata con Krisa o Creare una routine di previsione personalizzata con scisci-learn.

Crea il tuo predittore

Indica ad AI Platform Prediction come gestire le richieste di previsione fornendole una classe Predictor. Questo è un corso che implementa la seguente interfaccia:

class Predictor(object):
    """Interface for constructing custom predictors."""

    def predict(self, instances, **kwargs):
        """Performs custom prediction.

        Instances are the decoded values from the request. They have already
        been deserialized from JSON.

        Args:
            instances: A list of prediction input instances.
            **kwargs: A dictionary of keyword args provided as additional
                fields on the predict request body.

        Returns:
            A list of outputs containing the prediction results. This list must
            be JSON serializable.
        """
        raise NotImplementedError()

    @classmethod
    def from_path(cls, model_dir):
        """Creates an instance of Predictor using the given path.

        Loading of the predictor should be done in this method.

        Args:
            model_dir: The local directory that contains the exported model
                file along with any additional files uploaded when creating the
                version resource.

        Returns:
            An instance implementing this Predictor class.
        """
        raise NotImplementedError()

I nodi di previsione di AI Platform Prediction utilizzano il metodo della classe from_path per caricare un'istanza del tuo predittore. Questo metodo deve caricare gli artefatti salvati nella directory del modello i cui contenuti vengono copiati da Cloud Storage in una posizione visualizzata dall'argomento model_dir.

Ogni volta che il deployment riceve una richiesta di previsione online, l'istanza della classe predittore restituita da from_path usa il suo metodo predict per generare previsioni. AI Platform Prediction serializza il valore restituito di questo metodo su JSON e lo invia come risposta alla richiesta di previsione.

Tieni presente che il metodo predict non ha bisogno di convertire l'input da JSON in oggetti Python o convertire l'output in JSON; AI Platform Prediction gestisce questo aspetto al di fuori del metodo predict.

AI Platform Prediction fornisce l'argomento instances analizzando il campo instances dal corpo della richiesta predict all'API AI Platform Training and Prediction. Analizza eventuali altri campi del corpo della richiesta e li fornisce al metodo predict come voci nel dizionario **kwargs. Per scoprire di più, leggi l'articolo su come strutturare una richiesta predict nell'API AI Platform Training and Prediction.

Continuando l'esempio della sezione precedente, supponiamo che la directory del modello contenga preprocessor.pkl (l'istanza sottaceto della classe ZeroCenterer) e un modello tf.keras addestrato esportato come model.h5 o un modello addestrato scikit-learn esportato come model.joblib.

A seconda del framework di machine learning utilizzato, implementa una delle seguenti classi di predittore in un file denominato predictor.py:

TensorFlow

import os
import pickle

import numpy as np
from tensorflow import keras

class MyPredictor(object):
    """An example Predictor for an AI Platform custom prediction routine."""

    def __init__(self, model, preprocessor):
        """Stores artifacts for prediction. Only initialized via `from_path`.
        """
        self._model = model
        self._preprocessor = preprocessor

    def predict(self, instances, **kwargs):
        """Performs custom prediction.

        Preprocesses inputs, then performs prediction using the trained Keras
        model.

        Args:
            instances: A list of prediction input instances.
            **kwargs: A dictionary of keyword args provided as additional
                fields on the predict request body.

        Returns:
            A list of outputs containing the prediction results.
        """
        inputs = np.asarray(instances)
        preprocessed_inputs = self._preprocessor.preprocess(inputs)
        outputs = self._model.predict(preprocessed_inputs)
        return outputs.tolist()

    @classmethod
    def from_path(cls, model_dir):
        """Creates an instance of MyPredictor using the given path.

        This loads artifacts that have been copied from your model directory in
        Cloud Storage. MyPredictor uses them during prediction.

        Args:
            model_dir: The local directory that contains the trained Keras
                model and the pickled preprocessor instance. These are copied
                from the Cloud Storage model directory you provide when you
                deploy a version resource.

        Returns:
            An instance of `MyPredictor`.
        """
        model_path = os.path.join(model_dir, 'model.h5')
        model = keras.models.load_model(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)

scikit-learn

import os
import pickle

import numpy as np
from sklearn.externals import joblib

class MyPredictor(object):
    """An example Predictor for an AI Platform custom prediction routine."""

    def __init__(self, model, preprocessor):
        """Stores artifacts for prediction. Only initialized via `from_path`.
        """
        self._model = model
        self._preprocessor = preprocessor

    def predict(self, instances, **kwargs):
        """Performs custom prediction.

        Preprocesses inputs, then performs prediction using the trained
        scikit-learn model.

        Args:
            instances: A list of prediction input instances.
            **kwargs: A dictionary of keyword args provided as additional
                fields on the predict request body.

        Returns:
            A list of outputs containing the prediction results.
        """
        inputs = np.asarray(instances)
        preprocessed_inputs = self._preprocessor.preprocess(inputs)
        outputs = self._model.predict(preprocessed_inputs)
        return outputs.tolist()

    @classmethod
    def from_path(cls, model_dir):
        """Creates an instance of MyPredictor using the given path.

        This loads artifacts that have been copied from your model directory in
        Cloud Storage. MyPredictor uses them during prediction.

        Args:
            model_dir: The local directory that contains the trained
                scikit-learn model and the pickled preprocessor instance. These
                are copied from the Cloud Storage model directory you provide
                when you deploy a version resource.

        Returns:
            An instance of `MyPredictor`.
        """
        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)

Nota che il metodo predict converte i risultati della previsione in un elenco con il metodo tolist, prima di restituirli. Gli array NumPy non sono serializzabili in JSON, quindi devi convertirli in elenchi di numeri (che sono serializzabili in JSON). In caso contrario, AI Prediction Prediction non invierà la risposta di previsione.

Pacchettizza il tuo predittore e le sue dipendenze

Devi pacchettizzare il predittore come pacchetto di distribuzione di origine .tar.gz. Poiché NumPy, TensorFlow e scikit-learn sono inclusi nell'immagine di runtime di AI Platform Prediction, non devi includere queste dipendenze nel tarball. Tuttavia, assicurati di includere una delle dipendenze del predittore che non sia preinstallata in AI Platform Prediction.

Nell'esempio precedente, devi includere preprocess.py nel pacchetto di distribuzione di origine, anche se il tuo predittore non lo importa in modo esplicito. In caso contrario, preprocessor = pickle.load(f) non riuscirà perché Python non riconoscerà la classe dell'istanza ZeroCenterer nel file pickle.

Il seguente setup.py mostra un modo per pacchettizzare questi script:

from setuptools import setup

setup(
    name='my_custom_code',
    version='0.1',
    scripts=['predictor.py', 'preprocess.py'])

Per pacchettizzare e caricare l'esempio di codice personalizzato descritto in questa pagina, procedi come segue:

  1. Crea i file preprocess.py, predictor.py e setup.py descritti nelle sezioni precedenti, tutti nella stessa directory. Vai alla directory nella shell.

  2. Esegui python setup.py sdist --formats=gztar per creare dist/my_custom_code-0.1.tar.gz.

  3. Carica questo tarball in una posizione temporanea in Cloud Storage.

    Non deve necessariamente corrispondere alla directory del modello. Se hai intenzione di eseguire l'iterazione e il deployment di più versioni della routine di previsione personalizzata, puoi caricare i pacchetti di codice personalizzati in una directory temporanea prescelta. Puoi aggiornare l'argomento version in setup.py quando aggiorni il codice per tenere traccia di versioni diverse.

    Il comando seguente mostra un modo per caricare il pacchetto di distribuzione di origine in Cloud Storage:

    gsutil cp dist/my_custom_code-0.1.tar.gz gs://YOUR_BUCKET/PATH_TO_STAGING_DIR/
    

Puoi fornire il codice per la tua routine di previsione personalizzata in uno o più pacchetti.

Esegui il deployment della tua routine di previsione personalizzata

Seleziona un'area geografica in cui è disponibile la previsione online e utilizza gcloud per creare una risorsa modello:

gcloud ai-platform models create MODEL_NAME{"</var>"}} \
  --regions CHOSEN_REGION

Assicurati che il componente gcloud beta sia aggiornato, quindi crea una risorsa di versione con particolare attenzione ai seguenti flag gcloud:

  • --origin: il percorso della directory del modello in Cloud Storage.
  • --package-uris: un elenco separato da virgole di tarball relativi al codice utente in Cloud Storage, incluso quello che contiene la classe Predittore.
  • --prediction-class: il nome completo della classe predittiva (MODULE_NAME.CLASS_NAME).
  • --framework: non specificare un framework durante il deployment di una routine di previsione personalizzata.
  • --runtime-version: le routine di previsione personalizzate sono disponibili nelle versioni di runtime da 1.4 a 2.9.

Il comando seguente mostra come creare una risorsa di versione in base ai file di esempio descritti nelle sezioni precedenti:

gcloud components install beta

gcloud beta ai-platform versions create VERSION_NAME \
  --model MODEL_NAME{"</var>"}} \
  --runtime-version 2.9 \
  --python-version 3.7 \
  --origin gs://YOUR_BUCKET/PATH_TO_MODEL_DIR \
  --package-uris gs://YOUR_BUCKET/PATH_TO_STAGING_DIR/my_custom_code-0.1.tar.gz \
  --prediction-class predictor.MyPredictor

Per scoprire di più sulla creazione di modelli e versioni in dettaglio o per scoprire come crearli utilizzando la console Google Cloud anziché l'interfaccia a riga di comando gcloud, consulta la guida al deployment dei modelli.

Specifica un account di servizio

Quando crei una risorsa di versione, puoi facoltativamente specificare un account di servizio da utilizzare durante la previsione nella routine di previsione personalizzata. Questo ti consente di personalizzare le autorizzazioni per accedere ad altre risorse Google Cloud. Scopri di più su come specificare un account di servizio per la tua previsione personalizzata.

Passaggi successivi

  • Segui un tutorial sull'utilizzo di routine di previsione personalizzate con Kris o con scisci-learn per vedere un esempio più completo di come addestrare ed eseguire il deployment di un modello utilizzando una routine di previsione personalizzata.
  • Leggi la guida all'esportazione dei modelli per scoprire di più sull'esportazione degli artefatti per la previsione senza utilizzare una routine di previsione personalizzata.
  • Leggi la guida al deployment dei modelli per saperne di più sul deployment delle risorse model e version in AI Platform Prediction per pubblicare le previsioni.