Szybki start: używanie wielowariancji Narzędzie do wykrywania anomalii biblioteki klienta

Ważne

Od 20 września 2023 r. nie będzie można tworzyć nowych zasobów Narzędzie do wykrywania anomalii. Usługa Narzędzie do wykrywania anomalii jest wycofywana 1 października 2026 r.

Rozpocznij pracę z wielowariancją biblioteki klienta Narzędzie do wykrywania anomalii dla języka C#. Wykonaj następujące kroki, aby zainstalować pakiet i rozpocząć korzystanie z algorytmów udostępnianych przez usługę. Nowe wielowariancyjne interfejsy API detektora anomalii umożliwiają deweloperom łatwe integrowanie zaawansowanej sztucznej inteligencji w celu wykrywania anomalii z grup metryk bez konieczności uczenia maszynowego lub etykietowania danych. Zależności i korelacje między różnymi sygnałami są automatycznie liczone jako kluczowe czynniki. Pomaga to aktywnie chronić złożone systemy przed awariami.

Użyj wielowariancji biblioteki klienta Narzędzie do wykrywania anomalii dla języka C#, aby:

  • Wykrywanie anomalii na poziomie systemu z grupy szeregów czasowych.
  • Kiedy każda pojedyncza seria czasowa nie powie Ci zbyt wiele i musisz przyjrzeć się wszystkim sygnałom, aby wykryć problem.
  • Predykatywna konserwacja kosztownych zasobów fizycznych z dziesiątkami do setek różnych typów czujników mierzących różne aspekty kondycji systemu.

Dokumentacja biblioteki — | pakiet kodu | źródłowego biblioteki (NuGet)

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Bieżąca wersja platformy .NET Core
  • Po utworzeniu subskrypcji platformy Azure utwórz zasób Narzędzie do wykrywania anomalii w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Poczekaj na wdrożenie i wybierz przycisk Przejdź do zasobu .
    • Potrzebny będzie klucz i punkt końcowy z utworzonego zasobu, aby połączyć aplikację z interfejsem API Narzędzie do wykrywania anomalii. Wklej klucz i punkt końcowy do poniższego kodu w dalszej części przewodnika Szybki start. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Ustawienia

Tworzenie konta magazynu

Wielowariancja Narzędzie do wykrywania anomalii wymaga przechowywania przykładowego pliku w usłudze Azure Blob Storage.

  1. Utwórz konto usługi Azure Storage.
  2. Przejdź do pozycji Kontrola dostępu (Zarządzanie dostępem i tożsamościami) i wybierz pozycję DODAJ , aby dodać przypisanie roli.
  3. Wyszukaj rolę Czytelnik danych obiektu blob usługi Storage, wyróżnij ten typ konta, a następnie wybierz pozycję Dalej.
  4. Wybierz pozycję Przypisz dostęp do tożsamości zarządzanej, a następnie wybierz pozycję Członkowie, a następnie wybierz utworzony wcześniej zasób Narzędzie do wykrywania anomalii, a następnie wybierz pozycję Przejrzyj i przypisz.

Ta konfiguracja może czasami być nieco myląca, jeśli masz problemy, zalecamy zapoznanie się z naszym wielowariantowym przykładem notesu Jupyter Notebook, który przeprowadzi cię przez ten proces bardziej szczegółowo.

Pobierz przykładowe dane

W tym przewodniku Szybki start użyto jednego pliku dla przykładowych danych sample_data_5_3000.csv. Ten plik można pobrać z przykładowych danych usługi GitHub

Możesz również pobrać przykładowe dane, uruchamiając polecenie:

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

Przekazywanie przykładowych danych do konta magazynu

  1. Przejdź do konta magazynu, wybierz pozycję Kontenery i utwórz nowy kontener.
  2. Wybierz pozycję Przekaż i przekaż plik sample_data_5_3000.csv
  3. Wybierz przekazane dane i skopiuj adres URL obiektu blob, ponieważ musisz dodać go do przykładu kodu w kilku krokach.

Pobieranie klucza i punktu końcowego

Aby pomyślnie wykonać wywołanie usługi Narzędzie do wykrywania anomalii, potrzebne są następujące wartości:

Nazwa zmiennej Wartość
ANOMALY_DETECTOR_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Przykładowy punkt końcowy: https://YOUR_RESOURCE_NAME.cognitiveservices.azure.com/
ANOMALY_DETECTOR_API_KEY Wartość klucza interfejsu API można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2.

Przejdź do zasobu w witrynie Azure Portal. Punkt końcowy i klucze można znaleźć w sekcji Zarządzanie zasobami. Skopiuj punkt końcowy i klucz dostępu, ponieważ potrzebujesz zarówno do uwierzytelniania wywołań interfejsu API. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.

Tworzenie zmiennych środowiskowych

Tworzenie i przypisywanie trwałych zmiennych środowiskowych dla klucza i punktu końcowego.

setx ANOMALY_DETECTOR_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"
setx ANOMALY_DETECTOR_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE"

Tworzenie nowej aplikacji .NET Core

W oknie konsoli (takim jak cmd, PowerShell lub Bash) użyj dotnet new polecenia , aby utworzyć nową aplikację konsolową o nazwie anomaly-detector-quickstart-multivariate. To polecenie tworzy prosty projekt "Hello World" z jednym plikiem źródłowym języka C#: Program.cs.

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

Zmień katalog na nowo utworzony folder aplikacji. Aplikację można skompilować za pomocą następujących funkcji:

dotnet build

Dane wyjściowe kompilacji nie powinny zawierać żadnych ostrzeżeń ani błędów.

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

Instalowanie biblioteki klienta

W katalogu aplikacji zainstaluj bibliotekę klienta Narzędzie do wykrywania anomalii dla platformy .NET za pomocą następującego polecenia:

dotnet add package Azure.AI.AnomalyDetector --prerelease

W katalogu projektu otwórz plik program.cs i zastąp ciąg następującym kodem:

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

Uruchamianie aplikacji

Uruchom aplikację za pomocą dotnet run polecenia z katalogu aplikacji.

dotnet run

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć subskrypcję usług Azure AI, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych zasobów skojarzonych z grupą zasobów.

Następne kroki

Wprowadzenie do wielowariancyjnej biblioteki klienta Narzędzie do wykrywania anomalii dla języka JavaScript. Wykonaj następujące kroki, aby zainstalować pakiet i rozpocząć korzystanie z algorytmów udostępnianych przez usługę. Nowe wielowariancyjne interfejsy API detektora anomalii umożliwiają deweloperom łatwe integrowanie zaawansowanej sztucznej inteligencji w celu wykrywania anomalii z grup metryk bez konieczności uczenia maszynowego lub etykietowania danych. Zależności i korelacje między różnymi sygnałami są automatycznie liczone jako kluczowe czynniki. Pomaga to aktywnie chronić złożone systemy przed awariami.

Użyj wielowariancyjnej biblioteki klienta Narzędzie do wykrywania anomalii dla języka JavaScript, aby:

  • Wykrywanie anomalii na poziomie systemu z grupy szeregów czasowych.
  • Kiedy każda pojedyncza seria czasowa nie powie Ci zbyt wiele i musisz przyjrzeć się wszystkim sygnałom, aby wykryć problem.
  • Predykatywna konserwacja kosztownych zasobów fizycznych z dziesiątkami do setek różnych typów czujników mierzących różne aspekty kondycji systemu.

Dokumentacja biblioteki — kod | | źródłowy biblioteki źródłowej Package (npm) | Przykładowy kod

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Bieżąca wersja środowiska Node.js
  • Po utworzeniu subskrypcji platformy Azure utwórz zasób Narzędzie do wykrywania anomalii w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Poczekaj na wdrożenie i wybierz przycisk Przejdź do zasobu .
    • Będziesz potrzebować klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API Narzędzie do wykrywania anomalii. W dalszej części przewodnika Szybki start wklejesz klucz i punkt końcowy do poniższego kodu. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Konfigurowanie

Tworzenie nowej aplikacji Node.js

W oknie konsoli (na przykład cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji i przejdź do niego.

mkdir myapp && cd myapp

Uruchom polecenie npm init, aby utworzyć aplikację Node przy użyciu pliku package.json.

npm init

Utwórz plik o nazwie index.js i zaimportuj następujące biblioteki: "

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

Utwórz zmienne punktu końcowego i klucza platformy Azure zasobu. Utwórz inną zmienną dla przykładowego pliku danych.

Uwaga

Zawsze będziesz mieć możliwość użycia jednego z dwóch kluczy. Umożliwia to bezpieczną rotację kluczy. Na potrzeby tego przewodnika Szybki start użyj pierwszego klucza.

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

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.

Aby użyć interfejsów API wielowariancji Narzędzie do wykrywania anomalii, należy najpierw wytrenować własne modele. Dane szkoleniowe to zestaw wielu szeregów czasowych, które spełniają następujące wymagania:

Każda seria czasowa powinna być plikiem CSV z dwoma kolumnami (i tylko dwoma), "sygnaturą czasową" i "wartością" (wszystkie małe litery) jako wiersz nagłówka. Wartości "sygnatury czasowej" powinny być zgodne z normą ISO 8601; "wartość" może być liczbami całkowitymi lub dziesiętnymi z dowolną liczbą miejsc dziesiętnych. Na przykład:

timestamp wartość
2019-04-01T00:00:00Z 5
2019-04-01T00:01:00Z 3,6
2019-04-01T00:02:00Z 100
... ...

Każdy plik CSV powinien mieć nazwę po innej zmiennej, która będzie używana do trenowania modelu. Na przykład "temperature.csv" i "humidity.csv". Wszystkie pliki CSV powinny być spakowane do jednego pliku zip bez żadnych podfolderów. Plik zip może mieć dowolną nazwę. Plik zip powinien zostać przekazany do usługi Azure Blob Storage. Po wygenerowaniu adresu URL sygnatur dostępu współdzielonego obiektu blob (sygnatury dostępu współdzielonego) dla pliku zip można go użyć do trenowania. Zapoznaj się z tym dokumentem, aby dowiedzieć się, jak wygenerować adresy URL sygnatur dostępu współdzielonego z usługi Azure Blob Storage.

Instalowanie biblioteki klienta

ms-rest-azure Zainstaluj pakiety NPM i azure-ai-anomalydetector . Biblioteka csv-parse jest również używana w tym przewodniku Szybki start:

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

Plik aplikacji package.json jest aktualizowany przy użyciu zależności.

Przykłady kodu

Te fragmenty kodu pokazują, jak wykonać następujące czynności za pomocą biblioteki klienta Narzędzie do wykrywania anomalii dla środowiska Node.js:

Uwierzytelnianie użytkownika

Utwórz wystąpienie AnomalyDetectorClient obiektu przy użyciu punktu końcowego i poświadczeń.

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

Szkolenie modelu

Konstruowanie wyniku modelu

Najpierw musimy utworzyć żądanie modelu. Upewnij się, że godzina rozpoczęcia i zakończenia jest zgodna ze źródłem danych.

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

Trenowanie nowego modelu

Żądanie modelu jest przekazywane do metody klienta trainMultivariateModel Narzędzie do wykrywania anomalii.

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)

Aby sprawdzić, czy trenowanie modelu zostało ukończone, możesz śledzić stan modelu:

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

Wykrywanie anomalii

detectAnomaly Użyj funkcji igetDectectionResult, aby określić, czy istnieją jakiekolwiek anomalie w źródle danych.

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

Eksportowanie modelu

Uwaga

Polecenie eksportu ma służyć do zezwalania na uruchamianie Narzędzie do wykrywania anomalii wielowariancji modeli w środowisku konteneryzowanym. Nie jest to obecnie obsługiwane w przypadku wielowariancji, ale obsługa zostanie dodana w przyszłości.

Aby wyeksportować wytrenowany model, użyj exportModel funkcji .

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

Usuwanie modelu

Aby usunąć istniejący model dostępny dla bieżącego zasobu, użyj deleteMultivariateModel funkcji .

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

Uruchamianie aplikacji

Przed uruchomieniem aplikacji przydatne może być sprawdzenie kodu pod kątem pełnego przykładowego kodu

Uruchom aplikację, wykonując polecenie node dla pliku szybkiego startu.

node index.js

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć subskrypcję usług Azure AI, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych zasobów skojarzonych z grupą zasobów.

Następne kroki

Dokumentacja biblioteki dokumentacji |Pakietu kodu | źródłowego biblioteki (PyPi) |Znajdowanie przykładowego kodu w usłudze GitHub

Rozpocznij pracę z wielowariancją biblioteki klienta Narzędzie do wykrywania anomalii dla języka Python. Wykonaj następujące kroki, aby zainstalować pakiet i rozpocząć korzystanie z algorytmów dostarczonych przez usługę. Nowe wielowariancyjne interfejsy API detektora anomalii umożliwiają deweloperom łatwe integrowanie zaawansowanej sztucznej inteligencji w celu wykrywania anomalii z grup metryk bez konieczności uczenia maszynowego lub etykietowania danych. Zależności i korelacje między różnymi sygnałami są automatycznie liczone jako kluczowe czynniki. Pomaga to aktywnie chronić złożone systemy przed awariami.

Użyj wielowariancji biblioteki klienta Narzędzie do wykrywania anomalii dla języka Python, aby:

  • Wykrywanie anomalii na poziomie systemu z grupy szeregów czasowych.
  • Kiedy każda pojedyncza seria czasowa nie powie Ci zbyt wiele i musisz przyjrzeć się wszystkim sygnałom, aby wykryć problem.
  • Predykatywna konserwacja kosztownych zasobów fizycznych z dziesiątkami do setek różnych typów czujników mierzących różne aspekty kondycji systemu.

Wymagania wstępne

Ustawienia

Zainstaluj bibliotekę klienta. Bibliotekę klienta można zainstalować za pomocą następujących funkcji:

pip install --upgrade azure.ai.anomalydetector

Tworzenie konta magazynu

Wielowariancja Narzędzie do wykrywania anomalii wymaga przechowywania przykładowego pliku w usłudze Azure Blob Storage.

  1. Utwórz konto usługi Azure Storage.
  2. Przejdź do pozycji Kontrola dostępu (Zarządzanie dostępem i tożsamościami) i wybierz pozycję DODAJ , aby dodać przypisanie roli.
  3. Wyszukaj rolę Czytelnik danych obiektu blob usługi Storage, wyróżnij ten typ konta, a następnie wybierz pozycję Dalej.
  4. Wybierz pozycję Przypisz dostęp do tożsamości zarządzanej, a następnie wybierz pozycję Członkowie, a następnie wybierz utworzony wcześniej zasób Narzędzie do wykrywania anomalii, a następnie wybierz pozycję Przejrzyj i przypisz.

Ta konfiguracja może czasami być nieco myląca, jeśli masz problemy, zalecamy zapoznanie się z naszym wielowariantowym przykładem notesu Jupyter Notebook, który przeprowadzi cię przez ten proces bardziej szczegółowo.

Pobierz przykładowe dane

W tym przewodniku Szybki start użyto jednego pliku dla przykładowych danych sample_data_5_3000.csv. Ten plik można pobrać z przykładowych danych usługi GitHub

Możesz również pobrać przykładowe dane, uruchamiając polecenie:

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

Przekazywanie przykładowych danych do konta magazynu

  1. Przejdź do konta magazynu, wybierz pozycję Kontenery i utwórz nowy kontener.
  2. Wybierz pozycję Przekaż i przekaż plik sample_data_5_3000.csv
  3. Wybierz przekazane dane i skopiuj adres URL obiektu blob, ponieważ musisz dodać go do przykładu kodu w kilku krokach.

Pobieranie klucza i punktu końcowego

Aby pomyślnie wykonać wywołanie usługi Narzędzie do wykrywania anomalii, potrzebne są następujące wartości:

Nazwa zmiennej Wartość
ANOMALY_DETECTOR_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Przykładowy punkt końcowy: https://YOUR_RESOURCE_NAME.cognitiveservices.azure.com/
ANOMALY_DETECTOR_API_KEY Wartość klucza interfejsu API można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2.

Przejdź do zasobu w witrynie Azure Portal. Punkt końcowy i klucze można znaleźć w sekcji Zarządzanie zasobami. Skopiuj punkt końcowy i klucz dostępu, ponieważ potrzebujesz zarówno do uwierzytelniania wywołań interfejsu API. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.

Tworzenie zmiennych środowiskowych

Tworzenie i przypisywanie trwałych zmiennych środowiskowych dla klucza i punktu końcowego.

setx ANOMALY_DETECTOR_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"
setx ANOMALY_DETECTOR_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE"

Tworzenie nowej aplikacji w języku Python

  1. Utwórz nowy plik języka Python o nazwie sample_multivariate_detect.py. Następnie otwórz go w preferowanym edytorze lub środowisku IDE.

  2. Zastąp zawartość pliku sample_multivariate_detect.py następującym kodem. Należy zmodyfikować ścieżki zmiennych 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
                )
            )

Uruchamianie aplikacji

Uruchom aplikację, wykonując polecenie python dla pliku szybkiego startu.

python sample_multivariate_detect.py

Wyjście

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

Wyniki wyjściowe zostały obcięte w celu zwięzłości.

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć zasób Narzędzie do wykrywania anomalii, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów. Możesz również rozważyć usunięcie utworzonych zmiennych środowiskowych, jeśli nie zamierzasz już ich używać.

Rozpocznij pracę z wielowariancją biblioteki klienta Narzędzie do wykrywania anomalii dla języka Java. Wykonaj następujące kroki, aby zainstalować pakiet za pomocą algorytmów dostarczonych przez usługę. Nowe wielowariancyjne interfejsy API detektora anomalii umożliwiają deweloperom łatwe integrowanie zaawansowanej sztucznej inteligencji w celu wykrywania anomalii z grup metryk bez konieczności uczenia maszynowego lub etykietowania danych. Zależności i korelacje między różnymi sygnałami są automatycznie liczone jako kluczowe czynniki. Pomaga to aktywnie chronić złożone systemy przed awariami.

Użyj wielowariancji biblioteki klienta Narzędzie do wykrywania anomalii dla języka Java, aby:

  • Wykrywanie anomalii na poziomie systemu z grupy szeregów czasowych.
  • Kiedy każda pojedyncza seria czasowa nie powie Ci zbyt wiele i musisz przyjrzeć się wszystkim sygnałom, aby wykryć problem.
  • Predykatywna konserwacja kosztownych zasobów fizycznych z dziesiątkami do setek różnych typów czujników mierzących różne aspekty kondycji systemu.

Dokumentacja biblioteki — kod | | źródłowy biblioteki (Maven) | Przykładowy kod

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Bieżąca wersja zestawu Java Development Kit (JDK)
  • Narzędzie kompilacji narzędzia Gradle lub inny menedżer zależności.
  • Po utworzeniu subskrypcji platformy Azure utwórz zasób Narzędzie do wykrywania anomalii w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Poczekaj na wdrożenie i wybierz przycisk Przejdź do zasobu .
    • Będziesz potrzebować klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API Narzędzie do wykrywania anomalii. W dalszej części przewodnika Szybki start wklejesz klucz i punkt końcowy do poniższego kodu. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Konfigurowanie

Tworzenie nowego projektu narzędzia Gradle

W tym przewodniku Szybki start jest używany menedżer zależności narzędzia Gradle. Więcej informacji o bibliotece klienta można znaleźć w repozytorium centralnym programu Maven.

W oknie konsoli (na przykład cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji i przejdź do niego.

mkdir myapp && cd myapp

gradle init Uruchom polecenie z katalogu roboczego. To polecenie tworzy podstawowe pliki kompilacji dla narzędzia Gradle, w tym build.gradle.kts , które są używane w czasie wykonywania do tworzenia i konfigurowania aplikacji.

gradle init --type basic

Po wyświetleniu monitu wybierz pozycję Język DSL, a następnie Kotlin.

Instalowanie biblioteki klienta

Znajdź plik build.gradle.kts i otwórz go przy użyciu preferowanego środowiska IDE lub edytora tekstów. Następnie skopiuj tę konfigurację kompilacji. Pamiętaj, aby uwzględnić zależności projektu.

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

Tworzenie pliku języka Java

Utwórz folder dla przykładowej aplikacji. W katalogu roboczym uruchom następujące polecenie:

mkdir -p src/main/java

Przejdź do nowego folderu i utwórz plik o nazwie MetricsAdvisorQuickstarts.java. Otwórz go w preferowanym edytorze lub środowisku IDE i dodaj następujące import instrukcje:

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;

Utwórz zmienne punktu końcowego i klucza platformy Azure zasobu. Utwórz inną zmienną dla przykładowego pliku danych.

Uwaga

Zawsze będziesz mieć możliwość użycia jednego z dwóch kluczy. Umożliwia to bezpieczną rotację kluczy. Na potrzeby tego przewodnika Szybki start użyj pierwszego klucza.

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

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.

Aby użyć interfejsów API wielowariancji Narzędzie do wykrywania anomalii, należy najpierw wytrenować własne modele. Dane szkoleniowe to zestaw wielu szeregów czasowych, które spełniają następujące wymagania:

Każda seria czasowa powinna być plikiem CSV z dwoma kolumnami (i tylko dwoma), "sygnaturą czasową" i "wartością" (wszystkie małe litery) jako wiersz nagłówka. Wartości "sygnatury czasowej" powinny być zgodne z normą ISO 8601; "wartość" może być liczbami całkowitymi lub dziesiętnymi z dowolną liczbą miejsc dziesiętnych. Na przykład:

timestamp wartość
2019-04-01T00:00:00Z 5
2019-04-01T00:01:00Z 3,6
2019-04-01T00:02:00Z 100
... ...

Każdy plik CSV powinien mieć nazwę po innej zmiennej, która będzie używana do trenowania modelu. Na przykład "temperature.csv" i "humidity.csv". Wszystkie pliki CSV powinny być spakowane do jednego pliku zip bez żadnych podfolderów. Plik zip może mieć dowolną nazwę. Plik zip powinien zostać przekazany do usługi Azure Blob Storage. Po wygenerowaniu adresu URL sygnatur dostępu współdzielonego obiektu blob (sygnatury dostępu współdzielonego) dla pliku zip można go użyć do trenowania. Zapoznaj się z tym dokumentem, aby dowiedzieć się, jak wygenerować adresy URL sygnatur dostępu współdzielonego z usługi Azure Blob Storage.

Przykłady kodu

Te fragmenty kodu pokazują, jak wykonać następujące czynności za pomocą biblioteki klienta Narzędzie do wykrywania anomalii dla środowiska Node.js:

Uwierzytelnianie użytkownika

Utwórz wystąpienie anomalyDetectorClient obiektu przy użyciu punktu końcowego i poświadczeń.

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

Szkolenie modelu

Konstruowanie wyniku modelu i trenowanie modelu

Najpierw musimy utworzyć żądanie modelu. Upewnij się, że godzina rozpoczęcia i zakończenia jest zgodna ze źródłem danych.

Aby użyć Narzędzie do wykrywania anomalii wielowariancyjnych interfejsów API, musimy wytrenować własny model przed użyciem wykrywania. Dane używane do trenowania to partia szeregów czasowych, a każda seria czasowa powinna znajdować się w pliku CSV zawierającym tylko dwie kolumny, "sygnaturę czasową" i "wartość" (nazwy kolumn powinny być dokładnie takie same). Każdy plik CSV powinien mieć nazwę po każdej zmiennej dla szeregów czasowych. Cały szereg czasowy powinien zostać spakowany do jednego pliku zip i przekazany do usługi Azure Blob Storage, a nazwa pliku zip nie jest wymagana. Alternatywnie dodatkowy plik meta.json można dołączyć do pliku zip, jeśli chcesz, aby nazwa zmiennej różniła się od nazwy pliku zip. Po wygenerowaniu adresu URL sygnatur dostępu współdzielonego obiektu blob (sygnatury dostępu współdzielonego) możemy użyć adresu URL do pliku zip na potrzeby trenowania.

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

Wykrywanie anomalii

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

Eksportowanie modelu

Uwaga

Polecenie eksportu ma służyć do zezwalania na uruchamianie Narzędzie do wykrywania anomalii wielowariancji modeli w środowisku konteneryzowanym. Nie jest to obecnie obsługiwane w przypadku wielowariancji, ale obsługa zostanie dodana w przyszłości.

Aby wyeksportować wytrenowany model, użyj polecenia 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));

Usuwanie modelu

Aby usunąć istniejący model dostępny dla bieżącego zasobu, użyj deleteMultivariateModelWithResponse funkcji .

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

Uruchamianie aplikacji

Aplikację można skompilować za pomocą następujących funkcji:

gradle build

Uruchamianie aplikacji

Przed uruchomieniem może być przydatne sprawdzenie kodu pod kątem pełnego przykładowego kodu.

Uruchom aplikację z run celem:

gradle run

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć subskrypcję usług Azure AI, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych zasobów skojarzonych z grupą zasobów.

Następne kroki