Implantar um modelo de aprendizado de máquina no Azure Functions com o Cache Redis do Azure
Neste artigo, você implanta um modelo do Aprendizado de Máquina do Azure como um aplicativo de função no Azure Functions usando uma instância do Cache do Azure para Redis.
O Cache Redis do Azure tem desempenho e é escalável. Quando emparelhado com um modelo do Azure Machine Learning, você obtém baixa latência e alta taxa de transferência em seu aplicativo. Alguns cenários em que um cache é benéfico: ao inferir os dados e para os resultados reais da inferência do modelo. Em ambos os cenários, os metadados ou resultados são armazenados na memória, o que leva a um maior desempenho.
Nota
Embora o Aprendizado de Máquina do Azure e o Azure Functions estejam geralmente disponíveis, a capacidade de empacotar um modelo do serviço de Aprendizado de Máquina para Funções está em visualização.
Pré-requisitos
- Subscrição do Azure - crie uma gratuitamente.
- Uma área de trabalho do Azure Machine Learning. Para obter mais informações, consulte o artigo Criar um espaço de trabalho .
- CLI do Azure.
- Um modelo de aprendizado de máquina treinado registrado em seu espaço de trabalho. Se você não tiver um modelo, use o tutorial Classificação de imagem: modelo de trem para treinar e registrar um.
Importante
Os trechos de código neste artigo pressupõem que você tenha definido as seguintes variáveis:
ws
- Seu espaço de trabalho do Azure Machine Learning.model
- O modelo cadastrado que será implantado.inference_config
- A configuração de inferência para o modelo.
Para obter mais informações sobre como definir essas variáveis, consulte Implantar modelos com o Azure Machine Learning.
Criar uma instância do Cache do Azure para Redis
Você poderá implantar um modelo de aprendizado de máquina no Azure Functions com qualquer instância de cache Basic, Standard ou Premium. Para criar uma instância de cache, siga estas etapas.
Vá para a página inicial do portal do Azure ou abra o menu da barra lateral e selecione Criar um recurso.
Na página Novo, selecione Bancos de Dados e, em seguida, selecione Cache do Azure para Redis.
Na página Novo Cache Redis, defina as configurações para o novo cache.
Definição Valor sugerido Description Nome DNS Introduza um nome globalmente exclusivo. O nome do cache deve ser uma cadeia de caracteres entre 1 e 63 caracteres. A cadeia de caracteres pode conter apenas números, letras ou hífenes. O nome deve começar e terminar com um número ou letra e não pode conter hífenes consecutivos. O nome de host da instância de cache será <DNS name.redis.cache.windows.net>. Subscrição Drop-down e selecione sua assinatura. A assinatura sob a qual criar essa nova instância do Cache do Azure para Redis. Grupo de recursos Drop-down e selecione um grupo de recursos, ou selecione Criar novo e insira um novo nome de grupo de recursos. Nome do grupo de recursos no qual criar o cache e outros recursos. Ao colocar todos os recursos do seu aplicativo em um grupo de recursos, você pode facilmente gerenciá-los ou excluí-los juntos. Location Drop-down e selecione um local. Selecione uma região perto de outros serviços que usarão seu cache. Escalão de preço Menu suspenso e selecione um Nível 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 Visão geral do Cache do Azure para Redis. Selecione a guia Rede ou selecione o botão Rede na parte inferior da página.
Na guia Rede, selecione seu método de conectividade.
Selecione a guia Avançar: Avançado ou selecione o botão Avançar: Avançado na parte inferior da página.
Na guia Avançado para uma instância de cache básica ou padrão, selecione a opção habilitar se quiser habilitar uma porta não-TLS.
Na guia Avançado para instância de cache premium, defina as configurações para porta não-TLS, clustering e persistência de dados.
Selecione a guia Next: Tags ou selecione o botão Next: Tags na parte inferior da página.
Opcionalmente, na guia Marcas , insira o nome e o valor se desejar categorizar o recurso.
Selecione Rever + criar. Você é levado para a guia Revisão + criação, onde o Azure valida sua configuração.
Depois que a mensagem verde Validação passada for exibida, selecione Criar.
Demora um pouco para o cache ser criado. Você pode monitorar o progresso na página Visão geral do Cache do Azure para Redis. Quando Status é exibido como Em execução, o cache está pronto para uso.
Preparar para a implementação
Antes de implantar, você deve definir o que é necessário para executar o modelo como um serviço Web. A lista a seguir descreve os principais itens necessários para uma implantação:
Um script de entrada. Esse script aceita solicitações, pontua a solicitação usando o modelo e retorna os resultados.
Importante
O script de entrada é específico para o seu modelo; Ele deve entender o formato dos dados de solicitação de entrada, o formato dos dados esperados pelo seu modelo e o formato dos dados retornados aos clientes.
Se os dados da solicitação estiverem em um formato que não é utilizável pelo seu modelo, o script pode transformá-los em um formato aceitável. Também pode transformar a resposta antes de devolvê-la ao cliente.
Por padrão, ao empacotar funções, a entrada é tratada como texto. Se você estiver interessado em consumir os bytes brutos da entrada (por exemplo, para gatilhos de Blob), use AMLRequest para aceitar dados brutos.
Para a função run, verifique se ela se conecta a um ponto de extremidade 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 script de entrada, consulte Definir código de pontuação.
- Dependências, como scripts auxiliares ou pacotes Python/Conda necessários para executar o script ou modelo de entrada
Essas entidades são encapsuladas em uma 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 uso com o Azure Functions, você deve usar um objeto Environment . Observe que, se você estiver definindo um ambiente personalizado, deverá adicionar azureml-defaults com version >= 1.0.45 como uma dependência pip. Este pacote contém a funcionalidade necessária para hospedar o modelo como um serviço Web. O exemplo a seguir demonstra a criação de um objeto de ambiente e o uso 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, consulte Criar e gerenciar ambientes para treinamento e implantação.
Para obter mais informações sobre a configuração de inferência, consulte Implantar modelos com o Azure Machine Learning.
Importante
Ao implantar no Functions, não é necessário criar uma configuração de implantação.
Instale o pacote de visualização do SDK para suporte ao Functions
Para criar pacotes para o Azure Functions, você deve instalar o pacote de visualização do SDK.
pip install azureml-contrib-functions
Criar a imagem
Para criar a imagem do Docker implantada no Azure Functions, use azureml.contrib.functions.package ou a função de pacote específica para o gatilho que você deseja usar. O trecho de código a seguir demonstra como criar um novo pacote com um gatilho HTTP a partir do modelo e da configuração de inferência:
Nota
O trecho de código pressupõe que model
contém um modelo registrado e que inference_config
contém a configuração para o ambiente de inferência. Para obter mais informações, consulte Implantar 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
, a saída do processo de compilação do Docker é mostrada. Quando o processo for concluído, a imagem será criada no Registro de Contêiner do Azure para seu espaço de trabalho. Depois que a imagem tiver sido criada, o local no Registro de Contêiner do Azure será exibido. O local retornado está no formato <acrinstance>.azurecr.io/package@sha256:<imagename>
.
Nota
Atualmente, o Packaging for Functions suporta Gatilhos HTTP, Gatilhos de Blob e Gatilhos de barramento de serviço. Para obter mais informações sobre gatilhos, consulte Associações do Azure Functions.
Importante
Salve as informações de localização, como elas são usadas ao implantar a imagem.
Implantar imagem como um aplicativo Web
Use o comando a seguir para obter as credenciais de logon para o Registro de Contêiner do Azure que contém a imagem. Substitua
<myacr>
pelo valor retornado anteriormente depackage.location
:az acr credential show --name <myacr>
A saída deste comando é semelhante ao seguinte documento JSON:
{ "passwords": [ { "name": "password", "value": "abcdefghijklmmopqrstuv1234567890" }, { "name": "password2", "value": "1234567890abcdefghijklmmopqrstuv" } ], "username": "charlie.roy" }
Salve o valor para nome de usuário e uma das senhas.
Se você ainda não tiver um grupo de recursos ou um plano de serviço de aplicativo para implantar 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, um nível de preço básico do Linux (
--sku B1
) é usado.Importante
As imagens criadas pelo Azure Machine Learning usam Linux, portanto, você deve usar o
--is-linux
parâmetro.Crie a conta de armazenamento a ser usada para o armazenamento de trabalhos da Web e obtenha sua cadeia de conexão. Substitua
<webjobStorage>
pelo nome que deseja usar.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 o aplicativo de função, use o seguinte comando. Substitua
<app-name>
pelo nome que deseja usar. Substitua<acrinstance>
e<imagename>
pelos valores retornadospackage.location
anteriormente. Substitua<webjobStorage>
pelo nome da conta de armazenamento da etapa 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 ponto, o aplicativo de função foi criado. No entanto, como você não forneceu a cadeia de conexão para o gatilho HTTP ou credenciais para o Registro de Contêiner do Azure que contém a imagem, o aplicativo de função não está ativo. Nas próximas etapas, você fornece a cadeia de conexão e as informações de autenticação para o registro de contêiner.
Para fornecer ao aplicativo de função as credenciais necessárias para acessar o registro de contêiner, use o seguinte comando. Substitua
<app-name>
pelo nome do aplicativo de função. Substitua<acrinstance>
e<imagetag>
pelos valores da chamada AZ CLI na etapa anterior. Substitua<username>
e<password>
pelas informações de login do ACR recuperadas 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 retorna 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 ponto, o aplicativo de função começa a carregar a imagem.
Importante
Pode demorar vários minutos até que a imagem seja carregada. Você pode monitorar o progresso usando o portal do Azure.
Testar o gatilho HTTP do Azure Functions
Agora vamos executar e testar nosso gatilho HTTP do Azure Functions.
- Vá para seu aplicativo de função no portal do Azure.
- Em desenvolvedor, selecione Código + Teste.
- No lado direito, selecione a guia Entrada .
- Selecione no botão Executar para testar o gatilho HTTP do Azure Functions.
Agora você implantou com êxito um modelo do Aprendizado de Máquina do Azure como um aplicativo de função usando uma instância do Cache do Azure para Redis. Saiba mais sobre o Cache Redis do Azure navegando até os links na seção abaixo.
Clean up resources (Limpar 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 encargos.
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 você criou os recursos para hospedar este exemplo dentro de um grupo de recursos existente que contém recursos que você deseja manter, você pode excluir cada recurso individualmente à esquerda em vez de excluir 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.
Próximos passos
- Saiba mais sobre o Cache Redis do Azure
- Aprenda a configurar seu aplicativo de função na documentação do Functions .
- Referência da API
- Criar um aplicativo Python que usa o Cache Redis do Azure