Создание прогнозов с помощью модели AutoML ONNX в .NET
В этой статье вы узнаете, как использовать модель автоматического машинного обучения (AutoML) Open Neural Network Exchange (ONNX) для прогнозирования в консольном приложении C# с ML.NET.
ML.NET — это кроссплатформенная платформа машинного обучения, платформа машинного обучения для экосистемы .NET, которая позволяет обучать и использовать пользовательские модели машинного обучения с помощью подхода c# или F#, а также с помощью средств с низким кодом, таких как Конструктор моделей и интерфейс командной строки ML.NET. Платформа расширяема и позволяет использовать другие популярные платформы машинного обучения, такие как TensorFlow и ONNX.
ONNX — это открытый формат для моделей на базе искусственного интеллекта. ONNX поддерживает взаимодействие между разными платформами. Это означает, что модель можно обучить в одной из многих популярных платформ машинного обучения, таких как PyTorch, преобразовать ее в формат ONNX и использовать модель ONNX в другой инфраструктуре, такой как ML.NET. Дополнительные сведения см. на веб-сайте ONNX.
Необходимые компоненты
- Пакет SDK для .NET 6 или более поздней версии
- Текстовый редактор или интегрированная среда разработки (например, Visual Studio или Visual Studio Code)
- Модель ONNX. Сведения о том, как обучить модель AutoML ONNX, см. в записной книжке с маркетинговой классификацией для банка.
- Netron (необязательно)
Создание консольного приложения на C#
В этом примере вы используете интерфейс командной строки .NET для создания приложения, но вы можете выполнять те же задачи с помощью Visual Studio. Дополнительные сведения о .NET CLI.
Откройте терминал и создайте консольное приложение C# .NET. В этом примере имя приложения —
AutoMLONNXConsoleApp
. При этом создается каталог под тем же именем с содержимым приложения.dotnet new console -o AutoMLONNXConsoleApp
В окне терминала перейдите в каталог AutoMLONNXConsoleApp.
cd AutoMLONNXConsoleApp
Добавление пакетов программного обеспечения
Установите пакеты NuGet Microsoft.ML, Microsoft.ML.OnnxRuntime и Microsoft.ML.OnnxTransformer NuGet с помощью .NET CLI.
dotnet add package Microsoft.ML dotnet add package Microsoft.ML.OnnxRuntime dotnet add package Microsoft.ML.OnnxTransformer
Эти пакеты содержат зависимости, необходимые для использования модели ONNX в приложении .NET. ML.NET предоставляет API, который использует среду выполнения ONNX для прогнозов.
Откройте файл Program.cs и добавьте следующие
using
директивы вверху.using System.Linq; using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Transforms.Onnx;
Добавление ссылки в модель ONNX
Чтобы консольное приложение может получить доступ к модели ONNX, добавьте ее в выходной каталог сборки. Если у вас еще нет модели, выполните эту записную книжку , чтобы создать пример модели.
Добавьте ссылку на файл модели ONNX в приложении:
Скопируйте модель ONNX в корневой каталог приложения AutoMLONNXConsoleApp.
Откройте файл AutoMLONNXConsoleApp.csproj и добавьте следующее содержимое в узел
Project
.<ItemGroup> <None Include="automl-model.onnx"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
В данном случае имя файла модели ONNX — automl-model.onnx.
(Дополнительные сведения об общих элементах MSBuild см. в разделеРуководство по MSBuild.)
Откройте файл 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.
Откройте Netron.
В строке верхнего меню выберите Файл > Открыть и выберите модель в обозревателе файлов.
Модель откроется. Например, структура модели automl-model.onnx выглядит следующим образом:
Выберите последний узел в нижней части графа (в данном случае —
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.
Создайте новый метод
GetPredictionPipeline
в классеProgram
.static ITransformer GetPredictionPipeline(MLContext mlContext) { }
Задайте названия входных и выходных столбцов. Добавьте следующий код в метод
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" };
Создайте конвейер. Предоставляет
IEstimator
схему операций и входных и выходных схем конвейера.var onnxPredictionPipeline = mlContext .Transforms .ApplyOnnxModel( outputColumnNames: outputColumns, inputColumnNames: inputColumns, ONNX_MODEL_PATH);
В данном случае
ApplyOnnxModel
является единственным преобразованием в конвейере, которое принимает имена входных и выходных столбцов, а также путь к файлу модели ONNX.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.
Внутри метода
Main
вызовите методGetPredictionPipeline
с необходимыми параметрами.var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
Использование модели для прогнозирования
Теперь, когда у вас есть конвейер, его можно использовать для создания прогнозов. ML.NET предоставляет удобный API PredictionEngine
для создания прогнозов на одном экземпляре данных с под названием.
Внутри метода
Main
создайтеPredictionEngine
с помощью методаCreatePredictionEngine
.var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
Создайте тестовые входные данные.
var testInput = new OnnxInput { VendorId = "CMT", RateCode = 1, PassengerCount = 1, TripTimeInSecs = 1271, TripDistance = 3.8f, PaymentType = "CRD" };
С помощью
predictionEngine
создайте прогноз на основе новых данныхtestInput
с помощью методаPredict
.var prediction = onnxPredictionEngine.Predict(testInput);
Выведите результаты прогноза на консоль.
Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
Используйте интерфейс командной строки .NET для запуска приложения.
dotnet run
Результат должен выглядеть примерно следующим образом.
Predicted Fare: 15.621523
Дополнительные сведения о создании прогнозов в ML.NET см. в статье "Использование модели для прогнозирования".