Eseguire il training dei modelli con i set di dati di Azure Machine Learning

Si applica a: Python SDK azureml v1

Questo articolo illustra come lavorare con i set di dati di Azure Machine Learning per eseguire il training dei modelli di Machine Learning. È possibile usare set di dati nella destinazione di calcolo locale o remota senza preoccuparsi di stringhe di connessione o percorsi di dati.

I set di dati di Azure Machine Learning offrono una perfetta integrazione con le funzionalità di training di Azure Machine Learning come ScriptRunConfig, HyperDrive e le pipeline di Azure Machine Learning.

Se i dati non sono ancora pronti per essere resi disponibili per il training dei modelli, ma si vuole caricare i dati nel notebook per esplorarli, vedere come esplorare i dati nel set di dati.

Prerequisiti

Per la creazione e il training con i set di dati, è necessario:

Nota

Alcune classi di set di dati hanno dipendenze dal pacchetto azureml-dataprep. Per gli utenti Linux, queste classi sono supportate solo nelle distribuzioni seguenti: Red Hat Enterprise Linux, Ubuntu e Fedora.

Usare set di dati negli script di training di Machine Learning

Se i dati strutturati non sono ancora stati registrati come set di dati, creare un oggetto TabularDataset e usarlo direttamente nello script di training per il proprio esperimento locale o remoto.

In questo esempio, si crea un oggetto TabularDataset non registrato e lo si specifica come un argomento dello script nell'oggetto ScriptRunConfig per il training. Per usare di nuovo TabularDataset con altri esperimenti nell'area di lavoro, vedere come registrare i set di dati nell'area di lavoro.

Creare un oggetto TabularDataset

Il codice seguente crea un oggetto TabularDataset non registrato da un URL Web.

from azureml.core.dataset import Dataset

web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path)

Gli oggetti TabularDataset offrono un modo per caricare i dati nell'oggetto TabularDataset in un frame di dati Pandas o Spark, in modo da poter usare librerie di training e preparazione dei dati familiari senza dover uscire dal notebook.

Accedere al set di dati nello script di training

Il codice seguente configura un argomento dello script --input-data che verrà specificato quando viene configurata l'esecuzione del training (vedere la sezione successiva). Quando il set di dati tabulare viene passato come valore dell'argomento, Azure Machine Learning lo risolve nell'ID del set di dati. È quindi possibile usare tale valore dell'argomento per accedere al set di dati nello script di training senza dover impostare come hardcoded il nome o l'ID del set di dati nello script. Verrà poi usato il metodo to_pandas_dataframe() per caricare il set di dati in un frame di dati Pandas per ulteriori operazioni di esplorazione e preparazione dei dati prima del training.

Nota

Se l'origine dati originale contiene valori NaN, stringhe vuote o valori vuoti, quando si usa to_pandas_dataframe(), questi valori vengono sostituiti da un valore Null.

Se è necessario caricare i dati preparati in un nuovo set di dati da un frame di dati Pandas in memoria, scrivere i dati in un file locale, ad esempio un file Parquet, e creare un nuovo set di dati dal file. Altre informazioni su come creare set di dati.

%%writefile $script_folder/train_titanic.py

import argparse
from azureml.core import Dataset, Run

parser = argparse.ArgumentParser()
parser.add_argument("--input-data", type=str)
args = parser.parse_args()

run = Run.get_context()
ws = run.experiment.workspace

# get the input dataset by ID
dataset = Dataset.get_by_id(ws, id=args.input_data)

# load the TabularDataset to pandas DataFrame
df = dataset.to_pandas_dataframe()

Configurare l'esecuzione del training

Un oggetto ScriptRunConfig viene usato per configurare e inviare l'esecuzione del training.

Questo codice crea un oggetto ScriptRunConfig, src, che specifica:

  • Una directory di script per gli script. Tutti i file in questa directory vengono caricati nei nodi del cluster per l'esecuzione.
  • Lo script di training train_titanic.py.
  • Il set di dati di input per il training, titanic_ds, come argomento dello script. Azure Machine Learning lo risolve nell'ID corrispondente del set di dati quando viene passato allo script.
  • La destinazione di calcolo per l'esecuzione.
  • L'ambiente per l'esecuzione.
from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=script_folder,
                      script='train_titanic.py',
                      # pass dataset as an input with friendly name 'titanic'
                      arguments=['--input-data', titanic_ds.as_named_input('titanic')],
                      compute_target=compute_target,
                      environment=myenv)
                             
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)                             

Montare file in destinazioni di calcolo remote

Se sono presenti dati non strutturati, creare un oggetto FileDataset e montare o scaricare i file di dati per renderli disponibili per la destinazione di calcolo remota per il training. Informazioni su quando usare montaggio o download per gli esperimenti di training remoti.

Vedere l'esempio seguente:

  • Crea un oggetto FileDataset di input, mnist_ds, per i dati di training.
  • Specifica dove scrivere i risultati di training e promuovere questi risultati come FileDataset.
  • Monta il set di dati di input nella destinazione di calcolo.

Nota

Se si sta usando un'immagine di base Docker personalizzata, sarà necessario installare fuse tramite apt-get install -y fuse come dipendenza affinché il montaggio del set di dati funzioni. Informazioni su come creare un'immagine personalizzata.

Per l'esempio di notebook, vedere Come configurare un'esecuzione del training con l'input e l'output di dati.

Creare un oggetto FileDataset

Nell'esempio seguente, viene creato un oggetto FileDataset non registrato mnist_data da URL Web. Questo oggetto FileDataset corrisponde ai dati di input per l'esecuzione del training.

Ulteriori informazioni su come creare set di dati da altre origini.


from azureml.core.dataset import Dataset

web_paths = [
            'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
            ]

mnist_ds = Dataset.File.from_files(path = web_paths)

Dove scrivere l'output del training

È possibile specificare dove scrivere i risultati del training con un oggetto OutputFileDatasetConfig.

Gli oggetti OutputFileDatasetConfig consentono di:

  • Montare o caricare l'output di un'esecuzione di training nell'archiviazione cloud specificata.
  • Salvare l'output come FileDataset in questi tipi di archiviazione supportati:
    • BLOB di Azure
    • Condivisione file di Azure
    • Azure Data Lake Storage generazioni 1 e 2
  • Tenere traccia della derivazione dei dati tra le esecuzioni del training.

Il codice seguente specifica che i risultati del training devono essere salvati come FileDataset nella cartella outputdataset nell'archivio dati BLOB predefinito def_blob_store.

from azureml.core import Workspace
from azureml.data import OutputFileDatasetConfig

ws = Workspace.from_config()

def_blob_store = ws.get_default_datastore()
output = OutputFileDatasetConfig(destination=(def_blob_store, 'sample/outputdataset'))

Configurare l'esecuzione del training

È consigliabile passare il set di dati come argomento durante il montaggio tramite il parametro arguments del costruttore ScriptRunConfig. In questo modo, si ottiene il percorso dati (punto di montaggio) nello script di training tramite gli argomenti ed è possibile usare lo stesso script di training per il debug locale e il training remoto su qualsiasi piattaforma cloud.

Nell'esempio seguente viene creato un oggetto ScriptRunConfig che passa nell'oggetto FileDataset tramite arguments. Dopo l'invio dell'esecuzione, i file di dati a cui fa riferimento il set di dati mnist_ds vengono montati nella destinazione di calcolo e i risultati del training vengono salvati nella cartella outputdataset specificata nell'archivio dati predefinito.

from azureml.core import ScriptRunConfig

input_data= mnist_ds.as_named_input('input').as_mount()# the dataset will be mounted on the remote compute 

src = ScriptRunConfig(source_directory=script_folder,
                      script='dummy_train.py',
                      arguments=[input_data, output],
                      compute_target=compute_target,
                      environment=myenv)

# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)

Script di training semplice

Lo script seguente viene inviato tramite ScriptRunConfig. Questo legge il set di dati mnist_ds come input e scrive il file nella cartella outputdataset nell'archivio dati BLOB predefinito def_blob_store.

%%writefile $source_directory/dummy_train.py

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import sys
import os

print("*********************************************************")
print("Hello Azure Machine Learning!")

mounted_input_path = sys.argv[1]
mounted_output_path = sys.argv[2]

print("Argument 1: %s" % mounted_input_path)
print("Argument 2: %s" % mounted_output_path)
    
with open(mounted_input_path, 'r') as f:
    content = f.read()
    with open(os.path.join(mounted_output_path, 'output.csv'), 'w') as fw:
        fw.write(content)

Montaggio e download a confronto

I file di montaggio o download di qualsiasi formato sono supportati per i set di dati creati da Archiviazione BLOB di Azure, File di Azure, Azure Data Lake Storage Gen1, Azure Data Lake Storage Gen2, database SQL di Azure e Database di Azure per PostgreSQL.

Quando si monta un set di dati, collegare i file a cui fa riferimento il set di dati a una directory (punto di montaggio) e renderli disponibili nella destinazione di calcolo. Il montaggio è supportato per gli ambienti di calcolo basati su Linux, tra cui l'ambiente di calcolo di Azure Machine Learning, macchine virtuali e HDInsight. Se le dimensioni dei dati superano le dimensioni del disco di calcolo, non è possibile eseguire il download. Per questo scenario, è consigliabile eseguire il montaggio poiché al momento dell'elaborazione vengono caricati solo i file di dati usati dallo script.

Quando si scarica un set di dati, tutti i file a cui fa riferimento il set di dati vengono scaricati nella destinazione di calcolo. Il download è supportato per tutti i tipi di calcolo. Se lo script elabora tutti i file a cui fa riferimento il set di dati e il disco di calcolo può adattarsi al set di dati completo, è consigliabile eseguire il download per evitare il sovraccarico dei dati di streaming dai servizi di archiviazione. Per i download multinodo, vedere come evitare la limitazione.

Nota

Il nome del percorso di download non deve superare i 255 caratteri alfanumerici per il sistema operativo Windows. Per il sistema operativo Linux, il nome del percorso di download non deve superare i 4.096 caratteri alfanumerici. Inoltre, per il sistema operativo Linux il nome del file (che è l'ultimo segmento del percorso di download /path/to/file/{filename}) non deve superare i 255 caratteri alfanumerici.

Il codice seguente monta dataset nella directory temporanea in mounted_path

import tempfile
mounted_path = tempfile.mkdtemp()

# mount dataset onto the mounted_path of a Linux-based compute
mount_context = dataset.mount(mounted_path)

mount_context.start()

import os
print(os.listdir(mounted_path))
print (mounted_path)

Ottenere set di dati negli script di Machine Learning

I set di dati registrati sono accessibili sia localmente che in remoto in cluster di elaborazione come l'ambiente di calcolo di Azure Machine Learning. Per accedere al set di dati registrato tra gli esperimenti, usare il codice seguente per accedere all'area di lavoro e ottenere il set di dati usato nell'esecuzione inviata in precedenza. Per impostazione predefinita, il metodo get_by_name() nella classe Dataset restituisce la versione più recente del set di dati registrato con l'area di lavoro.

%%writefile $script_folder/train.py

from azureml.core import Dataset, Run

run = Run.get_context()
workspace = run.experiment.workspace

dataset_name = 'titanic_ds'

# Get a dataset by name
titanic_ds = Dataset.get_by_name(workspace=workspace, name=dataset_name)

# Load a TabularDataset into pandas DataFrame
df = titanic_ds.to_pandas_dataframe()

Accedere al codice sorgente durante il training

Archiviazione BLOB di Azure offre velocità effettive più elevate rispetto a una condivisione file di Azure e la scalabilità per avviare in parallelo un numero elevato di processi. Per questo motivo, è consigliabile configurare le esecuzioni in modo da usare l'archiviazione BLOB per il trasferimento di file di codice sorgente.

L'esempio di codice seguente specifica nella configurazione di esecuzione quale archivio dati BLOB usare per i trasferimenti del codice sorgente.

# workspaceblobstore is the default blob storage
src.run_config.source_directory_data_store = "workspaceblobstore" 

Esempi di notebook

Risoluzione dei problemi

Inizializzazione del set di dati non riuscita: l'attesa di disponibilità del punto di montaggio ha raggiunto il timeout:

  • Se non si dispone di regole del gruppo di sicurezza di rete (NSG) in uscita e si usa azureml-sdk>=1.12.0, aggiornare azureml-dataset-runtime e le relative dipendenze in modo che corrispondano all'ultima versione secondaria specifica. Altrimenti, se si usa l'oggetto in un'esecuzione, ricreare l'ambiente in modo che possa avere la patch più recente con l'aggiornamento.
  • Se si usa azureml-sdk<1.12.0, eseguire l'aggiornamento alla versione più recente.
  • Se sono presenti regole NSG in uscita, assicurarsi che sia presente una regola in uscita che consenta tutto il traffico per il tag del servizio AzureResourceMonitor.

Inizializzazione del set di dati non riuscita: StreamAccessException è stato causato da ThrottlingException

Per i download di file multinodo, tutti i nodi possono tentare di scaricare tutti i file nel set di dati del file dal servizio Archiviazione di Azure, generando quindi un errore di limitazione. Per evitare la limitazione, impostare inizialmente la variabile di ambiente AZUREML_DOWNLOAD_CONCURRENCY su un valore pari a otto volte il numero di core CPU diviso per il numero di nodi. La configurazione di un valore per questa variabile di ambiente potrebbe richiedere una sperimentazione, pertanto le indicazioni precedenti sono un punto di partenza.

L'esempio seguente presuppone 32 core e 4 nodi.

from azureml.core.environment import Environment 
myenv = Environment(name="myenv")
myenv.environment_variables = {"AZUREML_DOWNLOAD_CONCURRENCY":64}

Archiviazione AzureFile

Non è possibile caricare i file di progetto nella directory di lavoro in AzureFile perché lo spazio di archiviazione è sovraccarico:

  • Se si usa la condivisione file per altri carichi di lavoro, come il trasferimento dei dati, è consigliabile usare BLOB in modo che la condivisione file possa essere usata per l'invio delle esecuzioni.

  • È anche possibile suddividere il carico di lavoro tra due aree di lavoro diverse.

ConfigException: non è possibile creare una connessione ad AzureFileService a causa della mancanza di credenziali. È necessario collegare una chiave dell'account o un token di firma di accesso condiviso all'archivio BLOB predefinito dell'area di lavoro.

Per assicurarsi che le credenziali di accesso alle risorse di archiviazione siano collegate all'area di lavoro e all'archivio dati file associato, completare la procedura seguente:

  1. Passare all'area di lavoro nel portale di Azure.
  2. Selezionare il collegamento all'archiviazione nella pagina Panoramica dell'area di lavoro.
  3. Nella pagina di archiviazione, selezionare Chiavi di accesso nel menu a sinistra.
  4. Copiare la chiave.
  5. Passare allo studio di Azure Machine Learning per la propria area di lavoro.
  6. Nello studio, selezionare l'archivio dati file per cui si vuole fornire le credenziali di autenticazione.
  7. Selezionare Aggiorna autenticazione.
  8. Incollare la chiave dai passaggi precedenti.
  9. Seleziona Salva.

Passaggio di dati come input

TypeError: FileNotFound: No such file or directory: questo errore si verifica se il percorso del file fornito non corrisponde alla posizione del file. È necessario assicurarsi che il modo in cui si fa riferimento al file sia coerente con la posizione in cui è stato montato il set di dati nella destinazione di calcolo. Per garantire uno stato deterministico, è consigliabile usare il percorso astratto durante il montaggio di un set di dati in una destinazione di calcolo. Nel codice seguente, ad esempio, il set di dati viene montato nella radice del file system della destinazione di calcolo /tmp.

# Note the leading / in '/tmp/dataset'
script_params = {
    '--data-folder': dset.as_named_input('dogscats_train').as_mount('/tmp/dataset'),
} 

Se la barra iniziale "/" non viene inclusa, è necessario anteporre un prefisso alla directory di lavoro, ad esempio /mnt/batch/.../tmp/dataset, nella destinazione di calcolo per indicare dove montare il set di dati.

Passaggi successivi