Richiedere previsioni batch

Se non hai bisogno di previsioni immediate o se hai un numero elevato di istanze per le quali ottenere le previsioni, puoi utilizzare il servizio di previsione batch. Questa pagina descrive come avviare i job di previsione in batch di AI Platform Prediction. AI Platform Prediction supporta solo l'ottenimento di previsioni batch dai modelli TensorFlow.

Scopri di più sulla previsione online e batch o consulta una panoramica dei concetti di previsione.

Prima di iniziare

Per richiedere le previsioni, devi prima:

  • Crea una risorsa modello e una risorsa versione o inserisci un SavedModel di TensorFlow in una posizione Cloud Storage a cui il tuo progetto può accedere.

  • Configura una posizione Cloud Storage a cui il tuo progetto ha accesso per:

    • File di dati di input. Possono essere presenti più posizioni e il progetto deve essere autorizzato a leggere da ciascuna.

    • File di output. Puoi specificare un solo percorso di output e il tuo progetto deve essere autorizzato a scrivere dati al suo interno.

  • Verifica che il file di input sia nel formato corretto per la previsione batch.

Configurazione di un job di previsione batch

Per avviare il job di previsione batch, devi raccogliere alcuni dati di configurazione. Si tratta degli stessi dati contenuti nell'oggetto PredictionInput che utilizzi quando chiami direttamente l'API:

Formato dei dati

Il tipo di formato di input utilizzato per i file di input. Tutti i file di input per un determinato job devono utilizzare lo stesso formato di dati. Imposta uno di questi valori:

JSON

I file di input sono in testo normale con un'istanza su ogni riga. Si tratta del formato descritto nella pagina dei concetti di previsione.

TF_RECORD

I file di input utilizzano il formato TFRecord di TensorFlow.

TF_RECORD_GZIP

I file di input sono file TFRecord compressi con GZIP.

Percorsi di input

Gli URI dei file di dati di input, che devono trovarsi in posizioni Cloud Storage. Puoi specificare:

  • Percorsi di file specifici: 'gs://path/to/my/input/file.json'.

  • Percorsi alle directory con un singolo asterisco come carattere jolly per indicare tutti i file al loro interno: 'gs://path/to/my/input/*'.

  • Percorsi di nomi file parziali con un singolo asterisco jolly alla fine per indicare tutti i file che iniziano con la sequenza fornita:'gs://path/to/my/input/file*'.

Puoi combinare più URI. In Python ne crei un elenco. Se utilizzi Google Cloud CLI o chiami direttamente l'API, puoi elencare più URI separati da virgole, ma senza spazi tra di loro. Questo è il formato corretto per l'indicatore --input-paths:

 --input-paths gs://a/directory/of/files/*,gs://a/single/specific/file.json,gs://a/file/template/data*
Percorso di output

Il percorso della posizione Cloud Storage in cui vuoi che il servizio di previsione salvi i risultati. Il progetto deve disporre delle autorizzazioni di scrittura in questa posizione.

Nome del modello e nome della versione

Il nome del modello e, facoltativamente, la versione da cui vuoi ottenere le predizioni. Se non specifichi una versione, viene utilizzata la versione predefinita del modello. Per le previsioni in batch, la versione deve utilizzare il tipo di macchina mls1-c1-m2.

Se fornisci un URI modello (vedi la sezione seguente), ometti questi campi.

URI del modello

Puoi ottenere le previsioni da un modello di cui non è stato eseguito il deployment in AI Platform Prediction specificando l'URI del modello salvato che vuoi utilizzare. Il modello SavedModel deve essere archiviato su Cloud Storage.

In sintesi, hai tre opzioni per specificare il modello da utilizzare per la previsione batch. Puoi utilizzare:

  • Il nome del modello da solo per utilizzare la versione predefinita del modello.

  • I nomi del modello e della versione per utilizzare una versione specifica del modello.

  • L'URI del modello per utilizzare un SavedModel su Cloud Storage, ma non di cui è stato eseguito il deployment in AI Platform Prediction.

Regione

La regione Google Compute Engine in cui vuoi eseguire il job. Per ottenere le migliori prestazioni, devi eseguire il job di previsione e archiviare i dati di input e di output nella stessa regione, in particolare per i set di dati molto grandi. La previsione batch di AI Platform Prediction è disponibile nelle seguenti regioni:

  -   us-central1
  -   us-east1
  -   europe-west1
  -   asia-east1

Per comprendere appieno le regioni disponibili per i servizi di AI Platform Prediction, tra cui l'addestramento dei modelli e la previsione online, leggi la guida alle regioni.

Nome job

Un nome per il job, che deve:

  • Contenere solo lettere maiuscole e minuscole (sensibile alle maiuscole), cifre e trattini bassi.
  • Deve iniziare con una lettera.
  • Non contenere più di 128 caratteri.
  • Deve essere univoco tra tutti i nomi dei job di addestramento e di previsione batch mai utilizzati nel tuo progetto. Sono inclusi tutti i job che hai creato nel progetto, indipendentemente dal loro stato o dal loro esito.
Dimensione del batch (facoltativa)

Il numero di record per batch. Il servizio memorizza in memoria un numero di record pari a batch_size prima di invocare il modello. Se non specificato, il valore predefinito è 64.

Etichette (facoltative)

Puoi aggiungere etichette ai job per organizzarli e ordinarli in categorie quando visualizzi o monitori le risorse. Ad esempio, puoi ordinare i job per team (aggiungendo etichette come engineering o research) o per fase di sviluppo (prod o test). Per aggiungere etichette al job di previsione, fornisci un elenco di coppie KEY=VALUE.

Numero massimo di worker (facoltativo)

Il numero massimo di nodi di previsione da utilizzare nel cluster di elaborazione per questo job. In questo modo puoi impostare un limite superiore per la funzionalità di scalabilità automatica della previsione batch. Se non specifichi un valore, il valore predefinito è 10. Indipendentemente dal valore specificato, la scalabilità è limitata dalla quota dei nodi di previsione.

Versione del runtime (facoltativa)

La versione di AI Platform Prediction da utilizzare per il job. Questa opzione è inclusa per consentirti di specificare una versione di runtime da utilizzare con i modelli non di cui non è stato eseguito il deployment in AI Platform Prediction. Devi sempre omettere questo valore per le versioni del modello di cui è stato eseguito il deployment, in modo da indicare al servizio di utilizzare la stessa versione specificata al momento del deployment.

Nome della firma (facoltativo)

Se il modello salvato ha più firme, utilizza questa opzione per specificare un nome personalizzato della firma di TensorFlow, che ti consente di selezionare una mappa di input/output alternativa definita nel modello SavedModel di TensorFlow. Consulta la documentazione di TensorFlow su SavedModel per una guida all'utilizzo delle firme e la guida per specificare i risultati di un modello personalizzato. Il valore predefinito è DEFAULT_SERVING_SIGNATURE_DEF_KEY, che ha il valore serving_default.

Gli esempi seguenti definiscono variabili per contenere i dati di configurazione.

gcloud

Non è necessario creare variabili quando utilizzi lo strumento a riga di comando gcloud per avviare un job. Tuttavia, se lo fai qui, il comando di invio del job è molto più facile da inserire e leggere.

DATA_FORMAT="text" # JSON data format
INPUT_PATHS='gs://path/to/your/input/data/*'
OUTPUT_PATH='gs://your/desired/output/location'
MODEL_NAME='census'
VERSION_NAME='v1'
REGION='us-east1'
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="census_batch_predict_$now"
MAX_WORKER_COUNT="20"
BATCH_SIZE="32"
LABELS="team=engineering,phase=test,owner=sara"

Python

Quando utilizzi la libreria client dell'API di Google per Python, puoi utilizzare i dizionari Python per rappresentare le risorse Job e PredictionInput.

  1. Formatta il nome del progetto e il nome del modello o della versione con la sintassi utilizzata dalle API REST di AI Platform Prediction:

    • project_name -> 'projects/project_name'
    • model_name -> 'projects/project_name/models/model_name'
    • version_name -> 'projects/project_name/models/model_name/versions/version_name'
  2. Crea un dizionario per la risorsa Job e compilalo con due elementi:

    • Una chiave denominata 'jobId' con il nome del job che vuoi utilizzare come valore.

    • Una chiave denominata 'predictionInput' che contiene un altro oggetto dizionario contenente tutti i membri obbligatori di PredictionInput e tutti i membri facoltativi che vuoi utilizzare.

    Il seguente esempio mostra una funzione che prende le informazioni di configurazione come variabili di input e restituisce il corpo della richiesta di previsione. Oltre alle informazioni di base, l'esempio genera anche un identificatore di job univoco in base al nome del progetto, al nome del modello e all'ora corrente.

    import time
    import re
    
    def make_batch_job_body(project_name, input_paths, output_path,
            model_name, region, data_format='JSON',
            version_name=None, max_worker_count=None,
            runtime_version=None):
    
        project_id = 'projects/{}'.format(project_name)
        model_id = '{}/models/{}'.format(project_id, model_name)
        if version_name:
            version_id = '{}/versions/{}'.format(model_id, version_name)
    
        # Make a jobName of the format "model_name_batch_predict_YYYYMMDD_HHMMSS"
        timestamp = time.strftime('%Y%m%d_%H%M%S', time.gmtime())
    
        # Make sure the project name is formatted correctly to work as the basis
        # of a valid job name.
        clean_project_name = re.sub(r'\W+', '_', project_name)
    
        job_id = '{}_{}_{}'.format(clean_project_name, model_name,
                               timestamp)
    
        # Start building the request dictionary with required information.
        body = {'jobId': job_id,
                'predictionInput': {
                    'dataFormat': data_format,
                    'inputPaths': input_paths,
                    'outputPath': output_path,
                    'region': region}}
    
        # Use the version if present, the model (its default version) if not.
        if version_name:
            body['predictionInput']['versionName'] = version_id
        else:
            body['predictionInput']['modelName'] = model_id
    
        # Only include a maximum number of workers or a runtime version if specified.
        # Otherwise let the service use its defaults.
        if max_worker_count:
            body['predictionInput']['maxWorkerCount'] = max_worker_count
    
        if runtime_version:
            body['predictionInput']['runtimeVersion'] = runtime_version
    
        return body
    

Invio di un job di previsione batch

L'invio del job è una semplice chiamata a projects.jobs.create o al suo equivalente dello strumento a riga di comando, gcloud ai-platform jobs submit prediction.

gcloud

L'esempio seguente utilizza le variabili definite nella sezione precedente per avviare la previsione in batch.

gcloud ai-platform jobs submit prediction $JOB_NAME \
    --model $MODEL_NAME \
    --input-paths $INPUT_PATHS \
    --output-path $OUTPUT_PATH \
    --region $REGION \
    --data-format $DATA_FORMAT

Python

L'avvio di un job di previsione batch con la libreria client delle API di Google per Python segue un pattern simile ad altre procedure dell'SDK client:

  1. Prepara il corpo della richiesta da utilizzare per la chiamata (come mostrato nella sezione precedente).

  2. Forma la richiesta chiamando ml.projects.jobs.create.

  3. Chiama execute sulla richiesta per ricevere una risposta, assicurandoti di controllare gli errori HTTP.

  4. Utilizza la risposta come dizionario per recuperare i valori dalla risorsa Job.

Puoi utilizzare la libreria client dell'API di Google per Python per chiamare l'API di formazione e previsione della piattaforma AI senza creare manualmente le richieste HTTP. Prima di eseguire il seguente esempio di codice, devi configurare l'autenticazione.

    import googleapiclient.discovery as discovery

    project_id = 'projects/{}'.format(project_name)

    ml = discovery.build('ml', 'v1')
    request = ml.projects().jobs().create(parent=project_id,
                                          body=batch_predict_body)

    try:
        response = request.execute()

        print('Job requested.')

        # The state returned will almost always be QUEUED.
        print('state : {}'.format(response['state']))

    except errors.HttpError as err:
        # Something went wrong, print out some information.
        print('There was an error getting the prediction results.' +
              'Check the details:')
        print(err._get_reason())

Monitoraggio del job di previsione batch

Il completamento di un job di previsione batch può richiedere molto tempo. Puoi monitorare l'avanzamento del job utilizzando la console Google Cloud:

  1. Vai alla pagina Job di previsione della piattaforma AI nella console Google Cloud:

    Vai alla pagina Job della console Google Cloud

  2. Fai clic sul nome del job nell'elenco ID job. Viene visualizzata la pagina Dettagli job.

  3. Lo stato corrente viene visualizzato con il nome del job nella parte superiore della pagina.

  4. Per maggiori dettagli, puoi fare clic su Visualizza log per visualizzare la voce del tuo job in Cloud Logging.

Esistono altri modi per monitorare l'avanzamento del job di previsione batch. Seguono gli stessi schemi del monitoraggio dei job di addestramento. Puoi trovare maggiori informazioni nella pagina che descrive come monitorare i job di addestramento. Potresti dover modificare leggermente le istruzioni per utilizzare i job di previsione, ma i meccanismi sono gli stessi.

Ottenere i risultati della previsione

Il servizio scrive le previsioni nella posizione Cloud Storage specificata. Esistono due tipi di file di output che potrebbero includere risultati interessanti:

  • I file denominati prediction.errors_stats-NNNNN-of-NNNNN contengono informazioni su eventuali problemi riscontrati durante il job.

  • I file JSON Lines denominati prediction.results-NNNNN-of-NNNNN contengono le previsioni stesse, come definite dall'output del modello.

I nomi file includono numeri di indice (mostrati sopra come "N" per ogni cifra) che indicano il numero totale di file che dovresti trovare. Ad esempio, un job con sei file di risultati include prediction.results-00000-of-00006 fino a prediction.results-00005-of-00006.

Ogni riga di ogni file di previsione è un oggetto JSON che rappresenta un singolo risultato di previsione. Puoi aprire i file di previsione con l'editor di testo che preferisci. Per una rapida occhiata alla riga di comando, puoi utilizzare gcloud storage cat:

gcloud storage cat $OUTPUT_PATH/prediction.results-NNNNN-of-NNNNN|less

Tieni presente che i risultati della previsione in genere non vengono visualizzati nello stesso ordine delle istanze di input, anche se utilizzi un solo file di input. Puoi trovare la previsione per un'istanza abbinando le chiavi dell'istanza.

Passaggi successivi