Come usare il processo in parallelo nella pipeline (V2)

SI APPLICA A:Estensione per Machine Learning dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)

Il processo in parallelo consente agli utenti di accelerare l'esecuzione del processo distribuendo attività ripetute in cluster di calcolo multinodo potenti. Si consideri ad esempio lo scenario in cui si esegue un modello di rilevamento oggetti in un set di immagini di grandi dimensioni. Con il processo in parallelo di Azure Machine Learning, è possibile distribuire facilmente le immagini per eseguire codice personalizzato in parallelo in un cluster di calcolo specifico. La parallelizzazione potrebbe ridurre significativamente il costo orario. L'uso del processo in parallelo di Azure Machine Learning consente inoltre di semplificare e automatizzare il processo per renderlo più efficiente.

Prerequisito

Il processo in parallelo di Azure Machine Learning può essere usato solo come uno dei passaggi in un processo della pipeline. È quindi importante avere familiarità con l'uso delle pipeline. Per altre informazioni sulle pipeline di Azure Machine Learning, vedere gli articoli seguenti.

Perché sono necessari processi in parallelo?

Nel mondo reale i tecnici che si occupano di apprendimento automatico hanno sempre requisiti di scalabilità per le attività di training o inferenza. Ad esempio, quando un data scientist fornisce un singolo script per eseguire il training di un modello di stima delle vendite, i tecnici che si occupano di apprendimento automatico devono applicare questa attività di training a ogni singolo archivio. Durante questo processo di aumento del numero di istanze si verificano alcune problematiche, tra cui:

  • Pressione dovuta al ritardo causata da tempi di esecuzione lunghi.
  • Intervento manuale per gestire problemi imprevisti per continuare l'attività.

Il valore principale del processo in parallelo di Azure Machine Learning consiste nel suddividere una singola attività seriale in mini batch e inviare tali mini batch a più ambienti di calcolo per l'esecuzione in parallelo. Usando processi in parallelo, è possibile:

  • Ridurre significativamente il tempo di esecuzione end-to-end.
  • Usare le impostazioni di gestione automatica degli errori del processo in parallelo di Azure Machine Learning.

È consigliabile usare il processo in parallelo di Azure Machine Learning se:

  • Si prevede di eseguire il training di molti modelli sui dati partizionati.
  • Si vuole accelerare l'attività di inferenza batch su larga scala.

Preparare il processo in parallelo

A differenza di altri tipi di processi, un processo in parallelo richiede preparazione. Seguire le sezioni successive per preparare la creazione del processo in parallelo.

Dichiarare gli input da distribuire e l'impostazione della divisione dati

Il processo in parallelo richiede una sola origine di dati di input principali da suddividere ed elaborare in parallelo. I dati di input principali possono essere dati tabulari o un set di file. Tipi di input diversi possono avere un metodo di divisione dati diverso.

Nella tabella seguente viene illustrata la relazione tra i dati di input e il metodo di divisione dati:

Formato dati Tipo di input di Azure Machine Learning Modalità di input di Azure Machine Learning Metodo di divisione dati
Elenco di file mltable oppure
uri_folder
ro_mount o
download
Per dimensione (numero di file)
Per partizioni
Dati tabulari mltable dirette Per dimensione (dimensioni fisiche stimate)
Per partizioni

È possibile dichiarare i dati di input principali con l'attributo input_data nel codice YAML o Python SDK per il processo in parallelo. È anche possibile associarli a uno dei valori inputs definiti del processo in parallelo usando ${{inputs.<input name>}}. È quindi necessario definire il metodo di divisione dati per l'input principale compilando un attributo diverso:

Metodo di divisione dati Attribute name Tipo di attributo Esempio di processo
Per dimensioni mini_batch_size string Stima batch Iris
Per partizioni partition_keys Elenco di stringhe Stima delle vendite di succo d'arancia

SI APPLICA A: estensione ml dell’interfaccia della riga di comando di Azure v2 (corrente)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

Dopo aver definito l'impostazione della divisione dei dati, è possibile configurare il numero di risorse per la parallelizzazione compilando i due attributi seguenti:

Attribute name Type Descrizione Default value
instance_count integer Numero di nodi da usare per il processo. 1
max_concurrency_per_instance integer Numero di processori in ogni nodo. Per una risorsa di calcolo di GPU, il valore predefinito è 1.
Per una risorsa di calcolo della CPU, il valore predefinito è il numero di core.

Questi due attributi interagiscono con il cluster di calcolo specificato.

Diagramma che mostra il funzionamento dei dati distribuiti nel processo in parallelo.

Codice di esempio per impostare due attributi:

SI APPLICA A: estensione ml dell’interfaccia della riga di comando di Azure v2 (corrente)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

Nota

Se si usano mltable tabulari come dati di input principali, è necessario avere il file di specifica MLTABLE con la sezione transformations - read_delimited compilata nel percorso specifico. Per altri esempi, vedere Creare un asset di dati mltable

Implementare funzioni predefinite nello script di immissione

Lo script di immissione è un singolo file Python in cui l'utente deve implementare tre funzioni predefinite con codice personalizzato. Il processo in parallelo di Azure Machine Learning segue il diagramma seguente per eseguirli in ogni processore.

Diagramma che mostra il funzionamento dello script di immissione nel processo in parallelo.

Nome della funzione Richiesto Descrzione Input Restituzione
Init() Y Usare questa funzione per la preparazione comune prima di iniziare a eseguire mini batch. Usarla ad esempio per caricare il modello in un oggetto globale. -- --
Run(mini_batch) Y Implementa la logica di esecuzione principale per mini_batches. mini_batch:
Dataframe Pandas se i dati di input sono dati tabulari.
Elenco del percorso del file se i dati di input sono una directory.
Dataframe, elenco o tupla.
Shutdown() N Funzione facoltativa per eseguire operazioni di pulizia personalizzate prima di restituire la risorsa di calcolo al pool. -- --

Per ottenere altri dettagli, vedere gli esempi di script di immissione seguenti:

Quando lo script di immissione è pronto, è possibile impostare i due attributi seguenti per usarlo nel processo in parallelo:

Attribute name Type Descrizione Default value
code string Percorso locale della directory del codice sorgente da caricare e usare per il processo.
entry_script string File Python che contiene l'implementazione di funzioni parallele predefinite.

Codice di esempio per impostare due attributi:

SI APPLICA A: estensione ml dell’interfaccia della riga di comando di Azure v2 (corrente)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

  task:
    type: run_function
    code: "./script"
    entry_script: iris_prediction.py
    environment:
      name: "prs-env"
      version: 1
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04
      conda_file: ./environment/environment_parallel.yml
    program_arguments: >-
      --model ${{inputs.score_model}}
      --error_threshold 5
      --allowed_failed_percent 30
      --task_overhead_timeout 1200
      --progress_update_timeout 600
      --first_task_creation_timeout 600
      --copy_logs_to_parent True
      --resource_monitor_interva 20
    append_row_to: ${{outputs.job_output_file}}

Importante

La funzione Run(mini_batch) richiede la restituzione di un dataframe, un elenco o una tupla. Il processo in parallelo userà il conteggio di tali elementi restituiti per misurare gli elementi con esito positivo in tale mini batch. Idealmente, il numero di mini batch deve essere uguale al conteggio degli elenchi restituiti se tutti gli elementi sono stati elaborati correttamente in questo mini batch.

Importante

Se si vogliono analizzare gli argomenti nella funzione Init() o Run(mini_batch), usare "parse_known_args" anziché "parse_args" per evitare eccezioni. Vedere l'esempio iris_score per lo script di immissione con parser di argomenti.

Importante

Se si usa mltable come dati di input principali, è necessario installare la libreria "mltable" nell'ambiente. Vedere la riga 9 di questo file conda di esempio.

Prendere in considerazione le impostazioni di automazione

Il processo in parallelo di Azure Machine Learning espone numerose impostazioni per controllare automaticamente il processo senza intervento manuale. Per informazioni dettagliate, vedere la tabella seguente.

Chiave Type Descrizione Valori consentiti Valore predefinito Impostato nell'attributo Impostato negli argomenti del programma
mini batch error threshold integer Definisce il numero di mini batch non riusciti che potrebbero essere ignorati in questo processo in parallelo. Se il numero di mini batch non riusciti è superiore a questa soglia, il processo in parallelo verrà contrassegnato come non riuscito.

Il mini batch viene contrassegnato come non riuscito se:
- Il numero di elementi restituiti da run() è inferiore al numero di input di mini batch.
- Vengono intercettate eccezioni nel codice run() personalizzato.

"-1" è il numero predefinito e indica che tutti i mini batch non riusciti durante il processo in parallelo verranno ignorati.
[-1, int.max] -1 mini_batch_error_threshold N/D
mini batch max retries integer Definisce il numero di tentativi quando il mini batch ha esito negativo o si verifica il timeout. Se tutti i tentativi non sono riusciti, il mini batch verrà contrassegnato come non riuscito per il calcolo mini_batch_error_threshold. [0, int.max] 2 retry_settings.max_retries N/D
mini batch timeout integer Definisce il timeout in secondi per l'esecuzione di una funzione run() personalizzata. Se il tempo di esecuzione è superiore a questa soglia, il mini batch verrà interrotto e contrassegnato come mini batch non riuscito per attivare nuovi tentativi. (0, 259200] 60 retry_settings.timeout N/D
item error threshold integer Soglia di elementi non riusciti. Gli elementi non riusciti vengono conteggiati in base al divario numerico tra gli input e gli elementi restituiti da ogni mini batch. Se la somma degli elementi non riusciti è superiore a questa soglia, il processo in parallelo verrà contrassegnato come non riuscito.

Nota: "-1" è il numero predefinito e indica che tutti gli errori durante il processo in parallelo verranno ignorati.
[-1, int.max] -1 N/D --error_threshold
allowed failed percent integer Simile a mini_batch_error_threshold, ma usa la percentuale di mini batch non riusciti anziché il conteggio. [0, 100] 100 N/D --allowed_failed_percent
overhead timeout integer Timeout in secondi per l'inizializzazione di ogni mini batch. Ad esempio, caricaremento dei dati del mini batch e passaggio alla funzione run(). (0, 259200] 600 N/D --task_overhead_timeout
progress update timeout integer Timeout in secondi per il monitoraggio dello stato di avanzamento dell'esecuzione di mini batch. Se non vengono ricevuti aggiornamenti dello stato entro questa impostazione di timeout, il processo in parallelo verrà contrassegnato come non riuscito. (0, 259200] Calcolato dinamicamente da altre impostazioni. N/D --progress_update_timeout
first task creation timeout integer Timeout in secondi per il monitoraggio del tempo tra l'avvio del processo e l'esecuzione del primo mini batch. (0, 259200] 600 N/D --first_task_creation_timeout
logging level string Definisce il livello di log di cui verrà eseguito il dump nei file di log utente. INFO, AVVISO o DEBUG INFO logging_level N/D
append row to string Aggrega tutti i valori restituiti da ogni esecuzione di mini batch e li restituisce come output in questo file. Può fare riferimento a uno degli output del processo in parallelo usando l'espressione ${{outputs.<output_name>}} task.append_row_to N/D
copy logs to parent string Opzione booleana per specificare se copiare lo stato del processo, la panoramica e i log nel processo della pipeline padre. True o False Falso N/D --copy_logs_to_parent
resource monitor interval integer Intervallo di tempo in secondi per eseguire il dump dell'utilizzo delle risorse del nodo (ad esempio CPU, memoria) nella cartella di log nel percorso "logs/sys/perf".

Nota: i log delle risorse di dump frequenti rallentano leggermente la velocità di esecuzione del mini batch. Impostare questo valore su "0" per interrompere il dump dell'utilizzo delle risorse.
[0, int.max] 600 N/D --resource_monitor_interval

Codice di esempio per aggiornare queste impostazioni:

SI APPLICA A: estensione ml dell’interfaccia della riga di comando di Azure v2 (corrente)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

  task:
    type: run_function
    code: "./script"
    entry_script: iris_prediction.py
    environment:
      name: "prs-env"
      version: 1
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04
      conda_file: ./environment/environment_parallel.yml
    program_arguments: >-
      --model ${{inputs.score_model}}
      --error_threshold 5
      --allowed_failed_percent 30
      --task_overhead_timeout 1200
      --progress_update_timeout 600
      --first_task_creation_timeout 600
      --copy_logs_to_parent True
      --resource_monitor_interva 20
    append_row_to: ${{outputs.job_output_file}}

Creare un processo in parallelo nella pipeline

SI APPLICA A: estensione ml dell’interfaccia della riga di comando di Azure v2 (corrente)

È possibile creare il processo in parallelo inline con il processo della pipeline:

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: iris-batch-prediction-using-parallel
description: The hello world pipeline job with inline parallel job
tags:
  tag: tagvalue
  owner: sdkteam

settings:
  default_compute: azureml:cpu-cluster

jobs:
  batch_prediction:
    type: parallel
    compute: azureml:cpu-cluster
    inputs:
      input_data: 
        type: mltable
        path: ./neural-iris-mltable
        mode: direct
      score_model: 
        type: uri_folder
        path: ./iris-model
        mode: download
    outputs:
      job_output_file:
        type: uri_file
        mode: rw_mount

    input_data: ${{inputs.input_data}}
    mini_batch_size: "10kb"
    resources:
        instance_count: 2
    max_concurrency_per_instance: 2

    logging_level: "DEBUG"
    mini_batch_error_threshold: 5
    retry_settings:
      max_retries: 2
      timeout: 60

    task:
      type: run_function
      code: "./script"
      entry_script: iris_prediction.py
      environment:
        name: "prs-env"
        version: 1
        image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04
        conda_file: ./environment/environment_parallel.yml
      program_arguments: >-
        --model ${{inputs.score_model}}
        --error_threshold 5
        --allowed_failed_percent 30
        --task_overhead_timeout 1200
        --progress_update_timeout 600
        --first_task_creation_timeout 600
        --copy_logs_to_parent True
        --resource_monitor_interva 20
      append_row_to: ${{outputs.job_output_file}}

Inviare il processo della pipeline e controllare il passaggio parallelo nell'interfaccia utente dello studio

SI APPLICA A: estensione ml dell’interfaccia della riga di comando di Azure v2 (corrente)

È possibile inviare il processo della pipeline con un passaggio parallelo usando il comando dell'interfaccia della riga di comando:

az ml job create --file pipeline.yml

Dopo aver inviato il processo della pipeline, il widget dell'SDK o dell'interfaccia della riga di comando fornirà un collegamento URL Web all'interfaccia utente dello studio. Il collegamento porterà alla visualizzazione del grafico della pipeline per impostazione predefinita. Selezionare due volte il passaggio parallelo per aprire il pannello destro del processo in parallelo.

Per controllare le impostazioni del processo in parallelo, passare alla scheda Parametri, espandere Impostazioni di esecuzione e vedere la sezione Parallelo:

Screenshot di studio di Azure Machine Learning nella scheda dei processi che mostra le impostazioni del processo in parallelo.

Per eseguire il debug dell'errore del processo in parallelo, passare alla scheda Output e log, espandere la cartella logs dalle directory di output a sinistra e controllare il file job_result.txt per capire perché il processo in parallelo non è riuscito. Per altre informazioni sulla struttura di registrazione del processo in parallelo, vedere il file readme.txt nella stessa cartella.

Screenshot di studio di Azure Machine Learning nella scheda dei processi che mostra i risultati del processo in parallelo.

Esempi di processi in parallelo nella pipeline

Passaggi successivi