Compartilhar via


Treinar modelos com conjunto de dados do Azure Machine Learning

APLICA-SE A: SDK do Python do AzureML v1

Neste artigo você aprenderá a trabalhar com conjuntos de dados do Azure Machine Learning para treinar modelos de aprendizado de máquina. Você pode usar conjuntos de dados em seu destino de computação local ou remoto sem se preocupar com cadeias de conexão ou caminhos de dados.

Os conjunto de dados do Azure Machine Learning fornecem uma integração perfeita com a funcionalidade de treinamento do Azure Machine Learning, como os pipelines do ScriptRunConfig, do HyperDrive e do Azure Machine Learning.

Se você ainda não estiver preparado para disponibilizar os dados para o treinamento de modelo, mas quiser carregar os dados no notebook para explorá-los, consulte como explorar os dados em seu conjunto de dados.

Pré-requisitos

Para criar e treinar com conjuntos de dados, você precisa de:

Observação

Algumas classes de conjunto de dados têm dependências no pacote azureml-dataprep. Para usuários do Linux, essas classes são compatíveis apenas nas seguintes distribuições: Red Hat Enterprise Linux, Ubuntu e Fedora.

Consumir conjuntos de dados em scripts de treinamento do aprendizado de máquina

Se você estruturou dados que ainda não estão registrados como um conjunto de dados, crie um TabularDataset e o use diretamente no script de treinamento para seu experimento local ou remoto.

Neste exemplo é criado um TabularDataset não registrado que é especificado como um argumento de script no objeto ScriptRunConfig para treinamento. Se quiser reutilizar esse TabularDataset com outros experimentos em seu workspace, consulte como registrar conjuntos de dados em seu workspace.

Criar um TabularDataset

O código a seguir cria um TabularDataset não registrado a partir de uma URL da 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)

Os objetos TabularDataset fornecem um modo de carregar os dados de seu TabularDataset em um DataFrame do Pandas ou do Spark para que possa trabalhar com bibliotecas de treinamento e preparação de dados familiares, sem precisar sair do bloco de anotações.

Acessar o conjunto de dados no script de treinamento

O código a seguir configura o argumento de script --input-data que será especificado ao configurar a execução de treinamento (consulte a próxima seção). Quando o conjunto de dados tabular é passado como o valor do argumento, o Azure Machine Learning o resolve para a ID do conjunto de dados. Em seguida, você pode usar esse valor de argumento para acessar o conjunto de dados em seu script de treinamento (sem precisar codificar o nome ou a ID do conjunto de dados em seu script). Depois ele usa o método to_pandas_dataframe() para carregar o conjunto de dados em um dataframe do Pandas para exploração e preparação de dados antes do treinamento.

Observação

Se a fonte de dados original contiver NaN, cadeias de caracteres vazias ou valores em branco, quando você usar to_pandas_dataframe(), esses valores serão substituídos com um valor Nulo.

Se precisar carregar os dados preparados em um novo conjunto de dados a partir de um dataframe do Pandas na memória, grave os dados em um arquivo local, como um Parquet, e crie um novo conjunto de dados a partir desse arquivo. Saiba mais sobre como criar conjuntos de dados.

%%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()

Configurar a execução do treinamento

O objeto ScriptRunConfig é usado para configurar e enviar a execução do treinamento.

Esse código cria um objeto ScriptRunConfig src, que especifica:

  • Um diretório de script para seus scripts. Todos os arquivos neste diretório são carregados nos nós do cluster para execução.
  • O script de treinamento train_titanic.py.
  • O conjunto de dados de entrada para o treinamento titanic_ds, como um argumento de script. O Azure Machine Learning resolverá isso para a ID correspondente do conjunto de dados quando ele for transmitido para o script.
  • O destino de computação para a execução.
  • O ambiente para a execução.
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)                             

Montar arquivos para destinos de computação remota

Se você tiver dados não estruturados, crie um FileDataset e monte ou baixe seus arquivos de dados para disponibilizá-los para o destino de computação remoto para treinamento. Saiba mais sobre quando usar o montagem vs download para seus experimentos de treinamento remoto.

O exemplo a seguir

  • Cria um FileDataset de entrada, mnist_ds, para seus dados de treinamento.
  • Especifica onde gravar resultados de treinamento e promover esses resultados como um FileDataset.
  • Monta o conjuntos de dados de entrada para o destino de computação.

Observação

Se você estiver usando uma imagem de base personalizada do Docker, será necessário instalar o fusível por meio do apt-get install -y fuse como uma dependência para a montagem do conjunto de dados funcionar. Saiba como criar uma imagem de compilação personalizada.

Para o exemplo de notebook, consulte Como configurar uma execução de treinamento com entrada e saída de dados.

Criar um FileDataset

O exemplo a seguir cria um FileDataset não registrado, mnist_data, a partir de URLs da Web. Esse FileDataset são os dados de entrada para a sua execução de treinamento.

Saiba mais sobre como criar conjuntos de dados de outras fontes.


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)

Onde gravar a saída de treinamento

Você pode especificar onde gravar os resultados de treinamento com um objeto OutputFileDatasetConfig.

Objetos OutputFileDatasetConfig permitem que você:

  • Monte ou carregue a saída de uma execução para o armazenamento em nuvem que você especificar.
  • Salve a saída como um FileDataset nesses tipos de armazenamento com suporte:
    • Blob do Azure
    • Compartilhamento de arquivos do Azure
    • Azure Data Lake Storage gerações 1 e 2
  • Acompanhe a linhagem de dados entre as execuções de treinamento.

O código a seguir especifica que os resultados do treinamento devem ser salvos como um FileDataset outputdatasetna pasta no armazenamento de dados de blob padrão, 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'))

Configurar a execução do treinamento

Recomenda-se passar o conjunto de dados como um argumento ao montar por meio do parâmetro arguments do construtor ScriptRunConfig. Ao fazer isso, você obtém o caminho dos dados (ponto de montagem) em seu script de treinamento por meio de argumentos. Dessa forma, você pode usar o mesmo script de treinamento para depuração local e treinamento remoto em qualquer plataforma de nuvem.

O exemplo a seguir cria um ScriptRunConfig que passa no FileDataset via arguments. Depois de enviar a execução, os arquivos de dados referenciados pelo conjuntos de dados mnist_ds são montados no destino de computação, e os resultados do treinamento são salvos na pasta outputdataset especificada no armazenamento de dados padrão.

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 de treinamento simples

O script a seguir é enviado por meio do ScriptRunConfig. Ele lê o conjuntos de dados mnist_ds como entrada e grava o arquivo na pasta outputdataset no armazenamento de dados de blob padrão, 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)

Montagem vs download

A montagem ou o download de arquivos de qualquer formato são compatíveis com conjuntos de dados criados a partir do armazenamento de Blob do Azure, Arquivos do Azure, Azure Data Lake Storage Gen1, Azure Data Lake Storage Gen2, Banco de Dados SQL do Azure e Banco de Dados do Azure para PostgreSQL.

Ao montar um conjunto de dados, anexe os arquivos referenciados pelo conjunto de dados a um diretório (ponto de montagem) e os disponibilize no destino de computação. A montagem é compatível para computações baseadas em Linux, incluindo Computação do Azure Machine Learning, máquinas virtuais e HDInsight. Se o tamanho dos dados exceder o tamanho do disco de computação, o download não será possível. Para este cenário recomendamos a montagem, pois apenas os arquivos de dados usados pelo script serão carregados no momento do processamento.

Quando você faz download de um conjunto de dados, todos os arquivos referenciados pelo conjunto de dados são baixados para o destino de computação. O download é compatível com todos os tipos de computação. Se o seu script processa todos os arquivos referenciados pelo conjunto de dados e seu disco de computação pode se ajustar a seu conjunto de dados completo, recomenda-se usar o download para evitar a sobrecarga de streaming de dados dos serviços de armazenamento. Para downloads de vários nós, confira Como evitar a limitação.

Observação

O nome do caminho de download não deve ter mais de 255 caracteres alfanuméricos para o sistema operacional Windows. Para o sistema operacional Linux, o nome do caminho de download não deve ter mais de 4.096 caracteres alfanuméricos. Além disso, para o sistema operacional Linux, o nome do arquivo (que é o último segmento do caminho de download /path/to/file/{filename}) não deve ter mais de 255 caracteres alfanuméricos.

O código a seguir monta o dataset no diretório Temp em 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)

Obter conjuntos de dados em scripts do aprendizado de máquina

Os conjuntos de dados registrados são acessíveis localmente e remotamente em clusters de computação, como a computação do Azure Machine Learning. Para acessar seu conjunto de dados registrados em experimentos, use o código a seguir para acessar seu workspace e obter o conjunto de dados que foi usado na execução enviada anteriormente. Por padrão, o método get_by_name() da classe Dataset retorna a versão mais recente do conjunto de dados registrado com o workspace.

%%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()

Acessar o código-fonte durante o treinamento

O Armazenamento de Blobs do Azure tem velocidades de taxa de transferência mais altas que um compartilhamento de arquivo do Azure e será dimensionado para um grande número de trabalhos iniciados em paralelo. Por esse motivo, recomendamos configurar suas execuções para usar o Armazenamento de Blobs na transferência de arquivos de código-fonte.

O exemplo de código a seguir especifica na configuração de execução qual armazenamento de dados de blob usar em transferências de código-fonte.

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

Exemplos de notebook

Solução de problemas

Falha na inicialização do conjunto de dados: tempo limite excedido ao aguardar o ponto de montagem estar pronto:

  • Se você não tiver regras de saída de grupo de segurança de rede e estiver usando azureml-sdk>=1.12.0, atualize azureml-dataset-runtime e suas dependências para a versão secundária específica mais recentes. Se estiver usando em uma execução, recrie seu ambiente para que ele possa ter o patch mais recente com a correção.
  • Se estiver usando azureml-sdk<1.12.0, atualize para a versão mais recente.
  • Se você tiver regras de saída de NSG (grupo de segurança de rede), confira se há uma regra de saída que permita todo o tráfego para a marca de serviço AzureResourceMonitor.

Falha na inicialização do conjunto de dados: StreamAccessException foi causado por ThrottlingException

Para downloads de arquivo de vários nós, todos os nós podem tentar baixar todos os arquivos no conjunto de dados de arquivo do serviço de Armazenamento do Azure, o que resulta em um erro de limitação. Para evitar a limitação, inicialmente, defina a variável de ambiente AZUREML_DOWNLOAD_CONCURRENCY como um valor igual a oito vezes o número de núcleos de CPU dividido pelo número de nós. A configuração de um valor para essa variável de ambiente pode exigir alguma experimentação. Portanto, as diretrizes mencionadas anteriormente são um ponto de partida.

O exemplo a seguir pressupõe 32 núcleos e quatro nós.

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

Armazenamento do Azurefile

Não é possível carregar arquivos de projeto no diretório de trabalho no AzureFile porque o armazenamento está sobrecarregado:

  • Se você usa o compartilhamento de arquivos para outras cargas de trabalho, como a transferência de dados, a recomendação é usar blobs para que o compartilhamento de arquivos esteja livre para ser usado para o envio de execuções.

  • Você também pode dividir a carga de trabalho entre dois workspaces diferentes.

ConfigException: não foi possível criar uma conexão com o AzureFileService devido a credenciais ausentes. Uma Chave de Conta ou token SAS precisa ser vinculado ao armazenamento de blob de workspace padrão.

Para garantir que suas credenciais de acesso de armazenamento estejam vinculadas ao espaço de trabalho e ao armazenamento de arquivos de arquivos associado, conclua as seguintes etapas:

  1. Navegue até o workspace no portal do Azure.
  2. Selecione o link armazenamento na página Visão geral do espaço de trabalho.
  3. Na página de armazenamento, selecione Chaves de acesso no menu lateral esquerdo.
  4. Copie a chave.
  5. Navegue até o Estúdio do Azure Machine Learning para seu espaço de trabalho.
  6. No estúdio, selecione o armazenamento de dados de arquivo para o qual você deseja fornecer credenciais de autenticação.
  7. Selecione Atualizar a autenticação.
  8. Cole a chave das etapas anteriores.
  9. Selecione Salvar.

Passagem de dados como entrada

TypeError: FileNotFound: No such file or directory: esse erro ocorre se o caminho do arquivo que você forneceu não está onde o arquivo está localizado. Confira se a maneira como você se refere ao arquivo é consistente com o local em que você montou seu conjunto de dados em seu destino de computação. Para garantir um estado determinístico, recomenda-se usar o caminho abstrato ao montar um conjunto de dados para um destino de computação. Por exemplo, no código a seguir montamos o conjunto de dados na raiz do filesystem do destino de computação /tmp.

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

Se você não incluir a barra à esquerda '/', será necessário prefixar o diretório de trabalho. Por exemplo, /mnt/batch/.../tmp/dataset no destino de computação para indicar onde você deseja que o conjunto de dados seja montado.

Próximas etapas