无法加载 DLL 'tensorflow' 或其依赖项之一 (ML.NET)

8

我有一个使用 Microsoft 的 ML.NET 框架进行图像分类的 .NET Core 3 应用程序。

在我的开发计算机上,我可以运行代码,一切正常。

然而,当我将其部署到暂存服务器时,在运行时出现以下错误:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
     System.DllNotFoundException: Unable to load DLL 'tensorflow' or one of its dependencies: The specified module could not be found. (0x8007007E)
     at Tensorflow.c_api.TF_NewGraph()
     at Tensorflow.Graph..ctor()
     at Microsoft.ML.Transforms.Dnn.DnnUtils.LoadTFSession(IExceptionContext ectx, Byte[] modelBytes, String modelFile)
...

我已经尝试将tensorflow.dll复制到部署的bin文件夹中;我尝试了构建为x64、x86或AnyCPU。我已验证包含SciSharp.TensorFlow.Redist和Microsoft.ML.Tensorflow.Redist NuGet包。到目前为止,没有任何作用。
有什么想法为什么它找不到DLL文件,或者我如何使它工作?

只是为了帮助其他遇到同样问题的人,附上参考链接:https://developers.de/2019/10/25/hosting-ml-net-in-appservice/,它指出了我应该去哪里查找。 - Farid
10个回答

18

我安装了版本为1.14.0的"SciSharp.TensorFlow.Redist",现在这个问题已经解决了。

我的包引用正好如下:

<PackageReference Include="Microsoft.ML" Version="1.4.0" />
<PackageReference Include="Microsoft.ML.ImageAnalytics" Version="1.4.0" />
<PackageReference Include="Microsoft.ML.Vision" Version="1.4.0" />
<PackageReference Include="SciSharp.TensorFlow.Redist" Version="1.14.0" />

当我包含了SciSharp.TensorFlow.Redist时,我的问题立即得到了解决。在我的情况下,v2.1也可以使用。 - Snympi

5

我已经找到了根本原因。

原因1: Microsoft.ML仅适用于x64

原因2: 以下软件包的最新稳定版本(1.4.0)出现了错误。以下v1.3.1版本的软件包可以正常工作。

  • Microsoft.ML v1.3.1
  • Microsoft.ML.ImageAnalytics v1.3.1
  • Microsoft.ML.TensorFlow v1.3.1

原因3: ML.NET和Tensor flow只在.NET CORE中正常工作,而不是在.NET框架中。

希望这对你也有帮助!编码愉快!


5
在C#桌面应用程序中,使用tensorflow神经网络时,在开发环境中运行正常,但在其他机器上失败。安装客户端机器上的Microsoft Visual C++ Redistributable解决了这个问题。

这对我很有帮助。我的设置是Microsoft.ML = 1.5.2,Microsoft.ML.ImageAnalytics = 1.5.2,Microsoft.ML.TensorFlow = 1.5.2,SciSharp.TensorFlow.Redist = 2.3.1。加载由tensorflow 2.1.x创建并在Windows 8 x64上运行的模型。 - Eric Craeymeersch

5

我遇到了一些与 ML 库相关的问题:

在 OQ 中提到的那个库。错误信息:无法加载 DLL“tensorflow”或其某个依赖项:找不到指定的模块。 (0x8007007E),确实可以通过更新最新的 VC++ x64 Redistributable 来解决。对于我来说,下载链接在这里

当出现错误:无法在 DLL“tensorflow”中找到名为'TF_StringEncodedSize'的入口点时,我需要将 SciSharp.TensorFlow.Redist 库从 2.4.x 降级到 2.3.x。

当出现 检查 GraphDef 解释二进制文件是否与 GraphDef 生成二进制文件保持最新 错误时,我注意到安装 Microsoft.ML.TensorFlow.Redist 是一个错误,并需要将其删除。


3

安装最新的VC_redist即可使其正常工作!


1
安装vc_redist.x64.exe帮助了我。

0

如果有人遇到这个问题,我来提供一些帮助。对我来说,绊脚石是其中一个不支持Tensorflow库所需的AVX/AVX2 CPU特性的旧服务器。

这里有一个类似的问题:https://stackoverflow.com/a/62186328/2729784

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CheckForAVXSupport
{
    internal class Program
    {
        public static bool HasAvxSupport()
        {
            try
            {
                return (GetEnabledXStateFeatures() & 4) != 0;
            }
            catch
            {
                return false;
            }
        }

        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        private static extern long GetEnabledXStateFeatures();

        static void Main(string[] args)
        {
            Console.WriteLine("AVX/AVX2 support: " + HasAvxSupport().ToString());
            Console.WriteLine("\nPress any key...");
            Console.ReadKey();
        }
    }
}

来源:https://dev59.com/193ws4cB2Jgan1znv578#35096938


0
更改 Azure Windows 功能运行时为 x64 是我这种情况下的解决方案。其他建议都没有起作用。

0
  1. 首先,确保您的硬件能够处理最新的软件技术,例如CPU架构或主板兼容性。我曾经遇到过这个问题,因为我使用了一个超过10年的旧系统。
  2. 安装最新的兼容vc_redist_64x分发版。
  3. 安装安装框架兼容性包的Windows更新程序,适用于x64系统。

当我完成以上所有步骤时,它对我起作用了。


0
如果您添加了对Microsoft.ML.TensorFlow.Redist的引用,这可能会有所帮助。这对我解决了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接