Implementar modelos de aprendizagem automática para Azure

Aprenda a implementar o seu modelo de aprendizagem automática ou aprendizagem profunda como um serviço web na nuvem Azure.

Dica

Os pontos finais online geridos (pré-visualização) fornecem uma forma de implementar o seu modelo treinado sem ter de criar e gerir a infraestrutura subjacente. Para obter mais informações, consulte Implementar e marcar um modelo de machine learning com um ponto final online gerido (pré-visualização).

O fluxo de trabalho é semelhante, independentemente de onde implementa o modelo:

  1. Registar o modelo
  2. Preparar um roteiro de entrada
  3. Preparar uma configuração de inferência
  4. Implemente o modelo localmente para garantir que tudo funcione
  5. Escolha um alvo de cálculo
  6. Re-implantar o modelo para a nuvem
  7. Testar o serviço web resultante

Para obter mais informações sobre os conceitos envolvidos no fluxo de trabalho de implementação de machine learning, consulte Gerir, implementar e monitorizar modelos com Azure Machine Learning.

Pré-requisitos

Ligar à sua área de trabalho

O que deve fazer

az login
az account set -s <my subscription>
az ml workspace list --resource-group=<my resource group>

para ver os espaços de trabalho a que tem acesso.

Registe o seu modelo

Uma situação típica para um serviço de machine learning implantado é que você precisa dos seguintes componentes:

  • recursos que representam o modelo específico que pretende implementar (por exemplo: um ficheiro modelo de pytorch)
  • código que vai estar a executar em th serviço, que executa o modelo em uma dada entrada

O Azure Machine Learnings permite-lhe separar a implementação em dois componentes distintos, para que possa manter o mesmo código, mas apenas atualizar o modelo. Definimos o mecanismo pelo qual envia um modelo separadamente do seu código como "registar o modelo".

Quando regista um modelo, enviamos o modelo para a nuvem (na conta de armazenamento padrão do seu espaço de trabalho) e depois montamo-lo no mesmo computação onde o seu webservice está a funcionar.

Os exemplos que se seguem demonstram como registar um modelo.

Importante

Deve utilizar apenas modelos que crie ou obtenha a partir de uma fonte fidedigna. Deve tratar os modelos serializados como código, uma vez que as vulnerabilidades de segurança foram descobertas em vários formatos populares. Além disso, os modelos podem ser intencionalmente treinados com intenção maliciosa de fornecer uma saída tendenciosa ou imprecisa.

Registar um modelo a partir de um arquivo local

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

-pDesacorde o caminho de uma pasta ou de um ficheiro que pretende registar.

Para obter mais az ml model register informações, consulte a documentação de referência.

Registar um modelo de um treino Azure ML

az ml model register -n bidaf_onnx --asset-path outputs/model.onnx --experiment-name myexperiment --run-id myrunid --tag area=qna

Dica

Se receber uma mensagem de erro indicando que a extensão ml não está instalada, utilize o seguinte comando para a instalar:

az extension add -n azure-cli-ml

O --asset-path parâmetro refere-se à localização em nuvem do modelo. Neste exemplo, o caminho de um único ficheiro é usado. Para incluir vários ficheiros no registo do modelo, definido --asset-path para o caminho de uma pasta que contém os ficheiros.

Para obter mais az ml model register informações, consulte a documentação de referência.

Defina um script de entrada falso

O script de entrada recebe os dados enviados para um serviço Web implementado e transmite-os para o modelo. Em seguida, devolve a resposta do modelo ao cliente. O script é específico do seu modelo. O script de entrada deve compreender os dados que o modelo espera e devolve.

As duas coisas que precisas de realizar no teu guião de entrada são:

  1. Carregar o seu modelo (utilizando uma função init() chamada)
  2. Executar o seu modelo em dados de entrada (utilizando uma função chamada run() )

Para a sua implementação inicial, utilize um script de entrada falso que imprima os dados que recebe.

import json


def init():
    print("This is init")


def run(data):
    test = json.loads(data)
    print(f"received data {test}")
    return f"test is {test}"

Guarde este ficheiro como echo_score.py dentro de um diretório chamado source_dir .

Assim, por exemplo, se um utilizador ligar para o seu modelo com:

curl -X POST -d '{"this":"is a test"}' -H "Content-Type: application/json" http://localhost:6789/score

O seguinte valor é devolvido:

"test is {'this': 'is a test'}"

Definir uma configuração de inferência

Uma configuração de inferência descreve o recipiente e ficheiros Docker para utilizar ao rubricar o seu serviço web. Todos os ficheiros dentro do seu diretório de origem, incluindo subdireções, serão fechados e enviados para a nuvem quando implementar o seu serviço web.

A configuração de inferência abaixo especifica que a implementação de machine learning utilizará o ficheiro echo_score.py no ./source_dir diretório para processar pedidos de entrada e que utilizará a imagem docker com os pacotes Python especificados no project_environment ambiente.

Você pode usar qualquer ambiente curado Azure Machine Learning como a imagem base docker ao criar o seu ambiente de projeto. Instalaremos as dependências necessárias no topo e armazenaremos a imagem resultante do Docker no repositório que está associado ao seu espaço de trabalho.

Uma configuração mínima de inferência pode ser escrita como:

{
    "entryScript": "echo_score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "1"
    }
}

Guarde este ficheiro com o nome dummyinferenceconfig.json .

Consulte este artigo para uma discussão mais aprofundada sobre as configurações de inferência.

Definir uma configuração de implementação

Uma configuração de implementação especifica a quantidade de memória e núcleos para reservar para o seu webservice necessário para executar, bem como detalhes de configuração do serviço web subjacente. Por exemplo, uma configuração de implementação permite especificar que o seu serviço precisa de 2 gigabytes de memória, 2 núcleos de CPU, 1 núcleo de GPU e que pretende ativar a autoscalagem.

As opções disponíveis para uma configuração de implementação diferem consoante o alvo de computação que escolher. Numa implementação local, tudo o que pode especificar é em que porta será servido o seu serviço web.

As entradas no mapa do deploymentconfig.json documento aos parâmetros para LocalWebservice.deploy_configuration. A tabela a seguir descreve o mapeamento entre as entidades do documento JSON e os parâmetros para o método:

Entidade JSON Parâmetro do método Description
computeType ND O destino de computação. Para os alvos locais, o valor deve local ser.
port port O porto local para expor o ponto final HTTP do serviço.

Este JSON é uma configuração de implementação de exemplo para utilização com o CLI:

{
    "computeType": "local",
    "port": 32267
}

Guarde este JSON como um ficheiro chamado deploymentconfig.json .

Para mais informações, consulte esta referência.

Implemente o seu modelo de aprendizagem automática

Está agora pronto para lançar o seu modelo.

bidaf_onnx:1Substitua-o pelo nome do seu modelo e pelo número da sua versão.

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Ligue para o seu modelo

Vamos verificar se o seu modelo de eco foi implementado com sucesso. Você deve ser capaz de fazer um simples pedido de vida, bem como um pedido de pontuação:

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Definir um script de entrada

Agora é hora de carregar o seu modelo. Primeiro, modifique o seu script de entrada:

import json
import numpy as np
import os
import onnxruntime
from nltk import word_tokenize
import nltk


def init():
    nltk.download("punkt")
    global sess
    sess = onnxruntime.InferenceSession(
        os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model.onnx")
    )


def run(request):
    print(request)
    text = json.loads(request)
    qw, qc = preprocess(text["query"])
    cw, cc = preprocess(text["context"])

    # Run inference
    test = sess.run(
        None,
        {"query_word": qw, "query_char": qc, "context_word": cw, "context_char": cc},
    )
    start = np.asscalar(test[0])
    end = np.asscalar(test[1])
    ans = [w for w in cw[start : end + 1].reshape(-1)]
    print(ans)
    return ans


def preprocess(word):
    tokens = word_tokenize(word)

    # split into lower-case word tokens, in numpy array with shape of (seq, 1)
    words = np.asarray([w.lower() for w in tokens]).reshape(-1, 1)

    # split words into chars, in numpy array with shape of (seq, 1, 1, 16)
    chars = [[c for c in t][:16] for t in tokens]
    chars = [cs + [""] * (16 - len(cs)) for cs in chars]
    chars = np.asarray(chars).reshape(-1, 1, 1, 16)
    return words, chars

Guarde este ficheiro como score.py dentro de source_dir .

Note a utilização da AZUREML_MODEL_DIR variável ambiental para localizar o seu modelo registado. Agora que adicionou alguns pacotes de pip.

{
    "entryScript": "score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults",
                            "nltk",
                            "numpy",
                            "onnxruntime"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "2"
    }
}

Guarde este ficheiro como inferenceconfig.json

Deploy your service again: null

bidaf_onnx:1Substitua-o pelo nome do seu modelo e pelo número da sua versão.

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Em seguida, certifique-se de que pode enviar um pedido de correio para o serviço:

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Escolha um alvo de cálculo

Consulte o diagrama abaixo ao escolher um alvo de cálculo.

Como escolher um alvo de computação

O alvo de computação que utiliza para hospedar o seu modelo irá afetar o custo e a disponibilidade do seu ponto final implantado. Utilize esta tabela para escolher um alvo de computação apropriado.

Destino de computação Utilizado para Suporte de GPU Suporte de FPGA Description
 Serviço web local   Teste/depuragem     Utilização para testes limitados e resolução de problemas. A aceleração do hardware depende da utilização de bibliotecas no sistema local.
Azure Kubernetes Service (AKS) Inferência em tempo real Sim (implantação de serviço web) Sim Utilização para implantações de produção de alta escala. Proporciona tempo de resposta rápida e autoscalagem do serviço implantado. A autoescalagem do cluster não é suportada através do Azure Machine Learning SDK. Para alterar os nós no cluster AKS, utilize o UI para o seu cluster AKS no portal Azure.

Apoiado no designer.
Azure Container Instances Inferência em tempo real     Utilize cargas de trabalho baseadas em CPU de baixa escala que exijam menos de 48 GB de RAM. Não requer que maneje um aglomerado.

Apoiado no designer.
Clusters de computação do Azure Machine Learning  Inferência do lote Sim (pipeline de aprendizagem automática)   Executar a pontuação do lote no cálculo sem servidor. Suporta VMs normais e de baixa prioridade. Sem apoio para inferência em tempo real.

Nota

Embora os alvos computativos como os clusters de cálculo local, e Azure Machine Learning suportem GPU para treino e experimentação, usando GPU para inferência quando implementado como um serviço web é suportado apenas em AKS.

A utilização de uma GPU para inferência ao marcar com um pipeline de aprendizagem automática é suportada apenas no cálculo Azure Machine Learning.

Ao escolher um cluster SKU, primeiro escalone e depois escale para fora. Comece com uma máquina que tenha 150% da RAM que o seu modelo necessita, perfile o resultado e encontre uma máquina que tenha o desempenho de que necessita. Assim que aprenderes isso, aumenta o número de máquinas para se adaptar à tua necessidade de inferência simultânea.

Nota

  • As instâncias do contentor são adequadas apenas para pequenos modelos com menos de 1 GB de tamanho.
  • Utilize clusters AKS de nó único para dev/teste de modelos maiores.

Re-implantar para a nuvem

Assim que tiver confirmado que o seu serviço funciona localmente e escolheu um alvo de computação remota, está pronto para ser implantado na nuvem.

Altere a sua configuração de implementação para corresponder ao alvo de cálculo que escolheu, neste caso, instâncias do contentor Azure:

As opções disponíveis para uma configuração de implementação diferem consoante o alvo de computação que escolher.

{
    "computeType": "aci",
    "containerResourceRequirements":
    {
        "cpu": 0.5,
        "memoryInGB": 1.0
    },
    "authEnabled": true,
    "sslEnabled": false,
    "appInsightsEnabled": false
}

Guarde este ficheiro como re-deploymentconfig.json .

Para mais informações, consulte esta referência.

Implemente novamente o seu serviço:

bidaf_onnx:1Substitua-o pelo nome do seu modelo e pelo número da sua versão.

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Ligue para o seu serviço web remoto

Quando se implanta remotamente, poderá ter a autenticação da chave ativada. O exemplo abaixo mostra como obter a sua chave de serviço com python para fazer um pedido de inferência.

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Consulte o artigo sobre aplicações de clientes para consumir serviços web para mais exemplo clientes em outros idiomas.

Estado de serviço de compreensão

Durante a implementação do modelo, poderá ver a alteração do estado de serviço enquanto este se desdobra completamente.

A tabela a seguir descreve os diferentes estados de serviço:

Estado do serviço web Description Estado final?
Transição O serviço está em processo de implantação. No
Mau estado de funcionamento O serviço foi implantado, mas está atualmente inacessível. No
Insodulável O serviço não pode ser implantado neste momento devido à falta de recursos. No
Com falhas O serviço falhou em ser acionado devido a um erro ou acidente. Yes
Bom estado de funcionamento O serviço é saudável e o ponto final está disponível. Yes

Dica

Ao implementar, as imagens do Docker para alvos de computação são construídas e carregadas a partir do Registo de Contentores de Azure (ACR). Por predefinição, o Azure Machine Learning cria um ACR que utiliza o nível básico de serviço. Mudar o ACR para o seu espaço de trabalho para um nível normal ou premium pode reduzir o tempo que leva para construir e implementar imagens para os seus alvos de computação. Para mais informações, consulte os níveis de serviço de registo de contentores Azure.

Nota

Se estiver a implementar um modelo para o Serviço Azure Kubernetes (AKS), aconselhamos que adinga o Azure Monitor para esse cluster. Isto irá ajudá-lo a compreender a saúde geral do cluster e o uso de recursos. Também poderá encontrar os seguintes recursos úteis:

Se estiver a tentar implantar um modelo num cluster pouco saudável ou sobrecarregado, espera-se que experimente problemas. Se precisar de ajuda para resolver problemas de resolução de problemas de cluster AKS contacte o Suporte AKS.

Eliminar recursos

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Aviso

Parece que a amostra de que está à procura foi movida! Não se preocupe, estamos a tentar resolver o problema.

Para eliminar um serviço web implantado, utilize az ml service delete <name of webservice> .

Para eliminar um modelo registado do seu espaço de trabalho, utilize az ml model delete <model id>

Leia mais sobre a eliminação de um serviço web e a eliminação de um modelo.

Passos seguintes