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 后,我没有看到执行时间有任何显着差异。
如果有人对我可以采取的进一步故障排除步骤有任何建议,或者他们知道我哪里出了问题,或者他们认为这是错误的用例,我将非常感谢任何帮助/反馈。
如果有帮助,这里是一些系统规格:
这是我正在运行的 ML.Packages(版本):
对于 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 个预测,这甚至比我的目标更好。
小智 4
可能是版本不匹配。
\nTensorFlow 支持 CUDA\xc2\xae 10.1 (TensorFlow >= 2.1.0)
\nhttps://www.tensorflow.org/install/gpu
\n您可以检查输出窗口,了解其无法连接到 GPU 的原因。
\n 归档时间: |
|
查看次数: |
4028 次 |
最近记录: |