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.
- 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 (
Konfiguruj
Tworzenie konta magazynu
Wielowariancja Narzędzie do wykrywania anomalii wymaga przechowywania przykładowego pliku w usłudze Azure Blob Storage.
- Utwórz konto usługi Azure Storage.
- Przejdź do pozycji Kontrola dostępu (Zarządzanie dostępem i tożsamościami) i wybierz pozycję DODAJ , aby dodać przypisanie roli.
- Wyszukaj rolę Czytelnik danych obiektu blob usługi Storage, wyróżnij ten typ konta, a następnie wybierz pozycję Dalej.
- 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
- Przejdź do konta magazynu, wybierz pozycję Kontenery i utwórz nowy kontener.
- Wybierz pozycję Przekaż i przekaż sample_data_5_3000.csv
- 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.
Ważne
Jeśli używasz klucza interfejsu API, zapisz go bezpiecznie w innym miejscu, na przykład w usłudze Azure Key Vault. Nie dołączaj klucza interfejsu API bezpośrednio do kodu i nigdy nie publikuj go publicznie.
Aby uzyskać więcej informacji na temat zabezpieczeń usług sztucznej inteligencji, zobacz Uwierzytelnianie żądań w usługach Azure AI.
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 pojedynczym 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 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.
- 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 (
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 Node.js:
- Uwierzytelnianie użytkownika
- Szkolenie modelu
- Wykrywanie anomalii
- Eksportowanie modelu
- Usuwanie modelu
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
- Subskrypcja platformy Azure — utwórz bezpłatnie
- Python 3.x
- 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 . 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.
Konfiguruj
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.
- Utwórz konto usługi Azure Storage.
- Przejdź do pozycji Kontrola dostępu (Zarządzanie dostępem i tożsamościami) i wybierz pozycję DODAJ , aby dodać przypisanie roli.
- Wyszukaj rolę Czytelnik danych obiektu blob usługi Storage, wyróżnij ten typ konta, a następnie wybierz pozycję Dalej.
- 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
- Przejdź do konta magazynu, wybierz pozycję Kontenery i utwórz nowy kontener.
- Wybierz pozycję Przekaż i przekaż sample_data_5_3000.csv
- 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.
Ważne
Jeśli używasz klucza interfejsu API, zapisz go bezpiecznie w innym miejscu, na przykład w usłudze Azure Key Vault. Nie dołączaj klucza interfejsu API bezpośrednio do kodu i nigdy nie publikuj go publicznie.
Aby uzyskać więcej informacji na temat zabezpieczeń usług sztucznej inteligencji, zobacz Uwierzytelnianie żądań w usługach Azure AI.
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
Utwórz nowy plik języka Python o nazwie sample_multivariate_detect.py. Następnie otwórz go w preferowanym edytorze lub środowisku IDE.
Zastąp zawartość 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 *
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
)
)
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.
- 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 (
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 Node.js:
- Uwierzytelnianie użytkownika
- Szkolenie modelu
- Wykrywanie anomalii
- Eksportowanie modelu
- Usuwanie modelu
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.