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 jazyka C# 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# nebo prostřednictvím nástrojů s nízkým kódem, jako je Tvůrce modelů a rozhraní příkazového řádku ML.NET. Architektura je 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
- Sada .NET 6 SDK nebo novější
- Textový editor nebo integrované vývojové prostředí (například Visual Studio nebo Visual Studio Code)
- Model ONNX. Informace o trénování modelu AutoML ONNX najdete v následujícím poznámkovém bloku pro klasifikaci marketingu banky.
- Netron (volitelné)
Vytvoření konzolové aplikace jazyka C#
V této ukázce použijete k sestavení aplikace rozhraní příkazového řádku .NET CLI, 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.
Otevřete terminál a vytvořte novou konzolovou aplikaci C# .NET. V tomto příkladu je
AutoMLONNXConsoleApp
název aplikace . Adresář se vytvoří stejným názvem s obsahem vaší aplikace.dotnet new console -o AutoMLONNXConsoleApp
V terminálu přejděte do adresáře AutoMLONNXConsoleApp .
cd AutoMLONNXConsoleApp
Přidání softwarových balíčků
Nainstalujte balíčky NuGet Microsoft.ML, Microsoft.ML.OnnxRuntime a Microsoft.ML.OnnxTransformer Pomocí rozhraní příkazového řádku .NET.
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.
Otevřete soubor Program.cs a do horní části přidejte následující
using
direktivy.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í. Pokud ještě model nemáte, vytvořte ukázkový model podle tohoto poznámkového bloku .
Přidejte do své aplikace odkaz na soubor modelu ONNX:
Zkopírujte model ONNX do kořenového adresáře AutoMLONNXConsoleApp vaší aplikace.
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.
(Další informace o běžných položkách nástroje MSBuild najdete v tématu
/>.Průvodce msBuildem.) 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 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
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ázka dat je znázorněná v následující tabulce:
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.
Otevřete Netron.
V horním řádku nabídek vyberte Otevřít soubor > a pomocí prohlížeče souborů vyberte model.
Otevře se váš model. Například struktura modelu automl-model.onnx vypadá takto:
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 uvnitř 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 uvnitř souboru Program.cs .
public class OnnxOutput
{
[ColumnName("variable_out1")]
public float[] PredictedFare { get; set; }
}
OnnxInput
Podobně jako při mapování výstupu ColumnName
variable_out1
na popisnější název PredictedFare
použ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.
Vytvoření nové metody volané
GetPredictionPipeline
Program
uvnitř třídystatic ITransformer GetPredictionPipeline(MLContext mlContext) { }
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" };
Definujte svůj kanál. Poskytuje
IEstimator
podrobný plán operací a 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.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 metoduFit
k vytvoření z vašehoonnxPredictionPipeline
.var emptyDv = mlContext.Data.LoadFromEnumerable(new OnnxInput[] {}); return onnxPredictionPipeline.Fit(emptyDv);
Metoda
Fit
očekáváIDataView
, že jako vstup provede operace. PředstavujeIDataView
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ázdnouIDataView
, abyste poskytliITransformer
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. Doporučujeme ale použít samostatné aplikace k definování a používání kanálu k předpovědím. V ML.NET je možné kanály serializovat a ukládat pro další použití v jiných aplikacích koncových uživatelů .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ů.
Main
Uvnitř metody zavolejte metoduGetPredictionPipeline
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
.
Main
Uvnitř metody vytvořte metoduPredictionEngine
CreatePredictionEngine
.var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
Vytvořte vstup testovacích dat.
var testInput = new OnnxInput { VendorId = "CMT", RateCode = 1, PassengerCount = 1, TripTimeInSecs = 1271, TripDistance = 3.8f, PaymentType = "CRD" };
predictionEngine
Pomocí metody můžete vytvářet předpovědi na základě novýchtestInput
datPredict
.var prediction = onnxPredictionEngine.Predict(testInput);
Vypíše výsledek předpovědi do konzoly.
Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
Ke spuštění aplikace použijte rozhraní příkazového řádku .NET.
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í předpovědí v ML.NET najdete v tématu Použití modelu k vytváření předpovědí.