Vytváření predikcí pomocí modelu AutoML ONNX v .NET

V tomto článku se dozvíte, jak pomocí modelu Open Neural Network Exchange (ONNX) automatizovaného strojového učení (AutoML) provádět předpovědi v konzolové aplikaci C# .NET Core s ML.NET.

ML.NET je opensourcová multiplatformní architektura strojového učení pro ekosystém .NET, která umožňuje trénovat a využívat vlastní modely strojového učení pomocí přístupu založeného na kódu v jazyce C# nebo F# a také pomocí nástrojů s nízkým kódem, jako je Model Builder a ML.NET CLI. Architektura je také rozšiřitelná a umožňuje využívat další oblíbené architektury strojového učení, jako jsou TensorFlow a ONNX.

ONNX je opensourcový formát pro modely AI. ONNX podporuje interoperabilitu mezi architekturami. To znamená, že model můžete trénovat v jedné z mnoha oblíbených architektur strojového učení, jako je PyTorch, převést ho na formát ONNX a využívat model ONNX v jiné rozhraní, jako je ML.NET. Další informace najdete na webu ONNX.

Požadavky

Vytvoření konzolové aplikace jazyka C#

V této ukázce použijete rozhraní příkazového řádku .NET Core k sestavení aplikace, ale pomocí sady Visual Studio můžete provádět stejné úlohy. Přečtěte si další informace o rozhraní příkazového řádku .NET Core.

  1. Otevřete terminál a vytvořte novou konzolovou aplikaci C# .NET Core. V tomto příkladu je AutoMLONNXConsoleAppnázev aplikace . Adresář se vytvoří stejným názvem s obsahem vaší aplikace.

    dotnet new console -o AutoMLONNXConsoleApp
    
  2. V terminálu přejděte do adresáře AutoMLONNXConsoleApp .

    cd AutoMLONNXConsoleApp
    

Přidání softwarových balíčků

  1. Nainstalujte balíčky NuGet Microsoft.ML, Microsoft.ML.OnnxRuntime a Microsoft.ML.OnnxTransformer NuGet pomocí rozhraní příkazového řádku .NET Core.

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

    Tyto balíčky obsahují závislosti potřebné k použití modelu ONNX v aplikaci .NET. ML.NET poskytuje rozhraní API, které používá modul runtime ONNX pro předpovědi.

  2. Otevřete soubor Program.cs a přidejte do horní části následující using příkazy, které odkazují na příslušné balíčky.

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

Přidání odkazu na model ONNX

Způsob, jak konzolová aplikace získat přístup k modelu ONNX, je přidat ji do výstupního adresáře sestavení. Další informace o běžných položkách nástroje MSBuild najdete v příručce NÁSTROJE MSBuild.

Přidání odkazu na soubor modelu ONNX ve vaší aplikaci

  1. Zkopírujte model ONNX do kořenového adresáře AutoMLONNXConsoleApp aplikace.

  2. Otevřete soubor AutoMLONNXConsoleApp.csproj a přidejte do uzlu následující obsah Project .

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

    V tomto případě je název souboru modelu ONNX automl-model.onnx.

  3. Otevřete soubor Program.cs a přidejte do třídy následující řádek Program .

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

Inicializace MLContext

Main Uvnitř metody vaší Program třídy vytvořte novou instanci MLContext.

MLContext mlContext = new MLContext();

Třída MLContext je výchozím bodem pro všechny operace ML.NET a inicializace mlContext vytvoří nové ML.NET prostředí, které lze sdílet napříč životním cyklem modelu. Je to podobné, koncepčně, jako DbContext v Entity Frameworku.

Definování schématu dat modelu

Váš model očekává vstupní a výstupní data v určitém formátu. ML.NET umožňuje definovat formát dat prostřednictvím tříd. Někdy už možná víte, jak tento formát vypadá. V případech, kdy datový formát neznáte, můžete pomocí nástrojů, jako je Netron, zkontrolovat model ONNX.

Model použitý v této ukázce používá data z datové sady NYC TLC Taxi Trip. Ukázku dat najdete níže:

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

Kontrola modelu ONNX (volitelné)

Pomocí nástroje, jako je Netron, můžete zkontrolovat vstupy a výstupy modelu.

  1. Otevřete Netron.

  2. V horním řádku nabídek vyberte Otevřít soubor > a pomocí prohlížeče souborů vyberte model.

  3. Otevře se váš model. Například struktura modelu automl-model.onnx vypadá takto:

    Netron AutoML ONNX Model

  4. Výběrem posledního uzlu v dolní části grafu (variable_out1 v tomto případě) zobrazíte metadata modelu. Vstupy a výstupy na bočním panelu ukazují očekávané vstupy, výstupy a datové typy modelu. Pomocí těchto informací můžete definovat vstupní a výstupní schéma modelu.

Definování schématu vstupu modelu

Vytvořte novou třídu s OnnxInput následujícími vlastnostmi v souboru 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; }
}

Každá z vlastností se mapuje na sloupec v datové sadě. Vlastnosti jsou dále opatřeny poznámkami s atributy.

Atribut ColumnName umožňuje určit, jak ML.NET by měl odkazovat na sloupec při použití dat. I když například TripDistance vlastnost dodržuje standardní konvence pojmenování .NET, model zná pouze sloupec nebo funkci známou jako trip_distance. Pro vyřešení této nesrovnalosti ColumnName v pojmenování atribut mapuje TripDistance vlastnost na sloupec nebo funkci podle názvu trip_distance.

U číselných hodnot ML.NET funguje jenom na Single typech hodnot. Původní datový typ některých sloupců jsou ale celá čísla. Atributy OnnxMapType mapují typy mezi ONNX a ML.NET.

Další informace o atributech dat najdete v průvodci načtením dat ML.NET.

Definování výstupního schématu modelu

Po zpracování dat vytvoří výstup určitého formátu. Definujte schéma výstupu dat. Vytvořte novou třídu s OnnxOutput následujícími vlastnostmi v souboru Program.cs .

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

Podobně jako OnnxInputu atributu ColumnName namapujte variable_out1 výstup na popisnější název PredictedFare.

Definování kanálu predikce

Kanál v ML.NET je obvykle řada zřetězených transformací, které pracují se vstupními daty za účelem vytvoření výstupu. Další informace o transformacích dat najdete v průvodci ML.NET transformací dat.

  1. Vytvoření nové metody volané GetPredictionPipeline uvnitř Program třídy

    static ITransformer GetPredictionPipeline(MLContext mlContext)
    {
    
    }
    
  2. Definujte název vstupních a výstupních sloupců. Do metody přidejte následující kód 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. Definujte svůj kanál. Poskytuje IEstimator podrobný plán operací, vstupu a výstupních schémat kanálu.

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

    V tomto případě ApplyOnnxModel je jedinou transformací v kanálu, která přebírá názvy vstupních a výstupních sloupců a také cestu k souboru modelu ONNX.

  4. Definuje IEstimator jenom sadu operací, které se mají použít pro vaše data. Co funguje na vašich datech, se označuje jako .ITransformer Použijte metodu Fit k vytvoření z vašeho onnxPredictionPipeline.

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

    Metoda Fit očekává, že IDataView jako vstup provede operace. An IDataView je způsob, jak znázorňovat data v ML.NET pomocí tabulkového formátu. Vzhledem k tomu, že v tomto případě se kanál používá pouze pro předpovědi, můžete zadat prázdnou IDataView , abyste získali ITransformer potřebné informace o vstupním a výstupním schématu. ITransformer Montáž se pak vrátí k dalšímu použití ve vaší aplikaci.

    Tip

    V této ukázce je kanál definován a používán ve stejné aplikaci. Doporučujeme ale použít samostatné aplikace k definování a používání kanálu k vytváření předpovědí. V ML.NET můžete kanály serializovat a ukládat pro další použití v jiných aplikacích koncového uživatele .NET. ML.NET podporuje různé cíle nasazení, jako jsou desktopové aplikace, webové služby, aplikace WebAssembly* a mnoho dalších. Další informace o ukládání kanálů najdete v průvodci ukládáním a načítáním trénovaných modelů ML.NET.

    *WebAssembly je podporován pouze v .NET Core 5 nebo vyšší

  5. Main Uvnitř metody zavolejte metodu GetPredictionPipeline s požadovanými parametry.

    var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
    

Použití modelu k předpovědím

Teď, když máte kanál, je čas ho použít k vytváření predikcí. ML.NET poskytuje pohodlné rozhraní API pro vytváření předpovědí v jedné instanci dat, která se nazývá PredictionEngine.

  1. Main Uvnitř metody vytvořte pomocí metody metodu PredictionEngineCreatePredictionEngine.

    var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
    
  2. Vytvořte vstup testovacích dat.

    var testInput = new OnnxInput
    {
        VendorId = "CMT",
        RateCode = 1,
        PassengerCount = 1,
        TripTimeInSecs = 1271,
        TripDistance = 3.8f,
        PaymentType = "CRD"
    };
    
  3. predictionEngine Použijte k vytváření predikcí na základě nových testInput dat pomocí Predict metody.

    var prediction = onnxPredictionEngine.Predict(testInput);
    
  4. Vypište výsledek předpovědi do konzoly.

    Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
    
  5. Ke spuštění aplikace použijte rozhraní příkazového řádku .NET Core.

    dotnet run
    

    Výsledek by měl vypadat podobně jako v následujícím výstupu:

    Predicted Fare: 15.621523
    

Další informace o vytváření predikcí v ML.NET najdete v průvodci predikcí pomocí modelu.

Další kroky