Richiesta di previsioni batch

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

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

Prima di iniziare

Per richiedere previsioni, devi prima:

  • Crea una risorsa del modello e una risorsa della versione o inserisci un modello di TensorFlow SavingModel in una località di Cloud Storage a cui può accedere il tuo progetto.

  • Configura una località di Cloud Storage a cui ha accesso il tuo progetto per:

    • File di dati di input. Può trattarsi di più posizioni e il progetto deve essere autorizzato a leggere da ognuna.

    • File di output. Puoi specificare un solo percorso di output e il progetto deve essere autorizzato a scrivervi dati.

  • 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, dovrai 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 dei dati. Imposta uno di questi valori:

JSON

I file di input sono in testo normale con un'istanza su ogni riga. Questo è il 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 di Cloud Storage. Puoi specificare:

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

  • Percorsi delle directory con un singolo carattere jolly asterisco, per indicare tutti i file nella directory: 'gs://path/to/my/input/*'.

  • Percorsi di nomi file parziali con un singolo carattere jolly asterisco 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, li fai un elenco. Se utilizzi Google Cloud CLI o chiami direttamente l'API, puoi elencare più URI, separati da virgole, ma senza spazi tra loro. Questo è il formato corretto per il flag --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 località Cloud Storage in cui il servizio di previsione deve salvare i risultati. Il progetto deve disporre delle autorizzazioni per scrivere in questa posizione.

Nome del modello e della versione

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

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

URI del modello

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

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

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

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

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

Regione

La regione di 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, soprattutto nel caso di set di dati di grandi dimensioni. 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, inclusi l'addestramento dei modelli e la previsione online, leggi la guida alle regioni.

Nome job

Un nome per il lavoro, che deve:

  • Contenere solo lettere maiuscole e minuscole miste, numeri e trattini bassi.
  • Inizia con una lettera.
  • Non contenere più di 128 caratteri.
  • Essere univoco tra tutti i nomi dei job di addestramento e previsione batch mai utilizzati nel progetto. Sono inclusi tutti i job creati nel progetto, indipendentemente dal loro successo o stato.
Dimensioni batch (facoltativo)

Il numero di record per batch. Il servizio eseguirà il buffering di batch_size numero di record in memoria prima di richiamare il modello. Se non specificato, il valore predefinito è 64.

Etichette (facoltative)

Puoi aggiungere etichette al job per organizzare e ordinare i job in categorie durante la visualizzazione o il monitoraggio delle 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 KEY=VALUE coppie.

Numero massimo di worker (facoltativo)

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

Versione 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 di cui non è stato eseguito il deployment su AI Platform Prediction. Devi sempre omettere questo valore per le versioni del modello di cui è stato eseguito il deployment, in modo che il servizio utilizzi la stessa versione specificata al momento del deployment della versione del modello.

Nome della firma (facoltativo)

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

I seguenti esempi definiscono le 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, questo rende 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 delle API di Google per Python, puoi utilizzare i dizionari Python per rappresentare le risorse Job e PredictionInput.

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

    • nome_progetto -> "progetti/nome_progetto"
    • nome_modello -> 'projects/nome_progetto/modelli/nome_modello'
    • nome_versione -> 'projects/nome_progetto/models/nome_modello/versioni/nome_versione'
  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 del dizionario che contiene tutti i membri obbligatori di PredictionInput ed eventuali membri facoltativi che vuoi utilizzare.

    L'esempio seguente 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 univoco del job basato sul nome del progetto, sul nome del modello e sull'ora attuale.

    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 il suo strumento a riga di comando equivalente, gcloud ai-platform Jobssend previsione.

gcloud

L'esempio seguente utilizza le variabili definite nella sezione precedente per avviare la previsione 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 (mostrato nella sezione precedente).

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

  3. La chiamata viene eseguita sulla richiesta per ricevere una risposta, assicurandosi di verificare la presenza di errori HTTP.

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

Puoi utilizzare la libreria client delle API di Google per Python per chiamare l'API AI Platform Training and Prediction 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 di AI Platform 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 attuale viene mostrato con il nome del job nella parte superiore della pagina.

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

Esistono altri modi per monitorare l'avanzamento del job di previsione batch. Seguono gli stessi pattern del monitoraggio dei job di addestramento. Nella pagina troverai ulteriori informazioni su come monitorare i job di addestramento. Potrebbe essere necessario modificare leggermente le istruzioni per lavorare con i job di previsione, ma i meccanismi sono gli stessi.

Recupero dei risultati della previsione

Il servizio scrive le previsioni nella località di Cloud Storage specificata. Esistono due tipi di output di file 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 definito dall'output del modello.

I nomi dei file includono numeri di indice (indicati in precedenza con una "N" per ogni cifra) che rilevano quanti file dovresti trovare in totale. Ad esempio, un job con sei file di risultati include da prediction.results-00000-of-00006 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 usare gsutil cat:

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

Ricorda che in genere i risultati della previsione 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 di istanza.

Passaggi successivi