Detección de anomalías en Azure Stream AnalyticsAnomaly detection in Azure Stream Analytics

Disponible tanto en la nube como en Azure IoT Edge, Azure Stream Analytics ofrece funcionalidades de detección de anomalías integradas basadas en aprendizaje automático, que se pueden usar para supervisar las dos anomalías que se producen con más frecuencia: temporales y persistentes.Available in both the cloud and Azure IoT Edge, Azure Stream Analytics offers built-in machine learning based anomaly detection capabilities that can be used to monitor the two most commonly occurring anomalies: temporary and persistent. Con las funciones AnomalyDetection_SpikeAndDip y AnomalyDetection_ChangePoint, puede realizar la detección de anomalías directamente en el trabajo de Stream Analytics.With the AnomalyDetection_SpikeAndDip and AnomalyDetection_ChangePoint functions, you can perform anomaly detection directly in your Stream Analytics job.

Los modelos de aprendizaje automático asumen una serie temporal muestreada uniformemente.The machine learning models assume a uniformly sampled time series. Si la serie temporal no es uniforme, puede insertar un paso de agregación con una ventana de saltos de tamaño constante antes de llamar a la detección de anomalías.If the time series is not uniform, you may insert an aggregation step with a tumbling window prior to calling anomaly detection.

En este momento, las operaciones de aprendizaje automático no admiten las tendencias de estacionalidad ni las correlaciones múltiples variadas.The machine learning operations do not support seasonality trends or multi-variate correlations at this time.

Comportamiento del modeloModel behavior

Por lo general, la precisión del modelo mejora con más datos en la ventana deslizante.Generally, the model's accuracy improves with more data in the sliding window. Los datos de la ventana deslizante especificada se tratan como parte de su rango normal de valores para ese período.The data in the specified sliding window is treated as part of its normal range of values for that time frame. El modelo solo tiene en cuenta el historial de eventos a través de la ventana deslizante para comprobar si el evento actual es anómalo.The model only considers event history over the sliding window to check if the current event is anomalous. Cuando se mueve la ventana deslizante, los valores antiguos se expulsan del entrenamiento del modelo.As the sliding window moves, old values are evicted from the model’s training.

Las funciones operan estableciendo un valor normal determinado en función de lo han observado hasta ahora.The functions operate by establishing a certain normal based on what they have seen so far. Los valores atípicos se identifican mediante la comparación con el valor normal establecido, en el nivel de confianza.Outliers are identified by comparing against the established normal, within the confidence level. El tamaño de ventana debe basarse en los eventos mínimos necesarios para entrenar el modelo para el comportamiento normal, con el fin de que cuando se produzca alguna anomalía, pueda reconocerlos.The window size should be based on the minimum events required to train the model for normal behavior so that when an anomaly occurs, it would be able to recognize it.

El tiempo de respuesta del modelo aumenta con el tamaño del historial porque se debe comparar con un mayor número de eventos anteriores.The model's response time increases with history size because it needs to compare against a higher number of past events. Se recomienda que incluya solo el número de eventos para mejorar el rendimiento necesario.It is recommended to only include the necessary number of events for better performance.

Las brechas en la serie temporal pueden producirse porque el modelo no recibe los eventos en determinados puntos en el tiempo.Gaps in the time series can be a result of the model not receiving events at certain points in time. Stream Analytics controla esta situación mediante lógica de imputación.This situation is handled by Stream Analytics using imputation logic. El tamaño del historial, así como una duración, en la misma ventana deslizante se usa para calcular la velocidad media a la que se esperan que lleguen los eventos.The history size, as well as a time duration, for the same sliding window is used to calculate the average rate at which events are expected to arrive.

Puede usarse el generador de anomalías que está disponible aquí para alimentar una instancia de IoT Hub con datos con distintos patrones de anomalías.An anomaly generator available here can be used to feed an Iot Hub with data with different anomaly patterns. Se puede configurar un trabajo de ASA con estas funciones de detección de anomalías para leer esta instancia de IoT Hub y detectar anomalías.An ASA job can be set up with these anomaly detection functions to read from this Iot Hub and detect anomalies.

Picos e interrupcionesSpike and dip

A las anomalías temporales de un flujo de eventos de serie temporal se les conocen como picos e interrupciones.Temporary anomalies in a time series event stream are known as spikes and dips. Los picos y las interrupciones pueden supervisarse mediante el operador basado en Machine Learning, AnomalyDetection_SpikeAndDip.Spikes and dips can be monitored using the Machine Learning based operator, AnomalyDetection_SpikeAndDip.

Ejemplo de anomalías de picos e interrupciones

En la misma ventana deslizante, si un pico de segundo es menor que el primero, la puntuación calculada del pico más pequeño probablemente no es lo suficientemente significativo en comparación con la puntuación del primer pico en el nivel de confianza especificado.In the same sliding window, if a second spike is smaller than the first one, the computed score for the smaller spike is probably not significant enough compared to the score for the first spike within the confidence level specified. Puede intentar reducir la confianza del modelo para capturar estas anomalías.You can try decreasing the model's confidence level to detect such anomalies. Sin embargo, si empieza a recibir demasiadas alertas, puede usar un intervalo de confianza superior.However, if you start to get too many alerts, you can use a higher confidence interval.

En la siguiente consulta de ejemplo se da por supuesto una velocidad uniforme de entrada de un evento por segundo en una ventana deslizante de 2 minutos con un historial de 120 eventos.The following example query assumes a uniform input rate of one event per second in a 2-minute sliding window with a history of 120 events. La instrucción SELECT final extrae y produce la puntuación y el estado de anomalía con un nivel de confianza del 95 %.The final SELECT statement extracts and outputs the score and anomaly status with a confidence level of 95%.

WITH AnomalyDetectionStep AS
(
    SELECT
        EVENTENQUEUEDUTCTIME AS time,
        CAST(temperature AS float) AS temp,
        AnomalyDetection_SpikeAndDip(CAST(temperature AS float), 95, 120, 'spikesanddips')
            OVER(LIMIT DURATION(second, 120)) AS SpikeAndDipScores
    FROM input
)
SELECT
    time,
    temp,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'Score') AS float) AS
    SpikeAndDipScore,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'IsAnomaly') AS bigint) AS
    IsSpikeAndDipAnomaly
INTO output
FROM AnomalyDetectionStep

Cambio de puntosChange point

Las anomalías persistentes en un flujo de eventos de serie temporal son los cambios en la distribución de valores del flujo de eventos, como los cambios de nivel y tendencias.Persistent anomalies in a time series event stream are changes in the distribution of values in the event stream, like level changes and trends. En Stream Analytics, estas anomalías se detectan mediante el operador AnomalyDetection_ChangePoint basado en Machine Learning.In Stream Analytics, such anomalies are detected using the Machine Learning based AnomalyDetection_ChangePoint operator.

Los cambios persistentes duran mucho más que los picos y las interrupciones, y podrían indicar eventos catastróficos.Persistent changes last much longer than spikes and dips and could indicate catastrophic event(s). Los cambios persistentes normalmente no son visibles a simple vista, pero se pueden detectar con el operador AnomalyDetection_ChangePoint.Persistent changes are not usually visible to the naked eye, but can be detected with the AnomalyDetection_ChangePoint operator.

La imagen siguiente es un ejemplo de un cambio de nivel:The following image is an example of a level change:

Ejemplo de anomalía de cambio de nivel

La imagen siguiente es un ejemplo de un cambio de tendencia:The following image is an example of a trend change:

Ejemplo de anomalía de cambio de tendencia

En la siguiente consulta de ejemplo se da por supuesto una velocidad uniforme de entrada de un evento por segundo en una ventana deslizante de 20 minutos con un historial de 1200 eventos.The following example query assumes a uniform input rate of one event per second in a 20-minute sliding window with a history size of 1200 events. La instrucción SELECT final extrae y produce la puntuación y el estado de anomalía con un nivel de confianza del 80 %.The final SELECT statement extracts and outputs the score and anomaly status with a confidence level of 80%.

WITH AnomalyDetectionStep AS
(
    SELECT
        EVENTENQUEUEDUTCTIME AS time,
        CAST(temperature AS float) AS temp,
        AnomalyDetection_ChangePoint(CAST(temperature AS float), 80, 1200) 
        OVER(LIMIT DURATION(minute, 20)) AS ChangePointScores
    FROM input
)
SELECT
    time,
    temp,
    CAST(GetRecordPropertyValue(ChangePointScores, 'Score') AS float) AS
    ChangePointScore,
    CAST(GetRecordPropertyValue(ChangePointScores, 'IsAnomaly') AS bigint) AS
    IsChangePointAnomaly
INTO output
FROM AnomalyDetectionStep

Características de rendimientoPerformance characteristics

El rendimiento de estos modelos depende del tamaño del historial, la duración de la ventana, la carga de eventos y de si se utiliza la partición del nivel de función.The performance of these models depends on the history size, window duration, event load, and whether function level partitioning is used. En esta sección se describen estas configuraciones y se proporcionan ejemplos de cómo mantener las tasas de ingesta de mil, cinco mil y diez mil eventos por segundo.This section discusses these configurations and provides samples for how to sustain ingestion rates of 1K, 5K and 10K events per second.

  • Tamaño del historial: estos modelos se ejecutan linealmente con el tamaño historial.History size - These models perform linearly with history size. Cuanto mayor sea, más tiempo tardarán los modelos en puntuar un nuevo evento.The longer the history size, the longer the models take to score a new event. Esto es porque los modelos comparan el nuevo evento con cada uno de los eventos anteriores en el búfer del historial.This is because the models compare the new event with each of the past events in the history buffer.
  • Duración de la ventana: la duración de la ventana debe reflejar cuánto tarda en recibir todos los eventos según lo especificado por el tamaño del historial.Window duration - The Window duration should reflect how long it takes to receive as many events as specified by the history size. Si no hay muchos eventos en la ventana, Azure Stream Analytics imputará los valores que falten.Without that many events in the window, Azure Stream Analytics would impute missing values. Por lo tanto, el consumo de CPU es una función del tamaño del historial.Hence, CPU consumption is a function of the history size.
  • Carga de eventos: cuanto mayor sea la carga de eventos, más trabajo realizarán los modelos, lo cual afecta al consumo de CPU.Event load - The greater the event load, the more work that is performed by the models, which impacts CPU consumption. El trabajo se puede escalar horizontalmente de manera vergonzosamente paralela, dando por hecho que tiene sentido según la lógica de negocios usar más particiones de entrada.The job can be scaled out by making it embarrassingly parallel, assuming it makes sense for business logic to use more input partitions.
  • Partición del nivel de función: la partición del nivel de función se realiza mediante PARTITION BY dentro de la llamada de la función de detección de anomalías.Function level partitioning - Function level partitioning is done by using PARTITION BY within the anomaly detection function call. Este tipo de partición agrega una sobrecarga, ya que el estado debe mantenerse para varios modelos al mismo tiempo.This type of partitioning adds an overhead, as state needs to be maintained for multiple models at the same time. La partición del nivel de función se usa en escenarios como la partición del nivel de dispositivo.Function level partitioning is used in scenarios like device level partitioning.

RelaciónRelationship

El tamaño del historial, la duración de ventana y la carga total de eventos están relacionados de la siguiente manera:The history size, window duration, and total event load are related in the following way:

DuraciónDeLaVentana (en ms) = 1000 * tamañoDelHistorial / (Total de eventos de entrada por segundo / recuento de particiones de entrada)windowDuration (in ms) = 1000 * historySize / (Total Input Events Per Sec / Input Partition Count)

Al realizar la partición de la función por identificador de dispositivo, agregue "PARTITION BY deviceId" a la llamada de la función de detección de anomalías.When partitioning the function by deviceId, add “PARTITION BY deviceId” to the anomaly detection function call.

ObservacionesObservations

En la siguiente tabla se incluyen las observaciones de rendimiento para un solo nodo (6 SU) para el caso sin particiones:The following table includes the throughput observations for a single node (6 SU) for the non-partitioned case:

Tamaño del historial (eventos)History size (events) Duración de la ventana (ms)Window duration (ms) Total de eventos de entrada por segundoTotal input events per sec
6060 5555 22002,200
600600 728728 16501,650
6,0006,000 10 91010,910 11001,100

En la siguiente tabla se incluyen las observaciones de rendimiento para un solo nodo (6 SU) para el caso con particiones:The following table includes the throughput observations for a single node (6 SU) for the partitioned case:

Tamaño del historial (eventos)History size (events) Duración de la ventana (ms)Window duration (ms) Total de eventos de entrada por segundoTotal input events per sec Recuento de dispositivosDevice count
6060 10911,091 11001,100 1010
600600 10 91010,910 11001,100 1010
6,0006,000 218 182218,182 <550<550 1010
6060 21 81921,819 550550 100100
600600 218 182218,182 550550 100100
6,0006,000 2 181 8192,181,819 <550<550 100100

El código de ejemplo para ejecutar las configuraciones sin particiones anterior se encuentra en el repositorio Streaming At Scale de los ejemplos de Azure.Sample code to run the non-partitioned configurations above is located in the Streaming At Scale repo of Azure Samples. El código crea un trabajo de Stream Analytics sin particiones del nivel de función que usa Event Hubs como entrada y salida.The code creates a stream analytics job with no function level partitioning, which uses Event Hub as input and output. La carga de entrada se genera con clientes de prueba.The input load is generated using test clients. Cada evento de entrada es un documento json de 1 KB.Each input event is a 1KB json document. Los eventos simulan el envío de datos JSON desde un dispositivo IoT (para hasta mil dispositivos).Events simulate an IoT device sending JSON data (for up to 1K devices). El tamaño del historial, la duración de ventana y la carga total de eventos varían en 2 particiones de entrada.The history size, window duration, and total event load are varied over 2 input partitions.

Nota

Para una estimación más precisa, personalice los ejemplos para que se ajusten a su escenario.For a more accurate estimate, customize the samples to fit your scenario.

Identificación de los cuellos de botellaIdentifying bottlenecks

Utilice el panel Métricas del trabajo de Azure Stream Analytics para identificar los cuellos de botella en la canalización.Use the Metrics pane in your Azure Stream Analytics job to identify bottlenecks in your pipeline. Revise Eventos de entrada/salida para ver el rendimiento y Retraso de la marca de agua o Eventos de trabajos pendientes para ver si el trabajo está al día con respecto a la tasa de entrada.Review Input/Output Events for throughput and "Watermark Delay" or Backlogged Events to see if the job is keeping up with the input rate. Para métricas de Event Hubs, busque Solicitudes limitadas y ajuste las unidades de umbral como corresponda.For Event Hub metrics, look for Throttled Requests and adjust the Threshold Units accordingly. En lo relativo a las métricas de Cosmos DB, vea Máximo de RU/s consumidas por cada intervalo de claves de partición en Rendimiento para garantizar que los intervalos de claves de partición se consumen uniformemente.For Cosmos DB metrics, review Max consumed RU/s per partition key range under Throughput to ensure your partition key ranges are uniformly consumed. Para Azure SQL DB, supervise las E/S de registro y la CPU.For Azure SQL DB, monitor Log IO and CPU.

Detección de anomalías con aprendizaje automático en Azure Stream AnalyticsAnomaly detection using machine learning in Azure Stream Analytics

En el siguiente vídeo se demuestra cómo detectar una anomalía en tiempo real mediante funciones con aprendizaje automático en Azure Stream Analytics.The following video demonstrates how to detect an anomaly in real time using machine learning functions in Azure Stream Analytics.

Pasos siguientesNext steps