Partilhar via


Treinar modelos com conjuntos de dados do Azure Machine Learning

APLICA-SE A: Python SDK 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 conjuntos de dados do Azure Machine Learning fornecem uma integração perfeita com a funcionalidade de treinamento do Azure Machine Learning, como pipelines ScriptRunConfig, HyperDrive e Azure Machine Learning.

Se você não estiver pronto para disponibilizar seus dados para treinamento de modelo, mas quiser carregar seus dados em seu bloco de anotações para exploração de dados, veja como explorar os dados em seu conjunto de dados.

Pré-requisitos

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

Nota

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

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

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

Neste exemplo, você cria um TabularDataset não registrado e o especifica como um argumento de script no objeto ScriptRunConfig para treinamento. Se você quiser reutilizar esse TabularDataset com outros experimentos em seu espaço de trabalho, veja como registrar conjuntos de dados em seu espaço de trabalho.

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 oferecem uma maneira de carregar os dados em seu TabularDataset em um pandas ou Spark DataFrame para que você possa trabalhar com bibliotecas familiares de preparação e treinamento de dados sem precisar sair do seu bloco de anotações.

Conjunto de dados do Access no script de treinamento

O código a seguir configura um argumento --input-data de script que você especificará ao configurar sua execução de treinamento (consulte a próxima seção). Quando o conjunto de dados tabular é passado como o valor do argumento, o Aprendizado de Máquina do Azure 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 ter que codificar o nome ou a ID do conjunto de dados em seu script). Em seguida, ele usa o to_pandas_dataframe() método para carregar esse conjunto de dados em um dataframe pandas para exploração e preparação de dados adicionais antes do treinamento.

Nota

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

Se você precisar carregar os dados preparados em um novo conjunto de dados a partir de um dataframe 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

Um objeto ScriptRunConfig é usado para configurar e enviar a execução de treinamento.

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

  • Um diretório de scripts para seus scripts. Todos os ficheiros neste diretório são carregados para os nós do cluster, para execução.
  • O roteiro de treinamento, train_titanic.py.
  • O conjunto de dados de entrada para treinamento, titanic_ds, como um argumento de script. O Aprendizado de Máquina do Azure o resolve para a ID correspondente do conjunto de dados quando ele é passado para seu script.
  • O destino de computação para a execução.
  • O ambiente para a corrida.
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)                             

Monte arquivos em destinos de computação remotos

Se você tiver dados não estruturados, crie um FileDataset e monte ou baixe seus arquivos de dados para disponibilizá-los ao seu destino de computação remoto para treinamento. Saiba mais sobre quando usar montagem versus 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 escrever os resultados do treinamento e promover esses resultados como um FileDataset.
  • Monta o conjunto de dados de entrada no destino de computação.

Nota

Se você estiver usando uma imagem base personalizada do Docker, precisará instalar o fusível via apt-get install -y fuse como uma dependência para que a montagem do conjunto de dados funcione. Saiba como criar uma imagem de compilação personalizada.

Para obter o exemplo do bloco de anotações, 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. Este FileDataset são os dados de entrada para 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 escrever os resultados do treinamento

Você pode especificar onde escrever os resultados do treinamento com um objeto OutputFileDatasetConfig.

Os objetos OutputFileDatasetConfig permitem:

  • 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 nestes tipos de armazenamento suportados:
    • Blob do Azure
    • Partilha de ficheiros 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 outputdataset resultados do treinamento devem ser salvos como um FileDataset na 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

Recomendamos passar o conjunto de dados como um argumento ao montar através arguments do parâmetro do ScriptRunConfig construtor. Ao fazer isso, você obtém o caminho de 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 referidos pelo conjunto mnist_ds de dados são montados no destino de computação e os resultados do treinamento são salvos na pasta especificada outputdataset 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 mnist_ds conjunto de dados como entrada e grava o outputdataset arquivo na pasta 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)

Monte vs baixar

A montagem ou o download de arquivos de qualquer formato são suportados para 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, você anexa os arquivos referenciados pelo conjunto de dados a um diretório (ponto de montagem) e o disponibiliza no destino de computação. A montagem é suportada para cálculos baseados em Linux, incluindo Azure Machine Learning Compute, 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 esse cenário, recomendamos a montagem, pois apenas os arquivos de dados usados pelo script são carregados no momento do processamento.

Quando você baixa um conjunto de dados, todos os arquivos referenciados pelo conjunto de dados são baixados para o destino de computação. O download é suportado para todos os tipos de computação. Se o script processar todos os arquivos referenciados pelo conjunto de dados e o disco de computação puder se ajustar ao conjunto de dados completo, o download é recomendado para evitar a sobrecarga de streaming de dados dos serviços de armazenamento. Para downloads de vários nós, veja como evitar a limitação.

Nota

O nome do caminho de download não deve ter mais de 255 caracteres alfanuméricos para o sistema operacional Windows. Para Linux OS, 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 /path/to/file/{filename}de download) não deve ter mais de 255 caracteres alfanuméricos.

O código a seguir é dataset montado 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 de aprendizado de máquina

Os conjuntos de dados registrados podem ser acessados local e remotamente em clusters de computação, como a computação do Azure Machine Learning. Para acessar seu conjunto de dados registrado em experimentos, use o código a seguir para acessar seu espaço de trabalho e obter o conjunto de dados que foi usado em sua execução enviada anteriormente. Por padrão, o get_by_name() Dataset método na classe retorna a versão mais recente do conjunto de dados registrado no espaço de trabalho.

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

Acesse o código-fonte durante o treinamento

O armazenamento de Blob do Azure tem velocidades de taxa de transferência mais altas do que um compartilhamento de arquivos 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 Blob para transferir 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 deve ser usado para transferências de código-fonte.

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

Exemplos de blocos de notas

Resolução de Problemas

Falha na inicialização do conjunto de dados: Aguardando o ponto de montagem estar pronto atingiu o tempo limite:

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

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

Para downloads de arquivos com 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, defina inicialmente a variável AZUREML_DOWNLOAD_CONCURRENCY de ambiente para um valor de oito vezes o número de núcleos de CPU dividido pelo número de nós. Configurar um valor para essa variável de ambiente pode exigir alguma experimentação, portanto, a orientação anterior é um ponto de partida.

O exemplo a seguir assume 32 núcleos e 4 nós.

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

Armazenamento AzureFile

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

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

  • Você também pode dividir a carga de trabalho entre dois espaços de trabalho 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 espaço de trabalho padrão.

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

  1. Navegue até seu espaço de trabalho no portal do Azure.
  2. Selecione o link de armazenamento na página Visão geral do espaço de trabalho.
  3. Na página de armazenamento, selecione Teclas de acesso no menu do lado 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 autenticação.
  8. Cole a chave das etapas anteriores.
  9. Selecione Guardar.

Passando dados como entrada

TypeError: FileNotFound: Nenhum arquivo ou diretório: Este erro ocorre se o caminho do arquivo fornecido não estiver onde o arquivo está localizado. Você precisa ter certeza de que a maneira como você se refere ao arquivo é consistente com onde você montou seu conjunto de dados em seu destino de computação. Para garantir um estado determinístico, recomendamos o uso do caminho abstrato ao montar um conjunto de dados em um destino de computação. Por exemplo, no código a seguir, montamos o conjunto de dados sob a raiz do sistema de arquivos 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, '/', deverá prefixar o diretório de trabalho, por exemplo, /mnt/batch/.../tmp/dataset no destino de computação para indicar onde deseja que o conjunto de dados seja montado.

Próximos passos