Configurare e inviare processi di training

SI APPLICA A:Python SDK azureml v1

Questo articolo illustra come configurare e inviare processi di Azure Machine Learning per eseguire il training dei modelli. I frammenti di codice illustrano le parti chiave della configurazione e l'invio di uno script di training. Usare quindi uno dei notebook di esempio per trovare gli esempi di lavoro end-to-end completi.

Quando si esegue il training, è comune avviare nel computer locale e quindi aumentare il numero di istanze in un cluster basato sul cloud. Con Azure Machine Learning è possibile eseguire lo script in varie destinazioni di calcolo senza dover modificare lo script di training.

È sufficiente definire l'ambiente per ogni destinazione di calcolo all'interno di una configurazione del processo di script. Quindi, quando si vuole eseguire l'esperimento di training in una destinazione di calcolo diversa, specificare la configurazione del processo per tale calcolo.

Prerequisiti

Che cos'è una configurazione di esecuzione dello script?

ScriptRunConfig viene usato per configurare le informazioni necessarie per l'invio di un processo di training come parte di un esperimento.

Si invia l'esperimento di training con un oggetto ScriptRunConfig. Questo oggetto include:

  • source_directory: la directory di origine che contiene lo script di training
  • script: script di training da eseguire
  • compute_target: destinazione di calcolo su cui eseguire
  • environment: ambiente da usare durante l'esecuzione dello script
  • e alcune opzioni configurabili aggiuntive (vedere la documentazione di riferimento per altre informazioni)

Eseguire training del modello

Il modello di codice per inviare un processo di training è lo stesso per tutti i tipi di destinazioni di calcolo:

  1. Creare un esperimento da eseguire
  2. Creare un ambiente in cui verrà eseguito lo script
  3. Creare uno ScriptRunConfig, che specifica la destinazione di calcolo e l'ambiente
  4. Inviare il processo
  5. Attendere il completamento del processo

In alternativa, è possibile:

Creare un esperimento

Creare un esperimento nell'area di lavoro. Un esperimento è un contenitore leggero che consente di organizzare gli invii di processi e tenere traccia del codice.

from azureml.core import Experiment

experiment_name = 'my_experiment'
experiment = Experiment(workspace=ws, name=experiment_name)

Selezionare una destinazione di calcolo

Selezionare la destinazione di calcolo in cui verrà eseguito lo script di training. Se non viene specificata alcuna destinazione di calcolo in ScriptRunConfig o se compute_target='local', Azure Machine Learning eseguirà lo script in locale.

Il codice di esempio in questo articolo presuppone che sia già stata creata una destinazione my_compute_target di calcolo dalla sezione "Prerequisiti".

Nota

Azure Databricks non è supportato come destinazione di calcolo per il training del modello. È possibile usare Azure Databricks per le attività di preparazione e distribuzione dei dati.

Nota

Per creare e collegare una destinazione di calcolo per il training nel cluster Kubernetes abilitato per Azure Arc, vedere Configurare Machine Learning abilitato per Azure Arc

Creare un ambiente

Gli ambienti di Azure Machine Learning sono un incapsulamento dell'ambiente in cui viene eseguito il training di Machine Learning. Specificano i pacchetti Python, l'immagine Docker, le variabili di ambiente e le impostazioni software per gli script di training e assegnazione dei punteggi. Specificano anche i runtime (Python, Spark o Docker).

È possibile definire un ambiente personalizzato o usare un ambiente curato di Azure Machine Learning. Gli ambienti curati sono ambienti predefiniti disponibili nell'area di lavoro per impostazione predefinita. Questi ambienti sono supportati da immagini Docker memorizzate nella cache che riducono il costo di preparazione del processo. Per l'elenco completo degli ambienti curati disponibili, vedere Ambienti curati di Azure Machine Learning .

Per una destinazione di calcolo remota, è possibile usare uno di questi ambienti curati più diffusi per iniziare con:

from azureml.core import Workspace, Environment

ws = Workspace.from_config()
myenv = Environment.get(workspace=ws, name="AzureML-Minimal")

Per altre informazioni e dettagli sugli ambienti, vedere Creare & ambienti software in Azure Machine Learning.

Destinazione di calcolo locale

Se la destinazione di calcolo è il computer locale, è necessario assicurarsi che tutti i pacchetti necessari siano disponibili nell'ambiente Python in cui viene eseguito lo script. Usare python.user_managed_dependencies per usare l'ambiente Python corrente (o Python nel percorso specificato).

from azureml.core import Environment

myenv = Environment("user-managed-env")
myenv.python.user_managed_dependencies = True

# You can choose a specific Python environment by pointing to a Python path 
# myenv.python.interpreter_path = '/home/johndoe/miniconda3/envs/myenv/bin/python'

Creare la configurazione del processo di script

Ora che si dispone di una destinazione di calcolo (my_compute_targetvedere Prerequisiti e ambiente (myenvvedere Creare un ambiente), creare una configurazione del processo script che esegue lo script di training (train.py) disponibile nella project_folder directory:

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=project_folder,
                      script='train.py',
                      compute_target=my_compute_target,
                      environment=myenv)

# Set compute target
# Skip this if you are running on your local computer
script_run_config.run_config.target = my_compute_target

Se non si specifica un ambiente, verrà creato automaticamente un ambiente predefinito.

Se sono presenti argomenti della riga di comando da passare allo script di training, è possibile specificarli tramite il arguments parametro del costruttore ScriptRunConfig, ad esempio arguments=['--arg1', arg1_val, '--arg2', arg2_val].

Se si vuole eseguire l'override del tempo massimo predefinito consentito per il processo, è possibile farlo tramite il max_run_duration_seconds parametro . Il sistema tenterà di annullare automaticamente il processo se richiede più tempo di questo valore.

Specificare una configurazione del processo distribuito

Se si vuole eseguire un processo di training distribuito , specificare la configurazione specifica del processo distribuita al distributed_job_config parametro . I tipi di configurazione supportati includono MpiConfiguration, TensorflowConfiguration e PyTorchConfiguration.

Per altre informazioni ed esempi sull'esecuzione di processi Horovod, TensorFlow e PyTorch distribuiti, vedere:

Inviare l'esperimento

run = experiment.submit(config=src)
run.wait_for_completion(show_output=True)

Importante

Quando si invia il processo di training, viene creato e inviato uno snapshot della directory contenente gli script di training. Lo snapshot viene inoltre archiviato come parte dell'esperimento nell'area di lavoro. Se si modificano i file e si invia di nuovo il processo, verranno caricati solo i file modificati.

Per evitare che i file non necessari vengano inclusi nello snapshot, impostare un file ignorato (.gitignore o .amlignore) nella directory . Aggiungere i file e le directory da escludere. Per altre informazioni sulla sintassi da usare all'interno di questo file, vedere sintassi e modelli per .gitignore. Il .amlignore file usa la stessa sintassi. Se esistono entrambi i file, il .amlignore file viene usato e il .gitignore file non è usato.

Per altre informazioni sugli snapshot, vedere Snapshot.

Importante

Cartelle speciali Due cartelle outputs e logs, hanno un trattamento speciale in Azure Machine Learning. Durante il training, quando si scrivono file in cartelle denominate output e log relativi rispettivamente alla directory radice (./outputs e ./logs), i file verranno caricati automaticamente nella cronologia dei processi in modo che sia possibile accedervi al termine del processo.

Per creare artefatti creati durante il training (ad esempio file modello, checkpoint, file di dati o immagini tracciate), scriverli nella cartella ./outputs.

Analogamente, è possibile scrivere tutti i log dal processo di training nella ./logs cartella . Per usare l'integrazione TensorBoard di Azure Machine Learning, assicurarsi di scrivere i log di TensorBoard in questa cartella. Mentre il processo è in corso, sarà possibile avviare TensorBoard ed eseguire lo streaming di questi log. Successivamente, sarà anche possibile ripristinare i log da uno dei processi precedenti.

Ad esempio, per scaricare un file scritto nella cartella outputs nel computer locale dopo il processo di training remoto: run.download_file(name='outputs/my_output_file', output_file_path='my_destination_path')

Rilevamento e integrazione di Git

Quando si avvia un processo di training in cui la directory di origine è un repository Git locale, le informazioni sul repository vengono archiviate nella cronologia dei processi. Per altre informazioni, vedere Integrazione di Git con Azure Machine Learning.

Esempi di notebook

Per esempi di configurazione dei processi per diversi scenari di training, vedere questi notebook:

Per informazioni su come eseguire i notebook, vedere l'articolo Esplorare Azure Machine Learning con notebook Jupyter.

Risoluzione dei problemi

  • AttributeError: l'oggetto 'RoundTripLoader' non ha alcun attributo 'comment_handling': questo errore deriva dalla nuova versione (v0.17.5) di ruamel-yaml, una azureml-core dipendenza, che introduce una modifica che causa un'interruzione in azureml-core. Per correggere questo errore, disinstallare ruamel-yaml eseguendo pip uninstall ruamel-yaml e installando una versione diversa di ruamel-yaml. Le versioni supportate sono da v0.15.35 a v0.17.4 (incluse). A tale scopo, eseguire pip install "ruamel-yaml>=0.15.35,<0.17.5".

  • Il processo ha esito negativo con jwt.exceptions.DecodeError: messaggio di errore esatto: jwt.exceptions.DecodeError: It is required that you pass in a value for the "algorithms" argument when calling decode().

    Prendere in considerazione l'aggiornamento alla versione più recente di azureml-core: pip install -U azureml-core.

    Se si verifica questo problema per i processi locali, controllare la versione di PyJWT installata nell'ambiente in cui si avviano i processi. Le versioni supportate di PyJWT sono < 2.0.0. Disinstallare PyJWT dall'ambiente se la versione è >= 2.0.0. È possibile controllare la versione di PyJWT, disinstallare e installare la versione corretta come indicato sotto:

    1. Avviare una shell dei comandi, attivare l'ambiente conda in cui è installato azureml-core.
    2. Immettere pip freeze e cercare PyJWT, se trovato, la versione elencata deve essere < 2.0.0
    3. Se la versione elencata non è supportata, pip uninstall PyJWT nella shell dei comandi immettere y per confermare.
    4. Installare usando pip install 'PyJWT<2.0.0'

    Se si invia un ambiente creato dall'utente con il processo, è consigliabile usare la versione più recente di azureml-core in tale ambiente. Versioni >= 1.18.0 di azureml-core già pin PyJWT < 2.0.0. Se è necessario usare una versione di azureml-core < 1.18.0 nell'ambiente inviato, assicurarsi di specificare PyJWT < 2.0.0 nelle dipendenze pip.

  • ModuleErrors (nessun modulo denominato): se si esegue ModuleErrors durante l'invio di esperimenti in Azure Machine Learning, lo script di training prevede l'installazione di un pacchetto ma non viene aggiunto. Dopo aver specificato il nome del pacchetto, Azure Machine Learning installa il pacchetto nell'ambiente usato per il processo di training.

    Se si usano estimatori per inviare esperimenti, è possibile specificare un nome di pacchetto tramite pip_packages o conda_packages parametro nello strumento di stima in base all'origine in cui si vuole installare il pacchetto. È anche possibile specificare un file yml con tutte le dipendenze usando conda_dependencies_fileo elencare tutti i requisiti pip in un file txt usando il pip_requirements_file parametro . Se si dispone di un oggetto Azure Machine Learning Environment che si vuole eseguire l'override dell'immagine predefinita usata dallo strumento di stima, è possibile specificare tale ambiente tramite il environment parametro del costruttore di stima.

    Le immagini Docker gestite da Azure Machine Learning e i relativi contenuti possono essere visualizzati nei contenitori di Azure Machine Learning. Le dipendenze specifiche del framework sono elencate nella documentazione del framework corrispondente:

    Nota

    Se si ritiene che un pacchetto specifico sia abbastanza comune da essere aggiunto in Immagini e ambienti gestiti da Azure Machine Learning, generare un problema di GitHub nei contenitori di Azure Machine Learning.

  • NameError (nome non definito), AttributeError (Object non ha attributo): questa eccezione deve provenire dagli script di training. È possibile esaminare i file di log da portale di Azure per ottenere altre informazioni sul nome specifico non definito o sull'errore dell'attributo. Dall'SDK è possibile usare run.get_details() per esaminare il messaggio di errore. Verranno elencati anche tutti i file di log generati per il processo. Assicurarsi di esaminare lo script di training e correggere l'errore prima di inviare di nuovo il processo.

  • Eliminazione del processo o dell'esperimento: gli esperimenti possono essere archiviati usando il metodo Experiment.archive o dalla visualizzazione della scheda Esperimento in studio di Azure Machine Learning client tramite il pulsante "Esperimento archivio". Questa azione nasconde l'esperimento dalle query e dalle visualizzazioni dell'elenco, ma non la elimina.

    L'eliminazione permanente di singoli esperimenti o processi non è attualmente supportata. Per altre informazioni sull'eliminazione degli asset dell'area di lavoro, vedere Esportare o eliminare i dati dell'area di lavoro del servizio Machine Learning.

  • Documento metrica troppo grande: Azure Machine Learning ha limiti interni per le dimensioni degli oggetti metrica che possono essere registrati contemporaneamente da un processo di training. Se si verifica un errore "Documento metrica troppo grande" durante la registrazione di una metrica con valori di elenco, provare a suddividere l'elenco in blocchi più piccoli, ad esempio:

    run.log_list("my metric name", my_metric[:N])
    run.log_list("my metric name", my_metric[N:])
    

    Internamente, Azure Machine Learning concatena i blocchi con lo stesso nome di metrica in un elenco contiguo.

  • L'avvio della destinazione di calcolo richiede molto tempo: le immagini Docker per le destinazioni di calcolo vengono caricate da Registro Azure Container (Registro Azure Container). Per impostazione predefinita, Azure Machine Learning crea un Registro Azure Container che usa il livello di servizio di base . La modifica di ACR per l'area di lavoro al livello Standard o Premium può ridurre il tempo necessario per compilare e caricare le immagini. Per altre informazioni, vedere Livelli di servizio di Registro Azure Container.

Passaggi successivi