Поделиться через


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

Внимание

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

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

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

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

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

Предварительные условия

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

Настройка

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

Для использования Многомерного Детектора аномалий ваш образец файла должен быть сохранён в Azure Blob Storage.

  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-адрес Blob, поскольку его нужно добавить в кодовый образец через несколько шагов.

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

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

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

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

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

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

Внимание

Мы рекомендуем использовать аутентификацию Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы избежать хранения учетных данных в ваших приложениях, работающих в облаке.

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

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

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

Внимание

Мы рекомендуем использовать аутентификацию Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы избежать хранения учетных данных в ваших приложениях, работающих в облаке.

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

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

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

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

метка времени значение
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-адрес SAS (подписи общего доступа) для 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

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

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

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

Предварительные условия

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

Настройка

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

pip install --upgrade azure.ai.anomalydetector

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

Для использования Многомерного Детектора аномалий ваш образец файла должен быть сохранён в Azure Blob Storage.

  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-адрес Blob, поскольку его нужно добавить в кодовый образец через несколько шагов.

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

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

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

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

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

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

Внимание

Мы рекомендуем использовать аутентификацию Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы избежать хранения учетных данных в ваших приложениях, работающих в облаке.

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

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

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 *
import os

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)
anomaly_results = ad_client.get_multivariate_batch_detection_result(result_id)
print("Get detection result...(it may take a few seconds)")

while anomaly_results.summary.status != MultivariateBatchDetectionStatus.READY and anomaly_results.summary.status != MultivariateBatchDetectionStatus.FAILED:
    anomaly_results = ad_client.get_multivariate_batch_detection_result(result_id)
    print("Detection is {}".format(anomaly_results.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

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

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

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

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

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

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

mkdir -p src/main/java

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

Внимание

Мы рекомендуем использовать аутентификацию Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы избежать хранения учетных данных в ваших приложениях, работающих в облаке.

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

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

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

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

метка времени значение
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-адрес SAS (подписи общего доступа) для 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-файл и загружены в Azure Blob Storage, и нет требований к имени ZIP-файла. Но вы можете добавить дополнительный файл meta.json в ZIP-файл, если имя переменной должно отличаться от имени ZIP-файла. Создав URL-адрес BLOB SAS (Подписанные URL-адреса общего доступа), мы сможем использовать 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, можно удалить ресурс или группу ресурсов. При этом удаляются все ресурсы, связанные с этой группой ресурсов.

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