Share via


Migrar do Batch AI para o serviço Azure Machine Learning

A Azure Batch serviço de IA será descontinuação em março. As capacidades de preparação e classificação em escala do Batch AI estão agora disponíveis no serviço Azure Machine Learning, que ficou disponível globalmente a 4 de dezembro de 2018.

Juntamente com muitas outras capacidades de machine learning, o serviço Azure Machine Learning inclui um destino de computação gerida com base na cloud para preparar, implementar e classificar modelos de machine learning. Este destino de computação chama-se Computação do Azure Machine Learning. Comece a migrar e a utilizá-lo hoje mesmo. Pode interagir com o serviço Azure Machine Learning através dos respetivos SDKs Python, da interface de linha de comandos e do portal do Azure.

Atualizar do Batch AI de Pré-visualização para o serviço do Azure Machine Learning em Disponibilidade Geral proporciona-lhe uma melhor experiência através de conceitos que são mais fáceis de utilizar, como Avaliadores e Arquivos de Dados. Também garante SLAs de serviço do Azure de nível GA e suporte ao cliente.

O serviço Azure Machine Learning também traz novas funcionalidades, como machine learning automatizado, otimização de hiperparâmetros e pipelines de ML, que são úteis na maioria das cargas de trabalho de IA em grande escala. A capacidade de implementar um modelo preparado sem mudar para um serviço separado ajuda a concluir o ciclo de ciência de dados desde a preparação de dados (com o SDK de Preparação de Dados) até à operacionalização e monitorização de modelos.

Começar a migrar

Para evitar interrupções nas suas aplicações e beneficiar das funcionalidades mais recentes, siga os passos seguintes antes de 31 de março de 2019:

  1. Crie uma área de trabalho do serviço Azure Machine Learning e comece:

  2. Instale o SDK do Azure Machine Learning e o SDK de Preparação de Dados.

  3. Configurar uma Computação do Azure Machine Learning para preparação de modelos.

  4. Atualize os scripts para utilizar a Computação do Azure Machine Learning. As secções seguintes mostram-lhe como o código comum que utiliza para o Batch AI mapeia para codificar para o Azure Machine Learning.

Criar áreas de trabalho

O conceito de inicializar uma área de trabalho com um configuration.json no Azure Batch ia mapeia de forma semelhante à utilização de um ficheiro de configuração no serviço Azure Machine Learning.

Para o Batch AI, fê-lo desta forma:

sys.path.append('../../..')
import utilities as utils

cfg = utils.config.Configuration('../../configuration.json')
client = utils.config.create_batchai_client(cfg)

utils.config.create_resource_group(cfg)
_ = client.workspaces.create(cfg.resource_group, cfg.workspace, cfg.location).result()

Serviço Azure Machine Learning, experimente:

from azureml.core.workspace import Workspace

ws = Workspace.from_config()
print('Workspace name: ' + ws.name, 
      'Azure region: ' + ws.location, 
      'Subscription id: ' + ws.subscription_id, 
      'Resource group: ' + ws.resource_group, sep = '\n')

Além disso, também pode criar uma Área de Trabalho diretamente ao especificar os parâmetros de configuração, como

from azureml.core import Workspace
# Create the workspace using the specified parameters
ws = Workspace.create(name = workspace_name,
                      subscription_id = subscription_id,
                      resource_group = resource_group, 
                      location = workspace_region,
                      create_resource_group = True,
                      exist_ok = True)
ws.get_details()

# write the details of the workspace to a configuration file to the notebook library
ws.write_config()

Saiba mais sobre a classe área de trabalho do Azure Machine Learning na documentação de referência do SDK.

Criar clusters de computação

O Azure Machine Learning suporta vários destinos de computação, alguns dos quais são geridos pelo serviço e outros que podem ser anexados à área de trabalho (por exemplo, Um cluster do HDInsight ou uma VM remota. Leia mais sobre vários destinos de computação. O conceito de criar um cluster de computação de IA Azure Batch mapeia à criação de um cluster AmlCompute no serviço Azure Machine Learning. A criação de Amlcompute assume uma configuração de computação semelhante à forma como transmite parâmetros no Azure Batch IA. Uma coisa a ter em atenção é que o dimensionamento automático está ativado por predefinição no cluster AmlCompute, ao passo que está desativado por predefinição no Azure Batch IA.

Para o Batch AI, fê-lo desta forma:

nodes_count = 2
cluster_name = 'nc6'

parameters = models.ClusterCreateParameters(
    vm_size='STANDARD_NC6',
    scale_settings=models.ScaleSettings(
        manual=models.ManualScaleSettings(target_node_count=nodes_count)
    ),
    user_account_settings=models.UserAccountSettings(
        admin_user_name=cfg.admin,
        admin_user_password=cfg.admin_password or None,
        admin_user_ssh_public_key=cfg.admin_ssh_key or None,
    )
)
_ = client.clusters.create(cfg.resource_group, cfg.workspace, cluster_name, parameters).result()

Para o serviço Azure Machine Learning, experimente:

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

# Choose a name for your CPU cluster
gpu_cluster_name = "nc6"

# Verify that cluster does not exist already
try:
    gpu_cluster = ComputeTarget(workspace=ws, name=gpu_cluster_name)
    print('Found existing cluster, use it.')
except ComputeTargetException:
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6',
                                                           vm_priority='lowpriority',
                                                           min_nodes=1,
                                                           max_nodes=2,
                                                           idle_seconds_before_scaledown='300',
                                                           vnet_resourcegroup_name='<my-resource-group>',
                                                           vnet_name='<my-vnet-name>',
                                                           subnet_name='<my-subnet-name>')
    gpu_cluster = ComputeTarget.create(ws, gpu_cluster_name, compute_config)

gpu_cluster.wait_for_completion(show_output=True)

Saiba mais sobre a classe AMLCompute na documentação de referência do SDK. Tenha em atenção que, na configuração acima, apenas vm_size e max_nodes são obrigatórias e as restantes propriedades, como as VNets, destinam-se apenas à configuração avançada do cluster.

Monitorizar o estado do cluster

Isto é mais simples no serviço Azure Machine Learning, como verá abaixo.

Para o Batch AI, fê-lo desta forma:

cluster = client.clusters.get(cfg.resource_group, cfg.workspace, cluster_name)
utils.cluster.print_cluster_status(cluster)

Para o serviço Azure Machine Learning, experimente:

gpu_cluster.get_status().serialize()

Obter referência a uma conta de Armazenamento

O conceito de um armazenamento de dados, como o blob, é simplificado no serviço Azure Machine Learning com o objeto DataStore. Por predefinição, a área de trabalho do serviço Azure Machine Learning cria uma conta de armazenamento, mas também pode anexar o seu próprio armazenamento como parte da criação da área de trabalho.

Para o Batch AI, fê-lo desta forma:

azure_blob_container_name = 'batchaisample'
blob_service = BlockBlobService(cfg.storage_account_name, cfg.storage_account_key)
blob_service.create_container(azure_blob_container_name, fail_on_exist=False)

Para o serviço Azure Machine Learning, experimente:

ds = ws.get_default_datastore()
print(ds.datastore_type, ds.account_name, ds.container_name)

Saiba mais sobre como registar contas de armazenamento adicionais ou obter uma referência para outro arquivo de dados registado na documentação do serviço Azure Machine Learning.

Transferir e carregar dados

Com qualquer um dos serviços, pode carregar os dados para a conta de armazenamento facilmente através da referência do arquivo de dados acima. Para Azure Batch IA, também implementamos o script de preparação como parte da partilha de ficheiros, embora veja como pode especificá-lo como parte da configuração da sua tarefa no caso do serviço Azure Machine Learning.

Para o Batch AI, fê-lo desta forma:

mnist_dataset_directory = 'mnist_dataset'
utils.dataset.download_and_upload_mnist_dataset_to_blob(
    blob_service, azure_blob_container_name, mnist_dataset_directory)

script_directory = 'tensorflow_samples'
script_to_deploy = 'mnist_replica.py'

blob_service.create_blob_from_path(azure_blob_container_name,
                                   script_directory + '/' + script_to_deploy, 
                                   script_to_deploy)

Para o serviço Azure Machine Learning, experimente:

import os
import urllib
os.makedirs('./data', exist_ok=True)
download_url = 'https://s3.amazonaws.com/img-datasets/mnist.npz'
urllib.request.urlretrieve(download_url, filename='data/mnist.npz')

ds.upload(src_dir='data', target_path='mnist_dataset', overwrite=True, show_progress=True)

path_on_datastore = ' mnist_dataset/mnist.npz' ds_data = ds.path(path_on_datastore) print(ds_data)

Criar experimentações

Conforme mencionado acima, o serviço Azure Machine Learning tem um conceito de experimentação semelhante a Azure Batch IA. Em seguida, cada experimentação pode ter execuções individuais, semelhantes à forma como temos trabalhos no Azure Batch IA. O serviço Azure Machine Learning também lhe permite ter hierarquia em cada execução principal, para execuções subordinadas individuais.

Para o Batch AI, fê-lo desta forma:

experiment_name = 'tensorflow_experiment'
experiment = client.experiments.create(cfg.resource_group, cfg.workspace, experiment_name).result()

Para o serviço Azure Machine Learning, experimente:

from azureml.core import Experiment

experiment_name = 'tensorflow_experiment'
experiment = Experiment(ws, name=experiment_name)

Submeter tarefas

Depois de criar uma experimentação, tem algumas formas diferentes de submeter uma execução. Neste exemplo, estamos a tentar criar um modelo de aprendizagem profunda com o TensorFlow e vamos utilizar um Avaliador do serviço Azure Machine Learning para o fazer. Um Avaliador é simplesmente uma função de wrapper na configuração de execução subjacente, o que torna mais fácil submeter execuções e é atualmente suportado apenas para Pytorch e TensorFlow. Através do conceito de arquivos de dados, também verá como é fácil especificar os caminhos de montagem

Para o Batch AI, fê-lo desta forma:

azure_file_share = 'afs'
azure_blob = 'bfs'
args_fmt = '--job_name={0} --num_gpus=1 --train_steps 10000 --checkpoint_dir=$AZ_BATCHAI_OUTPUT_MODEL --log_dir=$AZ_BATCHAI_OUTPUT_TENSORBOARD --data_dir=$AZ_BATCHAI_INPUT_DATASET --ps_hosts=$AZ_BATCHAI_PS_HOSTS --worker_hosts=$AZ_BATCHAI_WORKER_HOSTS --task_index=$AZ_BATCHAI_TASK_INDEX'

parameters = models.JobCreateParameters(
     cluster=models.ResourceId(id=cluster.id),
     node_count=2,
     input_directories=[
        models.InputDirectory(
            id='SCRIPT',
            path='$AZ_BATCHAI_JOB_MOUNT_ROOT/{0}/{1}'.format(azure_blob, script_directory)),
        models.InputDirectory(
            id='DATASET',
            path='$AZ_BATCHAI_JOB_MOUNT_ROOT/{0}/{1}'.format(azure_blob, mnist_dataset_directory))],
     std_out_err_path_prefix='$AZ_BATCHAI_JOB_MOUNT_ROOT/{0}'.format(azure_file_share),
     output_directories=[
        models.OutputDirectory(
            id='MODEL',
            path_prefix='$AZ_BATCHAI_JOB_MOUNT_ROOT/{0}'.format(azure_file_share),
            path_suffix='Models'),
        models.OutputDirectory(
            id='TENSORBOARD',
            path_prefix='$AZ_BATCHAI_JOB_MOUNT_ROOT/{0}'.format(azure_file_share),
            path_suffix='Logs')
     ],
     mount_volumes=models.MountVolumes(
            azure_file_shares=[
                models.AzureFileShareReference(
                    account_name=cfg.storage_account_name,
                    credentials=models.AzureStorageCredentialsInfo(
                        account_key=cfg.storage_account_key),
                    azure_file_url='https://{0}.file.core.windows.net/{1}'.format(
                        cfg.storage_account_name, azure_file_share_name),
                    relative_mount_path=azure_file_share)
            ],
            azure_blob_file_systems=[
                models.AzureBlobFileSystemReference(
                    account_name=cfg.storage_account_name,
                    credentials=models.AzureStorageCredentialsInfo(
                        account_key=cfg.storage_account_key),
                    container_name=azure_blob_container_name,
                    relative_mount_path=azure_blob)
            ]
        ),
     container_settings=models.ContainerSettings(
         image_source_registry=models.ImageSourceRegistry(image='tensorflow/tensorflow:1.8.0-gpu')),
     tensor_flow_settings=models.TensorFlowSettings(
         parameter_server_count=1,
         worker_count=nodes_count,
         python_script_file_path='$AZ_BATCHAI_INPUT_SCRIPT/'+ script_to_deploy,
         master_command_line_args=args_fmt.format('worker'),
         worker_command_line_args=args_fmt.format('worker'),
         parameter_server_command_line_args=args_fmt.format('ps'),
     )
)

Submeter a tarefa em si no Azure Batch IA é através da função create.

job_name = datetime.utcnow().strftime('tf_%m_%d_%Y_%H%M%S')
job = client.jobs.create(cfg.resource_group, cfg.workspace, experiment_name, job_name, parameters).result()
print('Created Job {0} in Experiment {1}'.format(job.name, experiment.name))

As informações completas para este fragmento de código de preparação (incluindo o ficheiro mnist_replica.py que carregámos para a partilha de ficheiros acima) podem ser encontradas no repositório github do bloco de notas de exemplo de IA Azure Batch.

Para o serviço Azure Machine Learning, experimente:

from azureml.train.dnn import TensorFlow

script_params={
    '--num_gpus': 1,
    '--train_steps': 500,
    '--input_data': ds_data.as_mount()

}

estimator = TensorFlow(source_directory=project_folder,
                       compute_target=gpu_cluster,
                       script_params=script_params,
                       entry_script='tf_mnist_replica.py',
                       node_count=2,
                       worker_count=2,
                       parameter_server_count=1,   
                       distributed_backend='ps',
                       use_gpu=True)

As informações completas para este fragmento de código de preparação (incluindo o ficheiro tf_mnist_replica.py) podem ser encontradas no repositório github do bloco de notas de exemplo do serviço Azure Machine Learning. O próprio arquivo de dados pode ser montado nos nós individuais ou os dados de preparação podem ser transferidos no próprio nó. Mais detalhes sobre como referenciar o arquivo de dados no seu avaliador estão na documentação do serviço Azure Machine Learning.

Submeter uma execução no serviço Azure Machine Learning é através da função submit.

run = experiment.submit(estimator)
print(run)

Existe outra forma de especificar parâmetros para a execução com uma configuração de execução, especialmente útil para definir um ambiente de preparação personalizado. Pode encontrar mais detalhes neste bloco de notas AmlCompute de exemplo.

Monitorizar execuções

Depois de submeter uma execução, pode aguardar que a mesma seja concluída ou monitorizá-la no serviço Azure Machine Learning com widgets do Jupyter organizados que pode invocar diretamente a partir do seu código. Também pode solicitar o contexto de qualquer execução anterior ao percorrer as várias experimentações numa área de trabalho e a execução individual em cada experimentação.

Para o Batch AI, fê-lo desta forma:

utils.job.wait_for_job_completion(client, cfg.resource_group, cfg.workspace, 
                                  experiment_name, job_name, cluster_name, 'stdouterr', 'stdout-wk-0.txt')

files = client.jobs.list_output_files(cfg.resource_group, cfg.workspace, experiment_name, job_name,
                                      models.JobsListOutputFilesOptions(outputdirectoryid='stdouterr')) 
for f in list(files):
    print(f.name, f.download_url or 'directory')

Para o serviço Azure Machine Learning, experimente:

run.wait_for_completion(show_output=True)

from azureml.widgets import RunDetails
RunDetails(run).show()

Eis um instantâneo de como o widget carregaria no seu bloco de notas para ver os registos em tempo real: Diagrama de monitorização do Widget

Editar clusters

A eliminação de um cluster é simples. Além disso, o serviço Azure Machine Learning também lhe permite atualizar um cluster a partir do bloco de notas, caso pretenda dimensioná-lo para um número mais elevado de nós ou aumentar o tempo de espera inativo antes de reduzir verticalmente o cluster. Não lhe permitimos alterar o tamanho da VM do próprio cluster, uma vez que requer uma nova implementação de forma eficaz no back-end.

Para o Batch AI, fê-lo desta forma:

_ = client.clusters.delete(cfg.resource_group, cfg.workspace, cluster_name)

Para o serviço Azure Machine Learning, experimente:

gpu_cluster.delete()

gpu_cluster.update(min_nodes=2, max_nodes=4, idle_seconds_before_scaledown=600)

Obter suporte

O Batch AI deverá ser descontinuado a 31 de março e já está a bloquear o registo de novas subscrições no serviço, a menos que esteja na lista de permissões ao criar uma exceção através do suporte. Contacte-nos em Azure Batch Pré-visualização da Preparação de IA com perguntas ou se tem feedback à medida que migra para o serviço Azure Machine Learning.

O serviço Azure Machine Learning é um serviço geralmente disponível. Isto significa que vem com um SLA consolidado e vários planos de suporte à escolha.

Os preços para utilizar a infraestrutura do Azure através do serviço de IA Azure Batch ou através do serviço Azure Machine Learning não devem variar, uma vez que só cobramos o preço da computação subjacente em ambos os casos. Para obter mais informações, veja a calculadora de preços.

Veja a disponibilidade regional entre os dois serviços no portal do Azure.

Passos seguintes