Condividi tramite


Avviare, monitorare e tenere traccia della cronologia di esecuzione

SI APPLICA A: Python SDK azureml v1

SI APPLICA A: Estensione ML dell’interfaccia della riga di comando di Azure v1

In Azure Machine Learning SDK per Python v1 e l'interfaccia della riga di comando di Machine Learning sono disponibili vari metodi per monitorare, organizzare e tenere traccia delle esecuzioni per il training e la sperimentazione. La cronologia di esecuzione di ML è una parte importante di un processo di sviluppo di ML spiegabile e ripetibile.

Questo articolo illustra come eseguire le attività seguenti:

  • Monitorare le prestazioni di esecuzione.
  • Contrassegnare e trovare le esecuzioni.
  • Eseguire ricerche nella cronologia di esecuzione.
  • Annullare le esecuzioni o contrassegnarle come non riuscite.
  • Creare esecuzioni figlio.
  • Monitorare lo stato dell'esecuzione tramite notifiche e-mail.

Suggerimento

Per informazioni sul monitoraggio del servizio Azure Machine Learning e dei servizi di Azure associati, vedere Come monitorare Azure Machine Learning. Per informazioni sui modelli di monitoraggio distribuiti come servizi Web, vedere Raccogliere i dati del modello e Monitorare con Application Insights.

Prerequisiti

È necessario avere quanto segue:

Monitorare le prestazioni di esecuzione

  • Avviare un'esecuzione e il relativo processo di registrazione

    SI APPLICA A: Python SDK azureml v1

    1. Configurare l'esperimento importando le classi Workspace, Experiment, Rune ScriptRunConfig dal pacchetto azureml.core.

      import azureml.core
      from azureml.core import Workspace, Experiment, Run
      from azureml.core import ScriptRunConfig
      
      ws = Workspace.from_config()
      exp = Experiment(workspace=ws, name="explore-runs")
      
    2. Avviare un'esecuzione e il relativo processo di registrazione con il metodo start_logging().

      notebook_run = exp.start_logging()
      notebook_run.log(name="message", value="Hello from run!")
      
  • Monitorare lo stato di un'esecuzione

    SI APPLICA A: Python SDK azureml v1

    • Recuperare lo stato di un'esecuzione con il metodo get_status().

      print(notebook_run.get_status())
      
    • Per recuperare l'ID esecuzione, il tempo di esecuzione e altri dettagli, usare il metodo get_details().

      print(notebook_run.get_details())
      
    • Al termine, usare il metodo complete() per contrassegnare l’esecuzione come completata.

      notebook_run.complete()
      print(notebook_run.get_status())
      
    • Se si usa lo schema progettuale with...as di Python, l'esecuzione verrà automaticamente contrassegnata come completata quando non rientra nell'ambito. Non è necessario contrassegnare manualmente l'esecuzione come completata.

      with exp.start_logging() as notebook_run:
          notebook_run.log(name="message", value="Hello from run!")
          print(notebook_run.get_status())
      
      print(notebook_run.get_status())
      

Contrassegnare e trovare le esecuzioni

In Azure Machine Learning è possibile usare proprietà e tag per organizzare ed eseguire query sulle esecuzioni per ottenere informazioni importanti.

  • Aggiungere proprietà e tag

    SI APPLICA A: Python SDK azureml v1

    Per aggiungere alle esecuzioni metadati non disponibili per la ricerca, usare il metodo add_properties(). Ad esempio, il codice seguente aggiunge la proprietà"author" all'esecuzione:

    local_run.add_properties({"author":"azureml-user"})
    print(local_run.get_properties())
    

    Le proprietà non sono modificabili, quindi creano un record permanente a scopo di controllo. L'esempio di codice seguente genera un errore perché nel codice precedente è già stato aggiunto "azureml-user" come valore della proprietà "author":

    try:
        local_run.add_properties({"author":"different-user"})
    except Exception as e:
        print(e)
    

    A differenza delle proprietà, i tag sono modificabili. Per aggiungere informazioni significative e disponibili per la ricerca per i consumer dell'esperimento, usare il metodo tag().

    local_run.tag("quality", "great run")
    print(local_run.get_tags())
    
    local_run.tag("quality", "fantastic run")
    print(local_run.get_tags())
    

    È anche possibile aggiungere tag stringa semplici. Quando questi tag vengono visualizzati nel dizionario dei tag come chiavi, hanno il valore None.

    local_run.tag("worth another look")
    print(local_run.get_tags())
    
  • Eseguire query su proprietà e tag

    È possibile eseguire query all'interno di un esperimento per restituire un elenco di esecuzioni che corrispondono a proprietà e tag specifici.

    SI APPLICA A: Python SDK azureml v1

    list(exp.get_runs(properties={"author":"azureml-user"},tags={"quality":"fantastic run"}))
    list(exp.get_runs(properties={"author":"azureml-user"},tags="worth another look"))
    

Annullare le esecuzioni o contrassegnarle come non riuscite

Se si rileva un errore o se l'esecuzione richiede troppo tempo, è possibile annullare l'esecuzione.

SI APPLICA A: Python SDK azureml v1

Per annullare un'esecuzione usando l'SDK, usare il metodo cancel():

src = ScriptRunConfig(source_directory='.', script='hello_with_delay.py')
local_run = exp.submit(src)
print(local_run.get_status())

local_run.cancel()
print(local_run.get_status())

Se l'esecuzione viene completata, ma contiene un errore (ad esempio, è stato usato lo script di training non corretto), è possibile usare il metodo fail() per contrassegnarla come non riuscita.

local_run = exp.submit(src)
local_run.fail()
print(local_run.get_status())

Creare esecuzioni figlio

Si applica a: Python SDK azureml v1

Creare esecuzioni figlio per raggruppare le esecuzioni correlate, ad esempio per diverse iterazioni di ottimizzazione degli iperparametri.

Nota

Le esecuzioni figlio possono essere create solo usando l'SDK.

Questo esempio di codice usa lo script hello_with_children.py per creare un batch di cinque esecuzioni figlio dall'interno di un'esecuzione inviata usando il metodo child_run():

!more hello_with_children.py
src = ScriptRunConfig(source_directory='.', script='hello_with_children.py')

local_run = exp.submit(src)
local_run.wait_for_completion(show_output=True)
print(local_run.get_status())

with exp.start_logging() as parent_run:
    for c,count in enumerate(range(5)):
        with parent_run.child_run() as child:
            child.log(name="Hello from child run", value=c)

Nota

Quando non rientrano più nell'ambito, le esecuzioni figlio vengono automaticamente contrassegnate come completate.

Per creare molte esecuzioni figlio in modo efficiente, usare il metodo create_children(). Poiché ogni creazione genera una chiamata di rete, la creazione di un batch di esecuzioni è più efficiente rispetto alla creazione di un’esecuzione alla volta.

Inviare esecuzioni figlio

Le esecuzioni figlio possono essere inviate anche da un'esecuzione padre. In questo modo è possibile creare gerarchie di esecuzioni padre e figlio. Non è possibile creare un'esecuzione figlio senza padre: anche se l'esecuzione padre non esegue alcuna operazione ma avvia l'esecuzione figlio, è comunque necessario creare una gerarchia. Gli stati di tutte le esecuzioni sono indipendenti: lo stato di un’esecuzione padre può essere "Completed" (operazione riuscita) anche se una o più esecuzioni figlio sono state annullate o contrassegnate come non riuscite.

È possibile che l'esecuzione figlio usi una configurazione di esecuzione diversa rispetto all'esecuzione padre. Ad esempio, è possibile usare una configurazione meno potente basata sulla CPU per l'esecuzione padre, mentre si usano configurazioni basate su GPU per le esecuzioni figlio. Potrebbe essere necessario passare argomenti e dati diversi a ogni esecuzione figlio. Per personalizzare un'esecuzione figlio, creare un oggetto ScriptRunConfig per l'esecuzione figlio.

Importante

Per inviare un'esecuzione figlio da un'esecuzione padre in un ambiente di calcolo remoto, è necessario accedere prima all'area di lavoro nel codice di esecuzione padre. Per impostazione predefinita, il contesto di ambiente di un'esecuzione remota non dispone di credenziali per l'invio di esecuzioni figlio. Usare un'entità servizio o credenziali di identità gestita per accedere. Per altre informazioni sull'autenticazione, vedere Configurare l'autenticazione.

Il codice seguente:

  • Recupera una risorsa di calcolo denominata "gpu-cluster" dall'area di lavoro ws
  • Esegue iterazioni in base a diversi valori di argomento da passare agli oggetti ScriptRunConfig figlio
  • Crea e invia una nuova esecuzione figlio usando la risorsa di calcolo personalizzata e l'argomento
  • Si blocca fino al completamento di tutte le esecuzioni figlio
# parent.py
# This script controls the launching of child scripts
from azureml.core import Run, ScriptRunConfig

compute_target = ws.compute_targets["gpu-cluster"]

run = Run.get_context()

child_args = ['Apple', 'Banana', 'Orange']
for arg in child_args: 
    run.log('Status', f'Launching {arg}')
    child_config = ScriptRunConfig(source_directory=".", script='child.py', arguments=['--fruit', arg], compute_target=compute_target)
    # Starts the run asynchronously
    run.submit_child(child_config)

# Experiment will "complete" successfully at this point. 
# Instead of returning immediately, block until child runs complete

for child in run.get_children():
    child.wait_for_completion()

Per creare molte esecuzioni figlio con configurazioni, argomenti e input identici, usare il metodo create_children(). Poiché ogni creazione genera una chiamata di rete, la creazione di un batch di esecuzioni è più efficiente rispetto alla creazione di un’esecuzione alla volta.

All'interno di un'esecuzione figlio è possibile visualizzare l'ID esecuzione padre:

## In child run script
child_run = Run.get_context()
child_run.parent.id

Eseguire query su esecuzioni figlio

Per eseguire una query sulle esecuzioni figlio di un’esecuzione padre specifica, usare il metodo get_children(). L'argomento recursive = True consente di eseguire una query su un albero annidato di elementi figlio e nipote.

print(parent_run.get_children())

Accedere all'esecuzione padre o radice

È possibile usare il campo Run.parent per accedere all'esecuzione che ha avviato l'esecuzione figlio corrente. Un caso d'uso comune per l'uso del campo Run.parent consiste nel combinare i risultati del log in un'unica posizione. Le esecuzioni figlio vengono eseguite in modo asincrono; l’ordinamento e la sincronizzazione non sono garantiti, anche se l’esecuzione padre attende il completamento delle esecuzioni figlio.

# in child (or even grandchild) run

def root_run(self : Run) -> Run :
    if self.parent is None : 
        return self
    return root_run(self.parent)

current_child_run = Run.get_context()
root_run(current_child_run).log("MyMetric", f"Data from child run {current_child_run.id}")

Monitorare lo stato dell'esecuzione tramite notifiche e-mail

  1. Nella barra di spostamento a sinistra del portale di Azure selezionare la scheda Monitoraggio.

  2. Selezionare Impostazioni di diagnostica e quindi + Aggiungi impostazione di diagnostica.

    Screenshot delle impostazioni di diagnostica per la notifica tramite posta elettronica.

  3. Nella finestra Impostazione di diagnostica,

    1. in Dettagli categoria selezionare AmlRunStatusChangedEvent.
    2. In Dettagli destinazione selezionare Invia all’area di lavoro Log Analytics e specificare un valore nei campi Sottoscrizione e Area di lavoro Log Analytics.

    Nota

    L'area di lavoro Log Analytics di Azure è un tipo di risorsa di Azure diverso rispetto all'area di lavoro del servizio Azure Machine Learning. Se non sono presenti opzioni in tale elenco, è possibile creare un'area di lavoro Log Analytics.

    Screenshot della configurazione della notifica tramite posta elettronica.

  4. Nella scheda Log aggiungere una nuova regola di avviso.

    Screenshot della nuova regola di avviso.

  5. Per informazioni, vedere come creare e gestire gli avvisi del log tramite Monitoraggio di Azure.

Notebook di esempio

I notebook seguenti illustrano i concetti descritti in questo articolo:

Passaggi successivi