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.
- Comprensione del concetto di pipeline di Azure Machine Learning
- Familiarità con l'uso della pipeline di Azure Machine Learning con l'interfaccia della riga di comando v2 e SDK v2.
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 oppureuri_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.
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.
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:
- Identificazione immagine per un elenco di file di immagine
- Classificazione Iris per dati Iris tabulari
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:
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.
Esempi di processi in parallelo nella pipeline
- Repository di esempio dell'interfaccia della riga di comando di Azure e YAML
- Repository di esempio dell'SDK
Passaggi successivi
- Per lo schema YAML dettagliato del processo in parallelo, vedere le Informazioni di riferimento di YAML per il processo in parallelo.
- Per informazioni su come eseguire l'onboarding dei dati in MLTABLE, vedere Creare un asset di dati mltable.
- Per informazioni su come attivare regolarmente la pipeline, vedere Come pianificare la pipeline.