Integrar o Azure Stream Analytics com o Azure Machine Learning
Você pode implementar modelos de aprendizado de máquina como uma função definida pelo usuário (UDF) em seus trabalhos do Azure Stream Analytics para fazer pontuações e previsões em tempo real em seus dados de entrada de streaming. O Azure Machine Learning permite que você use qualquer ferramenta de código aberto popular, como TensorFlow, scikit-learn ou PyTorch, para preparar, treinar e implantar modelos.
Pré-requisitos
Conclua as etapas a seguir antes de adicionar um modelo de aprendizado de máquina como função ao seu trabalho do Stream Analytics:
Use o Azure Machine Learning para implantar seu modelo como um serviço Web.
Seu ponto de extremidade de aprendizado de máquina deve ter um swagger associado que ajude o Stream Analytics a entender o esquema de entrada e saída. Você pode usar essa definição de swagger de exemplo como referência para garantir que a configurou corretamente.
Verifique se o serviço Web aceita e retorna dados serializados JSON.
Implante seu modelo no Serviço Kubernetes do Azure para implantações de produção em alta escala. Se o serviço Web não for capaz de lidar com o número de solicitações provenientes do seu trabalho, o desempenho do seu trabalho do Stream Analytics será prejudicado, o que afeta a latência. Os modelos implantados em Instâncias de Contêiner do Azure são suportados somente quando você usa o portal do Azure.
Adicionar um modelo de aprendizagem automática ao seu trabalho
Você pode adicionar funções do Azure Machine Learning ao seu trabalho do Stream Analytics diretamente do portal do Azure ou do Visual Studio Code.
Portal do Azure
Navegue até o trabalho do Stream Analytics no portal do Azure e selecione Funções em Topologia do trabalho. Em seguida, selecione Serviço de Aprendizado de Máquina do Azure no menu suspenso + Adicionar .
Preencha o formulário de função do Serviço de Aprendizado de Máquina do Azure com os seguintes valores de propriedade:
A tabela a seguir descreve cada propriedade das funções do Serviço de Aprendizado de Máquina do Azure no Stream Analytics.
Property | Description |
---|---|
Alias de função | Insira um nome para invocar a função em sua consulta. |
Subscrição | A sua subscrição do Azure. |
Área de trabalho do Azure Machine Learning | O espaço de trabalho do Azure Machine Learning que você usou para implantar seu modelo como um serviço Web. |
Ponto final | O serviço Web que hospeda seu modelo. |
Assinatura da função | A assinatura do seu serviço Web inferida a partir da especificação de esquema da API. Se a assinatura não for carregada, verifique se você forneceu exemplos de entrada e saída no script de pontuação para gerar automaticamente o esquema. |
Número de solicitações paralelas por partição | Esta é uma configuração avançada para otimizar a taxa de transferência em alta escala. Esse número representa as solicitações simultâneas enviadas de cada partição do seu trabalho para o serviço Web. Trabalhos com seis unidades de streaming (SU) e inferiores têm uma partição. Trabalhos com 12 SUs têm duas partições, 18 SUs têm três partições e assim por diante. Por exemplo, se o seu trabalho tiver duas partições e você definir esse parâmetro como quatro, haverá oito solicitações simultâneas do seu trabalho para o seu serviço Web. |
Contagem máxima de lotes | Esta é uma configuração avançada para otimizar a taxa de transferência de alta escala. Esse número representa o número máximo de eventos a serem agrupados em lote em uma única solicitação enviada ao seu serviço Web. |
Chamando o ponto de extremidade de aprendizado de máquina a partir de sua consulta
Quando sua consulta do Stream Analytics invoca uma UDF do Azure Machine Learning, o trabalho cria uma solicitação serializada JSON para o serviço Web. A solicitação é baseada em um esquema específico do modelo que o Stream Analytics infere do swagger do ponto de extremidade.
Aviso
Os pontos de extremidade do Aprendizado de Máquina não são chamados quando você está testando com o editor de consultas do portal do Azure porque o trabalho não está em execução. Para testar a chamada de ponto de extremidade do portal, o trabalho do Stream Analytics precisa estar em execução.
A seguinte consulta do Stream Analytics é um exemplo de como invocar uma UDF do Azure Machine Learning:
SELECT udf.score(<model-specific-data-structure>)
INTO output
FROM input
WHERE <model-specific-data-structure> is not null
Se os dados de entrada enviados para o ML UDF forem inconsistentes com o esquema esperado, o ponto de extremidade retornará uma resposta com o código de erro 400, o que fará com que seu trabalho do Stream Analytics vá para um estado de falha. É recomendável que você habilite os logs de recursos para seu trabalho, o que permitirá que você depure e solucione facilmente esses problemas. Portanto, é altamente recomendável que você:
- Validar entrada para seu ML UDF não é nulo
- Valide o tipo de cada campo que é uma entrada para seu ML UDF para garantir que ele corresponda ao que o ponto de extremidade espera
Nota
As UDFs de ML são avaliadas para cada linha de uma determinada etapa de consulta, mesmo quando chamadas por meio de uma expressão condicional (ou seja CASE WHEN [A] IS NOT NULL THEN udf.score(A) ELSE '' END
, ). Se necessário, use a cláusula WITH para criar caminhos divergentes, chamando o ML UDF somente quando necessário, antes de usar UNION para mesclar caminhos juntos novamente.
Passe vários parâmetros de entrada para o UDF
Os exemplos mais comuns de entradas para modelos de aprendizado de máquina são matrizes numpy e DataFrames. Você pode criar uma matriz usando um UDF JavaScript e criar um DataFrame serializado por JSON usando a WITH
cláusula.
Criar uma matriz de entrada
Você pode criar um UDF JavaScript que aceita o número N de entradas e cria uma matriz que pode ser usada como entrada para sua UDF do Azure Machine Learning.
function createArray(vendorid, weekday, pickuphour, passenger, distance) {
'use strict';
var array = [vendorid, weekday, pickuphour, passenger, distance]
return array;
}
Depois de adicionar o JavaScript UDF ao seu trabalho, você pode invocar seu UDF do Azure Machine Learning usando a seguinte consulta:
WITH
ModelInput AS (
#use JavaScript UDF to construct array that will be used as input to ML UDF
SELECT udf.createArray(vendorid, weekday, pickuphour, passenger, distance) as inputArray
FROM input
)
SELECT udf.score(inputArray)
INTO output
FROM ModelInput
#validate inputArray is not null before passing it to ML UDF to prevent job from failing
WHERE inputArray is not null
O JSON a seguir é uma solicitação de exemplo:
{
"Inputs": {
"WebServiceInput0": [
["1","Mon","12","1","5.8"],
["2","Wed","10","2","10"]
]
}
}
Criar um DataFrame Pandas ou PySpark
Você pode usar a WITH
cláusula para criar um DataFrame serializado JSON que pode ser passado como entrada para sua UDF do Azure Machine Learning, conforme mostrado abaixo.
A consulta a seguir cria um DataFrame selecionando os campos necessários e usa o DataFrame como entrada para o UDF do Azure Machine Learning.
WITH
Dataframe AS (
SELECT vendorid, weekday, pickuphour, passenger, distance
FROM input
)
SELECT udf.score(Dataframe)
INTO output
FROM Dataframe
WHERE Dataframe is not null
O JSON a seguir é uma solicitação de exemplo da consulta anterior:
{
"Inputs": {
"WebServiceInput0": [
{
"vendorid": "1",
"weekday": "Mon",
"pickuphour": "12",
"passenger": "1",
"distance": "5.8"
},
{
"vendorid": "2",
"weekday": "Tue",
"pickuphour": "10",
"passenger": "2",
"distance": "10"
}]
}
}
Otimizar o desempenho para UDFs do Azure Machine Learning
Ao implantar seu modelo no Serviço Kubernetes do Azure, você pode criar o perfil do modelo para determinar a utilização de recursos. Você também pode habilitar o App Insights para suas implantações para entender as taxas de solicitação, os tempos de resposta e as taxas de falha.
Se você tiver um cenário com alta taxa de transferência de eventos, talvez seja necessário alterar os seguintes parâmetros no Stream Analytics para obter um desempenho ideal com baixas latências de ponta a ponta:
- Contagem máxima de lotes.
- Número de solicitações paralelas por partição.
Determinar o tamanho correto do lote
Depois de implantar seu serviço Web, você envia uma solicitação de amostra com tamanhos de lote variados a partir de 50 e aumentando-a na ordem de centenas. Por exemplo, 200, 500, 1000, 2000 e assim por diante. Você notará que, após um determinado tamanho de lote, a latência da resposta aumenta. O ponto após o qual a latência da resposta aumenta deve ser a contagem máxima de lotes para o seu trabalho.
Determinar o número de solicitações paralelas por partição
No dimensionamento ideal, seu trabalho do Stream Analytics deve ser capaz de enviar várias solicitações paralelas para seu serviço Web e obter uma resposta em poucos milissegundos. A latência da resposta do serviço Web pode afetar diretamente a latência e o desempenho do seu trabalho do Stream Analytics. Se a chamada do seu trabalho para o serviço Web demorar muito tempo, você provavelmente verá um aumento no atraso da marca d'água e também poderá ver um aumento no número de eventos de entrada em atraso.
Você pode obter baixa latência garantindo que seu cluster do Serviço Kubernetes do Azure (AKS) tenha sido provisionado com o número certo de nós e réplicas. É fundamental que seu serviço Web esteja altamente disponível e retorne respostas bem-sucedidas. Se o seu trabalho receber um erro que pode ser repetido, como resposta indisponível do serviço (503), ele será repetido automaticamente com um recuo exponencial. Se o seu trabalho receber um desses erros como resposta do ponto de extremidade, o trabalho irá para um estado de falha.
- Mau pedido (400)
- Conflito (409)
- Não encontrado (404)
- Não Autorizado (401)
Limitações
Se você estiver usando um serviço de Ponto de Extremidade Gerenciado do Azure ML, o Stream Analytics atualmente só poderá acessar pontos de extremidade que tenham o acesso à rede pública habilitado. Leia mais sobre isso na página sobre pontos de extremidade privados do Azure ML.