我目前正在.NET Framework4.8中开发一个桌面工具,它接收带有潜在裂纹的图像列表,并使用经过ML.Net (C#)训练的模型来执行裂纹检测。理想情况下,我希望对10幅图像的预测小于100 on (注:单个图像预测需要36到41 on之间)。
首先,我尝试在不同的线程中执行多个预测,使用一个PredictionEngines列表和Parall.For-循环(使用线程列表,因为.Net框架没有PredictionEnginePool实现)。后来,我了解到使用ITransformer进行预测是一种推荐的、线程安全的.Net框架方法,并转而使用它,但在这两种情况下,它都没有给我希望的性能。
执行以下代码需要255-281 It (平均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图像中提取的图像数据的byte[])和Label (字符串类型,设置为null)。
我试图通过将TensorFlow包依赖关系从SciSharp.TensorFlow.Redist
切换到SciSharp.TensorFlow.Redist-Windows-GPU
来加快这个过程,如这个教程中所描述的那样。
但是,执行时间几乎保持不变( 10幅图像的平均执行时间为262.4ms )。我还试着比较一下5760张图像的小数据集的训练时间,但没有看到多大的差别(两者都花了大约7分钟21秒)。
从这些结果看,它似乎没有使用GPU,所以我首先尝试删除我的项目的bin文件夹,并删除旧的面向CPU的tensorflow包(如果这是一个简单的构建问题)。当这没有帮助时,我重新安装了CUDA 10.0,按照说明描述了这里。我还通过运行一些示例项目(DeviceQuery、DeviceQueryDrv和bandwidthTest)来检查CUDA是否与我的显卡正常工作,以确保卡实际上是兼容的,并且运行得很好。
在这一点上,我似乎设置了错误的东西,或者GPU只是不适用于我的特定用例,但我不能指出它是什么。根据我所遵循的教程,GPU加速应该可以用于预测,但是在尝试使用GPU之后,我没有看到在执行时间上有任何明显的差异。
如果有人建议我可以采取进一步的故障排除措施,或者他们知道我哪里出了问题,或者如果他们认为这是错误的用例,我将非常感谢任何帮助/反馈。
如果有帮助,下面是一些系统规范:
下面是我正在运行的ML.Packages (版本):
对于GPU支持,我已经安装了CUDA v10.0和CUDNN v7.6.4。
编辑
事实证明,这个问题不是ML.Net特有的,而是与TensorFlow.Net有关的。在我将slightly .ensorFlow.Redist-Windows-GPU更新到2.3.0版本(发布于8/31/2020)之后,我将CUDA更新为10.1,并遵循了TensorFlow.Net GitHub的指导,该GitHub在使GPU支持工作方面有一些略微不同的步骤。我现在可以在不到50毫秒内得到10个预测,这甚至比我的目标更好。
发布于 2020-08-31 19:31:48
很可能是版本错配。
TensorFlow支持CUDA 10.1 (TensorFlow >= 2.1.0)
https://www.tensorflow.org/install/gpu
您可以检查您的输出窗口的原因,为什么它不会连接到您的GPU。
https://stackoverflow.com/questions/63641000
复制相似问题