Краткое руководство. Использование многовариантной Детектор аномалий клиентской библиотеки

Важно!

Начиная с 20 сентября 2023 г. вы не сможете создавать новые Детектор аномалий ресурсы. Служба Детектор аномалий отменяется 1 октября 2026 года.

Начало работы с многомерной клиентской библиотекой Детектора аномалий для C#. Выполните следующие действия, чтобы установить пакет и приступить к использованию алгоритмов, предоставляемых службой. Новые многовариантные API детектора аномалий позволяют разработчикам легко интегрировать расширенный ИИ для обнаружения аномалий из групп метрик, не требуя знаний машинного обучения или помеченных данных. Зависимости и взаимные корреляции между разными сигналами автоматически считаются ключевыми факторами. Это помогает заблаговременно защитить сложные системы от сбоев.

Используйте многомерную клиентскую библиотеку Детектора аномалий для C#, чтобы выполнять следующие действия.

  • Обнаружение аномалий на уровне системы по группе временных рядов.
  • Иногда отдельный временной ряд не может дать полезной информации, и для обнаружения проблемы нужно оценивать все сигналы.
  • Прогнозное обслуживание дорогостоящих физических ресурсов, оснащенных десятками или даже сотнями датчиков разных типов для измерения различных показателей работоспособности системы.

Справочная документация по библиотеке | Исходный код библиотеки | Пакет (NuGet)

Необходимые компоненты

  • Подписка Azure — создайте бесплатную учетную запись.
  • Текущая версия .NET Core.
  • После получения подписки Azure создайте ресурс Детектор аномалий в портал Azure, чтобы получить ключ и конечную точку. Дождитесь, пока закончится развертывание, и нажмите кнопку Перейти к ресурсу.
    • Для подключения приложения к API "Детектор аномалий" потребуется ключ и конечная точка из созданного ресурса. Вставьте ключ и конечную точку в код, приведенный ниже в этом кратком руководстве. Используйте бесплатную ценовую категорию (F0), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды.

Настройка

Создание учетной записи хранилища

Для нескольких Детектор аномалий требуется, чтобы образец файла храним в Хранилище BLOB-объектов Azure.

  1. Создайте учетную запись Службы хранилища Azure.
  2. Перейдите к контроль доступа(IAM) и выберите "Добавить" для добавления назначения ролей.
  3. Роль поиска служба хранилища читателя данных BLOB-объектов, выделите этот тип учетной записи и нажмите кнопку "Далее".
  4. Выберите "Назначить доступ к управляемому удостоверению" и "Выбрать участников", а затем выберите созданный ранее ресурс Детектор аномалий, а затем нажмите кнопку "Проверить и назначить".

Эта конфигурация иногда может быть немного запутанной, если у вас возникли проблемы, мы рекомендуем ознакомиться с нашим многовариантным примером Jupyter Notebook, который подробно описывает этот процесс.

Загрузка примера данных

В этом кратком руководстве используется один файл для примера данных sample_data_5_3000.csv. Этот файл можно скачать из примера данных GitHub

Вы также можете скачать примеры данных, выполнив следующие действия:

curl "https://github.com/Azure-Samples/AnomalyDetector/blob/master/sampledata/multivariate/sample_data_5_3000.csv" --output sample_data_5_3000_.csv

Отправка примеров данных в учетную запись служба хранилища

  1. Перейдите к учетной записи служба хранилища, выберите "Контейнеры" и создайте новый контейнер.
  2. Выберите " Отправить и отправить" sample_data_5_3000.csv
  3. Выберите переданные данные и скопируйте URL-адрес БОЛЬШОго двоичного объекта, как необходимо добавить его в пример кода в нескольких шагах.

Получение ключа и конечной точки

Чтобы успешно вызвать службу Детектор аномалий, вам потребуется следующее:

Имя переменной Значение
ANOMALY_DETECTOR_ENDPOINT Это значение можно найти в разделе Ключи и конечная точка при просмотре ресурса на портале Azure. Пример конечной точки: https://YOUR_RESOURCE_NAME.cognitiveservices.azure.com/
ANOMALY_DETECTOR_API_KEY Значение ключа API можно найти в разделе "Ключи и конечная точка" при изучении ресурса из портал Azure. Вы можете использовать KEY1 или KEY2.

Перейдите к своему ресурсу на портале Azure. Конечную точку и ключи можно найти в разделе Управление ресурсами. Скопируйте конечную точку и ключ доступа, так как требуется для проверки подлинности вызовов API. Вы можете использовать KEY1 или KEY2. Наличие двух ключей позволяет безопасно менять и повторно создавать ключи без прерывания работы службы.

Создание переменной среды

Создайте и назначьте переменные постоянной среды для ключа и конечной точки.

setx ANOMALY_DETECTOR_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"
setx ANOMALY_DETECTOR_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE"

Создание приложения .NET Core

В окне консоли (cmd, PowerShell или Bash) выполните команду dotnet new, чтобы создать консольное приложение с именем anomaly-detector-quickstart-multivariate. Эта команда создает простой проект Hello World с одним исходным файлом C#: Program.cs.

dotnet new console -n anomaly-detector-quickstart-multivariate

Измените каталог на созданную папку приложения. Чтобы создать приложение, выполните следующую команду:

dotnet build

Выходные данные сборки не должны содержать предупреждений или ошибок.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

Установка клиентской библиотеки

В каталоге приложения установите клиентскую библиотеку Детектора аномалий для .NET с помощью следующей команды:

dotnet add package Azure.AI.AnomalyDetector --prerelease

В каталоге проекта откройте файл program.cs и замените содержимое следующим кодом:

using Azure.AI.AnomalyDetector;
using Azure;
using static System.Environment;

internal class Program
{
    private static void Main(string[] args)
    {
        string endpoint = GetEnvironmentVariable("ANOMALY_DETECTOR_ENDPOINT"); 
        string apiKey = GetEnvironmentVariable("ANOMALY_DETECTOR_API_KEY");
        string datasource = "Path-to-sample-file-in-your-storage-account";  // example path:https://docstest001.blob.core.windows.net/test/sample_data_5_3000.csv
        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, 2, 0, 0, 0, offset);
        DateTimeOffset end_time = new DateTimeOffset(2021, 1, 2, 5, 0, 0, offset);
        string model_id = null;
        try
        {
            model_id = TrainModel(client, datasource, start_time, end_time);

            // detect
            end_time = new DateTimeOffset(2021, 1, 2, 1, 0, 0, offset);
            MultivariateDetectionResult result = BatchDetect(client, datasource, model_id, start_time, end_time);
            if (result != null)
            {
                Console.WriteLine(string.Format("Result ID: {0}", result.ResultId.ToString()));
                Console.WriteLine(string.Format("Result summary: {0}", result.Summary.ToString()));
                Console.WriteLine(string.Format("Result length: {0}", result.Results.Count));
                Console.WriteLine(string.Format("Anomalies found: {0}", result.Results.Where(r => r.Value.IsAnomaly).Count()));
            }

            // delete
            DeleteModel(client, model_id);
        }
        catch (Exception e)
        {
            string msg = string.Format("Multivariate error. {0}", e.Message);
            Console.WriteLine(msg);
            throw;
        }

        int GetModelNumber(AnomalyDetectorClient client)
        {
            int model_number = 0;
            foreach (var multivariateModel in client.GetMultivariateModels())
            {
                model_number++;
            }
            return model_number;
        }

        string TrainModel(AnomalyDetectorClient client, string datasource, DateTimeOffset start_time, DateTimeOffset end_time, int max_tryout = 500)
        {
            try
            {
                Console.WriteLine("Training new model...");

                Console.WriteLine(string.Format("{0} available models before training.", GetModelNumber(client)));

                ModelInfo request = new ModelInfo(datasource, start_time, end_time);
                request.SlidingWindow = 200;

                Console.WriteLine("Training new model...(it may take a few minutes)");
                AnomalyDetectionModel response = client.TrainMultivariateModel(request);
                string trained_model_id = response.ModelId;
                Console.WriteLine(string.Format("Training model id is {0}", trained_model_id));

                // Wait until the model is ready. It usually takes several minutes
                ModelStatus? model_status = null;
                int tryout_count = 1;
                response = client.GetMultivariateModel(trained_model_id);
                while (tryout_count < max_tryout & model_status != ModelStatus.Ready & model_status != ModelStatus.Failed)
                {
                    Thread.Sleep(1000);
                    response = client.GetMultivariateModel(trained_model_id);
                    model_status = response.ModelInfo.Status;
                    Console.WriteLine(string.Format("try {0}, model_id: {1}, status: {2}.", tryout_count, trained_model_id, model_status));
                    tryout_count += 1;
                };

                if (model_status == ModelStatus.Ready)
                {
                    Console.WriteLine("Creating model succeeds.");
                    Console.WriteLine(string.Format("{0} available models after training.", GetModelNumber(client)));
                    return trained_model_id;
                }

                if (model_status == ModelStatus.Failed)
                {
                    Console.WriteLine("Creating model failed.");
                    Console.WriteLine("Errors:");
                    try
                    {
                        Console.WriteLine(string.Format("Error code: {0}, Message: {1}", response.ModelInfo.Errors[0].Code.ToString(), response.ModelInfo.Errors[0].Message.ToString()));
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(string.Format("Get error message fail: {0}", e.Message));
                    }
                }
                return null;
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Train error. {0}", e.Message));
                throw;
            }
        }

        MultivariateDetectionResult BatchDetect(AnomalyDetectorClient client, string datasource, string model_id, DateTimeOffset start_time, DateTimeOffset end_time, int max_tryout = 500)
        {
            try
            {
                Console.WriteLine("Start batch detect...");
                MultivariateBatchDetectionOptions request = new MultivariateBatchDetectionOptions(datasource, 10, start_time, end_time);

                Console.WriteLine("Start batch detection, this might take a few minutes...");
                MultivariateDetectionResult response = client.DetectMultivariateBatchAnomaly(model_id, request);
                string result_id = response.ResultId;
                Console.WriteLine(string.Format("result id is: {0}", result_id));

                // get detection result
                MultivariateDetectionResult resultResponse = client.GetMultivariateBatchDetectionResult(result_id);
                MultivariateBatchDetectionStatus result_status = resultResponse.Summary.Status;
                int tryout_count = 0;
                while (tryout_count < max_tryout & result_status != MultivariateBatchDetectionStatus.Ready & result_status != MultivariateBatchDetectionStatus.Failed)
                {
                    Thread.Sleep(1000);
                    resultResponse = client.GetMultivariateBatchDetectionResult(result_id);
                    result_status = resultResponse.Summary.Status;
                    Console.WriteLine(string.Format("try: {0}, result id: {1} Detection status is {2}", tryout_count, result_id, result_status.ToString()));
                    Console.Out.Flush();
                }

                if (result_status == MultivariateBatchDetectionStatus.Failed)
                {
                    Console.WriteLine("Detection failed.");
                    Console.WriteLine("Errors:");
                    try
                    {
                        Console.WriteLine(string.Format("Error code: {}. Message: {}", resultResponse.Summary.Errors[0].Code.ToString(), resultResponse.Summary.Errors[0].Message.ToString()));
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(string.Format("Get error message fail: {0}", e.Message));
                    }
                    return null;
                }
                return resultResponse;
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Detection error. {0}", e.Message));
                throw;
            }
        }

        void DeleteModel(AnomalyDetectorClient client, string model_id)
        {
            client.DeleteMultivariateModel(model_id);
            int model_number = GetModelNumber(client);
            Console.WriteLine(string.Format("{0} available models after deletion.", model_number));
        }
 
    }
}

Выполнение приложения

Запустите приложение с помощью команды dotnet run из каталога приложения.

dotnet run

Очистка ресурсов

Если вы хотите очистить и удалить подписку на службы искусственного интеллекта Azure, можно удалить ресурс или группу ресурсов. При этом удаляются все ресурсы, связанные с этой группой ресурсов.

Следующие шаги

Начало работы с многомерной клиентской библиотекой Детектора аномалий для JavaScript. Выполните следующие действия, чтобы установить пакет и приступить к использованию алгоритмов, предоставляемых службой. Новые многовариантные API детектора аномалий позволяют разработчикам легко интегрировать расширенный ИИ для обнаружения аномалий из групп метрик, не требуя знаний машинного обучения или помеченных данных. Зависимости и взаимные корреляции между разными сигналами автоматически считаются ключевыми факторами. Это помогает заблаговременно защитить сложные системы от сбоев.

Используйте многомерную клиентскую библиотеку Детектора аномалий для JavaScript, чтобы выполнять следующие действия:

  • Обнаружение аномалий на уровне системы по группе временных рядов.
  • Когда любая отдельная временные ряды не скажет вам много, и вы должны посмотреть на все сигналы для обнаружения проблемы.
  • Прогнозное обслуживание дорогостоящих физических ресурсов, оснащенных десятками или даже сотнями датчиков разных типов для измерения различных показателей работоспособности системы.

Справочная документация по библиотеке | Исходный код библиотеки | Пакет (npm) | Пример кода

Необходимые компоненты

  • Подписка Azure — создайте бесплатную учетную запись.
  • Текущая версия Node.js
  • После получения подписки Azure создайте ресурс Детектор аномалий в портал Azure, чтобы получить ключ и конечную точку. Дождитесь, пока закончится развертывание, и нажмите кнопку Перейти к ресурсу.
    • Вам потребуется ключ и конечная точка из ресурса, создаваемого для подключения приложения к API Детектор аномалий. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Используйте бесплатную ценовую категорию (F0), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды.

Установка

Создание нового приложения Node.js

В окне консоли (например, cmd, PowerShell или Bash) создайте новый каталог для приложения и перейдите в него.

mkdir myapp && cd myapp

Выполните команду npm init, чтобы создать приложение узла с помощью файла package.json.

npm init

Создайте файл с именем index.js и импортируйте следующие библиотеки:

'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');

Создайте переменные конечной точки и ключа ресурса Azure. Создайте еще одну переменную для примера файла данных.

Примечание.

Вы всегда сможете использовать один из двух ключей. Это позволяет реализовать безопасную смену ключей. В рамках этого краткого руководства используйте первый ключ.

const apiKey = "YOUR_API_KEY";
const endpoint = "YOUR_ENDPOINT";
const data_source = "YOUR_SAMPLE_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS";

Важно!

Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.

Чтобы использовать API-интерфейсы многомерной модели детектора аномалий, необходимо сначала обучить собственные модели. Обучающие данные — это набор из нескольких временных рядов, которые соответствуют указанным ниже требованиям.

Каждый временной ряд должен быть CSV-файлом с двумя (и только двумя) столбцами со следующими заголовками: timestamp и value. Значения timestamp должны соответствовать стандарту ISO 8601; значение value может быть целым или дробным числом с любым количеством десятичных разрядов. Например:

TIMESTAMP значение
2019-04-01T00:00:00Z 5
2019-04-01T00:01:00Z 3,6
2019-04-01T00:02:00Z 4
... ...

Каждый CSV-файл должен иметь название, соответствующей отдельной переменной, которая будет использоваться для обучения модели. Примеры: temperature.csv и humidity.csv. Все CSV-файлы должны быть сжаты в один ZIP-файл без вложенных папок. ZIP-файл может иметь любое имя на ваше усмотрение. ZIP-файл следует отправить в хранилище BLOB-объектов Azure. Когда для него будет создан подписанный URL-адрес BLOB-объекта, ZIP-файл можно будет использовать для обучения. Сведения о том, как создавать URL-адреса SAS с помощью хранилища BLOB-объектов Azure, см. в этом документе.

Установка клиентской библиотеки

Установите пакеты NPM ms-rest-azure и azure-ai-anomalydetector. В этом кратком руководстве также используется библиотека анализа CSV-файла:

npm install @azure/ai-anomaly-detector csv-parse

Файл package.json приложения обновлен с учетом зависимостей.

Примеры кода

Эти фрагменты кода показывают, как выполнить следующие действия с помощью клиентской библиотеки Детектора аномалий для Node.js:

аутентификация клиента;

Создайте экземпляр объекта с помощью конечной AnomalyDetectorClient точки и учетных данных.

const client = new AnomalyDetectorClient(endpoint, new AzureKeyCredential(apiKey));

Обучение модели

Создание результата модели

Сначала нам нужно создать запрос к модели. Убедитесь, что время начала и окончания соответствует источнику данных.

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
};

Обучение новой модели

Запрос модели передается методу клиента trainMultivariateModel Детектор аномалий.

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)

Чтобы проверить, завершена ли подготовка модели, отслеживайте ее состояние следующим образом:

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.");

Обнаружение аномалий

Используйте функции detectAnomaly и getDectectionResult, чтобы определить наличие аномалий в источнике данных.

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);

Экспорт модели

Примечание.

Команда экспорта предназначена для того, чтобы разрешить выполнение многовариативных моделей Детектора аномалий в контейнерной среде. В настоящее время многовариантность не поддерживается, но поддержка будет добавлена в будущем.

Чтобы экспортировать обученную модель, используйте функцию 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+".")

Удаление модели

Чтобы удалить существующую модель, которая доступна для текущего ресурса, используйте функцию deleteMultivariateModel.

client.deleteMultivariateModel(model_id)
console.log("New model has been deleted.")

Выполнение приложения

Перед запуском приложения полезно будет проверить код на соответствие полному коду примера.

Запустите приложение, выполнив команду node для файла quickstart.

node index.js

Очистка ресурсов

Если вы хотите очистить и удалить подписку на службы искусственного интеллекта Azure, можно удалить ресурс или группу ресурсов. При этом удаляются все ресурсы, связанные с этой группой ресурсов.

Следующие шаги

Справочная документация по библиотеке |Исходный код библиотеки | Пакет (PyPi) |Поиск примера кода на GitHub

Сведения Узнайте, как начать работу с многомерной клиентской библиотекой Детектора аномалий для Python. Выполните следующие действия, чтобы установить пакет и начать использовать алгоритмы, предоставляемые службой. Новые многовариантные API детектора аномалий позволяют разработчикам легко интегрировать расширенный ИИ для обнаружения аномалий из групп метрик, не требуя знаний машинного обучения или помеченных данных. Зависимости и взаимные корреляции между разными сигналами автоматически считаются ключевыми факторами. Это помогает заблаговременно защитить сложные системы от сбоев.

С помощью многомерной клиентской библиотеки Детектора аномалий для Python можно выполнять следующие действия:

  • Обнаружение аномалий на уровне системы по группе временных рядов.
  • Когда любая отдельная временные ряды не скажет вам много, и вы должны посмотреть на все сигналы для обнаружения проблемы.
  • Прогнозное обслуживание дорогостоящих физических ресурсов, оснащенных десятками или даже сотнями датчиков разных типов для измерения различных показателей работоспособности системы.

Необходимые компоненты

  • подписка Azure — создайте бесплатную учетную запись.
  • Python 3.x
  • После получения подписки Azure создайте ресурс Детектор аномалий в портал Azure, чтобы получить ключ и конечную точку. Дождитесь, пока закончится развертывание, и нажмите кнопку Перейти к ресурсу. Используйте бесплатную ценовую категорию (F0), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды.

Настройка

Установите клиентскую библиотеку. Клиентскую библиотеку можно установить с помощью следующей команды:

pip install --upgrade azure.ai.anomalydetector

Создание учетной записи хранилища

Для нескольких Детектор аномалий требуется, чтобы образец файла храним в Хранилище BLOB-объектов Azure.

  1. Создайте учетную запись Службы хранилища Azure.
  2. Перейдите к контроль доступа(IAM) и выберите "Добавить" для добавления назначения ролей.
  3. Роль поиска служба хранилища читателя данных BLOB-объектов, выделите этот тип учетной записи и нажмите кнопку "Далее".
  4. Выберите "Назначить доступ к управляемому удостоверению" и "Выбрать участников", а затем выберите созданный ранее ресурс Детектор аномалий, а затем нажмите кнопку "Проверить и назначить".

Эта конфигурация иногда может быть немного запутанной, если у вас возникли проблемы, мы рекомендуем ознакомиться с нашим многовариантным примером Jupyter Notebook, который подробно описывает этот процесс.

Загрузка примера данных

В этом кратком руководстве используется один файл для примера данных sample_data_5_3000.csv. Этот файл можно скачать из примера данных GitHub

Вы также можете скачать примеры данных, выполнив следующие действия:

curl "https://github.com/Azure-Samples/AnomalyDetector/blob/master/sampledata/multivariate/sample_data_5_3000.csv" --output sample_data_5_3000_.csv

Отправка примеров данных в учетную запись служба хранилища

  1. Перейдите к учетной записи служба хранилища, выберите "Контейнеры" и создайте новый контейнер.
  2. Выберите " Отправить и отправить" sample_data_5_3000.csv
  3. Выберите переданные данные и скопируйте URL-адрес БОЛЬШОго двоичного объекта, как необходимо добавить его в пример кода в нескольких шагах.

Получение ключа и конечной точки

Чтобы успешно вызвать службу Детектор аномалий, вам потребуется следующее:

Имя переменной Значение
ANOMALY_DETECTOR_ENDPOINT Это значение можно найти в разделе Ключи и конечная точка при просмотре ресурса на портале Azure. Пример конечной точки: https://YOUR_RESOURCE_NAME.cognitiveservices.azure.com/
ANOMALY_DETECTOR_API_KEY Значение ключа API можно найти в разделе "Ключи и конечная точка" при изучении ресурса из портал Azure. Вы можете использовать KEY1 или KEY2.

Перейдите к своему ресурсу на портале Azure. Конечную точку и ключи можно найти в разделе Управление ресурсами. Скопируйте конечную точку и ключ доступа, так как требуется для проверки подлинности вызовов API. Вы можете использовать KEY1 или KEY2. Наличие двух ключей позволяет безопасно менять и повторно создавать ключи без прерывания работы службы.

Создание переменной среды

Создайте и назначьте переменные постоянной среды для ключа и конечной точки.

setx ANOMALY_DETECTOR_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"
setx ANOMALY_DETECTOR_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE"

Создание приложения Python

  1. Создайте файл Python с именем sample_multivariate_detect.py. Затем откройте его в предпочитаемом редакторе или интегрированной среде разработки.

  2. Замените содержимое sample_multivariate_detect.py следующим кодом. Необходимо изменить пути для переменных blob_url.

import time
from datetime import datetime, timezone
from azure.ai.anomalydetector import AnomalyDetectorClient
from azure.core.credentials import AzureKeyCredential
from azure.ai.anomalydetector.models import *

SUBSCRIPTION_KEY =  os.environ['ANOMALY_DETECTOR_API_KEY']
ANOMALY_DETECTOR_ENDPOINT = os.environ['ANOMALY_DETECTOR_ENDPOINT']

ad_client = AnomalyDetectorClient(ANOMALY_DETECTOR_ENDPOINT, AzureKeyCredential(SUBSCRIPTION_KEY))

time_format = "%Y-%m-%dT%H:%M:%SZ"
blob_url = "Path-to-sample-file-in-your-storage-account"  # example path: https://docstest001.blob.core.windows.net/test/sample_data_5_3000.csv

train_body = ModelInfo(
    data_source=blob_url,
    start_time=datetime.strptime("2021-01-02T00:00:00Z", time_format),
    end_time=datetime.strptime("2021-01-02T05:00:00Z", time_format),
    data_schema="OneTable",
    display_name="sample",
    sliding_window=200,
    align_policy=AlignPolicy(
        align_mode=AlignMode.OUTER,
        fill_n_a_method=FillNAMethod.LINEAR,
        padding_value=0,
    ),
)

batch_inference_body = MultivariateBatchDetectionOptions(
       data_source=blob_url,
       top_contributor_count=10,
       start_time=datetime.strptime("2021-01-02T00:00:00Z", time_format),
       end_time=datetime.strptime("2021-01-02T05:00:00Z", time_format),
   )


print("Training new model...(it may take a few minutes)")
model = ad_client.train_multivariate_model(train_body)
model_id = model.model_id
print("Training model id is {}".format(model_id))

## Wait until the model is ready. It usually takes several minutes
model_status = None
model = None

while model_status != ModelStatus.READY and model_status != ModelStatus.FAILED:
    model = ad_client.get_multivariate_model(model_id)
    print(model)
    model_status = model.model_info.status
    print("Model is {}".format(model_status))
    time.sleep(30)
if model_status == ModelStatus.READY:
    print("Done.\n--------------------")
    # Return the latest model id

# Detect anomaly in the same data source (but a different interval)
result = ad_client.detect_multivariate_batch_anomaly(model_id, batch_inference_body)
result_id = result.result_id

# Get results (may need a few seconds)
r = ad_client.get_multivariate_batch_detection_result(result_id)
print("Get detection result...(it may take a few seconds)")

while r.summary.status != MultivariateBatchDetectionStatus.READY and r.summary.status != MultivariateBatchDetectionStatus.FAILED and r.summary.status !=MultivariateBatchDetectionStatus.CREATED:
    anomaly_results = ad_client.get_multivariate_batch_detection_result(result_id)
    print("Detection is {}".format(r.summary.status))
    time.sleep(5)
    
   
print("Result ID:\t", anomaly_results.result_id)
print("Result status:\t", anomaly_results.summary.status)
print("Result length:\t", len(anomaly_results.results))

# See detailed inference result
for r in anomaly_results.results:
    print(
        "timestamp: {}, is_anomaly: {:<5}, anomaly score: {:.4f}, severity: {:.4f}, contributor count: {:<4d}".format(
            r.timestamp,
            r.value.is_anomaly,
            r.value.score,
            r.value.severity,
            len(r.value.interpretation) if r.value.is_anomaly else 0,
        )
    )
    if r.value.interpretation:
        for contributor in r.value.interpretation:
            print(
                "\tcontributor variable: {:<10}, contributor score: {:.4f}".format(
                    contributor.variable, contributor.contribution_score
                )
            )

Выполнение приложения

Запустите приложение, выполнив команду python для файла quickstart.

python sample_multivariate_detect.py

Выходные данные

10 available models before training.
Training new model...(it may take a few minutes)
Training model id is 3a695878-a88f-11ed-a16c-b290e72010e0
{'modelId': '3a695878-a88f-11ed-a16c-b290e72010e0', 'createdTime': '2023-02-09T15:34:23Z', 'lastUpdatedTime': '2023-02-09T15:34:23Z', 'modelInfo': {'dataSource': 'https://docstest001.blob.core.windows.net/test/sample_data_5_3000 (1).csv', 'dataSchema': 'OneTable', 'startTime': '2021-01-02T00:00:00Z', 'endTime': '2021-01-02T05:00:00Z', 'displayName': 'sample', 'slidingWindow': 200, 'alignPolicy': {'alignMode': 'Outer', 'fillNAMethod': 'Linear', 'paddingValue': 0.0}, 'status': 'CREATED', 'errors': [], 'diagnosticsInfo': {'modelState': {'epochIds': [], 'trainLosses': [], 'validationLosses': [], 'latenciesInSeconds': []}, 'variableStates': []}}}
Model is CREATED
{'modelId': '3a695878-a88f-11ed-a16c-b290e72010e0', 'createdTime': '2023-02-09T15:34:23Z', 'lastUpdatedTime': '2023-02-09T15:34:55Z', 'modelInfo': {'dataSource': 'https://docstest001.blob.core.windows.net/test/sample_data_5_3000 (1).csv', 'dataSchema': 'OneTable', 'startTime': '2021-01-02T00:00:00Z', 'endTime': '2021-01-02T05:00:00Z', 'displayName': 'sample', 'slidingWindow': 200, 'alignPolicy': {'alignMode': 'Outer', 'fillNAMethod': 'Linear', 'paddingValue': 0.0}, 'status': 'READY', 'errors': [], 'diagnosticsInfo': {'modelState': {'epochIds': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], 'trainLosses': [1.0493712276220322, 0.5454281121492386, 0.42524269968271255, 0.38019897043704987, 0.3472398854792118, 0.34301353991031647, 0.3219067454338074, 0.3108387663960457, 0.30357857793569565, 0.29986055195331573], 'validationLosses': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 'latenciesInSeconds': [0.3412797451019287, 0.25798678398132324, 0.2556419372558594, 0.3165152072906494, 0.2748451232910156, 0.26111531257629395, 0.2571413516998291, 0.257282018661499, 0.2549862861633301, 0.25806593894958496]}, 'variableStates': [{'variable': 'series_0', 'filledNARatio': 0.0, 'effectiveCount': 301, 'firstTimestamp': '2021-01-02T00:00:00Z', 'lastTimestamp': '2021-01-02T05:00:00Z'}, {'variable': 'series_1', 'filledNARatio': 0.0, 'effectiveCount': 301, 'firstTimestamp': '2021-01-02T00:00:00Z', 'lastTimestamp': '2021-01-02T05:00:00Z'}, {'variable': 'series_2', 'filledNARatio': 0.0, 'effectiveCount': 301, 'firstTimestamp': '2021-01-02T00:00:00Z', 'lastTimestamp': '2021-01-02T05:00:00Z'}, {'variable': 'series_3', 'filledNARatio': 0.0, 'effectiveCount': 301, 'firstTimestamp': '2021-01-02T00:00:00Z', 'lastTimestamp': '2021-01-02T05:00:00Z'}, {'variable': 'series_4', 'filledNARatio': 0.0, 'effectiveCount': 301, 'firstTimestamp': '2021-01-02T00:00:00Z', 'lastTimestamp': '2021-01-02T05:00:00Z'}]}}}
Model is READY
Done.
--------------------
10 available models after training.
Get detection result...(it may take a few seconds)
Detection is CREATED
Detection is READY
Result ID:	 70a6cdf8-a88f-11ed-a461-928899e62c38
Result status:	 READY
Result length:	 301
timestamp: 2021-01-02 00:00:00+00:00, is_anomaly: 0    , anomaly score: 0.1770, severity: 0.0000, contributor count: 0   
timestamp: 2021-01-02 00:01:00+00:00, is_anomaly: 0    , anomaly score: 0.3446, severity: 0.0000, contributor count: 0   
timestamp: 2021-01-02 00:02:00+00:00, is_anomaly: 0    , anomaly score: 0.2397, severity: 0.0000, contributor count: 0   
timestamp: 2021-01-02 00:03:00+00:00, is_anomaly: 0    , anomaly score: 0.1270, severity: 0.0000, contributor count: 0   
timestamp: 2021-01-02 00:04:00+00:00, is_anomaly: 0    , anomaly score: 0.3321, severity: 0.0000, contributor count: 0   
timestamp: 2021-01-02 00:05:00+00:00, is_anomaly: 0    , anomaly score: 0.4053, severity: 0.0000, contributor count: 0   
timestamp: 2021-01-02 00:06:00+00:00, is_anomaly: 0    , anomaly score: 0.4371, severity: 0.0000, contributor count: 0   
timestamp: 2021-01-02 00:07:00+00:00, is_anomaly: 1    , anomaly score: 0.6615, severity: 0.3850, contributor count: 5   
	contributor variable: series_3  , contributor score: 0.2939
	contributor variable: series_1  , contributor score: 0.2834
	contributor variable: series_4  , contributor score: 0.2329
	contributor variable: series_0  , contributor score: 0.1543
	contributor variable: series_2  , contributor score: 0.0354

Выходные результаты усечены для краткости.

Очистка ресурсов

Если вы хотите очистить и удалить ресурс Детектор аномалий, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. Вы также можете рассмотреть возможность удаления созданных переменных среды, если вы больше не планируете их использовать.

Сведения для начала работы с многомерной клиентской библиотекой Детектора аномалий для Java. Выполните следующие действия, чтобы установить пакет и приступить к использованию алгоритмов, предоставляемых службой. Новые многовариантные API детектора аномалий позволяют разработчикам легко интегрировать расширенный ИИ для обнаружения аномалий из групп метрик, не требуя знаний машинного обучения или помеченных данных. Зависимости и взаимные корреляции между разными сигналами автоматически считаются ключевыми факторами. Это помогает заблаговременно защитить сложные системы от сбоев.

Используйте многомерную клиентскую библиотеку Детектора аномалий для Java, чтобы выполнять следующие действия:

  • Обнаружение аномалий на уровне системы по группе временных рядов.
  • Когда любая отдельная временные ряды не скажет вам много, и вы должны посмотреть на все сигналы для обнаружения проблемы.
  • Прогнозное обслуживание дорогостоящих физических ресурсов, оснащенных десятками или даже сотнями датчиков разных типов для измерения различных показателей работоспособности системы.

Справочная документация по библиотеке | Исходный код библиотеки | Пакет (Maven) | Пример кода

Необходимые компоненты

  • Подписка Azure — создайте бесплатную учетную запись.
  • Текущая версия пакета средств разработки Java (JDK).
  • Средство сборки Gradle или другой диспетчер зависимостей.
  • После получения подписки Azure создайте ресурс Детектор аномалий в портал Azure, чтобы получить ключ и конечную точку. Дождитесь, пока закончится развертывание, и нажмите кнопку Перейти к ресурсу.
    • Вам потребуется ключ и конечная точка из ресурса, создаваемого для подключения приложения к API Детектор аномалий. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Используйте бесплатную ценовую категорию (F0), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды.

Установка

Создание проекта Gradle

В этом кратком руководстве используется диспетчер зависимостей Gradle. Подробные сведения о клиентской библиотеке можно найти в центральном репозитории Maven.

В окне консоли (например, cmd, PowerShell или Bash) создайте новый каталог для приложения и перейдите в него.

mkdir myapp && cd myapp

Выполните команду gradle init из рабочей папки. Эта команда создает основные файлы сборки для Gradle, включая build.gradle.kts , который используется во время выполнения для создания и настройки приложения.

gradle init --type basic

Когда появится запрос на выбор предметно-ориентированного языка, выберите Kotlin.

Установка клиентской библиотеки

Найдите файл build.gradle.kts и откройте его в предпочитаемой интегрированной среде разработки или текстовом редакторе. Затем скопируйте и вставьте в файл эту конфигурацию сборки. Обязательно включите зависимости проекта.

dependencies {
    compile("com.azure:azure-ai-anomalydetector")
}

Создание файла Java

Создайте папку для примера приложения. Выполните следующие команды из рабочего каталога:

mkdir -p src/main/java

Перейдите в новую папку и создайте файл с именем MetricsAdvisorQuickstarts.java. Откройте его в предпочитаемом редакторе или интегрированной среде разработки и добавьте следующие операторы 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;

Создайте переменные конечной точки и ключа ресурса Azure. Создайте еще одну переменную для примера файла данных.

Примечание.

Вы всегда сможете использовать один из двух ключей. Это позволяет реализовать безопасную смену ключей. В рамках этого краткого руководства используйте первый ключ.

String key = "YOUR_API_KEY";
String endpoint = "YOUR_ENDPOINT";

Важно!

Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.

Чтобы использовать API-интерфейсы многомерной модели детектора аномалий, необходимо сначала обучить собственные модели. Обучающие данные — это набор из нескольких временных рядов, которые соответствуют указанным ниже требованиям.

Каждый временной ряд должен быть CSV-файлом с двумя (и только двумя) столбцами со следующими заголовками: timestamp и value. Значения timestamp должны соответствовать стандарту ISO 8601; значение value может быть целым или дробным числом с любым количеством десятичных разрядов. Например:

TIMESTAMP значение
2019-04-01T00:00:00Z 5
2019-04-01T00:01:00Z 3,6
2019-04-01T00:02:00Z 4
... ...

Каждый CSV-файл должен иметь название, соответствующей отдельной переменной, которая будет использоваться для обучения модели. Примеры: temperature.csv и humidity.csv. Все CSV-файлы должны быть сжаты в один ZIP-файл без вложенных папок. ZIP-файл может иметь любое имя на ваше усмотрение. ZIP-файл следует отправить в хранилище BLOB-объектов Azure. Когда для него будет создан подписанный URL-адрес BLOB-объекта, ZIP-файл можно будет использовать для обучения. Сведения о том, как создавать URL-адреса SAS с помощью хранилища BLOB-объектов Azure, см. в этом документе.

Примеры кода

Эти фрагменты кода показывают, как выполнить следующие действия с помощью клиентской библиотеки Детектора аномалий для Node.js:

аутентификация клиента;

Создайте экземпляр объекта с помощью конечной anomalyDetectorClient точки и учетных данных.

HttpHeaders headers = new HttpHeaders()
    .put("Accept", ContentType.APPLICATION_JSON);

HttpPipelinePolicy authPolicy = new AzureKeyCredentialPolicy("Ocp-Apim-Subscription-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();

Обучение модели

Создание результата модели и обучение модели

Сначала нам нужно создать запрос к модели. Убедитесь, что время начала и окончания соответствует источнику данных.

Чтобы использовать многомерные API-интерфейсы Детектора аномалий, сначала нужно обучить собственную модель. Данные, используемые для обучения, представляют собой пакет временных рядов. Каждый временный ряд должен находиться в CSV-файле с двумя столбцами: timestamp и value (имена столбцов должны быть в точности такими). Имя каждого CSV-файла должно соответствовать каждой переменной временного ряда. Все временные ряды должны быть зашифрованы в один ZIP-файл и отправляться в хранилище BLOB-объектов Azure, и для имени ZIP-файла не требуется. Но вы можете добавить дополнительный файл meta.json в ZIP-файл, если имя переменной должно отличаться от имени ZIP-файла. Создав подписанный URL-адрес для BLOB-объекта, мы сможем предоставить для обучения URL-адрес ZIP-файла.

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());
    }
}

Обнаружение аномалий

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());
    }
}

Экспорт модели

Примечание.

Команда экспорта предназначена для того, чтобы разрешить выполнение многовариативных моделей Детектора аномалий в контейнерной среде. В настоящее время многовариантность не поддерживается, но поддержка будет добавлена в будущем.

Чтобы экспортировать обученную модель, используйте функцию 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));

Удаление модели

Чтобы удалить существующую модель, которая доступна для текущего ресурса, используйте функцию deleteMultivariateModelWithResponse.

Response<Void> deleteMultivariateModelWithResponse = anomalyDetectorClient.deleteMultivariateModelWithResponse(model_id, Context.NONE);

Выполнение приложения

Чтобы создать приложение, выполните следующую команду:

gradle build

Выполнение приложения

Перед запуском полезно будет проверить код на соответствие полному коду примера.

Запустите приложение, выполнив цель run:

gradle run

Очистка ресурсов

Если вы хотите очистить и удалить подписку на службы искусственного интеллекта Azure, можно удалить ресурс или группу ресурсов. При этом удаляются все ресурсы, связанные с этой группой ресурсов.

Следующие шаги