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

C# ML.Net Image classification: Does GPU acceleration help improve the performance of predictions and how can I tell if it is?

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

起初,我尝试使用 PredictionEngine 列表和 Parallel.For 循环在不同线程中执行多个预测(使用线程列表,因为 .Net Framework 没有 PredictionEnginePool 实现)。后来我了解到,使用 IT运行sformer 进行预测是推荐的、线程安全的 .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();

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

我试图通过将 TensorFlow 包依赖项从 SciSharp.TensorFlow.Redist 切换到 SciSharp.TensorFlow.Redist-Windows-GPU 如本 tutorial.

中所述

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

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

在这一点上,我似乎设置了错误,或者 GPU 不适用于我的特定用例,但我无法确定是哪个。根据我关注的 tutorial,GPU 加速应该可用于预测,但在尝试使用 GPU 后我没有发现执行时间有任何显着差异。

如果有人对我可以采取的进一步故障排除步骤有任何建议,或者如果他们知道我哪里出错了,或者如果他们认为这是错误的用例,我将不胜感激 help/feedback.

如果有帮助,请参考以下系统规格:

这里是 ML.Packages(版本)我是 运行:

为了支持 GPU,我安装了 CUDA v10.0 along with CUDNN 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

您可以检查您的输出 window 以了解它无法连接到您的 GPU 的原因。