Я пытаюсь сравнить производительность оценки предварительно построенной модели тензорного потока с различными методами вывода. В настоящее время у меня есть игрушечная модель тензорного потока, обслуживающая half_plus_two
, которая обслуживается в виртуальной машине Ubuntu docker, которая дает следующие результаты:
GRP C: ~ 1700 прогнозов в секунду
REST: ~ 800 прогнозов в секунду
Мое приложение для конечного использования (Framework 4.5 с API) - это среда C#. Я бы хотел сравнить производительность ML. NET с REST и GRP C обслуживания тензорного потока, используя прогнозируемый / прогнозируемый двигатель ML. NET в моем приложении для конечного использования.
Среда
- Модель уже обучена
- Логический вывод делается путем подачи в модель одного значения с плавающей запятой с последующей обработкой возвращенного прогноза
- Приложение конечного использования будет передавать данные в реальном времени с очень высокой скоростью в секунду
- Tensorflow 2.x для создания модели и сохранения в формате
saved_model
ML. NET код
class TestProgram
{
static void Main(string[] args)
{
try
{
new ModelBuilder();
}
catch (Exception e)
{
// investigate
}
}
}
public class ModelBuilder
{
private readonly MLContext mlContext;
private string userDesktop = Environment.SpecialFolder.Desktop.ToString();
// feed these values to the pretrained tf model.
// expected results are 2.0, 3.0, 4.0, 5.0 respectively
private float[] testData = new float[] { 0.0f, 2.0f, 4.0f, 6.0f };
public ModelBuilder()
{
this.mlContext = new MLContext();
var tfPretrainedModel = this.mlContext.Model.LoadTensorFlowModel(Path.Combine(userDesktop, @"TF\half_plus_two\1\saved_model.pb"));
var predictionFunction = this.mlContext.Model.CreatePredictionEngine<HalfPlusTwoData, HalfPlusTwoPrediction>(tfPretrainedModel);
HalfPlusTwoPrediction prediction = null;
for (int i = 0; i < this.testData.Length; i++)
{
prediction = predictionFunction.Predict(new HalfPlusTwoData() { Input = this.testData[i] });
Console.WriteLine($"Input {this.testData[i]}, Prediction {prediction.Prediction}, Expected {(this.testData[i] / 2) + 2}");
}
}
}
public class HalfPlusTwoData
{
[LoadColumn(0), ColumnName("Label")]
public float Input;
}
public class HalfPlusTwoPrediction
{
[ColumnName("PredictedLabel")]
public float Prediction { get; set; }
}
Вопросы
- 1 Как правильно использовать
LoadTensorFlowModel
для создания модели или для создания конвейера? - 2 Является ли
HalfPlusTwoData
правильным способом? структурировать входные данные? - 3 Является ли HalfPlusTwoPrediction правильным способом структурирования класса предсказания?