C# ML.Net 图像分类:GPU 加速是否有助于提高预测性能?如何判断是否有效?

mig*_*lan 5 c# windows prediction tensorflow ml.net

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

首先,我尝试使用 PredictionEngines 列表和 Parallel.For 循环在不同线程中执行多个预测(使用线程列表,因为 .Net Framework 没有 PredictionEnginePool 实现)。后来我了解到,使用 ITransformer 进行预测是 .Net Framework 推荐的线程安全方法,并转而使用该方法,但在这两种情况下,它都没有给我带来我所希望的性能。

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

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

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

SciSharp.TensorFlow.Redist我尝试通过将 TensorFlow 包依赖项从 切换为 来 加速此过程,如本教程SciSharp.TensorFlow.Redist-Windows-GPU 中所述。

然而,执行时间几乎保持不变(10 个图像的平均时间为 262.4 毫秒)。我还尝试比较了 5760 张图像的小数据集的训练时间,但看不出有太大差异(两者都花费了大约 7 分 21 秒)。

从这些结果来看,它似乎没有使用 GPU,所以我首先尝试删除项目的 bin 文件夹,并删除旧的面向 CPU 的张量流包(以防这是一个简单的构建问题)。当这没有帮助时,我按照此处描述的说明重新安装了 CUDA 10.0 。我还通过运行一些示例项目(DeviceQuery、DeviceQueryDrv 和bandwidthTest)仔细检查了 CUDA 是否与我的显卡正常工作,以确保该卡实际上兼容,并且运行得很好。

此时,似乎我设置了错误,或者 GPU 不适用于我的特定用例,但我无法确定它是什么。根据我遵循的教程,GPU 加速应该可用于预测,但在尝试使用 GPU 后,我没有看到执行时间有任何显着差异。

如果有人对我可以采取的进一步故障排除步骤有任何建议,或者他们知道我哪里出了问题,或者他们认为这是错误的用例,我将非常感谢任何帮助/反馈。

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

  • 操作系统:Windows 10 专业版
  • CPU:Intel(R) Xeon(R) CPU E3-1275 v5 @ 3.60GHz
  • 内存:16.0GB
  • GPU:Quadro P1000(安装的驱动程序:版本452.06)

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

  • 微软.ML (v1.5.0)
  • Microsoft.ML.ImageAnalytics (v1.5.0)
  • Microsoft.ML.TensorFlow (v1.5.0)
  • 微软.ML.Vision (v1.5.0)
  • SciSharp.TensorFlow.Redist-Windows-GPU (v1.15.1)

对于 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 个预测,这甚至比我的目标更好。

小智 4

可能是版本不匹配。

\n

TensorFlow 支持 CUDA\xc2\xae 10.1 (TensorFlow >= 2.1.0)

\n

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

\n

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

\n