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

标签 c# windows tensorflow prediction ml.net

我目前正在开发 .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 图像中提取的图像数据的字节 [])和 Label(字符串类型,设置为 null)。
我试图通过从 SciSharp.TensorFlow.Redist 切换 TensorFlow 包依赖项来加快这个过程。到SciSharp.TensorFlow.Redist-Windows-GPU如本 tutorial 中所述.
但是,执行时间几乎保持不变(10 张图像的平均时间为 262.4 毫秒)。我还尝试在一个包含 5760 张图像的小数据集上比较训练时间,但看不出有多大差异(两者都花了大约 7 分钟 21 秒)。
从这些结果来看,它似乎没有使用 GPU,所以我首先尝试删除我的项目的 bin 文件夹并删除旧的面向 CPU 的 tensorflow 包(以防这是一个简单的构建问题)。
当这没有帮助时,我按照 here 中描述的说明重新安装了 CUDA 10.0。 .我还通过运行一些示例项目(DeviceQuery、DeviceQueryDrv 和 bandwidthTest)仔细检查了 CUDA 是否与我的显卡一起正常工作,以确保显卡实际上是兼容的,并且运行良好。
在这一点上,我似乎设置了错误,或者 GPU 不适用于我的特定用例,但我无法确定它是哪个。根据tutorial我一直在关注,GPU 加速应该可用于预测,但在尝试使用 GPU 后,我没有看到执行时间有任何显着差异。
如果有人对我可以采取的进一步故障排除步骤有任何建议,或者他们知道我哪里出错了,或者他们认为这是错误的用例,我将非常感谢任何帮助/反馈。
如果有帮助,这里有一些系统规范:
  • 操作系统:Windows 10 专业版
  • CPU:Intel(R) Xeon(R) CPU E3-1275 v5 @ 3.60GHz
  • 内存:16.0 GB
  • GPU:Quadro P1000(安装的驱动程序:版本 452.06)

  • 这是我正在运行的 ML.Packages(版本):
  • Microsoft.ML (v1.5.0)
  • Microsoft.ML.ImageAnalytics (v1.5.0)
  • Microsoft.ML.TensorFlow (v1.5.0)
  • Microsoft.ML.Vision (v1.5.0)
  • SciSharp.TensorFlow.Redist-Windows-GPU (v1.15.1)

  • 对于 GPU 支持,我安装了 CUDA v10.0连同 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
    你可以检查你的输出窗口,看看它没有连接到你的 GPU 的原因。

    关于C# ML.Net 图像分类 : Does GPU acceleration help improve the performance of predictions and how can I tell if it is?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63641000/

    相关文章:

    c# - Windows 窗体 TreeView 始终选择焦点上的节点

    C# Web 引用调用超时

    tensorflow - tf.nn.dynamic_rnn 中的排名错误

    windows - 转到异常 "signal arrived during cgo execution"

    python - Tensorflow 动态循环神经网络 (LSTM) : how to format input?

    tensorflow - 在 TensorFlow 中处理多个图表

    c# - c#.net 3.5 中的多线程异步 Web 服务调用

    c# - 如何在 Windows 中加密文件夹?

    windows - 从操作系统的角度来看,C++ 中动态加载 DLL 的内部机制?

    windows - 在 Windows 上通过 ssh 连接到 Git 失败