Inicio rápido: Uso de la biblioteca cliente multivariante de Anomaly Detector
Comience a usar la biblioteca cliente multivariante de Anomaly Detector para C#. Siga estos pasos para instalar el paquete y empezar a usar los algoritmos proporcionados por el servicio. Las nuevas API de detección de anomalías multivariante permiten a los desarrolladores integrar fácilmente inteligencia artificial avanzada para detectar anomalías de grupos de métricas, sin necesidad de tener conocimientos de aprendizaje automático ni usar datos etiquetados. Las dependencias y correlaciones entre distintas señales se consideran automáticamente como factores clave. De este modo, podrá proteger de forma proactiva los sistemas complejos frente a errores.
Utilice la biblioteca cliente multivariante de Anomaly Detector para C# con el fin de:
- Detectar anomalías de nivel del sistema para un grupo de series temporales.
- Cuando una serie temporal individual no ofrece demasiada información y se deben examinar todas las señales para detectar un problema.
- Mantenimiento predictivo de recursos físicos costosos con decenas o cientos de tipos de sensores diferentes que miden diversos aspectos del estado del sistema.
Documentación de referencia de la biblioteca | Código fuente de la biblioteca | Paquete (NuGet)
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- La versión actual de .NET Core
- Cuando tenga la suscripción de Azure, cree un recurso de Anomaly Detector en Azure Portal para obtener la clave y el punto de conexión. Espere a que se implemente y seleccione el botón Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. Más adelante en este inicio rápido, debe pegar la clave y el punto de conexión en el código que se incluye a continuación.
Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. Más adelante en este inicio rápido, debe pegar la clave y el punto de conexión en el código que se incluye a continuación.
Puede usar el plan de tarifa gratis (
Instalación
Creación de una aplicación de .NET Core
En una ventana de consola (por ejemplo, cmd, PowerShell o Bash), use el comando dotnet new para crear una nueva aplicación de consola con el nombre anomaly-detector-quickstart-multivariate. Este comando crea un sencillo proyecto "Hola mundo" con un solo archivo de origen de C#: Program.cs.
dotnet new console -n anomaly-detector-quickstart-multivariate
Cambie el directorio a la carpeta de aplicaciones recién creada. Para compilar la aplicación:
dotnet build
La salida de la compilación no debe contener advertencias ni errores.
...
Build succeeded.
0 Warning(s)
0 Error(s)
...
Instalación de la biblioteca cliente
Dentro del directorio de aplicaciones, instale la biblioteca cliente de Anomaly Detector para .NET con el siguiente comando:
dotnet add package Azure.AI.AnomalyDetector --version 3.0.0-preview.3
En el directorio del proyecto, abra el archivo program.cs y agregue lo siguiente mediante directives:
using System;
using System.Collections.Generic;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Azure.AI.AnomalyDetector.Models;
using Azure.Core.TestFramework;
using Microsoft.Identity.Client;
using NUnit.Framework;
En el método main() de la aplicación, cree variables para el punto de conexión del recurso de Azure, la clave de API y un origen de datos personalizado.
Nota
Siempre tendrá la opción de usar una de estas dos claves. Esto es para permitir la rotación de claves segura. Para este inicio rápido, use la primera clave.
string endpoint = "YOUR_API_KEY";
string apiKey = "YOUR_ENDPOINT";
string datasource = "YOUR_SAMPLE_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS";
Para usar las API multivariantes de Anomaly Detector, primero debe entrenar sus propios modelos. Los datos de entrenamiento son un conjunto de varias series temporales que cumplen los siguientes requisitos:
Cada serie temporal debe ser un archivo CSV con dos columnas (solo dos), "timestamp" y "value" (todo en minúsculas) como fila de encabezado. Los valores de "timestamp" deben cumplir la norma ISO 8601; los de "value" pueden ser números enteros o decimales con cualquier número de posiciones decimales. Por ejemplo:
| timestamp | value |
|---|---|
| 2019-04-01T00:00:00Z | 5 |
| 2019-04-01T00:01:00Z | 3.6 |
| 2019-04-01T00:02:00Z | 4 |
... |
... |
Cada archivo CSV debe tener el nombre de una variable diferente que se usará para el entrenamiento del modelo. Por ejemplo, "temperature.csv" y "humidity.csv". Todos los archivos CSV deben comprimirse en un archivo ZIP sin subcarpetas. El archivo ZIP puede tener el nombre que desee. El archivo ZIP debe cargarse en Azure Blob Storage. Una vez que genere la dirección URL de SAS de blob (firmas de acceso compartido) para el archivo ZIP, se puede usar para el entrenamiento. Consulte este documento para obtener información sobre cómo generar direcciones URL de SAS a partir de Azure Blob Storage.
Ejemplos de código
Estos fragmentos de código muestran cómo llevar a cabo las siguientes acciones mediante la biblioteca cliente multivariante de Anomaly Detector para .NET:
- Autenticar el cliente
- Entrenamiento del modelo
- Detectar anomalías
- Exportar un modelo
- Eliminar un modelo
Autenticar el cliente
Cree una instancia de un cliente de Anomaly Detector con el punto de conexión y la clave.
var endpointUri = new Uri(endpoint);
var credential = new AzureKeyCredential(apiKey)
AnomalyDetectorClient client = new AnomalyDetectorClient(endpointUri, credential);
Entrenar el modelo
Cree una nueva tarea asincrónica privada como se indica a continuación para entrenar el modelo. Usará TrainMultivariateModel para entrenar el modelo y GetMultivariateModelAysnc para comprobar cuándo se ha completado el entrenamiento.
private async Task<Guid?> trainAsync(AnomalyDetectorClient client, string datasource, DateTimeOffset start_time, DateTimeOffset end_time)
{
try
{
Console.WriteLine("Training new model...");
int model_number = await getModelNumberAsync(client, false).ConfigureAwait(false);
Console.WriteLine(String.Format("{0} available models before training.", model_number));
ModelInfo data_feed = new ModelInfo(datasource, start_time, end_time);
Response response_header = client.TrainMultivariateModel(data_feed);
response_header.Headers.TryGetValue("Location", out string trained_model_id_path);
Guid trained_model_id = Guid.Parse(trained_model_id_path.Split('/').LastOrDefault());
Console.WriteLine(trained_model_id);
// Wait until the model is ready. It usually takes several minutes
Response<Model> get_response = await client.GetMultivariateModelAsync(trained_model_id).ConfigureAwait(false);
while (get_response.Value.ModelInfo.Status != ModelStatus.Ready & get_response.Value.ModelInfo.Status != ModelStatus.Failed)
{
System.Threading.Thread.Sleep(10000);
get_response = await client.GetMultivariateModelAsync(trained_model_id).ConfigureAwait(false);
Console.WriteLine(String.Format("model_id: {0}, createdTime: {1}, lastUpdateTime: {2}, status: {3}.", get_response.Value.ModelId, get_response.Value.CreatedTime, get_response.Value.LastUpdatedTime, get_response.Value.ModelInfo.Status));
}
if (get_response.Value.ModelInfo.Status != ModelStatus.Ready)
{
Console.WriteLine(String.Format("Trainig failed."));
IReadOnlyList<ErrorResponse> errors = get_response.Value.ModelInfo.Errors;
foreach (ErrorResponse error in errors)
{
Console.WriteLine(String.Format("Error code: {0}.", error.Code));
Console.WriteLine(String.Format("Error message: {0}.", error.Message));
}
throw new Exception("Training failed.");
}
model_number = await getModelNumberAsync(client).ConfigureAwait(false);
Console.WriteLine(String.Format("{0} available models after training.", model_number));
return trained_model_id;
}
catch (Exception e)
{
Console.WriteLine(String.Format("Train error. {0}", e.Message));
throw new Exception(e.Message);
}
}
Detección de anomalías
Para detectar anomalías con el modelo recién entrenado, cree un private async Task denominado detectAsync. Creará un nuevo DetectionRequest y lo pasará como parámetro a DetectAnomalyAsync.
private async Task<DetectionResult> detectAsync(AnomalyDetectorClient client, string datasource, Guid model_id,DateTimeOffset start_time, DateTimeOffset end_time)
{
try
{
Console.WriteLine("Start detect...");
Response<Model> get_response = await client.GetMultivariateModelAsync(model_id).ConfigureAwait(false);
DetectionRequest detectionRequest = new DetectionRequest(datasource, start_time, end_time);
Response result_response = await client.DetectAnomalyAsync(model_id, detectionRequest).ConfigureAwait(false);
var ok = result_response.Headers.TryGetValue("Location", out string result_id_path);
Guid result_id = Guid.Parse(result_id_path.Split('/').LastOrDefault());
// get detection result
Response<DetectionResult> result = await client.GetDetectionResultAsync(result_id).ConfigureAwait(false);
while (result.Value.Summary.Status != DetectionStatus.Ready & result.Value.Summary.Status != DetectionStatus.Failed)
{
System.Threading.Thread.Sleep(2000);
result = await client.GetDetectionResultAsync(result_id).ConfigureAwait(false);
}
if (result.Value.Summary.Status != DetectionStatus.Ready)
{
Console.WriteLine(String.Format("Inference failed."));
IReadOnlyList<ErrorResponse> errors = result.Value.Summary.Errors;
foreach (ErrorResponse error in errors)
{
Console.WriteLine(String.Format("Error code: {0}.", error.Code));
Console.WriteLine(String.Format("Error message: {0}.", error.Message));
}
return null;
}
return result.Value;
}
catch (Exception e)
{
Console.WriteLine(String.Format("Detection error. {0}", e.Message));
throw new Exception(e.Message);
}
}
Exportación de un modelo
Nota
El comando de exportación está diseñado para permitir la ejecución de modelos multivariados de Anomaly Detector en un entorno en contenedor. Actualmente, no se admite para el multivariado, pero se agregará una compatibilidad en el futuro.
Para exportar el modelo que ha entrenado anteriormente, cree un private async Task denominado exportAysnc. Usará ExportModelAsync y pasará el identificador del modelo al modelo que desea exportar.
private async Task exportAsync(AnomalyDetectorClient client, Guid model_id, string model_path = "model.zip")
{
try
{
Stream model = await client.ExportModelAsync(model_id).ConfigureAwait(false);
if (model != null)
{
var fileStream = File.Create(model_path);
model.Seek(0, SeekOrigin.Begin);
model.CopyTo(fileStream);
fileStream.Close();
}
}
catch (Exception e)
{
Console.WriteLine(String.Format("Export error. {0}", e.Message));
throw new Exception(e.Message);
}
}
Eliminación de un modelo
Para eliminar un modelo que ha creado anteriormente, use DeleteMultivariateModelAsync y pase el identificador del modelo que desea eliminar. Para recuperar un identificador de modelo, puede usar getModelNumberAsync:
private async Task deleteAsync(AnomalyDetectorClient client, Guid model_id)
{
await client.DeleteMultivariateModelAsync(model_id).ConfigureAwait(false);
int model_number = await getModelNumberAsync(client).ConfigureAwait(false);
Console.WriteLine(String.Format("{0} available models after deletion.", model_number));
}
private async Task<int> getModelNumberAsync(AnomalyDetectorClient client, bool delete = false)
{
int count = 0;
AsyncPageable<ModelSnapshot> model_list = client.ListMultivariateModelAsync(0, 10000);
await foreach (ModelSnapshot x in model_list)
{
count += 1;
Console.WriteLine(String.Format("model_id: {0}, createdTime: {1}, lastUpdateTime: {2}.", x.ModelId, x.CreatedTime, x.LastUpdatedTime));
if (delete & count < 4)
{
await client.DeleteMultivariateModelAsync(x.ModelId).ConfigureAwait(false);
}
}
return count;
}
Main (método)
Ahora que tiene todos los elementos, debe agregar código al método principal para llamar a las tareas recién creadas.
{
//read endpoint and apiKey
string endpoint = "YOUR_API_KEY";
string apiKey = "YOUR_ENDPOINT";
string datasource = "YOUR_SAMPLE_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS";
Console.WriteLine(endpoint);
var endpointUri = new Uri(endpoint);
var credential = new AzureKeyCredential(apiKey);
//create client
AnomalyDetectorClient client = new AnomalyDetectorClient(endpointUri, credential);
// train
TimeSpan offset = new TimeSpan(0);
DateTimeOffset start_time = new DateTimeOffset(2021, 1, 1, 0, 0, 0, offset);
DateTimeOffset end_time = new DateTimeOffset(2021, 1, 2, 12, 0, 0, offset);
Guid? model_id_raw = null;
try
{
model_id_raw = await trainAsync(client, datasource, start_time, end_time).ConfigureAwait(false);
Console.WriteLine(model_id_raw);
Guid model_id = model_id_raw.GetValueOrDefault();
// detect
start_time = end_time;
end_time = new DateTimeOffset(2021, 1, 3, 0, 0, 0, offset);
DetectionResult result = await detectAsync(client, datasource, model_id, start_time, end_time).ConfigureAwait(false);
if (result != null)
{
Console.WriteLine(String.Format("Result ID: {0}", result.ResultId));
Console.WriteLine(String.Format("Result summary: {0}", result.Summary));
Console.WriteLine(String.Format("Result length: {0}", result.Results.Count));
}
// export model
await exportAsync(client, model_id).ConfigureAwait(false);
// delete
await deleteAsync(client, model_id).ConfigureAwait(false);
}
catch (Exception e)
{
String msg = String.Format("Multivariate error. {0}", e.Message);
if (model_id_raw != null)
{
await deleteAsync(client, model_id_raw.GetValueOrDefault()).ConfigureAwait(false);
}
Console.WriteLine(msg);
throw new Exception(msg);
}
}
Ejecución de la aplicación
Ejecute la aplicación con el comando dotnet run desde el directorio de la aplicación.
dotnet run
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a dicho grupo.
Pasos siguientes
Comience a usar la biblioteca cliente multivariante de Anomaly Detector para JavaScript. Siga estos pasos para instalar el paquete y empezar a usar los algoritmos proporcionados por el servicio. Las nuevas API de detección de anomalías multivariante permiten a los desarrolladores integrar fácilmente inteligencia artificial avanzada para detectar anomalías de grupos de métricas, sin necesidad de tener conocimientos de aprendizaje automático ni usar datos etiquetados. Las dependencias y correlaciones entre distintas señales se consideran automáticamente como factores clave. De este modo, podrá proteger de forma proactiva los sistemas complejos frente a errores.
Utilice la biblioteca cliente multivariante de Anomaly Detector para JavaScript con el fin de:
- Detectar anomalías de nivel del sistema para un grupo de series temporales.
- Cuando una serie temporal individual no ofrece demasiada información y se deben examinar todas las señales para detectar un problema.
- Mantenimiento predictivo de recursos físicos costosos con decenas o cientos de tipos de sensores diferentes que miden diversos aspectos del estado del sistema.
Documentación de referencia de la biblioteca | Código fuente de la biblioteca | Paquete (npm) | Código de ejemplo
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- La versión actual de Node.js
- Cuando tenga la suscripción de Azure, cree un recurso de Anomaly Detector en Azure Portal para obtener la clave y el punto de conexión. Espere a que se implemente y haga clic en el botón Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
Puede usar el plan de tarifa gratis (
Instalación
Creación de una aplicación Node.js
En una ventana de la consola (como cmd, PowerShell o Bash), cree un directorio para la aplicación y vaya a él.
mkdir myapp && cd myapp
Ejecute el comando npm init para crear una aplicación de nodo con un archivo package.json.
npm init
Cree un archivo llamado index.js e importe las bibliotecas siguientes:
'use strict'
const fs = require('fs');
const parse = require("csv-parse/lib/sync");
const { AnomalyDetectorClient } = require('@azure/ai-anomaly-detector');
const { AzureKeyCredential } = require('@azure/core-auth');
Cree variables para el punto de conexión y la clave de Azure del recurso. Cree otra variable para el archivo de datos de ejemplo.
Nota
Siempre tendrá la opción de usar una de estas dos claves. Esto es para permitir la rotación de claves segura. Para este inicio rápido, use la primera clave.
const apiKey = "YOUR_API_KEY";
const endpoint = "YOUR_ENDPOINT";
const data_source = "YOUR_SAMPLE_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS";
Para usar las API multivariantes de Anomaly Detector, primero debe entrenar sus propios modelos. Los datos de entrenamiento son un conjunto de varias series temporales que cumplen los siguientes requisitos:
Cada serie temporal debe ser un archivo CSV con dos columnas (solo dos), "timestamp" y "value" (todo en minúsculas) como fila de encabezado. Los valores de "timestamp" deben cumplir la norma ISO 8601; los de "value" pueden ser números enteros o decimales con cualquier número de posiciones decimales. Por ejemplo:
| timestamp | value |
|---|---|
| 2019-04-01T00:00:00Z | 5 |
| 2019-04-01T00:01:00Z | 3.6 |
| 2019-04-01T00:02:00Z | 4 |
... |
... |
Cada archivo CSV debe tener el nombre de una variable diferente que se usará para el entrenamiento del modelo. Por ejemplo, "temperature.csv" y "humidity.csv". Todos los archivos CSV deben comprimirse en un archivo ZIP sin subcarpetas. El archivo ZIP puede tener el nombre que desee. El archivo ZIP debe cargarse en Azure Blob Storage. Una vez que genere la dirección URL de SAS de blob (firmas de acceso compartido) para el archivo ZIP, se puede usar para el entrenamiento. Consulte este documento para obtener información sobre cómo generar direcciones URL de SAS a partir de Azure Blob Storage.
Instalación de la biblioteca cliente
Instale los paquetes ms-rest-azure y azure-ai-anomalydetector de NPM. La biblioteca de análisis de CSV también se usa en este inicio rápido:
npm install @azure/ai-anomaly-detector csv-parse
el archivo package.json de la aplicación se actualizará con las dependencias.
Ejemplos de código
Estos fragmentos de código muestran cómo realizar las siguientes acciones con la biblioteca cliente de Anomaly Detector para Node.js:
- Autenticar el cliente
- Entrenamiento de un modelo
- Detectar anomalías
- Exportar un modelo
- Eliminar un modelo
Autenticar el cliente
Cree una instancia de un objeto AnomalyDetectorClient con el punto de conexión y las credenciales.
const client = new AnomalyDetectorClient(endpoint, new AzureKeyCredential(apiKey));
Entrenamiento de un modelo
Construcción de un resultado de modelo
En primer lugar, es necesario construir una solicitud de modelo. Asegúrese de que la hora de inicio y finalización se correspondan con su origen de datos.
const Modelrequest = {
source: data_source,
startTime: new Date(2021,0,1,0,0,0),
endTime: new Date(2021,0,2,12,0,0),
slidingWindow:200
};
Entrenamiento de un modelo nuevo
Tendrá que pasar la solicitud de modelo al método trainMultivariateModel del cliente de Anomaly Detector.
console.log("Training a new model...")
const train_response = await client.trainMultivariateModel(Modelrequest)
const model_id = train_response.location?.split("/").pop() ?? ""
console.log("New model ID: " + model_id)
Para comprobar si el entrenamiento del modelo está completo, puede realizar un seguimiento del estado del modelo:
let model_response = await client.getMultivariateModel(model_id);
let model_status = model_response.modelInfo.status;
while (model_status != 'READY' && model_status != 'FAILED'){
await sleep(10000).then(() => {});
model_response = await client.getMultivariateModel(model_id);
model_status = model_response.modelInfo.status;
}
if (model_status == 'FAILED') {
console.log("Training failed.\nErrors:");
for (let error of model_response.modelInfo?.errors ?? []) {
console.log("Error code: " + error.code + ". Message: " + error.message);
}
}
console.log("TRAINING FINISHED.");
Detección de anomalías
Use las funciones detectAnomaly y getDectectionResult para determinar si existe cualquier anomalía con el origen de datos.
console.log("Start detecting...");
const detect_request = {
source: data_source,
startTime: new Date(2021,0,2,12,0,0),
endTime: new Date(2021,0,3,0,0,0)
};
const result_header = await client.detectAnomaly(model_id, detect_request);
const result_id = result_header.location?.split("/").pop() ?? "";
let result = await client.getDetectionResult(result_id);
let result_status = result.summary.status;
while (result_status != 'READY' && result_status != 'FAILED'){
await sleep(2000).then(() => {});
result = await client.getDetectionResult(result_id);
result_status = result.summary.status;
}
if (result_status == 'FAILED') {
console.log("Detection failed.\nErrors:");
for (let error of result.summary.errors ?? []) {
console.log("Error code: " + error.code + ". Message: " + error.message)
}
}
console.log("Result status: " + result_status);
console.log("Result Id: " + result.resultId);
Exportación de un modelo
Nota
El comando de exportación está diseñado para permitir la ejecución de modelos multivariados de Anomaly Detector en un entorno en contenedor. Actualmente, no se admite para el multivariado, pero se agregará una compatibilidad en el futuro.
Para exportar el modelo entrenado, use la función exportModel.
const export_result = await client.exportModel(model_id)
const model_path = "model.zip"
const destination = fs.createWriteStream(model_path)
export_result.readableStreamBody?.pipe(destination)
console.log("New model has been exported to "+model_path+".")
Eliminación del modelo
Para eliminar un modelo existente que esté disponible para el recurso actual, use la función deleteMultivariateModel.
client.deleteMultivariateModel(model_id)
console.log("New model has been deleted.")
Ejecución de la aplicación
Antes de ejecutar la aplicación, puede resultar útil comprobar el código con el código de ejemplo completo.
Ejecute la aplicación con el comando node en el archivo de inicio rápido.
node index.js
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a dicho grupo.
Pasos siguientes
Comience a usar la biblioteca cliente multivariante de Anomaly Detector para Python. Siga estos pasos para instalar el inicio del paquete con los algoritmos que proporciona el servicio. Las nuevas API de detección de anomalías multivariante permiten a los desarrolladores integrar fácilmente inteligencia artificial avanzada para detectar anomalías de grupos de métricas, sin necesidad de tener conocimientos de aprendizaje automático ni usar datos etiquetados. Las dependencias y correlaciones entre distintas señales se consideran automáticamente como factores clave. De este modo, podrá proteger de forma proactiva los sistemas complejos frente a errores.
Utilice la biblioteca cliente multivariante de Anomaly Detector para Python con el fin de:
- Detectar anomalías de nivel del sistema para un grupo de series temporales.
- Cuando una serie temporal individual no ofrece demasiada información y se deben examinar todas las señales para detectar un problema.
- Mantenimiento predictivo de recursos físicos costosos con decenas o cientos de tipos de sensores diferentes que miden diversos aspectos del estado del sistema.
Documentación de referencia de la biblioteca | Código fuente de la biblioteca | Paquete (PyPi) | Código de ejemplo
Requisitos previos
- Python 3.x
- La biblioteca de análisis de datos de Pandas
- Una suscripción a Azure: cree una cuenta gratuita
- Cuando tenga la suscripción de Azure, cree un recurso de Anomaly Detector en Azure Portal para obtener la clave y el punto de conexión. Espere a que se implemente y haga clic en el botón Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
Puede usar el plan de tarifa gratis (
Instalación
Instalación de la biblioteca cliente
Después de instalar Python, puede instalar las bibliotecas cliente con:
pip install pandas
pip install --upgrade azure-ai-anomalydetector
Creación de una nueva aplicación de Python
Cree un archivo de Python e importe las bibliotecas siguientes.
import os
import time
from datetime import datetime
from azure.ai.anomalydetector import AnomalyDetectorClient
from azure.ai.anomalydetector.models import DetectionRequest, ModelInfo
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
Cree variables para la clave como una variable de entorno, la ruta de acceso a un archivo de datos de serie temporal y la ubicación de Azure de su suscripción.
Nota
Siempre tendrá la opción de usar una de estas dos claves. Esto es para permitir la rotación de claves segura. Para este inicio rápido, use la primera clave.
subscription_key = "ANOMALY_DETECTOR_KEY"
anomaly_detector_endpoint = "ANOMALY_DETECTOR_ENDPOINT"
Ejemplos de código
Estos fragmentos de código muestran cómo realizar las siguientes acciones con la biblioteca cliente de Anomaly Detector para Python:
- Autenticar el cliente
- Entrenamiento del modelo
- Detectar anomalías
- Exportar un modelo
- Eliminar un modelo
Autenticar el cliente
Para crear una instancia de un nuevo cliente de Anomaly Detector, debe pasar la clave de suscripción de Anomaly Detector y el punto de conexión asociado. También estableceremos un origen de datos.
Para usar las API multivariantes de Anomaly Detector, primero debe entrenar sus propios modelos. Los datos de entrenamiento son un conjunto de varias series temporales que cumplen los siguientes requisitos:
Cada serie temporal debe ser un archivo CSV con dos columnas (solo dos), "timestamp" y "value" (todo en minúsculas) como fila de encabezado. Los valores de "timestamp" deben cumplir la norma ISO 8601; los de "value" pueden ser números enteros o decimales con cualquier número de posiciones decimales. Por ejemplo:
| timestamp | value |
|---|---|
| 2019-04-01T00:00:00Z | 5 |
| 2019-04-01T00:01:00Z | 3.6 |
| 2019-04-01T00:02:00Z | 4 |
... |
... |
Cada archivo CSV debe tener el nombre de una variable diferente que se usará para el entrenamiento del modelo. Por ejemplo, "temperature.csv" y "humidity.csv". Todos los archivos CSV deben comprimirse en un archivo ZIP sin subcarpetas. El archivo ZIP puede tener el nombre que desee. El archivo ZIP debe cargarse en Azure Blob Storage. Una vez que genere la dirección URL de SAS de blob (firmas de acceso compartido) para el archivo ZIP, se puede usar para el entrenamiento. Consulte este documento para obtener información sobre cómo generar direcciones URL de SAS a partir de Azure Blob Storage.
class MultivariateSample():
def __init__(self, subscription_key, anomaly_detector_endpoint, data_source=None):
self.sub_key = subscription_key
self.end_point = anomaly_detector_endpoint
# Create an Anomaly Detector client
# <client>
self.ad_client = AnomalyDetectorClient(AzureKeyCredential(self.sub_key), self.end_point)
# </client>
self.data_source = "YOUR_SAMPLE_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS"
Entrenar el modelo
En primer lugar, entrenaremos el modelo, comprobaremos el estado del modelo durante el entrenamiento para determinar cuándo se ha completado el entrenamiento y, después, recuperaremos el identificador de modelo más reciente que necesitaremos cuando pasemos a la fase de detección.
def train(self, start_time, end_time):
# Number of models available now
model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000))
print("{:d} available models before training.".format(len(model_list)))
# Use sample data to train the model
print("Training new model...(it may take a few minutes)")
data_feed = ModelInfo(start_time=start_time, end_time=end_time, source=self.data_source)
response_header = \
self.ad_client.train_multivariate_model(data_feed, cls=lambda *args: [args[i] for i in range(len(args))])[-1]
trained_model_id = response_header['Location'].split("/")[-1]
# Model list after training
new_model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000))
# Wait until the model is ready. It usually takes several minutes
model_status = None
while model_status != ModelStatus.READY and model_status != ModelStatus.FAILED:
model_info = self.ad_client.get_multivariate_model(trained_model_id).model_info
model_status = model_info.status
time.sleep(10)
if model_status == ModelStatus.FAILED:
print("Creating model failed.")
print("Errors:")
if model_info.errors:
for error in model_info.errors:
print("Error code: {}. Message: {}".format(error.code, error.message))
else:
print("None")
return None
if model_status == ModelStatus.READY:
# Model list after training
new_model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000))
print("Done.\n--------------------")
print("{:d} available models after training.".format(len(new_model_list)))
# Return the latest model id
return trained_model_id
Detección de anomalías
Use detect_anomaly y get_dectection_result para determinar si existe cualquier anomalía con el origen de datos. Deberá pasar el identificador de modelo para el modelo que acaba de entrenar.
def detect(self, model_id, start_time, end_time):
# Detect anomaly in the same data source (but a different interval)
try:
detection_req = DetectionRequest(source=self.data_source, start_time=start_time, end_time=end_time)
response_header = self.ad_client.detect_anomaly(model_id, detection_req,
cls=lambda *args: [args[i] for i in range(len(args))])[-1]
result_id = response_header['Location'].split("/")[-1]
# Get results (may need a few seconds)
r = self.ad_client.get_detection_result(result_id)
while r.summary.status != DetectionStatus.READY and r.summary.status != DetectionStatus.FAILED:
r = self.ad_client.get_detection_result(result_id)
time.sleep(2)
if r.summary.status == DetectionStatus.FAILED:
print("Detection failed.")
print("Errors:")
if r.summary.errors:
for error in r.summary.errors:
print("Error code: {}. Message: {}".format(error.code, error.message))
else:
print("None")
return None
except HttpResponseError as e:
print('Error code: {}'.format(e.error.code), 'Error message: {}'.format(e.error.message))
except Exception as e:
raise e
return r
Exportación de un modelo
Nota
El comando de exportación está diseñado para permitir la ejecución de modelos multivariados de Anomaly Detector en un entorno en contenedor. Actualmente, no se admite para el multivariado, pero se agregará una compatibilidad en el futuro.
Si desea exportar un modelo, use export_model y pase el identificador del modelo que desea exportar:
def export_model(self, model_id, model_path="model.zip"):
# Export the model
model_stream_generator = self.ad_client.export_model(model_id)
with open(model_path, "wb") as f_obj:
while True:
try:
f_obj.write(next(model_stream_generator))
except StopIteration:
break
except Exception as e:
raise e
Eliminación del modelo
Para eliminar un modelo, use delete_multivariate_model y pase el identificador del modelo que desea eliminar:
def delete_model(self, model_id):
# Delete the mdoel
self.ad_client.delete_multivariate_model(model_id)
model_list_after_delete = list(self.ad_client.list_multivariate_model(skip=0, top=10000))
print("{:d} available models after deletion.".format(len(model_list_after_delete)))
Ejecución de la aplicación
Antes de ejecutar la aplicación, es necesario agregar código para llamar a las nuevas funciones creadas.
if __name__ == '__main__':
subscription_key = "ANOMALY_DETECTOR_KEY"
anomaly_detector_endpoint = "ANOMALY_DETECTOR_ENDPOINT"
# Create a new sample and client
sample = MultivariateSample(subscription_key, anomaly_detector_endpoint, data_source=None)
# Train a new model
model_id = sample.train(datetime(2021, 1, 1, 0, 0, 0), datetime(2021, 1, 2, 12, 0, 0))
# Reference
result = sample.detect(model_id, datetime(2021, 1, 2, 12, 0, 0), datetime(2021, 1, 3, 0, 0, 0))
print("Result ID:\t", result.result_id)
print("Result summary:\t", result.summary)
print("Result length:\t", len(result.results))
# Export model
sample.export_model(model_id, "model.zip")
# Delete model
sample.delete_model(model_id)
Antes de ejecutarla, puede resultar útil comprobar el proyecto con el código de ejemplo completo del que se deriva este inicio rápido.
También tenemos una instancia de Jupyter Notebook detallada para ayudarle a empezar a trabajar.
Ejecute la aplicación con el comando python en el nombre de archivo.
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a dicho grupo.
Pasos siguientes
Comience a usar la biblioteca cliente multivariante de Anomaly Detector para Java. Siga estos pasos para instalar el inicio del paquete con los algoritmos que proporciona el servicio. Las nuevas API de detección de anomalías multivariante permiten a los desarrolladores integrar fácilmente inteligencia artificial avanzada para detectar anomalías de grupos de métricas, sin necesidad de tener conocimientos de aprendizaje automático ni usar datos etiquetados. Las dependencias y correlaciones entre distintas señales se consideran automáticamente como factores clave. De este modo, podrá proteger de forma proactiva los sistemas complejos frente a errores.
Utilice la biblioteca cliente multivariante de Anomaly Detector para Java con el fin de:
- Detectar anomalías de nivel del sistema para un grupo de series temporales.
- Cuando una serie temporal individual no ofrece demasiada información y se deben examinar todas las señales para detectar un problema.
- Mantenimiento predictivo de recursos físicos costosos con decenas o cientos de tipos de sensores diferentes que miden diversos aspectos del estado del sistema.
Documentación de referencia de la biblioteca | Código fuente de la biblioteca | Paquete (Maven) | Código de ejemplo
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- La versión actual de Java Development Kit (JDK)
- La herramienta de compilación de Gradle u otro administrador de dependencias.
- Cuando tenga la suscripción de Azure, cree un recurso de Anomaly Detector en Azure Portal para obtener la clave y el punto de conexión. Espere a que se implemente y haga clic en el botón Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Anomaly Detector API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
Puede usar el plan de tarifa gratis (
Instalación
Creación de un proyecto de Gradle
En este inicio rápido se usa el administrador de dependencias Gradle. Puede encontrar más información de la biblioteca cliente en Maven Central Repository.
En una ventana de la consola (como cmd, PowerShell o Bash), cree un directorio para la aplicación y vaya a él.
mkdir myapp && cd myapp
Ejecute el comando gradle init desde el directorio de trabajo. Este comando creará archivos de compilación esenciales para Gradle, como build.gradle.kts, que se usa en el runtime para crear y configurar la aplicación.
gradle init --type basic
Cuando se le solicite que elija un DSL, seleccione Kotlin.
Instalación de la biblioteca cliente
Busque build.gradle.kts y ábralo con el IDE o el editor de texto que prefiera. A continuación, se copia en esta configuración de compilación. Asegúrese de incluir las dependencias del proyecto.
dependencies {
compile("com.azure:azure-ai-anomalydetector")
}
Creación de un archivo Java
Cree una carpeta para la aplicación de ejemplo. En el directorio de trabajo, ejecute el siguiente comando:
mkdir -p src/main/java
Vaya a la nueva carpeta y cree un archivo denominado MetricsAdvisorQuickstarts.java. Ábralo en el editor o el IDE que prefiera y agregue las siguientes instrucciones import:
package com.azure.ai.anomalydetector;
import com.azure.ai.anomalydetector.models.*;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.*;
import com.azure.core.http.policy.*;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.PagedResponse;
import com.azure.core.http.rest.Response;
import com.azure.core.http.rest.StreamResponse;
import com.azure.core.util.Context;
import reactor.core.publisher.Flux;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
Cree variables para el punto de conexión y la clave de Azure del recurso. Cree otra variable para el archivo de datos de ejemplo.
Nota
Siempre tendrá la opción de usar una de estas dos claves. Esto es para permitir la rotación de claves segura. Para este inicio rápido, use la primera clave.
String key = "YOUR_API_KEY";
String endpoint = "YOUR_ENDPOINT";
Para usar las API multivariantes de Anomaly Detector, primero debe entrenar sus propios modelos. Los datos de entrenamiento son un conjunto de varias series temporales que cumplen los siguientes requisitos:
Cada serie temporal debe ser un archivo CSV con dos columnas (solo dos), "timestamp" y "value" (todo en minúsculas) como fila de encabezado. Los valores de "timestamp" deben cumplir la norma ISO 8601; los de "value" pueden ser números enteros o decimales con cualquier número de posiciones decimales. Por ejemplo:
| timestamp | value |
|---|---|
| 2019-04-01T00:00:00Z | 5 |
| 2019-04-01T00:01:00Z | 3.6 |
| 2019-04-01T00:02:00Z | 4 |
... |
... |
Cada archivo CSV debe tener el nombre de una variable diferente que se usará para el entrenamiento del modelo. Por ejemplo, "temperature.csv" y "humidity.csv". Todos los archivos CSV deben comprimirse en un archivo ZIP sin subcarpetas. El archivo ZIP puede tener el nombre que desee. El archivo ZIP debe cargarse en Azure Blob Storage. Una vez que genere la dirección URL de SAS de blob (firmas de acceso compartido) para el archivo ZIP, se puede usar para el entrenamiento. Consulte este documento para obtener información sobre cómo generar direcciones URL de SAS a partir de Azure Blob Storage.
Ejemplos de código
Estos fragmentos de código muestran cómo realizar las siguientes acciones con la biblioteca cliente de Anomaly Detector para Node.js:
- Autenticar el cliente
- Entrenamiento de un modelo
- Detectar anomalías
- Exportar un modelo
- Eliminar un modelo
Autenticar el cliente
Cree una instancia de un objeto anomalyDetectorClient con el punto de conexión y las credenciales.
HttpHeaders headers = new HttpHeaders()
.put("Accept", ContentType.APPLICATION_JSON);
HttpPipelinePolicy authPolicy = new AzureKeyCredentialPolicy(key,
new AzureKeyCredential(key));
AddHeadersPolicy addHeadersPolicy = new AddHeadersPolicy(headers);
HttpPipeline httpPipeline = new HttpPipelineBuilder().httpClient(HttpClient.createDefault())
.policies(authPolicy, addHeadersPolicy).build();
// Instantiate a client that will be used to call the service.
HttpLogOptions httpLogOptions = new HttpLogOptions();
httpLogOptions.setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS);
AnomalyDetectorClient anomalyDetectorClient = new AnomalyDetectorClientBuilder()
.pipeline(httpPipeline)
.endpoint(endpoint)
.httpLogOptions(httpLogOptions)
.buildClient();
Entrenamiento de un modelo
Construcción de un resultado del modelo y entrenamiento del modelo
En primer lugar, es necesario construir una solicitud de modelo. Asegúrese de que la hora de inicio y finalización se correspondan con su origen de datos.
Para usar las API multivariante de Anomaly Detector, es necesario entrenar nuestro modelo antes de usar la detección. Los datos usados para el entrenamiento son un lote de series temporales; cada serie temporal debe estar en un archivo CSV con solo dos columnas, "timestamp" y "value" (los nombres de columna deben ser exactamente iguales). Cada archivo CSV debe tener el nombre de cada variable para la serie temporal. Todas las series temporales deben comprimirse en un archivo ZIP y cargarse en Azure Blob Storage. No existe ningún requisito para el nombre del archivo ZIP. Como alternativa, se puede incluir un archivo meta.json en el archivo ZIP si desea que el nombre de la variable sea diferente al nombre del archivo .zip. Una vez que se genera una URL de SAS (firmas de acceso compartido) de blob, podemos usar la dirección URL para el archivo ZIP para el entrenamiento.
Path path = Paths.get("test-data.csv");
List<String> requestData = Files.readAllLines(path);
List<TimeSeriesPoint> series = requestData.stream()
.map(line -> line.trim())
.filter(line -> line.length() > 0)
.map(line -> line.split(",", 2))
.filter(splits -> splits.length == 2)
.map(splits -> {
TimeSeriesPoint timeSeriesPoint = new TimeSeriesPoint();
timeSeriesPoint.setTimestamp(OffsetDateTime.parse(splits[0]));
timeSeriesPoint.setValue(Float.parseFloat(splits[1]));
return timeSeriesPoint;
})
.collect(Collectors.toList());
Integer window = 28;
AlignMode alignMode = AlignMode.OUTER;
FillNAMethod fillNAMethod = FillNAMethod.LINEAR;
Integer paddingValue = 0;
AlignPolicy alignPolicy = new AlignPolicy()
.setAlignMode(alignMode)
.setFillNAMethod(fillNAMethod)
.setPaddingValue(paddingValue);
String source = "YOUR_SAMPLE_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS";
OffsetDateTime startTime = OffsetDateTime.of(2021, 1, 2, 0, 0, 0, 0, ZoneOffset.UTC);
OffsetDateTime endTime = OffsetDateTime.of(2021, 1, 3, 0, 0, 0, 0, ZoneOffset.UTC);
String displayName = "Devops-MultiAD";
ModelInfo request = new ModelInfo()
.setSlidingWindow(window)
.setAlignPolicy(alignPolicy)
.setSource(source)
.setStartTime(startTime)
.setEndTime(endTime)
.setDisplayName(displayName);
TrainMultivariateModelResponse trainMultivariateModelResponse = anomalyDetectorClient.trainMultivariateModelWithResponse(request, Context.NONE);
String header = trainMultivariateModelResponse.getDeserializedHeaders().getLocation();
String[] substring = header.split("/");
UUID modelId = UUID.fromString(substring[substring.length - 1]);
System.out.println(modelId);
//Check model status until the model is ready
Response<Model> trainResponse;
while (true) {
trainResponse = anomalyDetectorClient.getMultivariateModelWithResponse(modelId, Context.NONE);
ModelStatus modelStatus = trainResponse.getValue().getModelInfo().getStatus();
if (modelStatus == ModelStatus.READY || modelStatus == ModelStatus.FAILED) {
break;
}
TimeUnit.SECONDS.sleep(10);
}
if (trainResponse.getValue().getModelInfo().getStatus() != ModelStatus.READY){
System.out.println("Training failed.");
List<ErrorResponse> errorMessages = trainResponse.getValue().getModelInfo().getErrors();
for (ErrorResponse errorMessage : errorMessages) {
System.out.println("Error code: " + errorMessage.getCode());
System.out.println("Error message: " + errorMessage.getMessage());
}
}
Detección de anomalías
DetectionRequest detectionRequest = new DetectionRequest().setSource(source).setStartTime(startTime).setEndTime(endTime);
DetectAnomalyResponse detectAnomalyResponse = anomalyDetectorClient.detectAnomalyWithResponse(modelId, detectionRequest, Context.NONE);
String location = detectAnomalyResponse.getDeserializedHeaders().getLocation();
String[] substring = location.split("/");
UUID resultId = UUID.fromString(substring[substring.length - 1]);
DetectionResult detectionResult;
while (true) {
detectionResult = anomalyDetectorClient.getDetectionResult(resultId);
DetectionStatus detectionStatus = detectionResult.getSummary().getStatus();;
if (detectionStatus == DetectionStatus.READY || detectionStatus == DetectionStatus.FAILED) {
break;
}
TimeUnit.SECONDS.sleep(10);
}
if (detectionResult.getSummary().getStatus() != DetectionStatus.READY){
System.out.println("Inference failed");
List<ErrorResponse> detectErrorMessages = detectionResult.getSummary().getErrors();
for (ErrorResponse errorMessage : detectErrorMessages) {
System.out.println("Error code: " + errorMessage.getCode());
System.out.println("Error message: " + errorMessage.getMessage());
}
}
Exportación de un modelo
Nota
El comando de exportación está diseñado para permitir la ejecución de modelos multivariados de Anomaly Detector en un entorno en contenedor. Actualmente, no se admite para el multivariado, pero se agregará una compatibilidad en el futuro.
Para exportar el modelo entrenado, use la función exportModelWithResponse.
StreamResponse response_export = anomalyDetectorClient.exportModelWithResponse(model_id, Context.NONE);
Flux<ByteBuffer> value = response_export.getValue();
FileOutputStream bw = new FileOutputStream("result.zip");
value.subscribe(s -> write(bw, s), (e) -> close(bw), () -> close(bw));
Eliminación del modelo
Para eliminar un modelo existente que esté disponible para el recurso actual, use la función deleteMultivariateModelWithResponse.
Response<Void> deleteMultivariateModelWithResponse = anomalyDetectorClient.deleteMultivariateModelWithResponse(model_id, Context.NONE);
Ejecución de la aplicación
Puede compilar la aplicación con:
gradle build
Ejecución de la aplicación
Antes de ejecutarla, puede resultar útil comprobar el código con el código de ejemplo completo.
Ejecute la aplicación con el objetivo run:
gradle run
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a dicho grupo.