التشغيل السريع: استخدام مكتبة عميل Anomaly Detector متعددة المتغيرات

هام

اعتبارا من 20 سبتمبر 2023، لن تتمكن من إنشاء موارد Anomaly Detector جديدة. يتم إيقاف خدمة Anomaly Detector في 1 أكتوبر 2026.

ابدأ باستخدام مكتبة العميل متعدد المتغيرات Anomaly Detector من أجل C#. اتبع تلك الخطوات لتثبيت الحزمة والبدء في استخدام الخوارزميات التي توفرها لك الخدمة. تمكن واجهات برمجة التطبيقات الجديدة للكشف عن الحالات الشاذة متعددة المتغيرات المطورين من خلال دمج الذكاء الاصطناعي المتقدمة بسهولة للكشف عن الحالات الشاذة من مجموعات المقاييس، دون الحاجة إلى معرفة التعلم الآلي أو البيانات المسماة. يتم احتساب التبعيات والارتباطات المتبادلة بين الإشارات المختلفة تلقائيًا كعوامل رئيسية. يساعدك ذلك في حماية الأنظمة المُعقدة بشكل استباقي من الأعطال.

ابدأ باستخدام مكتبة العميل متعدد المتغيرات Anomaly Detector لـ C# من أجل:

  • كشف الانحرافات على مستوى النظام من مجموعة من السلاسل الزمنية.
  • عندما لا تخبرك أي سلسلة زمنية فردية بالكثير وينبغي عليك النظر إلى جميع الإشارات للكشف عن مشكلة.
  • الصيانة التنبئية للأصول المادية باهظة الثمن مع عشرات إلى مئات الأنواع المختلفة من أجهزة الاستشعار التي تقيس جوانب مختلفة من حالة النظام.

الوثائق المرجعية للمكتبة | التعليمة البرمجية المصدر للمكتبة | الحزمة (NuGet)

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • الإصدار الحالي من .NET Core.
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Anomaly Detector في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. انتظر حتى يتم نشرها وانقر فوق الزر الانتقال إلى المورد.
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تنشئه؛ لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Anomaly Detector API. الصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في التشغيل السريع. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

الإعداد

إنشاء حساب تخزين

يتطلب Anomaly Detector متعدد المتغيرات تخزين نموذج الملف الخاص بك في Azure Blob Storage.

  1. إنشاء حساب Azure Storage.
  2. انتقل إلى Access Control(IAM)، وحدد ADD لإضافة تعيين دور.
  3. ابحث عن دور Storage Blob Data Reader، وقم بتمييز نوع الحساب هذا ثم حدد Next.
  4. حدد تعيين الوصول إلى الهوية المدارة، وحدد الأعضاء، ثم اختر مورد Anomaly Detector الذي قمت بإنشائه سابقا، ثم حدد Review + assign.

قد يكون هذا التكوين أحيانا مربكا بعض الشيء، إذا كانت لديك مشكلة نوصي باستشارة نموذج Jupyter Notebook متعدد المتغيرات، والذي يستعرض هذه العملية بمزيد من التعمق.

تنزيل نموذج البيانات

يستخدم هذا التشغيل السريع ملفا واحدا لعينة البيانات sample_data_5_3000.csv. يمكن تنزيل هذا الملف من بيانات نموذج GitHub

يمكنك أيضا تنزيل نموذج البيانات عن طريق تشغيل:

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

تحميل نموذج البيانات إلى حساب التخزين

  1. انتقل إلى حساب التخزين الخاص بك، وحدد حاويات وأنشئ حاوية جديدة.
  2. حدد تحميل وتحميل sample_data_5_3000.csv
  3. حدد البيانات التي قمت بتحميلها وانسخ عنوان URL للكائن الثنائي كبير الحجم حيث تحتاج إلى إضافته إلى نموذج التعليمات البرمجية في بضع خطوات.

قم باسترداد المفتاح ونقطة النهاية

لإجراء استدعاء بنجاح مقابل خدمة Anomaly Detector، تحتاج إلى القيم التالية:

اسم المتغير القيمة‬
ANOMALY_DETECTOR_ENDPOINT يمكن العثور على هذه القيمة في قسم المفاتيح ونقطة النهاية عند فحص المورد من مدخل Microsoft Azure. مثال على نقطة النهاية: https://YOUR_RESOURCE_NAME.cognitiveservices.azure.com/
ANOMALY_DETECTOR_API_KEY يمكن العثور على قيمة مفتاح واجهة برمجة التطبيقات في قسم المفاتيح ونقطة النهاية عند فحص المورد الخاص بك من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2.

انتقل إلى مجموعة الموارد في مدخل Microsoft Azure. يمكن العثور على نقطة النهاية والمفاتيح في قسم إدارة الموارد. انسخ نقطة النهاية ومفتاح الوصول كما تحتاج إلى كليهما لمصادقة استدعاءات واجهة برمجة التطبيقات. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.

إنشاء متغيرات البيئة

إنشاء متغيرات بيئة ثابتة وتعيينها للمفتاح ونقطة النهاية.

setx ANOMALY_DETECTOR_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"
setx ANOMALY_DETECTOR_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE"

إنشاء تطبيق .NET Core جديد

في نافذة وحدة تحكم (مثل cmd أو PowerShell أو Bash)، استخدم الأمر ⁧dotnet new⁩ لإنشاء تطبيق وحدة تحكم جديد بالاسم ⁧anomaly-detector-quickstart-multivariate⁩. ينشئ هذا الأمر مشروع "Hello World" بسيطًا مع ملف مصدر C# واحد: Program.cs.

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

غيّر دليلك إلى مجلد التطبيق المنشأ حديثاً. يمكنك إنشاء التطبيق باستخدام:

dotnet build

يجب ألا يحتوي إخراج البناء على تحذيرات أو أخطاء.

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

تثبيت مكتبة العميل

ضمن دليل التطبيق، قم بتثبيت مكتبة عميل Anomaly Detector من أجل .NET باستخدام الأمر التالي:

dotnet add package Azure.AI.AnomalyDetector --prerelease

من دليل المشروع، افتح ملف program.cs واستبدل بالتعليمات البرمجية التالية:

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

internal class Program
{
    private static void Main(string[] args)
    {
        string endpoint = GetEnvironmentVariable("ANOMALY_DETECTOR_ENDPOINT"); 
        string apiKey = GetEnvironmentVariable("ANOMALY_DETECTOR_API_KEY");
        string datasource = "Path-to-sample-file-in-your-storage-account";  // example path:https://docstest001.blob.core.windows.net/test/sample_data_5_3000.csv
        Console.WriteLine(endpoint);
        var endpointUri = new Uri(endpoint);
        var credential = new AzureKeyCredential(apiKey);

        //create client
        AnomalyDetectorClient client = new AnomalyDetectorClient(endpointUri, credential);

        // train
        TimeSpan offset = new TimeSpan(0);
        DateTimeOffset start_time = new DateTimeOffset(2021, 1, 2, 0, 0, 0, offset);
        DateTimeOffset end_time = new DateTimeOffset(2021, 1, 2, 5, 0, 0, offset);
        string model_id = null;
        try
        {
            model_id = TrainModel(client, datasource, start_time, end_time);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

شغّل التطبيق

شغل التطبيق من دليل تطبيقك باستخدام الأمر dotnet run.

dotnet run

تنظيف الموارد

إذا كنت ترغب في تنظيف اشتراك خدمات Azure الذكاء الاصطناعي وإزالته، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد أيضًا إلى حذف أي موارد أخرى مرتبطة بمجموعة الموارد هذه.

الخطوات التالية

ابدأ استخدام مكتبة عميل JavaScript ذات Anomaly Detector متعدد المتغيرات. اتبع تلك الخطوات لتثبيت الحزمة والبدء في استخدام الخوارزميات التي توفرها لك الخدمة. تمكن واجهات برمجة التطبيقات الجديدة للكشف عن الحالات الشاذة متعددة المتغيرات المطورين من خلال دمج الذكاء الاصطناعي المتقدمة بسهولة للكشف عن الحالات الشاذة من مجموعات المقاييس، دون الحاجة إلى معرفة التعلم الآلي أو البيانات المسماة. يتم احتساب التبعيات والارتباطات المتبادلة بين الإشارات المختلفة تلقائيًا كعوامل رئيسية. يساعدك ذلك في حماية الأنظمة المُعقدة بشكل استباقي من الأعطال.

استخدم مكتبة عميل JavaScript ذات Anomaly Detector متعدد المتغيرات من أجل:

  • كشف الانحرافات على مستوى النظام من مجموعة من السلاسل الزمنية.
  • عندما لا تخبرك أي سلسلة زمنية فردية بالكثير، ويتعين عليك إلقاء نظرة على جميع الإشارات للكشف عن مشكلة.
  • الصيانة التنبئية للأصول المادية باهظة الثمن مع عشرات إلى مئات الأنواع المختلفة من أجهزة الاستشعار التي تقيس جوانب مختلفة من حالة النظام.

الوثائق المرجعية للمكتبة | التعليمة البرمجية لمصدر المكتبة | الحزمة (npm) | نموذج التعليمات البرمجية

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • الإصدار الحالي من Node.js
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Anomaly Detector في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. انتظر حتى يتم نشرها وانقر فوق الزر الانتقال إلى المورد.
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Anomaly Detector. ستلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في التشغيل السريع. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

الإعداد

إنشاء تطبيق Node.js جديد

في إطار نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، يمكنك إنشاء دليل جديد لتطبيقك وانتقل إليه.

mkdir myapp && cd myapp

شغّل الأمر npm init لإنشاء تطبيق node باستخدام ملف package.json.

npm init

أنشئ ملفًا جديدًا باسم index.js وافتحه ثم استورد المكتبات التالية: `

'use strict'

const fs = require('fs');
const parse = require("csv-parse/lib/sync");
const { AnomalyDetectorClient } = require('@azure/ai-anomaly-detector');
const { AzureKeyCredential } = require('@azure/core-auth');

قم بإنشاء متغيرات ونقطة نهاية Azure للمورد الخاص بك. أنشئ متغير آخر لمثال ملف البيانات.

إشعار

سيكون لديك دائمًا خيار استخدام أحد المفتاحين. وهذا للسماح تدوير مفتاح آمن. استخدم المفتاح الأول لأغراض هذا التشغيل السريع.

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

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي للحصول على مزيد من المعلومات.

لاستخدام واجهات برمجة التطبيقات متعددة المتغيرات للكشف عن الحالات الخارجة عن المألوف، تحتاج إلى تدريب نماذجك الخاصة أولًا. تدريب البيانات هو مجموعة من سلاسل زمنية متعددة تلبي المتطلبات التالية:

يجب أن يكون لكل سلسلة زمنية ملف CSV مع عمودين (اثنين فقط)، "طابع زمني" و"قيمة" (كلها بأحرف صغيرة) كصف العنوان. يجب أن تتوافق قيم "الطابع الزمني" مع معايير ISO 8601؛ كما يمكن أن تكون "القيمة" أعدادًا صحيحة أو أرقامًا عشرية مع أي عدد من القيم العشرية. على سبيل المثال:

الطابع الزمني قيمة
2019-04-01T00:00:00Z 5
2019-04-01T00:01:00Z 3.6
2019-04-01T00:02:00Z 4
... ...

يجب تسمية كل ملف CSV بمتغير مختلف والذي سيتم استخدامه لتدريب النموذج. على سبيل المثال: "temperature.csv" و"humidity.csv". يجب ضغط كافة ملفات CSV في ملف مضغوط واحد دون أي مجلدات فرعية. يمكن تسمية الملف المضغوط أي اسم تريده. يجب تحميل الملف المضغوط إلى تخزين Azure Blob. بمجرد إنشائك عنوان URL لـ blob SAS (توقيعات الوصول المشتركة) للملف المضغوط، سيمكن استخدامه للتدريب. راجع هذا المستند لمعرفة كيفية إنشاء عناوين URL SAS من Azure Blob Storage.

تثبيت مكتبة العميل

ثبّت حزم NPM ms-rest-azure وazure-ai-anomalydetector. تُستخدم مكتبة csv-parse أيضًا في هذا التشغيل السريع:

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

يتم تحديث ملف تطبيقك package.json باستخدام التبعيات.

أمثلة على التعليمات البرمجية

توضح لك مقتطفات التعليمات البرمجية هذه كيفية القيام بما يلي مع مكتبة عميل Anomaly Detector لـ Node.js:

مصادقة العميل

أنشئ كائن AnomalyDetectorClient بنقطة النهاية وبيانات الاعتماد الخاصة بك.

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

تدريب نموذج

أنشئ نتيجة نموذج

أولاً، نحن بحاجة إلى إنشاء طلب نموذج. تأكد من توافق وقت البدء والانتهاء مع مصدر البيانات.

const Modelrequest = {
  source: data_source,
  startTime: new Date(2021,0,1,0,0,0),
  endTime: new Date(2021,0,2,12,0,0),
  slidingWindow:200
};

تدريب نموذج جديد

يمكنك تمرير طلب النموذج الخاص بك إلى أسلوب عميل trainMultivariateModel Anomaly Detector.

console.log("Training a new model...")
const train_response = await client.trainMultivariateModel(Modelrequest)
const model_id = train_response.location?.split("/").pop() ?? ""
console.log("New model ID: " + model_id)

للتحقق مما إذا كان تدريب النموذج قد اكتمل، يمكنك تتبع حالة النموذج:

let model_response = await client.getMultivariateModel(model_id);
let model_status = model_response.modelInfo.status;

while (model_status != 'READY' && model_status != 'FAILED'){
  await sleep(10000).then(() => {});
  model_response = await client.getMultivariateModel(model_id);
  model_status = model_response.modelInfo.status;
}

if (model_status == 'FAILED') {
  console.log("Training failed.\nErrors:");
  for (let error of model_response.modelInfo?.errors ?? []) {
    console.log("Error code: " + error.code + ". Message: " + error.message);
  }
}

console.log("TRAINING FINISHED.");

الكشف عن الحالات الخارجة عن المألوف

استخدم الوظائف detectAnomaly وgetDectectionResult لتحديد ما إذا وجدت أي حالات خارجة عن المألوف في مصدر البيانات الخاص بك.

console.log("Start detecting...");
const detect_request = {
  source: data_source,
  startTime: new Date(2021,0,2,12,0,0),
  endTime: new Date(2021,0,3,0,0,0)
};
const result_header = await client.detectAnomaly(model_id, detect_request);
const result_id = result_header.location?.split("/").pop() ?? "";
let result = await client.getDetectionResult(result_id);
let result_status = result.summary.status;

while (result_status != 'READY' && result_status != 'FAILED'){
  await sleep(2000).then(() => {});
  result = await client.getDetectionResult(result_id);
  result_status = result.summary.status;
}

if (result_status == 'FAILED') {
  console.log("Detection failed.\nErrors:");
  for (let error of result.summary.errors ?? []) {
    console.log("Error code: " + error.code + ". Message: " + error.message)
  }
}
console.log("Result status: " + result_status);
console.log("Result Id: " + result.resultId);

تصدير النموذج

إشعار

الغرض من أمر التصدير هو أن يستخدم للسماح بتشغيل نماذج الكشف عن الحالات الخارجة عن المألوف متعددة المتغيرات في بيئة حاوية. هذا غير مدعوم حاليًا لمتعدد المتغيرات ولكن سيتم إضافة الدعم في المستقبل.

لتصدير نموذجك المدرّب، استخدم وظيفة exportModel.

const export_result = await client.exportModel(model_id)
const model_path = "model.zip"
const destination = fs.createWriteStream(model_path)
export_result.readableStreamBody?.pipe(destination)
console.log("New model has been exported to "+model_path+".")

حذف النموذج

لحذف نموذج موجود متاح للمورد الحالي، استخدم الوظيفة deleteMultivariateModel.

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

شغّل التطبيق

قبل تشغيل التطبيق، قد يكون من المفيد فحص شفرتك بمقارنتها مع نموذج التعلميات البرمجية الكامل

شغّل التطبيق باستخدام الأمر node المُتاح على ملف التشغيل السريع.

node index.js

تنظيف الموارد

إذا كنت ترغب في تنظيف اشتراك خدمات Azure الذكاء الاصطناعي وإزالته، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد أيضًا إلى حذف أي موارد أخرى مرتبطة بمجموعة الموارد هذه.

الخطوات التالية

الوثائق المرجعية |للمكتبة حزمة التعليمات البرمجية | المصدر للمكتبة (PyPi) |ابحث عن نموذج التعليمات البرمجية على GitHub

ابدأ مع مكتبة عميل كاشف الحالات الخارجة عن المألوف متعدد المتغيرات لـ Python. اتبع هذه الخطوات لتثبيت الحزمة، وابدأ في استخدام الخوارزميات التي توفرها الخدمة. تمكن واجهات برمجة التطبيقات الجديدة للكشف عن الحالات الشاذة متعددة المتغيرات المطورين من خلال دمج الذكاء الاصطناعي المتقدمة بسهولة للكشف عن الحالات الشاذة من مجموعات المقاييس، دون الحاجة إلى معرفة التعلم الآلي أو البيانات المسماة. يتم احتساب التبعيات والارتباطات المتبادلة بين الإشارات المختلفة تلقائيًا كعوامل رئيسية. يساعدك ذلك في حماية الأنظمة المُعقدة بشكل استباقي من الأعطال.

استخدم مكتبة العميل متعدد المتغيرات الكاشف الحالات الخارجة عن المألوف لـ Python لـ:

  • كشف الانحرافات على مستوى النظام من مجموعة من السلاسل الزمنية.
  • عندما لا تخبرك أي سلسلة زمنية فردية بالكثير، ويتعين عليك إلقاء نظرة على جميع الإشارات للكشف عن مشكلة.
  • الصيانة التنبئية للأصول المادية باهظة الثمن مع عشرات إلى مئات الأنواع المختلفة من أجهزة الاستشعار التي تقيس جوانب مختلفة من حالة النظام.

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجاناً
  • Python 3.x
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Anomaly Detector في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. انتظر حتى يتم نشرها وانقر فوق الزر الانتقال إلى المورد. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

الإعداد

ثبت مكتبة العميل. يمكنك تثبيت مكتبة العميل باستخدام:

pip install --upgrade azure.ai.anomalydetector

إنشاء حساب تخزين

يتطلب Anomaly Detector متعدد المتغيرات تخزين نموذج الملف الخاص بك في Azure Blob Storage.

  1. إنشاء حساب Azure Storage.
  2. انتقل إلى Access Control(IAM)، وحدد ADD لإضافة تعيين دور.
  3. ابحث عن دور Storage Blob Data Reader، وقم بتمييز نوع الحساب هذا ثم حدد Next.
  4. حدد تعيين الوصول إلى الهوية المدارة، وحدد الأعضاء، ثم اختر مورد Anomaly Detector الذي قمت بإنشائه سابقا، ثم حدد Review + assign.

قد يكون هذا التكوين أحيانا مربكا بعض الشيء، إذا كانت لديك مشكلة نوصي باستشارة نموذج Jupyter Notebook متعدد المتغيرات، والذي يستعرض هذه العملية بمزيد من التعمق.

تنزيل نموذج البيانات

يستخدم هذا التشغيل السريع ملفا واحدا لعينة البيانات sample_data_5_3000.csv. يمكن تنزيل هذا الملف من بيانات نموذج GitHub

يمكنك أيضا تنزيل نموذج البيانات عن طريق تشغيل:

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

تحميل نموذج البيانات إلى حساب التخزين

  1. انتقل إلى حساب التخزين الخاص بك، وحدد حاويات وأنشئ حاوية جديدة.
  2. حدد تحميل وتحميل sample_data_5_3000.csv
  3. حدد البيانات التي قمت بتحميلها وانسخ عنوان URL للكائن الثنائي كبير الحجم حيث تحتاج إلى إضافته إلى نموذج التعليمات البرمجية في بضع خطوات.

قم باسترداد المفتاح ونقطة النهاية

لإجراء استدعاء بنجاح مقابل خدمة Anomaly Detector، تحتاج إلى القيم التالية:

اسم المتغير القيمة‬
ANOMALY_DETECTOR_ENDPOINT يمكن العثور على هذه القيمة في قسم المفاتيح ونقطة النهاية عند فحص المورد من مدخل Microsoft Azure. مثال على نقطة النهاية: https://YOUR_RESOURCE_NAME.cognitiveservices.azure.com/
ANOMALY_DETECTOR_API_KEY يمكن العثور على قيمة مفتاح واجهة برمجة التطبيقات في قسم المفاتيح ونقطة النهاية عند فحص المورد الخاص بك من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2.

انتقل إلى مجموعة الموارد في مدخل Microsoft Azure. يمكن العثور على نقطة النهاية والمفاتيح في قسم إدارة الموارد. انسخ نقطة النهاية ومفتاح الوصول كما تحتاج إلى كليهما لمصادقة استدعاءات واجهة برمجة التطبيقات. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.

إنشاء متغيرات البيئة

إنشاء متغيرات بيئة ثابتة وتعيينها للمفتاح ونقطة النهاية.

setx ANOMALY_DETECTOR_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"
setx ANOMALY_DETECTOR_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE"

إنشاء تطبيق Python جديد

  1. إنشاء ملف Python جديد يسمى sample_multivariate_detect.py. ثم افتحه في المحرر أو IDE المُفضل لديك.

  2. استبدل محتويات sample_multivariate_detect.py بالتعليمات البرمجية التالية. تحتاج إلى تعديل مسارات المتغيرات blob_url.

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

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

ad_client = AnomalyDetectorClient(ANOMALY_DETECTOR_ENDPOINT, AzureKeyCredential(SUBSCRIPTION_KEY))

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

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

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


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

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

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

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

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

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

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

شغّل التطبيق

شغّل التطبيق باستخدام الأمر python المُتاح على ملف التشغيل السريع.

python sample_multivariate_detect.py

الإخراج

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

تم اقتطاع نتائج الإخراج للإيجاز.

تنظيف الموارد

إذا كنت ترغب في تنظيف مورد Anomaly Detector وإزالته، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا. قد تحتاج أيضا إلى التفكير في حذف متغيرات البيئة التي قمت بإنشائها إذا لم تعد تنوي استخدامها.

ابدأ مع مكتبة عميل Java ذات Anomaly Detector متعدد المتغيرات. اتبع هذه الخطوات لتثبيت الحزمة والبدء في استخدام الخوارزميات التي توفرها الخدمة. تمكن واجهات برمجة التطبيقات الجديدة للكشف عن الحالات الشاذة متعددة المتغيرات المطورين من خلال دمج الذكاء الاصطناعي المتقدمة بسهولة للكشف عن الحالات الشاذة من مجموعات المقاييس، دون الحاجة إلى معرفة التعلم الآلي أو البيانات المسماة. يتم احتساب التبعيات والارتباطات المتبادلة بين الإشارات المختلفة تلقائيًا كعوامل رئيسية. يساعدك ذلك في حماية الأنظمة المُعقدة بشكل استباقي من الأعطال.

استخدم مكتبة عميل Java ذات Anomaly Detector متعدد المتغيرات من أجل:

  • كشف الانحرافات على مستوى النظام من مجموعة من السلاسل الزمنية.
  • عندما لا تخبرك أي سلسلة زمنية فردية بالكثير، ويتعين عليك إلقاء نظرة على جميع الإشارات للكشف عن مشكلة.
  • الصيانة التنبئية للأصول المادية باهظة الثمن مع عشرات إلى مئات الأنواع المختلفة من أجهزة الاستشعار التي تقيس جوانب مختلفة من حالة النظام.

الوثائق المرجعية للمكتبة | التعليمة البرمجية لمصدر المكتبة | الحزمة (Maven) | نموذج التعليمات البرمجية

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • الإصدار الحالي من Java Development Kit(JDK)
  • أداة إنشاء Gradleأو مدير تبعية آخر.
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Anomaly Detector في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. انتظر حتى يتم نشرها وانقر فوق الزر الانتقال إلى المورد.
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Anomaly Detector. ستلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في التشغيل السريع. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

الإعداد

إنشاء مشروع Gradle جديد

يستخدم هذا التشغيل السريع مدير تبعية Gradle. يمكنك العثور على مزيد من معلومات مكتبة العميل على مستودع Maven المركزي.

في إطار نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، يمكنك إنشاء دليل جديد لتطبيقك وانتقل إليه.

mkdir myapp && cd myapp

بادر بتشغيل الأمر gradle init من دليل العمل خاصتك. ينشئ هذا الأمر ملفات بناء أساسية ل Gradle، بما في ذلك build.gradle.kts التي يتم استخدامها في وقت التشغيل لإنشاء التطبيق الخاص بك وتكوينه.

gradle init --type basic

عند طلب اختيار DSL، حدد Kotlin.

تثبيت مكتبة العميل

حدد build.gradle.kts وافتحه باستخدام IDE أو محرر النص المفضل لديك. ثم انسخ في تكوين البناء هذا. تأكد من تضمين تبعيات المشروع.

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

إنشاء ملف Java

إنشاء مجلد لعينة التطبيق. من دليل العمل الخاص بك، قم بتشغيل الأمر التالي:

mkdir -p src/main/java

انتقل إلى المجلد الجديد وأنشئ ملفًا يسمى MetricsAdvisorQuickstarts.java. افتحه في المحرر المفضل لديك أو IDE وأضف عبارات import التالية:

package com.azure.ai.anomalydetector;

import com.azure.ai.anomalydetector.models.*;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.*;
import com.azure.core.http.policy.*;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.PagedResponse;
import com.azure.core.http.rest.Response;
import com.azure.core.http.rest.StreamResponse;
import com.azure.core.util.Context;
import reactor.core.publisher.Flux;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

قم بإنشاء متغيرات ونقطة نهاية Azure للمورد الخاص بك. أنشئ متغير آخر لمثال ملف البيانات.

إشعار

سيكون لديك دائمًا خيار استخدام أحد المفتاحين. وهذا للسماح تدوير مفتاح آمن. استخدم المفتاح الأول لأغراض هذا التشغيل السريع.

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

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي للحصول على مزيد من المعلومات.

لاستخدام واجهات برمجة التطبيقات متعددة المتغيرات للكشف عن الحالات الخارجة عن المألوف، تحتاج إلى تدريب نماذجك الخاصة أولًا. تدريب البيانات هو مجموعة من سلاسل زمنية متعددة تلبي المتطلبات التالية:

يجب أن يكون لكل سلسلة زمنية ملف CSV مع عمودين (اثنين فقط)، "طابع زمني" و"قيمة" (كلها بأحرف صغيرة) كصف العنوان. يجب أن تتوافق قيم "الطابع الزمني" مع معايير ISO 8601؛ كما يمكن أن تكون "القيمة" أعدادًا صحيحة أو أرقامًا عشرية مع أي عدد من القيم العشرية. على سبيل المثال:

الطابع الزمني قيمة
2019-04-01T00:00:00Z 5
2019-04-01T00:01:00Z 3.6
2019-04-01T00:02:00Z 4
... ...

يجب تسمية كل ملف CSV بمتغير مختلف والذي سيتم استخدامه لتدريب النموذج. على سبيل المثال: "temperature.csv" و"humidity.csv". يجب ضغط كافة ملفات CSV في ملف مضغوط واحد دون أي مجلدات فرعية. يمكن تسمية الملف المضغوط أي اسم تريده. يجب تحميل الملف المضغوط إلى تخزين Azure Blob. بمجرد إنشائك عنوان URL لـ blob SAS (توقيعات الوصول المشتركة) للملف المضغوط، سيمكن استخدامه للتدريب. راجع هذا المستند لمعرفة كيفية إنشاء عناوين URL SAS من Azure Blob Storage.

أمثلة على التعليمات البرمجية

توضح لك مقتطفات التعليمات البرمجية هذه كيفية القيام بما يلي مع مكتبة عميل Anomaly Detector لـ Node.js:

مصادقة العميل

أنشئ كائن anomalyDetectorClient بنقطة النهاية وبيانات الاعتماد الخاصة بك.

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

HttpPipelinePolicy authPolicy = new AzureKeyCredentialPolicy("Ocp-Apim-Subscription-Key",
 new AzureKeyCredential(key));
AddHeadersPolicy addHeadersPolicy = new AddHeadersPolicy(headers);

HttpPipeline httpPipeline = new HttpPipelineBuilder().httpClient(HttpClient.createDefault())
    .policies(authPolicy, addHeadersPolicy).build();
// Instantiate a client that will be used to call the service.
HttpLogOptions httpLogOptions = new HttpLogOptions();
httpLogOptions.setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS);

AnomalyDetectorClient anomalyDetectorClient = new AnomalyDetectorClientBuilder()
    .pipeline(httpPipeline)
    .endpoint(endpoint)
    .httpLogOptions(httpLogOptions)
    .buildClient();

تدريب نموذج

بناء نتيجة نموذجية وتدريب نموذج

أولاً، نحن بحاجة إلى إنشاء طلب نموذج. تأكد من توافق وقت البدء والانتهاء مع مصدر البيانات.

لاستخدام واجهات برمجة التطبيقات متعددة المتغيرات لكاشف الانحرافات، نحتاج إلى تدريب نموذجنا الخاص قبل استخدام الاكتشاف. البيانات المستخدمة للتدريب عبارة عن مجموعة من السلاسل الزمنية، يجب أن تكون كل سلسلة زمنية في ملف CSV يتكون من عمودين فقط، "الطابع الزمني" و"value"(يجب أن تكون أسماء الأعمدة بالضبط نفس الشيء). يجب تسمية كل ملف CSV بعد كل متغير للسلسلة الزمنية. يجب ضغط جميع السلاسل الزمنية في ملف مضغوط واحد وتحميلها إلى تخزين Azure Blob، ولا يوجد أي متطلبات لاسم الملف المضغوط. بدلًا من ذلك، يمكن تضمين ملف meta.json إضافي في الملف المضغوط إذا كنت ترغب في أن يكون اسم المتغير مختلفًا عن اسم ملف zip. بمجرد إنشاء عنوان URL لـ blob SAS (توقيعات الوصول المشتركة)، يمكننا استخدام عنوان url للملف المضغوط للتدريب.

Path path = Paths.get("test-data.csv");
List<String> requestData = Files.readAllLines(path);
List<TimeSeriesPoint> series = requestData.stream()
    .map(line -> line.trim())
    .filter(line -> line.length() > 0)
    .map(line -> line.split(",", 2))
    .filter(splits -> splits.length == 2)
    .map(splits -> {
        TimeSeriesPoint timeSeriesPoint = new TimeSeriesPoint();
        timeSeriesPoint.setTimestamp(OffsetDateTime.parse(splits[0]));
        timeSeriesPoint.setValue(Float.parseFloat(splits[1]));
        return timeSeriesPoint;
    })
    .collect(Collectors.toList());

Integer window = 28;
AlignMode alignMode = AlignMode.OUTER;
FillNAMethod fillNAMethod = FillNAMethod.LINEAR;
Integer paddingValue = 0;
AlignPolicy alignPolicy = new AlignPolicy()
                                .setAlignMode(alignMode)
                                .setFillNAMethod(fillNAMethod)
                                .setPaddingValue(paddingValue);
String source = "YOUR_SAMPLE_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS";
OffsetDateTime startTime = OffsetDateTime.of(2021, 1, 2, 0, 0, 0, 0, ZoneOffset.UTC);
OffsetDateTime endTime = OffsetDateTime.of(2021, 1, 3, 0, 0, 0, 0, ZoneOffset.UTC);
String displayName = "Devops-MultiAD";

ModelInfo request = new ModelInfo()
                        .setSlidingWindow(window)
                        .setAlignPolicy(alignPolicy)
                        .setSource(source)
                        .setStartTime(startTime)
                        .setEndTime(endTime)
                        .setDisplayName(displayName);
TrainMultivariateModelResponse trainMultivariateModelResponse = anomalyDetectorClient.trainMultivariateModelWithResponse(request, Context.NONE);
String header = trainMultivariateModelResponse.getDeserializedHeaders().getLocation();
String[] substring = header.split("/");
UUID modelId = UUID.fromString(substring[substring.length - 1]);
System.out.println(modelId);

//Check model status until the model is ready
Response<Model> trainResponse;
while (true) {
    trainResponse = anomalyDetectorClient.getMultivariateModelWithResponse(modelId, Context.NONE);
    ModelStatus modelStatus = trainResponse.getValue().getModelInfo().getStatus();
    if (modelStatus == ModelStatus.READY || modelStatus == ModelStatus.FAILED) {
        break;
    }
    TimeUnit.SECONDS.sleep(10);
}

if (trainResponse.getValue().getModelInfo().getStatus() != ModelStatus.READY){
    System.out.println("Training failed.");
    List<ErrorResponse> errorMessages = trainResponse.getValue().getModelInfo().getErrors();
    for (ErrorResponse errorMessage : errorMessages) {
        System.out.println("Error code:  " + errorMessage.getCode());
        System.out.println("Error message:  " + errorMessage.getMessage());
    }
}

الكشف عن الحالات الخارجة عن المألوف

DetectionRequest detectionRequest = new DetectionRequest().setSource(source).setStartTime(startTime).setEndTime(endTime);
DetectAnomalyResponse detectAnomalyResponse = anomalyDetectorClient.detectAnomalyWithResponse(modelId, detectionRequest, Context.NONE);
String location = detectAnomalyResponse.getDeserializedHeaders().getLocation();
String[] substring = location.split("/");
UUID resultId = UUID.fromString(substring[substring.length - 1]);

DetectionResult detectionResult;
while (true) {
    detectionResult = anomalyDetectorClient.getDetectionResult(resultId);
    DetectionStatus detectionStatus = detectionResult.getSummary().getStatus();;
    if (detectionStatus == DetectionStatus.READY || detectionStatus == DetectionStatus.FAILED) {
        break;
    }
    TimeUnit.SECONDS.sleep(10);
}

if (detectionResult.getSummary().getStatus() != DetectionStatus.READY){
    System.out.println("Inference failed");
    List<ErrorResponse> detectErrorMessages = detectionResult.getSummary().getErrors();
    for (ErrorResponse errorMessage : detectErrorMessages) {
        System.out.println("Error code:  " + errorMessage.getCode());
        System.out.println("Error message:  " + errorMessage.getMessage());
    }
}

تصدير النموذج

إشعار

الغرض من أمر التصدير هو أن يستخدم للسماح بتشغيل نماذج الكشف عن الحالات الخارجة عن المألوف متعددة المتغيرات في بيئة حاوية. هذا غير مدعوم حاليًا لمتعدد المتغيرات ولكن سيتم إضافة الدعم في المستقبل.

لتصدير نموذجك المدرّب، استخدم exportModelWithResponse.

StreamResponse response_export = anomalyDetectorClient.exportModelWithResponse(model_id, Context.NONE);
Flux<ByteBuffer> value = response_export.getValue();
FileOutputStream bw = new FileOutputStream("result.zip");
value.subscribe(s -> write(bw, s), (e) -> close(bw), () -> close(bw));

حذف النموذج

لحذف نموذج موجود متاح للمورد الحالي، استخدم الوظيفة deleteMultivariateModelWithResponse.

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

شغّل التطبيق

يمكنك إنشاء التطبيق باستخدام:

gradle build

شغّل التطبيق

قبل التشغيل، قد يكون من المفيد فحص شفرتك بمقارنتها مع نموذج الشفرة الكامل.

تشغيل التطبيق run بهدف:

gradle run

تنظيف الموارد

إذا كنت ترغب في تنظيف اشتراك خدمات Azure الذكاء الاصطناعي وإزالته، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد أيضًا إلى حذف أي موارد أخرى مرتبطة بمجموعة الموارد هذه.

الخطوات التالية