إجراء توقعات باستخدام نموذج AutoML ONNX في .NET

في هذه المقالة، ستتعلم كيفية استخدام نموذج Automated ML (AutoML) Open Neural Network Exchange (ONNX) لإجراء توقعات في تطبيق وحدة تحكم C# .NET Core مع ML.NET.

ML.NET هو إطار عمل تعلم آلي مفتوح المصدر وعبر الأنظمة الأساسية للنظام البنائي .NET يتيح لك تدريب نماذج التعلم الآلي المخصصة واستهلاكها باستخدام نهج التعليمات البرمجية أولاً في C# أو F# وكذلك من خلال أدوات التعليمات البرمجية المنخفضة مثل Model Builder وCLI ML.NET. كما أن إطار العمل قابل للتوسع ويتيح لك الاستفادة من أطر عمل التعلم الآلي الشائعة الأخرى مثل TensorFlow وONNX.

ONNX هو تنسيق مفتوح المصدر لنماذج الذكاء الاصطناعي. يدعم ONNX إمكانية التشغيل التفاعلي بين أطر العمل. وهذا يعني أنه يمكنك تدريب نموذج في أحد أطر عمل التعلم الآلي الشائعة العديدة، مثل PyTorch، وتحويله إلى تنسيق ONNX، واستهلاك نموذج ONNX في إطار عمل مختلف مثل ML.NET. لمعرفة المزيد، تفضل بزيارة موقع ONNX على الويب.

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

إنشاء تطبيق وحدة تحكم C#‎

في هذه العينة، يمكنك استخدام .NET Core CLI لبناء تطبيقك ولكن يمكنك القيام بنفس المهام باستخدام Visual Studio. اعرف المزيد حول .NET Core CLI.

  1. افتح محطة طرفية وأنشئ تطبيق وحدة تحكم C# .NET Core جديد. في هذا المثال، اسم التطبيق هو AutoMLONNXConsoleApp. يتم إنشاء دليل بنفس الاسم يضم محتويات تطبيقك.

    dotnet new console -o AutoMLONNXConsoleApp
    
  2. في المحطة الطرفية، انتقل إلى دليل AutoMLONNXConsoleApp.

    cd AutoMLONNXConsoleApp
    

إضافة حزم البرامج

  1. قم بتثبيت حزم Microsoft.ML وMicrosoft.ML.OnnxRuntime وMicrosoft.ML.OnnxTransformer NuGet باستخدام .NET Core CLI.

    dotnet add package Microsoft.ML
    dotnet add package Microsoft.ML.OnnxRuntime
    dotnet add package Microsoft.ML.OnnxTransformer
    

    تحتوي هذه الحزم على التبعيات المطلوبة لاستخدام نموذج ONNX في تطبيق .NET. يوفر ML.NET واجهة برمجة تطبيقات تستخدم وقت تشغيل ONNX للتوقعات.

  2. افتح ملف Program.cs وأضف عبارات using التالية في الأعلى للإشارة إلى الحزم المناسبة.

    using System.Linq;
    using Microsoft.ML;
    using Microsoft.ML.Data;
    using Microsoft.ML.Transforms.Onnx;
    

إضافة مرجع إلى نموذج ONNX

ثمة طريقة لتطبيق وحدة التحكم للوصول إلى نموذج ONNX تتمثل في إضافته إلى دليل إخراج البناء. لمعرفة المزيد حول العناصر MSBuild الشائعة، راجع دليل MSBuild.

إضافة مرجع إلى ملف نموذج ONNX في تطبيقك

  1. انسخ نموذج ONNX إلى دليل جذر AutoMLONNXConsoleApp لتطبيقك.

  2. افتح ملف AutoMLONNXConsoleApp.csproj وأضف المحتوى التالي داخل عقدة Project.

    <ItemGroup>
        <None Include="automl-model.onnx">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
    

    في هذه الحالة، يكون اسم ملف نموذج ONNX هو automl-model.onnx.

  3. افتح ملف Program.cs وأضف السطر التالي داخل فئة Program.

    static string ONNX_MODEL_PATH = "automl-model.onnx";
    

تهيئة MLContext

داخل أسلوب Main لفئة Program، أنشئ مثيل MLContext جديد.

MLContext mlContext = new MLContext();

تعتبر فئة MLContext نقطة بداية لجميع عمليات ML.NET، ويؤدي تهيئة mlContext إلى إنشاء بيئة ML.NET جديدة يمكن مشاركتها عبر دورة حياة النموذج. إنه يشبه، من الناحية المفاهيمية، DbContext في Entity Framework.

تعريف مخطط بيانات النموذج

يتوقع النموذج أن تكون بيانات الإدخال والإخراج بتنسيق معين. يتيح لك ML.NET تحديد تنسيق بياناتك عبر الفئات. في بعض الأحيان قد تعرف بالفعل شكل هذا التنسيق. في الحالات التي لا تعرف فيها تنسيق البيانات، يمكنك استخدام أدوات مثل Netron لفحص نموذج ONNX.

يستخدم النموذج المستخدم في هذه العينة بيانات من مجموعة بيانات رحلة تاكسي TLC في مدينة نيويورك. يمكن رؤية عينة من البيانات أدناه:

vendor_id rate_code passenger_count trip_time_in_secs trip_distance payment_type fare_amount
VTS 1 1 1140 3.75 CRD 15.5
VTS 1 1 480 2.72 CRD 10.0
VTS 1 1 1680 7.8 CSH 26.5

فحص نموذج ONNX (اختياري)

استخدم أداة مثل Netron لفحص مدخلات ومخرجات النموذج.

  1. افتح Netron.

  2. في شريط القوائم العلوي، حدد ملف > فتح واستخدم مستعرض الملفات لتحديد النموذج.

  3. يفتح النموذج. على سبيل المثال، تبدو بنية نموذج automl-model.onnx كما يلي:

    نموذج Netron AutoML ONNX

  4. حدد العقدة الأخيرة في أسفل الرسم البياني (variable_out1 في هذه الحالة) لعرض بيانات تعريف النموذج. تظهر لك المدخلات والمخرجات على الشريط الجانبي المدخلات والمخرجات وأنواع البيانات المتوقعة للنموذج. استخدم هذه المعلومات لتعريف مخطط الإدخال والإخراج للنموذج.

تعريف مخطط إدخال النموذج

أنشئ فئة جديدة تسمى OnnxInput بالخصائص التالية داخل ملف Program.cs.

public class OnnxInput
{
    [ColumnName("vendor_id")]
    public string VendorId { get; set; }

    [ColumnName("rate_code"),OnnxMapType(typeof(Int64),typeof(Single))]
    public Int64 RateCode { get; set; }

    [ColumnName("passenger_count"), OnnxMapType(typeof(Int64), typeof(Single))]
    public Int64 PassengerCount { get; set; }

    [ColumnName("trip_time_in_secs"), OnnxMapType(typeof(Int64), typeof(Single))]
    public Int64 TripTimeInSecs { get; set; }

    [ColumnName("trip_distance")]
    public float TripDistance { get; set; }

    [ColumnName("payment_type")]
    public string PaymentType { get; set; }
}

يتم تعيين كل خاصية من الخصائص إلى عمود في مجموعة البيانات. يتم إضافة المزيد من التعليقات التوضيحية إلى الخصائص مع السمات.

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

بالنسبة للقيم الرقمية، يعمل ML.NET فقط على أنواع قيم Single. مع ذلك، فإن نوع البيانات الأصلي لبعض الأعمدة هو أعداد صحيحة. تقوم السمة OnnxMapType بتعيين الأنواع بين ONNX وML.NET.

لمعرفة المزيد حول سمات البيانات، راجع دليل تحميل بيانات ML.NET.

تعريف مخطط إخراج النموذج

بمجرد معالجة البيانات، فإنها تنتج إخراجًا بتنسيق معين. حدد مخطط إخراج البيانات. أنشئ فئة جديدة تسمى OnnxOutput بالخصائص التالية داخل ملف Program.cs.

public class OnnxOutput
{
    [ColumnName("variable_out1")]
    public float[] PredictedFare { get; set; }
}

على غرار OnnxInput، استخدم السمة ColumnName لتعيين إخراج variable_out1 إلى اسم وصفي أكثر PredictedFare.

تعريف تدفقات التوقع

التدفقات في ML.NET هي عادة سلسلة من التحويلات المتسلسلة التي تعمل على بيانات الإدخال لإنتاج إخراج. لمعرفة المزيد حول تحويلات البيانات، راجع دليل تحويل بيانات ML.NET.

  1. إنشاء أسلوب جديد يسمى GetPredictionPipeline داخل فئة Program

    static ITransformer GetPredictionPipeline(MLContext mlContext)
    {
    
    }
    
  2. حدد اسم أعمدة الإدخال والإخراج. أضف التعليمات البرمجية التالية إلى أسلوب ⁧GetPredictionPipeline.

    var inputColumns = new string []
    {
        "vendor_id", "rate_code", "passenger_count", "trip_time_in_secs", "trip_distance", "payment_type"
    };
    
    var outputColumns = new string [] { "variable_out1" };
    
  3. حدد التدفقات الخاصة بك. يوفر IEstimator مخططًا للعمليات ومخططات الإدخال والإخراج للتدفقات الخاصة بك.

    var onnxPredictionPipeline =
        mlContext
            .Transforms
            .ApplyOnnxModel(
                outputColumnNames: outputColumns,
                inputColumnNames: inputColumns,
                ONNX_MODEL_PATH);
    

    في هذه الحالة، ApplyOnnxModel هو التحويل الوحيد في التدفقات، والذي يأخذ أسماء أعمدة الإدخال والإخراج بالإضافة إلى المسار إلى ملف نموذج ONNX.

  4. يحدد IEstimator فقط مجموعة العمليات التي يجب تطبيقها على بياناتك. يعرف ما يعمل على بياناتك باسم ITransformer. استخدم أسلوب Fit لإنشاء واحد من onnxPredictionPipeline الخاص بك.

    var emptyDv = mlContext.Data.LoadFromEnumerable(new OnnxInput[] {});
    
    return onnxPredictionPipeline.Fit(emptyDv);
    

    أسلوب Fit يتوقع IDataView كإدخال لإجراء العمليات عليه. يعد IDataView طريقة لتمثيل البيانات في ML.NET باستخدام تنسيق جدولي. نظرًا لأنه في هذه الحالة يتم استخدام التدفقات للتوقعات فقط، يمكنك توفير IDataView فارغ لإعطاء ITransformer معلومات مخطط الإدخال والإخراج الضرورية. يتم بعد ذلك إرجاع ITransformer المجهز لمزيد من الاستخدام في التطبيق الخاص بك.

    تلميح

    في هذه العينة، يتم تعريف التدفقات واستخدامها داخل نفس التطبيق. مع ذلك، يوصى بأن تستخدم تطبيقات منفصلة لتعريف التدفقات واستخدامها لإجراء توقعات. في ML.NET يمكن إجراء تسلسل التدفقات وحفظها لمزيد من الاستخدام في تطبيقات المستخدم النهائي .NET الأخرى. يدعم ML.NET أهداف توزيع مختلفة مثل تطبيقات سطح المكتب وخدمات الويب وتطبيقات WebAssembly* وغيرها الكثير. لمعرفة المزيد حول حفظ التدفقات، راجع دليل ML.NET حفظ وتحميل النماذج المدربة.

    *WebAssembly مدعوم فقط في .NET Core 5 أو الأحدث

  5. داخل أسلوب Main، قم باستدعاء أسلوب GetPredictionPipeline مع المعلمات المطلوبة.

    var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
    

استخدام النموذج لإجراء تنبؤات

الآن بعد أن أصبح لديك تدفقات، فقد حان الوقت لاستخدامها لإجراء توقعات. يوفر ML.NET واجهة برمجة تطبيقات ملائمة لإجراء توقعات على مثيل بيانات واحد يسمى PredictionEngine.

  1. داخل أسلوب Main، قم بإنشاء PredictionEngine باستخدام أسلوب CreatePredictionEngine.

    var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
    
  2. أنشئ إدخال بيانات اختبار.

    var testInput = new OnnxInput
    {
        VendorId = "CMT",
        RateCode = 1,
        PassengerCount = 1,
        TripTimeInSecs = 1271,
        TripDistance = 3.8f,
        PaymentType = "CRD"
    };
    
  3. استخدم predictionEngine لإجراء توقعات استنادًا إلى بيانات testInput الجديدة باستخدام أسلوب Predict.

    var prediction = onnxPredictionEngine.Predict(testInput);
    
  4. بادر بإخراج نتيجة توقعك إلى وحدة التحكم.

    Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
    
  5. استخدم .NET Core CLI لتشغيل تطبيقك.

    dotnet run
    

    ينبغي أن تتشابه النتيجة مع الإخراج التالي:

    Predicted Fare: 15.621523
    

لمعرفة المزيد حول إجراء التوقعات في ML.NET، راجع دليل استخدام نموذج لإجراء توقعات.

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