Condividi tramite


Creare ed eseguire pipeline di Machine Learning usando componenti l'interfaccia della riga di comando di Azure Machine Learning

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

Questo articolo illustra come creare ed eseguire pipeline di Machine Learning usando l'interfaccia della riga di comando di Azure e i componenti. È possibile creare pipeline senza usare componenti, ma i componenti offrono flessibilità e abilitano il riutilizzo. Le pipeline di Azure Machine Learning possono essere definite in YAML ed eseguite dalla CLI, create in Python o composte nel Designer di Azure Machine Learning Studio tramite un'interfaccia utente di trascinamento e rilascio. Questo articolo è incentrato sull'interfaccia della riga di comando.

Prerequisiti

Letture preliminari consigliate

Crea la tua prima pipeline con dei componenti

Prima di tutto, si creerà una pipeline con componenti usando un esempio. In questo modo si ottiene un'impressione iniziale dell'aspetto di una pipeline e di un componente in Azure Machine Learning.

Nella directory cli/jobs/pipelines-with-components/basics del repository azureml-examples, passare alla sottodirectory 3b_pipeline_with_data. In questa directory sono presenti tre tipi di file. Questi sono i file che è necessario creare quando si compila la propria pipeline.

  • pipeline.yml. Questo file YAML definisce la pipeline di Machine Learning. Descrive come suddividere un'attività di Machine Learning completa in un flusso di lavoro con più passaggi. Si consideri, ad esempio, la semplice attività di Machine Learning dell'uso di dati cronologici per eseguire il training di un modello di previsione delle vendite. È possibile creare un flusso di lavoro sequenziale che contiene l'elaborazione dei dati, il training del modello e i passaggi di valutazione del modello. Ogni passaggio è un componente che dispone di un'interfaccia ben definita e che può essere sviluppato, testato e ottimizzato in modo indipendente. Il file YAML della pipeline definisce anche il modo in cui i sotto-passaggi si connettono ad altri passaggi della pipeline. Ad esempio, il passaggio di training del modello genera un file di modello e il file del modello viene passato a un passaggio di valutazione del modello.

  • component.yml. Questi file YAML definiscono i componenti. Contengono le informazioni seguenti:

    • Metadati: nome, nome visualizzato, versione, descrizione, tipo e così via. I metadati consentono di descrivere e gestire il componente.
    • Interfaccia: input e output. Ad esempio, un componente di addestramento del modello accetta i dati di addestramento e il numero di epoche come input e genera un file di modello addestrato come output. Dopo aver definito l'interfaccia, i diversi team possono sviluppare e testare il componente in modo indipendente.
    • Comando, codice e ambiente: comando, codice e ambiente per eseguire il componente. Il comando è il comando shell per eseguire il componente. Il codice fa in genere riferimento a una directory del codice sorgente. L'ambiente può essere un ambiente di Azure Machine Learning (curato o creato dal cliente), un'immagine Docker o un ambiente conda.
  • component_src. Si tratta delle directory del codice sorgente per componenti specifici. Contengono il codice sorgente eseguito nel componente. È possibile usare il linguaggio preferito, tra cui Python, R e altri. Il codice deve essere eseguito da un comando della shell. Il codice sorgente può richiedere alcuni input dalla riga di comando della shell per controllare la modalità di esecuzione di questo passaggio. Ad esempio, un passaggio di addestramento potrebbe richiedere dati di addestramento, tasso di apprendimento e numero di epoche per controllare il processo di addestramento. L'argomento di un comando della shell viene usato per passare input e output al codice.

A questo punto si creerà una pipeline usando l'esempio 3b_pipeline_with_data . Ogni file è illustrato più avanti nelle sezioni seguenti.

Per prima cosa, elencare le risorse di calcolo disponibili usando il comando seguente:

az ml compute list

Se non è disponibile, creare un cluster chiamato cpu-cluster eseguendo questo comando:

Nota

Ignorare questo passaggio per usare l'elaborazione serverless.

az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 10

Creare ora un processo della pipeline definito nel file pipeline.yml eseguendo il comando seguente. La destinazione di calcolo viene indicata nel file pipeline.yml come azureml:cpu-cluster. Se la destinazione di calcolo usa un nome diverso, ricordarsi di aggiornarla nel file pipeline.yml.

az ml job create --file pipeline.yml

Si dovrebbe ricevere un dizionario JSON con informazioni sul processo della pipeline, tra cui:

Chiave Descrizione
name Nome del processo basato su GUID.
experiment_name Nome con cui verranno organizzati i processi in Studio.
services.Studio.endpoint URL per il monitoraggio e la revisione del processo della pipeline.
status Stato del processo. Probabilmente sarà Preparing a questo punto.

Passare all'URL services.Studio.endpoint per visualizzare una visualizzazione della pipeline:

Screenshot di una rappresentazione della pipeline.

Informazioni sul codice YAML di definizione della pipeline

Si esaminerà ora la definizione della pipeline nel file 3b_pipeline_with_data/pipeline.yml .

Nota

Per usare l'elaborazione serverless, sostituire default_compute: azureml:cpu-cluster con default_compute: azureml:serverless in questo file.

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

display_name: 3b_pipeline_with_data
description: Pipeline with 3 component jobs with data dependencies

settings:
  default_compute: azureml:cpu-cluster

outputs:
  final_pipeline_output:
    mode: rw_mount

jobs:
  component_a:
    type: command
    component: ./componentA.yml
    inputs:
      component_a_input: 
        type: uri_folder
        path: ./data

    outputs:
      component_a_output: 
        mode: rw_mount
  component_b:
    type: command
    component: ./componentB.yml
    inputs:
      component_b_input: ${{parent.jobs.component_a.outputs.component_a_output}}
    outputs:
      component_b_output: 
        mode: rw_mount
  component_c:
    type: command
    component: ./componentC.yml
    inputs:
      component_c_input: ${{parent.jobs.component_b.outputs.component_b_output}}
    outputs:
      component_c_output: ${{parent.outputs.final_pipeline_output}}
      #  mode: upload

Nella tabella seguente vengono descritti i campi usati più di frequente dello schema YAML della pipeline. Per altre informazioni, vedere lo schema YAML completo della pipeline.

Chiave Descrizione
type Obbligatorio. Tipo di processo. Deve essere pipeline per i processi della pipeline.
display_name Nome visualizzato del job della pipeline nell'interfaccia utente di Studio. Modificabile nell'interfaccia utente di Studio. Non deve essere univoco in tutti i lavori all'interno dell'area di lavoro.
jobs Obbligatorio. Un dizionario del gruppo di singoli lavori da eseguire come passaggi all'interno della pipeline. Questi processi sono considerati processi figlio del processo padre della pipeline. Nella versione corrente i tipi di processo supportati nella pipeline sono command e sweep.
inputs Dizionario di input per il processo di lavoro della pipeline. La chiave è un nome per l'input all'interno del contesto del processo e il valore è il valore di input. È possibile fare riferimento a questi input della pipeline tramite gli input di un singolo processo di passaggio nella pipeline usando l'espressione ${{ parent.inputs.<input_name> }} .
outputs Dizionario delle configurazioni di output del processo della pipeline. La chiave è un nome per l'output nel contesto del processo e il valore è la configurazione dell'output. È possibile fare riferimento a questi output della pipeline dagli output di un singolo processo di passaggio nella pipeline usando l'espressione ${{ parents.outputs.<output_name> }} .

L'esempio 3b_pipeline_with_data contiene una pipeline in tre passaggi.

  • I tre passaggi sono definiti in jobs. Tutti e tre i passaggi sono di tipo command. La definizione di ogni passaggio si trova in un file corrispondente component*.yml . È possibile visualizzare i file YAML del componente nella directory 3b_pipeline_with_data . componentA.yml è descritto nella sezione successiva.
  • Questa pipeline ha una dipendenza dai dati, che è comune nelle pipeline reali. Il componente A accetta l'input dei dati da una cartella locale in ./data (righe 18-21) e ne passa l'output al componente B (riga 29). È possibile fare riferimento all'output del componente A come ${{parent.jobs.component_a.outputs.component_a_output}}.
  • default_compute definisce il calcolo predefinito per la pipeline. Se un componente in jobs definisce un calcolo diverso, vengono rispettate le impostazioni specifiche del componente.

Screenshot della pipeline con l'esempio di dati.

Leggere e scrivere dati in una pipeline

Uno scenario comune consiste nel leggere e scrivere dati in una pipeline. In Azure Machine Learning si usa lo stesso schema per leggere e scrivere dati per tutti i tipi di processi (processi della pipeline, processi di comando e processi sweep). Di seguito sono riportati esempi di uso dei dati nelle pipeline per scenari comuni:

Informazioni sul codice YAML di definizione del componente

Ecco il file componentA.yml , un esempio di YAML che definisce un componente:

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command

name: component_a
display_name: componentA
version: 1

inputs:
  component_a_input:
    type: uri_folder

outputs:
  component_a_output:
    type: uri_folder

code: ./componentA_src

environment: 
  image: python

command: >-
  python hello.py --componentA_input ${{inputs.component_a_input}} --componentA_output ${{outputs.component_a_output}}

Questa tabella definisce i campi più usati del componente YAML. Per altre informazioni, vedere lo schema YAML completo del componente.

Chiave Descrizione
name Obbligatorio. Nome del componente. Deve essere univoco nell'area di lavoro di Azure Machine Learning. Deve iniziare con una lettera minuscola. Sono consentite lettere minuscole, numeri e caratteri di sottolineatura (_). La lunghezza massima consentita è di 255 caratteri.
display_name Nome visualizzato del componente nell'interfaccia utente dello studio. Non deve essere univoco all'interno dell'area di lavoro.
command Obbligatorio. Comando da eseguire.
code Il percorso locale alla directory del codice sorgente da caricare e usare per il componente.
environment Obbligatorio. Ambiente usato per eseguire il componente.
inputs Dizionario degli input dei componenti. La chiave è un nome per l'input all'interno del contesto del componente e il valore è la definizione di input del componente. È possibile fare riferimento agli input nel comando usando l'espressione ${{ inputs.<input_name> }} .
outputs Un dizionario degli output dei componenti. La chiave è un nome per l'output all'interno del contesto del componente e il valore è la definizione di output del componente. È possibile fare riferimento agli output nel comando usando l'espressione ${{ outputs.<output_name> }} .
is_deterministic Indica se riutilizzare il risultato del processo precedente se gli input del componente non cambiano. Il valore predefinito è true. Questa impostazione è nota anche come riutilizzo predefinito. Lo scenario comune quando è impostato su false consiste nel forzare il ricaricamento dei dati dall'archiviazione cloud o da un URL.

Nell'esempio in 3b_pipeline_with_data/componentA.yml, il componente A ha un input di dati e un output di dati, che può essere connesso ad altri passaggi della pipeline padre. Tutti i file nella sezione code del componente YAML verranno caricati in Azure Machine Learning al momento di invio del processo della pipeline. In questo esempio verranno caricati i file in ./componentA_src . (Riga 16 in componentA.yml. È possibile visualizzare il codice sorgente caricato nell'interfaccia utente di Studio: fare doppio clic sul passaggio componentA nel grafico e passare alla scheda Codice , come illustrato nello screenshot seguente. Si può notare che si tratta di uno script hello-world che esegue una semplice stampa e che scrive la data e l'ora correnti nel componentA_output percorso. Il componente accetta l'input e fornisce l'output tramite la riga di comando. È gestito in hello.py con argparse.

Screenshot della pipeline con un esempio di dati. Indica il componente A.

Input e output

L'input e l'output definiscono l'interfaccia di un componente. L'input e l'output possono essere valori letterali (di tipo string, numberinteger, o boolean) o un oggetto che contiene uno schema di input.

L'input dell'oggetto (di tipo uri_file, uri_folder, mltable, mlflow_model o custom_model) può connettersi ad altri passaggi del processo della pipeline principale per passare dati/modelli ad altri passaggi. Nel grafico della pipeline, l'input del tipo di oggetto viene visualizzato come un punto di connessione.

Gli input dei valori letterali (string, number, integer, boolean) sono i parametri che è possibile passare al componente in fase di esecuzione. È possibile aggiungere un valore predefinito di input letterali nel default campo . Per i tipi number e integer, è anche possibile aggiungere valori minimi e massimi utilizzando i campi min e max. Se il valore di input è minore del valore minimo o superiore al massimo, la pipeline non riesce alla convalida. La convalida viene eseguita prima di inviare un lavoro della pipeline, consentendo di risparmiare tempo. La convalida funziona per la CLI, il Python SDK e l'interfaccia utente di Designer. Lo screenshot seguente mostra un esempio di convalida nell'interfaccia utente di Progettazione. Analogamente, è possibile definire i valori consentiti nei enum campi.

Screenshot dell'input e dell'output del componente del modello di regressione lineare di training.

Se si vuole aggiungere un input a un componente, è necessario apportare modifiche in tre posizioni:

  • Campo inputs nel file YAML del componente.
  • Campo command nel file YAML del componente.
  • Nel codice sorgente del componente per gestire l'input della riga di comando.

Queste posizioni sono contrassegnate con caselle verdi nella schermata precedente.

Per altre informazioni su input e output, vedere Gestire input e output per componenti e pipeline.

Ambienti

L'ambiente è l'ambiente in cui viene eseguito il componente. Potrebbe trattarsi di un ambiente di Azure Machine Learning (curato, personalizzato o registrato), di un'immagine Docker o di un ambiente Conda. Vedere gli esempi seguenti:

Registrare un componente per il riutilizzo e la condivisione

Anche se alcuni componenti sono specifici di una particolare pipeline, il vero vantaggio dei componenti deriva dal riutilizzo e dalla condivisione. È possibile registrare un componente nell'area di lavoro di Machine Learning per renderlo disponibile per il riutilizzo. I componenti registrati supportano il controllo delle versioni automatico in modo da poter aggiornare il componente, ma assicurarsi che le pipeline che richiedono una versione precedente continueranno a funzionare.

Nel repository azureml-examples passare alla cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components directory .

Per registrare un componente, usare il comando az ml component create:

az ml component create --file train.yml
az ml component create --file score.yml
az ml component create --file eval.yml

Dopo aver eseguito questi comandi fino al completamento, è possibile visualizzare i componenti in lo Studio, in Assets>Componenti:

Screenshot dello studio. Mostra i componenti registrati.

Selezionare un componente. Vengono visualizzate informazioni dettagliate per ogni versione del componente.

La scheda Dettagli mostra informazioni di base, ad esempio il nome del componente, chi l'ha creato e la versione. Sono disponibili campi modificabili per Tag e Descrizione. È possibile usare i tag per aggiungere parole chiave di ricerca. Il campo description supporta la formattazione Markdown. È consigliabile usarlo per descrivere le funzionalità del componente e l'uso di base.

Nella scheda Processi viene visualizzata la cronologia di tutti i processi che usano il componente.

Usare componenti registrati in un file YAML del processo della pipeline

A questo punto si userà 1b_e2e_registered_components come esempio di come usare il componente registrato nella pipeline YAML. Passare alla 1b_e2e_registered_components directory e aprire il pipeline.yml file. Le chiavi e i valori nei campi inputs e outputs sono simili a quelli già descritti. L'unica differenza significativa è il valore del campo component nelle voci di jobs.<job_name>.component. Il component valore è nel formato azureml:<component_name>:<component_version>. La train-job definizione, ad esempio, specifica che deve essere usata la versione più recente del componente my_train registrato:

type: command
component: azureml:my_train@latest
inputs:
  training_data: 
    type: uri_folder 
    path: ./data      
  max_epocs: ${{parent.inputs.pipeline_job_training_max_epocs}}
  learning_rate: ${{parent.inputs.pipeline_job_training_learning_rate}}
  learning_rate_schedule: ${{parent.inputs.pipeline_job_learning_rate_schedule}}
outputs:
  model_output: ${{parent.outputs.pipeline_job_trained_model}}
services:
  my_vscode:

Gestire i componenti

È possibile controllare i dettagli del componente e gestire i componenti usando l'interfaccia della riga di comando v2. Usare az ml component -h per ottenere istruzioni dettagliate sui comandi dei componenti. Nella tabella seguente sono elencati tutti i comandi disponibili. Vedere altri esempi nelle informazioni di riferimento dell'interfaccia della riga di comando di Azure.

Comando Descrizione
az ml component create Creare un componente.
az ml component list Elencare i componenti in un'area di lavoro.
az ml component show Mostra i dettagli di un componente.
az ml component update Aggiorna un componente. Solo alcuni campi (descrizione, display_name) supportano l'aggiornamento.
az ml component archive Archiviare un contenitore di componenti.
az ml component restore Ripristinare un componente archiviato.

Passo successivo

  • Prova l'esempio del componente CLI v2