Share via


Implementar um modelo de machine learning para Funções do Azure com Cache do Azure para Redis

Neste artigo, vai implementar um modelo do Azure Machine Learning como uma aplicação de funções no Funções do Azure com uma instância Cache do Azure para Redis.

Cache do Azure para Redis é eficaz e dimensionável. Quando emparelhado com um modelo do Azure Machine Learning, ganha baixa latência e débito elevado na sua aplicação. Alguns cenários em que uma cache é benéfica: ao inferir os dados e os resultados reais da inferência do modelo. Em ambos os cenários, os metadados ou os resultados são armazenados na memória, o que leva a um maior desempenho.

Nota

Embora o Azure Machine Learning e o Funções do Azure estejam disponíveis em geral, a capacidade de empacotar um modelo a partir do serviço Machine Learning para Funções está em pré-visualização.

Pré-requisitos

Importante

Os fragmentos de código neste artigo partem do princípio de que definiu as seguintes variáveis:

  • ws - A área de trabalho do Azure Machine Learning.
  • model - O modelo registado que será implementado.
  • inference_config - A configuração de inferência do modelo.

Para obter mais informações sobre como definir estas variáveis, veja Implementar modelos com o Azure Machine Learning.

Criar uma instância de Cache do Azure para Redis

Poderá implementar um modelo de machine learning para Funções do Azure com qualquer instância de cache Básica, Standard ou Premium. Para criar uma instância de cache, siga estes passos.

  1. Aceda à home page portal do Azure ou abra o menu da barra lateral e, em seguida, selecione Criar um recurso.

  2. Na página Novo, selecione Bases de Dados e, em seguida, selecione Cache do Azure para Redis.

    Selecione Cache do Azure para Redis.

  3. Na página Nova Cache de Redis , configure as definições para a nova cache.

    Definição Valor sugerido Descrição
    Nome DNS Introduza um nome globalmente exclusivo. O nome da cache tem de ser uma cadeia entre 1 e 63 carateres. A cadeia só pode conter números, letras ou hífenes. O nome tem de começar e terminar com um número ou letra e não pode conter hífenes consecutivos. O nome do anfitrião da instância de cache será <DNS name.redis.cache.windows.net>.
    Subscrição Pendente e selecione a sua subscrição. A subscrição na qual criar esta nova instância de Cache do Azure para Redis.
    Grupo de recursos Lista pendente e selecione um grupo de recursos ou selecione Criar novo e introduza um novo nome de grupo de recursos. Nome do grupo de recursos no qual criar a cache e outros recursos. Ao colocar todos os recursos da sua aplicação num grupo de recursos, pode facilmente geri-los ou eliminá-los em conjunto.
    Localização Lista pendente e selecione uma localização. Selecione uma região perto de outros serviços que irão utilizar a cache.
    Escalão de preço Pendente e selecione um Escalão de preço. O escalão de preço determina o tamanho, o desempenho e as funcionalidades que estão disponíveis para a cache. Para obter mais informações, consulte Cache do Azure para Redis Descrição Geral.
  4. Selecione o separador Rede ou selecione o botão Rede na parte inferior da página.

  5. No separador Rede , selecione o método de conectividade.

  6. Selecione o separador Seguinte: Avançadas ou selecione o botão Seguinte: Avançadas na parte inferior da página.

  7. No separador Avançadas para uma instância de cache básica ou padrão, selecione o botão de alternar ativar se quiser ativar uma porta não TLS.

  8. No separador Avançadas da instância de cache premium, configure as definições para a persistência de dados, clustering e porta não TLS.

  9. Selecione o separador Seguinte: Etiquetas ou selecione o botão Seguinte: Etiquetas na parte inferior da página.

  10. Opcionalmente, no separador Etiquetas , introduza o nome e o valor se pretender categorizar o recurso.

  11. Selecione Rever + criar. É levado para o separador Rever + criar, onde o Azure valida a configuração.

  12. Depois de aparecer a mensagem verde Validação transmitida, selecione Criar.

A criação da cache demora algum tempo. Pode monitorizar o progresso na página Descrição Geral do Cache do Azure para Redis. Quando o Estado é apresentado como Em Execução, a cache está pronta para ser utilizada.

Preparar para a implementação

Antes de implementar, tem de definir o que é necessário para executar o modelo como um serviço Web. A lista seguinte descreve os itens principais necessários para uma implementação:

  • Um script de entrada. Este script aceita pedidos, classifica o pedido com o modelo e devolve os resultados.

    Importante

    O script de entrada é específico do modelo; tem de compreender o formato dos dados de pedidos recebidos, o formato dos dados esperados pelo modelo e o formato dos dados devolvidos aos clientes.

    Se os dados do pedido estiverem num formato que não seja utilizável pelo seu modelo, o script pode transformá-los num formato aceitável. Também pode transformar a resposta antes de a devolver ao cliente.

    Por predefinição, ao empacotar para funções, a entrada é tratada como texto. Se estiver interessado em consumir os bytes não processados da entrada (por exemplo, para acionadores de Blobs), deve utilizar a AMLRequest para aceitar dados não processados.

Para a função de execução, certifique-se de que se liga a um ponto final de Redis.

import json
import numpy as np
import os
import redis
from sklearn.externals import joblib

def init():
    global model
    global azrediscache
    azrediscache = redis.StrictRedis(host='<host_url>', port=6380, password="<access_key>", ssl=True)
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_mnist_model.pkl')
    model = joblib.load(model_path)

@input_schema('data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        input = azrediscache.get(data)
        result = model.predict(input)
        data = np.array(json.loads(data))
        result = model.predict(data)
        # You can return any data type, as long as it is JSON serializable.
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

Para obter mais informações sobre o script de entrada, veja Definir código de classificação.

  • Dependências, como scripts auxiliares ou pacotes Python/Conda necessários para executar o script ou modelo de entrada

Estas entidades são encapsuladas numa configuração de inferência. A configuração de inferência referencia o script de entrada e outras dependências.

Importante

Ao criar uma configuração de inferência para utilização com Funções do Azure, tem de utilizar um objeto Ambiente. Tenha em atenção que, se estiver a definir um ambiente personalizado, tem de adicionar azureml-defaults com a versão >= 1.0.45 como uma dependência pip. Este pacote contém a funcionalidade necessária para alojar o modelo como um serviço Web. O exemplo seguinte demonstra como criar um objeto de ambiente e utilizá-lo com uma configuração de inferência:

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies

# Create an environment and add conda dependencies to it
myenv = Environment(name="myenv")
# Enable Docker based environment
myenv.docker.enabled = True
# Build conda dependencies
myenv.python.conda_dependencies = CondaDependencies.create(conda_packages=['scikit-learn'],
                                                           pip_packages=['azureml-defaults', 'redis'])
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)

Para obter mais informações sobre ambientes, veja Criar e gerir ambientes para preparação e implementação.

Para obter mais informações sobre a configuração da inferência, veja Implementar modelos com o Azure Machine Learning.

Importante

Ao implementar em Funções, não precisa de criar uma configuração de implementação.

Instalar o pacote de pré-visualização do SDK para suporte de Funções

Para criar pacotes para Funções do Azure, tem de instalar o pacote de pré-visualização do SDK.

pip install azureml-contrib-functions

Criar a imagem

Para criar a imagem do Docker implementada no Funções do Azure, utilize azureml.contrib.functions.package ou a função de pacote específica para o acionador que pretende utilizar. O fragmento de código seguinte demonstra como criar um novo pacote com um acionador HTTP a partir da configuração do modelo e da inferência:

Nota

O fragmento de código pressupõe que model contém um modelo registado e que inference_config contém a configuração para o ambiente de inferência. Para obter mais informações, veja Implementar modelos com o Azure Machine Learning.

from azureml.contrib.functions import package
from azureml.contrib.functions import HTTP_TRIGGER
model_package = package(ws, [model], inference_config, functions_enabled=True, trigger=HTTP_TRIGGER)
model_package.wait_for_creation(show_output=True)
# Display the package location/ACR path
print(model_package.location)

Quando show_output=True, é apresentada a saída do processo de compilação do Docker. Assim que o processo for concluído, a imagem é criada no Azure Container Registry da área de trabalho. Assim que a imagem tiver sido criada, a localização no seu Azure Container Registry é apresentada. A localização devolvida está no formato <acrinstance>.azurecr.io/package@sha256:<imagename>.

Nota

Atualmente, o empacotamento para Funções suporta acionadores HTTP, acionadores de blobs e acionadores do Service Bus. Para obter mais informações sobre os acionadores, veja Funções do Azure enlaces.

Importante

Guarde as informações de localização, tal como são utilizadas ao implementar a imagem.

Implementar imagem como uma aplicação Web

  1. Utilize o seguinte comando para obter as credenciais de início de sessão do Azure Container Registry que contém a imagem. Substitua <myacr> pelo valor devolvido anteriormente de package.location:

    az acr credential show --name <myacr>
    

    O resultado deste comando é semelhante ao seguinte documento JSON:

    {
    "passwords": [
        {
        "name": "password",
        "value": "abcdefghijklmmopqrstuv1234567890"
        },
        {
        "name": "password2",
        "value": "1234567890abcdefghijklmmopqrstuv"
        }
    ],
    "username": "charlie.roy"
    }
    

    Guarde o valor para o nome de utilizador e uma das palavras-passe.

  2. Se ainda não tiver um grupo de recursos ou um plano do serviço de aplicações para implementar o serviço, estes comandos demonstram como criar ambos:

    az group create --name myresourcegroup --location "West Europe"
    az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
    

    Neste exemplo, é utilizado um escalão de preço básico do Linux (--sku B1).

    Importante

    As imagens criadas pelo Azure Machine Learning utilizam o Linux, pelo que tem de utilizar o --is-linux parâmetro .

  3. Crie a conta de armazenamento a utilizar para o armazenamento de tarefas Web e obtenha a respetiva cadeia de ligação. Substitua <webjobStorage> pelo nome que pretende utilizar.

    az storage account create --name <webjobStorage> --location westeurope --resource-group myresourcegroup --sku Standard_LRS
    
    az storage account show-connection-string --resource-group myresourcegroup --name <webJobStorage> --query connectionString --output tsv
    
  4. Para criar a aplicação de funções, utilize o seguinte comando. Substitua <app-name> pelo nome que pretende utilizar. Substitua <acrinstance> e <imagename> pelos valores devolvidos package.location anteriormente. Substitua <webjobStorage> pelo nome da conta de armazenamento do passo anterior:

    az functionapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.io/package:<imagename> --storage-account <webjobStorage>
    

    Importante

    Neste momento, a aplicação de funções foi criada. No entanto, uma vez que não forneceu a cadeia de ligação para o acionador HTTP ou credenciais para o Azure Container Registry que contém a imagem, a aplicação de funções não está ativa. Nos passos seguintes, irá fornecer a cadeia de ligação e as informações de autenticação do registo de contentor.

  5. Para fornecer à aplicação de funções as credenciais necessárias para aceder ao registo de contentor, utilize o seguinte comando. Substitua <app-name> pelo nome da aplicação de funções. Substitua <acrinstance> e <imagetag> pelos valores da chamada da CLI do AZ no passo anterior. Substitua <username> e <password> pelas informações de início de sessão do ACR obtidas anteriormente:

    az functionapp config container set --name <app-name> --resource-group myresourcegroup --docker-custom-image-name <acrinstance>.azurecr.io/package:<imagetag> --docker-registry-server-url https://<acrinstance>.azurecr.io --docker-registry-server-user <username> --docker-registry-server-password <password>
    

    Este comando devolve informações semelhantes ao seguinte documento JSON:

    [
    {
        "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
        "slotSetting": false,
        "value": "false"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_URL",
        "slotSetting": false,
        "value": "[server-name].azurecr.io"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_USERNAME",
        "slotSetting": false,
        "value": "[username]"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
        "slotSetting": false,
        "value": null
    },
    {
        "name": "DOCKER_CUSTOM_IMAGE_NAME",
        "value": "DOCKER|[server-name].azurecr.io/package:20190827195524"
    }
    ]
    

Neste momento, a aplicação de funções começa a carregar a imagem.

Importante

Pode demorar vários minutos até a imagem ser carregada. Pode monitorizar o progresso com o portal do Azure.

Testar Funções do Azure acionador HTTP

Vamos agora executar e testar o nosso Funções do Azure acionador HTTP.

  1. Aceda à sua aplicação de funções no portal do Azure.
  2. Em programador, selecione Código + Teste.
  3. No lado direito, selecione o separador Entrada .
  4. Selecione no botão Executar para testar o Funções do Azure acionador HTTP.

Implementou com êxito um modelo do Azure Machine Learning como uma aplicação de funções com uma instância Cache do Azure para Redis. Saiba mais sobre Cache do Azure para Redis ao navegar para as ligações na secção abaixo.

Limpar os recursos

Se avançar para o próximo tutorial, pode manter os recursos que criou neste início rápido e reutilizá-los.

Caso contrário, se tiver terminado o início rápido, pode eliminar os recursos do Azure que criou neste início rápido para evitar custos.

Importante

A eliminação de um grupo de recursos é irreversível. Quando elimina um grupo de recursos, todos os recursos nele contidos são eliminados permanentemente. Confirme que não elimina acidentalmente o grupo de recursos ou recursos errados. Se criou os recursos para alojar este exemplo dentro de um grupo de recursos existente que contém recursos que pretende manter, pode eliminar cada recurso individualmente à esquerda em vez de eliminar o grupo de recursos.

Para eliminar um grupo de recursos

  1. Inicie sessão no Portal do Azure e selecione Grupos de recursos.

  2. Na caixa Filtrar por nome..., escreva o nome do grupo de recursos. No grupo de recursos na lista de resultados, selecione ... e, em seguida, selecione Eliminar grupo de recursos.

É-lhe pedido que confirme a eliminação do grupo de recursos. Escreva o nome do grupo de recursos para confirmar e, em seguida, selecione Eliminar.

Após alguns instantes, o grupo de recursos e todos os respetivos recursos são eliminados.

Passos seguintes