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

Attenzione

Questo articolo fa riferimento a CentOS, una distribuzione Linux vicina allo stato end of life (EOL). Prendere in considerazione l'uso e la pianificazione di conseguenza. Per altre informazioni, vedere le linee guida per la fine della vita di CentOS.

SI APPLICA A:Python SDK azureml v1

Questo articolo illustra come usare i set di dati di Azure Machine Learning per eseguire il training di modelli di Machine Learning. È possibile usare set di dati nella destinazione di calcolo locale o remota senza doversi preoccupare di stringa 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, ad esempio Le pipeline ScriptRunConfig, HyperDrive e Azure Machine Learning.

Se non si è pronti per rendere disponibili i dati per il training del modello, ma si vuole caricare i dati nel notebook per l'esplorazione dei dati, vedere come esplorare i dati nel set di dati.

Prerequisiti

Per creare ed eseguire 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, Fedora e CentOS.

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 usarli direttamente nello script di training per l'esperimento locale o remoto.

In questo esempio si crea un tabularDataset non registrato e lo si specifica come argomento script nell'oggetto ScriptRunConfig per il training. Per riutilizzare questo oggetto 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 la possibilità di caricare i dati nell'oggetto TabularDataset in un dataframe 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 --input-data script che verrà specificato quando si configura l'esecuzione del training (vedere la sezione successiva). Quando il set di dati tabulare viene passato come valore dell'argomento, Azure Machine Learning risolverà tale valore in ID del set di dati, che sarà quindi possibile usare per accedere al set di dati nello script di training (senza dover impostare come hardcode il nome o l'ID del set di dati nello script). Usa quindi il metodo per caricare il to_pandas_dataframe() set di dati in un dataframe 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(), tali valori vengono sostituiti come valore Null .

Se è necessario caricare i dati preparati in un nuovo set di dati da un dataframe pandas in memoria, scrivere i dati in un file locale, ad esempio parquet, e creare un nuovo set di dati da tale 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:

  • Directory script per gli script. Tutti i file in questa directory vengono caricati nei nodi del cluster per l'esecuzione.
  • Script di training, train_titanic.py.
  • Set di dati di input per il training, titanic_ds, come argomento script. Azure Machine Learning risolverà questo problema con l'ID corrispondente del set di dati quando viene passato allo script.
  • Destinazione di calcolo per l'esecuzione.
  • 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 il montaggio e il download per gli esperimenti di training remoti.

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 tali risultati come FileDataset.
  • Monta il set di dati di input nella destinazione di calcolo.

Nota

Se si usa un'immagine di base Docker personalizzata, sarà necessario installare fuse tramite apt-get install -y fuse come dipendenza per il funzionamento del montaggio del set di dati. Informazioni su come creare un'immagine di compilazione personalizzata.

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

Creare un oggetto FileDataset

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

Altre 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 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 Archiviazione generazioni 1 e 2
  • Tenere traccia della derivazione dei dati tra le esecuzioni di training.

Il codice seguente specifica che i risultati di training devono essere salvati come FileDataset nella outputdataset cartella 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 arguments parametro del ScriptRunConfig costruttore. In questo modo, si ottiene il percorso dati (punto di montaggio) nello script di training tramite argomenti. In questo modo, è possibile usare lo stesso script di training per il debug locale e il training remoto in qualsiasi piattaforma cloud.

Nell'esempio seguente viene creato un oggetto ScriptRunConfig che passa l'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 specificata outputdataset 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. Legge il mnist_ds set di dati come input e scrive il file nella outputdataset cartella 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

Il montaggio o il download di file di qualsiasi formato sono supportati per i set di dati creati da Archiviazione BLOB di Azure, File di Azure, Azure Data Lake Archiviazione Gen1, Azure Data Lake Archiviazione 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 i calcoli basati su Linux, tra cui calcolo di Azure Machine Learning, macchine virtuali e HDInsight. Se le dimensioni dei dati superano le dimensioni del disco di calcolo, il download non è possibile. Per questo scenario, è consigliabile montare 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 verranno 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 scaricare 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 /path/to/file/{filename}di download ) non deve superare i 255 caratteri alfanumerici.

Il codice seguente viene montato 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 in locale che in remoto in cluster di calcolo 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 get_by_name() metodo nella Dataset classe restituisce la versione più recente del set di dati registrato nell'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

L'inizializzazione del set di dati non è riuscita: l'attesa del timeout del punto di montaggio è scaduta:

  • Se non si dispone di regole del gruppo di sicurezza di rete in uscita e si usano , aggiornare azureml-dataset-runtime e le relative dipendenze in modo che siano le più recenti per la versione secondaria specifica o se viene usata azureml-sdk>=1.12.0in un'esecuzione, ricreare l'ambiente in modo che possa avere la patch più recente con la correzione.
  • Se si usa azureml-sdk<1.12.0, eseguire l'aggiornamento alla versione più recente.
  • Se sono presenti regole del gruppo di sicurezza di rete in uscita, assicurarsi che sia presente una regola in uscita che consenta tutto il traffico per il tag AzureResourceMonitordel servizio .

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, che genera un errore di limitazione. Per evitare la limitazione, inizialmente impostare la variabile AZUREML_DOWNLOAD_CONCURRENCY di ambiente 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 può richiedere una sperimentazione, quindi le indicazioni indicate in precedenza 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 file di Azure

Impossibile caricare i file di progetto nella directory di lavoro in AzureFile perché l'archiviazione è in overload:

  • Se si usa la condivisione file per altri carichi di lavoro, ad esempio il trasferimento dei dati, è consigliabile usare BLOB in modo che la condivisione file sia gratuita da usare per l'invio delle esecuzioni.

  • Un'altra opzione consiste nel suddividere il carico di lavoro tra due aree di lavoro diverse.

ConfigException: impossibile creare una connessione ad AzureFileService a causa di credenziali mancanti. È 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 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 al studio di Azure Machine Learning per l'area di lavoro.
  6. In Studio selezionare l'archivio dati file per il quale si desidera 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: nessun file o directory di questo tipo: questo errore si verifica se il percorso del file specificato non è il percorso in cui si trova il file. È necessario assicurarsi che il modo in cui si fa riferimento al file sia coerente con il punto 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 non si include la barra iniziale , '/', è necessario anteporre ad esempio la directory di lavoro, /mnt/batch/.../tmp/dataset nella destinazione di calcolo per indicare dove si vuole montare il set di dati.

Passaggi successivi