Előrejelzések készítése AutoML ONNX-modellel a .NET-ben

Ebből a cikkből megtudhatja, hogyan használhat automatizált ml (AutoML) nyílt neurális hálózati exchange -modellt (ONNX) egy C# .NET Core-konzolalkalmazás előrejelzéseihez ML.NET.

ML.NET egy nyílt forráskódú, platformfüggetlen gépi tanulási keretrendszer a .NET-ökoszisztémához, amely lehetővé teszi egyéni gépi tanulási modellek betanítását és használatát a C# vagy az F# kódelső megközelítésével, valamint az olyan alacsony kódszámú eszközökkel, mint a Model Builder és a ML.NET CLI. A keretrendszer bővíthető is, és lehetővé teszi más népszerű gépi tanulási keretrendszerek, például a TensorFlow és az ONNX kihasználását.

Az ONNX egy nyílt forráskódú formátum az AI-modellekhez. Az ONNX támogatja a keretrendszerek közötti interoperabilitást. Ez azt jelenti, hogy betaníthat egy modellt a számos népszerű gépi tanulási keretrendszer, például a PyTorch egyikében, átalakíthatja ONNX formátumba, és felhasználhatja az ONNX-modellt egy másik keretrendszerben, például ML.NET. További információért látogasson el az ONNX webhelyére.

Előfeltételek

C#-konzolalkalmazás létrehozása

Ebben a példában a .NET Core CLI használatával hozza létre az alkalmazást, de ugyanezeket a feladatokat a Visual Studióval is elvégezheti. További információ a .NET Core parancssori felületéről.

  1. Nyisson meg egy terminált, és hozzon létre egy új C# .NET Core-konzolalkalmazást. Ebben a példában az alkalmazás neve .AutoMLONNXConsoleApp A címtárat ugyanaz a név hozza létre az alkalmazás tartalmával.

    dotnet new console -o AutoMLONNXConsoleApp
    
  2. A terminálban keresse meg az AutoMLONNXConsoleApp könyvtárat.

    cd AutoMLONNXConsoleApp
    

Szoftvercsomagok hozzáadása

  1. Telepítse a Microsoft.ML, a Microsoft.ML.OnnxRuntime és a Microsoft.ML.OnnxTransformer NuGet csomagokat a .NET Core parancssori felületével.

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

    Ezek a csomagok tartalmazzák azokat a függőségeket, amelyek az ONNX-modellek .NET-alkalmazásokban való használatához szükségesek. ML.NET biztosít egy API-t, amely az ONNX-futtatókörnyezetet használja az előrejelzésekhez.

  2. Nyissa meg a Program.cs fájlt, és adja hozzá felül a következő using utasításokat a megfelelő csomagokra való hivatkozáshoz.

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

Hivatkozás hozzáadása az ONNX-modellhez

Az ONNX-modell elérésének egyik módja, ha hozzáadja a konzolalkalmazást a build kimeneti könyvtárához. Az MSBuild gyakori elemeivel kapcsolatos további információkért tekintse meg az MSBuild útmutatót. Ha még nem rendelkezik modellel, kövesse ezt a jegyzetfüzetet egy példamodell létrehozásához.

Hivatkozás hozzáadása az ONNX-modellfájlhoz az alkalmazásban

  1. Másolja az ONNX-modellt az alkalmazás AutoMLONNXConsoleApp gyökérkönyvtárába.

  2. Nyissa meg az AutoMLONNXConsoleApp.csproj fájlt, és adja hozzá a következő tartalmat a Project csomóponton belül.

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

    Ebben az esetben az ONNX-modellfájl neve automl-model.onnx.

  3. Nyissa meg a Program.cs fájlt, és adja hozzá a következő sort az Program osztályon belül.

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

MLContext inicializálása

Main Az osztály metódusán Program belül hozzon létre egy új példányt.MLContext

MLContext mlContext = new MLContext();

Az MLContext osztály az összes ML.NET művelet kiindulópontja, és az inicializálás mlContext új ML.NET környezetet hoz létre, amely megosztható a modell életciklusában. A dbContexthez fogalmilag hasonló az Entity Frameworkben.

A modell adatséma definiálása

A modell egy adott formátumban várja a bemeneti és kimeneti adatokat. ML.NET lehetővé teszi az adatok formátumának osztályokon keresztüli meghatározását. Néha előfordulhat, hogy már tudja, hogyan néz ki ez a formátum. Ha nem ismeri az adatformátumot, a Netronhoz hasonló eszközökkel megvizsgálhatja az ONNX-modellt.

A mintában használt modell az NYC TLC Taxi Trip adatkészlet adatait használja. Az adatok mintája alább látható:

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

Az ONNX-modell vizsgálata (nem kötelező)

A Netronhoz hasonló eszközzel vizsgálhatja meg a modell bemeneteit és kimeneteit.

  1. Nyissa meg Netront.

  2. A felső menüsávon válassza a Fájl > megnyitása lehetőséget, és a fájlböngészővel válassza ki a modellt.

  3. Megnyílik a modell. Az automl-model.onnx modell struktúrája például a következőképpen néz ki:

    Netron AutoML ONNX Model

  4. Válassza ki a diagram alján található utolsó csomópontot (variable_out1 ebben az esetben) a modell metaadatainak megjelenítéséhez. Az oldalsáv bemenetei és kimenetei a modell várt bemeneteit, kimeneteit és adattípusait jelenítik meg. Ezen információk segítségével meghatározhatja a modell bemeneti és kimeneti sémáját.

Modellbemeneti séma definiálása

Hozzon létre egy új osztályt OnnxInput a Program.cs fájlban az alábbi tulajdonságokkal.

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

Az egyes tulajdonságok az adathalmaz egy oszlopára vannak leképelve. A tulajdonságok további attribútumokkal vannak eljegyzve.

Az ColumnName attribútum lehetővé teszi annak megadását, hogy ML.NET hogyan hivatkozzon az oszlopra az adatokon való működés során. Például, bár a tulajdonság a TripDistance standard .NET elnevezési konvenciók szerint van, a modell csak egy oszlopot vagy funkciót ismer, más néven trip_distance. Az elnevezési eltérés megoldásához az ColumnName attribútum a TripDistance tulajdonságot egy oszlopra vagy szolgáltatásra képezi le a név trip_distancealapján.

Numerikus értékek esetén ML.NET csak értéktípusokon Single működik. Egyes oszlopok eredeti adattípusa azonban egész szám. Az OnnxMapType attribútum típusokat képez le az ONNX és ML.NET között.

Az adatattribútumokról további információt az ML.NET adatbetöltési útmutatóban talál.

Modell kimeneti sémájának definiálása

Az adatok feldolgozása után egy bizonyos formátumú kimenet jön létre. Adja meg az adatkimeneti sémát. Hozzon létre egy új osztályt OnnxOutput a Program.cs fájlban az alábbi tulajdonságokkal.

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

OnnxInputEhhez hasonlóan az ColumnName attribútum használatával leképezi a variable_out1 kimenetet egy leíróbb névre PredictedFare.

Előrejelzési folyamat definiálása

A ML.NET folyamat általában láncolt átalakítások sorozata, amelyek a bemeneti adatokon működnek a kimenet létrehozásához. Az adatátalakításokról további információt az ML.NET adatátalakítási útmutatóban talál.

  1. Új metódus GetPredictionPipeline létrehozása az Program osztályon belül

    static ITransformer GetPredictionPipeline(MLContext mlContext)
    {
    
    }
    
  2. Adja meg a bemeneti és kimeneti oszlopok nevét. Adja hozzá a következő kódot a metódushoz 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. Definiálja a folyamatot. A IEstimator folyamat műveleteinek, bemeneti és kimeneti sémáinak tervrajza.

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

    Ebben az esetben ApplyOnnxModel ez az egyetlen átalakítás a folyamatban, amely a bemeneti és kimeneti oszlopok nevét, valamint az ONNX-modellfájl elérési útját veszi fel.

  4. Csak IEstimator az adatokra alkalmazandó műveletek készletét határozza meg. Az adatokon az úgynevezett ..</a0> Fit A metódus használatával hozzon létre egyet a saját onnxPredictionPipelinefiókjából.

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

    A Fit metódus bemenetként várja IDataView a műveletek végrehajtását. Az egyik IDataView módszer az adatok táblázatos formátumban való ábrázolására ML.NET. Mivel ebben az esetben a folyamat csak előrejelzésekhez használatos, üres IDataView értéket adhat meg a ITransformer szükséges bemeneti és kimeneti sémaadatok megadásához. A beszerelt ITransformer elemet ezután visszajuttatjuk az alkalmazásban való további használat céljából.

    Tipp.

    Ebben a mintában a folyamat ugyanabban az alkalmazásban van definiálva és használva. Javasoljuk azonban, hogy külön alkalmazásokkal definiálja és használja a folyamatot előrejelzések készítéséhez. A ML.NET a folyamatok szerializálhatók és menthetők más .NET végfelhasználói alkalmazásokban való további használatra. ML.NET különböző üzembehelyezési célokat támogat, például asztali alkalmazásokat, webszolgáltatásokat, WebAssembly-alkalmazásokat*, és még sok mást. A folyamatok mentésével kapcsolatos további információkért tekintse meg a ML.NET betanított modellek mentésére és betöltésére vonatkozó útmutatót.

    *A WebAssembly csak a .NET Core 5-ös vagy újabb verziójában támogatott

  5. A metóduson Main belül hívja meg a metódust GetPredictionPipeline a szükséges paraméterekkel.

    var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
    

Előrejelzések készítése a modell használatával

Most, hogy rendelkezik egy folyamatmal, ideje előrejelzést készítenie. ML.NET egy egyszerű API-t biztosít az előrejelzések készítéséhez egyetlen, úgynevezett PredictionEngineadatpéldányon.

  1. A metóduson Main belül hozzon létre egy PredictionEngine metódust CreatePredictionEngine .

    var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
    
  2. Hozzon létre egy tesztadat-bemenetet.

    var testInput = new OnnxInput
    {
        VendorId = "CMT",
        RateCode = 1,
        PassengerCount = 1,
        TripTimeInSecs = 1271,
        TripDistance = 3.8f,
        PaymentType = "CRD"
    };
    
  3. predictionEngine A módszerrel előrejelzéseket készíthet az új testInput adatok Predict alapján.

    var prediction = onnxPredictionEngine.Predict(testInput);
    
  4. Adja ki az előrejelzés eredményét a konzolon.

    Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
    
  5. Az alkalmazás futtatásához használja a .NET Core CLI-t.

    dotnet run
    

    Az eredménynek a következő kimenethez hasonlóan kell kinéznie:

    Predicted Fare: 15.621523
    

Ha többet szeretne megtudni az előrejelzések ML.NET való készítéséről, tekintse meg az előrejelzési útmutatók készítéséhez használt modellt.

Következő lépések