Vytváření předpovědí 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) vytvářet 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é prostřednictvím nástrojů s minimem kódu, 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.

Předpoklady

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 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 do horní části přidejte 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 MSBuild. Pokud ještě model nemáte, vytvořte ukázkový model pomocí tohoto poznámkového bloku .

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

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

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

    <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í řádekProgram.

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

Inicializace mlContext

Main Uvnitř metody třídy Program 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é je možné sdílet v rámci životního cyklu 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 formát dat 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 si můžete prohlédnout 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é)

Ke kontrole vstupů a výstupů modelu použijte nástroj, jako je Netron.

  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. Tyto informace slouží k definování vstupního a výstupního schématu 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 má odkazovat na sloupec při zpracování dat. I když TripDistance například vlastnost dodržuje standardní konvence vytváření názvů .NET, model zná pouze sloupec nebo funkci známou jako trip_distance. Chcete-li tento rozdíl v pojmenování vyřešit, ColumnName atribut mapuje TripDistance vlastnost na sloupec nebo funkci podle názvu trip_distance.

U číselných hodnot ML.NET pracuje pouze s Single typy 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; }
}

OnnxInputPodobně jako při mapování výstupu ColumnNamevariable_out1 na popisnější název PredictedFarepoužijte atribut .

Definování kanálu předpovědi

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 transformací dat ML.NET.

  1. Vytvoření nové metody volané GetPredictionPipelineProgram uvnitř 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í, vstupních 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 pouze sadu operací, které se mají použít pro vaše data. To, co funguje s vašimi daty, 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á IDataView , že jako vstup provede operace. Představuje IDataView 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 poskytnout prázdnou IDataView , abyste poskytli ITransformer potřebné informace o vstupním a výstupním schématu. Fitované ITransformer zařízení se pak vrátí k dalšímu použití ve vaší aplikaci.

    Tip

    V této ukázce se kanál definuje a používá ve stejné aplikaci. K definování a použití kanálu k předpovědím ale doporučujeme používat samostatné aplikace. V ML.NET je možné kanály serializovat a uložit pro další použití v jiných aplikacích pro koncové 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 ML.NET uložením a načtením natrénovaných modelů.

    *WebAssembly se podporuje jenom v .NET Core 5 nebo novějším.

  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í předpovědí. ML.NET poskytuje rozhraní API pro usnadnění vytváření předpovědí v jedné instanci dat s názvem PredictionEngine.

  1. Main Uvnitř metody vytvořte 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 Pomocí metody můžete vytvářet předpovědi na základě nových testInput datPredict.

    var prediction = onnxPredictionEngine.Predict(testInput);
    
  4. Vypíše 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 následující výstup:

    Predicted Fare: 15.621523
    

Další informace o vytváření předpovědí v ML.NET najdete v průvodci předpovědí pomocí modelu.

Další kroky