C#ML.Net图片分类:GPU加速是否有助于改善预测性能,如何确定预测是否正确?

问题描述

我目前正在使用.NET Framework 4.8中的桌面工具,该工具会接收具有潜在裂缝的图像列表,并使用经过ML.Net(C#)训练的模型来执行裂缝检测。理想情况下,我希望该预测在10张图像上花费的时间少于100毫秒(注意:单幅图像的预测花费36-41毫秒之间的时间)。

首先,我尝试使用PredictionEngines列表和Parallel.For循环(由于没有针对.Net Framework的PredictionEnginePool实现,因此使用线程列表)在不同的线程中执行多个预测。后来我了解到,使用ITransformer进行预测是.Net Framework的一种推荐的线程安全方法,后来转向使用该方法,但是在这两种情况下,它都无法满足我的期望。

执行以下代码大约需要255-281ms(平均267.1ms):

    MLContext mlContext = new MLContext();
    IDataView inputData = mlContext.Data.LoadFromEnumerable(inputDataEnumerable);
    IDataView results = _LoadedModel.Transform(inputData);
    var imageClassificationPredictions = mlContext.Data.CreateEnumerable<ImageClassificationPrediction>(results,false).ToList();

其中 _LoadedModel 一个ITransformer,代表以前训练和加载的模型,而 inputDataEnumerable ModelInput 的列表,其中包含两个属性:ImageData (从png图像提取的图像数据的字节[])和标签(字符串类型,设置为null)。

我试图通过将TensorFlow包依赖项从SciSharp.TensorFlow.Redist切换为 SciSharp.TensorFlow.Redist-Windows-GPU 如本tutorial中所述。

但是,执行时间几乎相同(10张图像平均262.4ms)。我还尝试在5760张图像的小型数据集上比较训练时间,看不出太大的差异(两者都花了7分钟21秒)。

从这些结果来看,好像没有使用GPU,因此我首先尝试删除项目的bin文件夹,并删除面向cpu的旧tensorflow包(以防是一个简单的构建问题)。 如果这样做没有帮助,请按照here中所述的说明重新安装CUDA 10.0。我还通过运行一些示例项目(DeviceQuery,DeviceQueryDrv和bandwidthTest)再次检查了CUDA是否可以与我的图形卡正常工作,以确保该卡实际上是兼容的,并且运行得很好。

在这一点上,似乎我设置了错误,或者GPU不适用于我的特定用例,但是我无法查明是哪一个。据我跟踪的tutorial所述,GPU加速应该可以用于预测,但是在尝试使用GPU之后,我看不出执行时间有任何显着差异。

如果任何人对我可以采取的进一步的故障排除步骤有任何建议,或者他们对我出了错的地方有所了解,或者如果他们认为这是错误的用例,我将非常感谢您的帮助/反馈。 / p>

如果有帮助,这里是一些系统规格:

  • 操作系统:Windows 10 Pro
  • cpu:3.60GHz @Intel®Xeon®cpu E3-1275 v5
  • RAM:16.0 GB
  • GPU:Quadro P1000(已安装驱动程序:452.06版)

这是我正在运行的ML.Packages(版本):

并且为了获得GPU支持,我已经安装了CUDA v10.0CUDNN v7.6.4

修改

事实证明,该问题并非特定于ML.Net,而是与TensorFlow.Net有关。将SciSharp.TensorFlow.Redist-Windows-GPU更新到版本2.3.0(2020年8月31日发行)后,我将CUDA更新为10.1,并遵循TensorFlow.Net GitHub的指导获得GPU支持的不同步骤。现在,我可以在不到50毫秒的时间内获得10个预测,甚至比我的目标还好。

解决方法

可能是版本不匹配。

TensorFlow支持CUDA®10.1(TensorFlow> = 2.1.0)

https://www.tensorflow.org/install/gpu

您可以检查输出窗口,以了解其为何无法连接到GPU。