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
- Subscrição do Azure - crie uma gratuitamente.
- Uma área de trabalho do Azure Machine Learning. Para obter mais informações, veja o artigo Criar uma área de trabalho .
- CLI do Azure.
- Um modelo de machine learning preparado registado na área de trabalho. Se não tiver um modelo, utilize o tutorial Classificação de imagens: preparar o modelo para preparar e registar um.
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.
Aceda à home page portal do Azure ou abra o menu da barra lateral e, em seguida, selecione Criar um recurso.
Na página Novo, selecione Bases de Dados e, em seguida, selecione Cache do Azure para Redis.
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. Selecione o separador Rede ou selecione o botão Rede na parte inferior da página.
No separador Rede , selecione o método de conectividade.
Selecione o separador Seguinte: Avançadas ou selecione o botão Seguinte: Avançadas na parte inferior da página.
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.
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.
Selecione o separador Seguinte: Etiquetas ou selecione o botão Seguinte: Etiquetas na parte inferior da página.
Opcionalmente, no separador Etiquetas , introduza o nome e o valor se pretender categorizar o recurso.
Selecione Rever + criar. É levado para o separador Rever + criar, onde o Azure valida a configuração.
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
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 depackage.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.
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 .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
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 devolvidospackage.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.
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.
- Aceda à sua aplicação de funções no portal do Azure.
- Em programador, selecione Código + Teste.
- No lado direito, selecione o separador Entrada .
- 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
Inicie sessão no Portal do Azure e selecione Grupos de recursos.
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
- Saiba mais sobre Cache do Azure para Redis
- Saiba como configurar a aplicação de funções na documentação das Funções .
- Referência da API
- Criar uma aplicação Python que utiliza Cache do Azure para Redis