将经过 tensorflow 训练的图部署到生产中的最佳方法是什么?

What is the best way to deploy a tensorflow trained graph into production?

作为实习的一部分,我最近一直在研究机器学习问题。到目前为止,我一直在使用带有 python 的 Tensorflow,因为这是我最熟悉的。一旦使用深度学习解决了一个问题,剩下的就是网络架构和权重。现在,我的问题是,如何在生产中部署我的解决方案?我不会使用 tensorflow 服务,因为它主要用于设置远程服务器的大型应用程序,您开发的应用程序将向该服务器发出请求。就我而言,我只想开发一个机器学习解决方案并将其集成到一个现有的软件中,该软件在 visual studio 2017.

中使用 C++

到目前为止,经过大量研究,我想到了一些解决方案:

1) 使用 OpenCV 中的 "dnn" 模块:该模块可以加载图形,您可以进行推理和其他操作(例如在 运行 时间从网络中提取特定层)。这个模块看起来很有前途,但是当我使用与 OpenCV github 中描述的示例中使用的网络略有不同的网络时,我开始遇到一些问题,他们使用 "inception5h" 作为示例,当我试图加载 "inception_v3" 关于网络中某个未知层的错误,即 JPEG_decode 层。

2) 从源代码构建 tensorflow 并直接与 C++ 一起使用。这个解决方案似乎是最好的解决方案,但后来我遇到了很多问题,我的部分代码无法编译,而其他代码可以编译。我正在使用 Visual Studio 2017 和 Windows 10。所以虽然我能够从源代码构建 tensorflow,但我无法编译代码的所有部分,事实上它甚至不是我的代码,这是一个来自tensorflow网站的例子,这个:tensorflow C++ example

3) 我感兴趣的另一种可能性是使用 tensorflow 设计解决方案,然后使用其他机器学习框架(如 Caffe2、CNTK 等)部署到生产环境中。我在这里发现了一些将图形从一种框架转换为另一种框架的可能性:models converters。我认为这可能是一个合理的解决方案,因为我所要做的就是找到与 windows 最兼容的框架,并在我完成在 tensorflow 和 python 中设计我的解决方案后进行模型转换。转换过程虽然看起来有点太好了,我错了吗?

4) 我想到的最后一种可能性是使用 CPython。所以基本上,我将在 python 中创建我的预测管道,包装一些 python 函数,然后在我的 Visual Studio 项目中使用 <Python.h> 并使用 C++ 调用这些函数,这里有一个例子:embedding python in C++。我以前从未使用过这样的解决方案,我不确定所有可能出错的地方。

所以基本上,您认为将机器学习解决方案部署到 Visual Studio 上使用 C++ 的现有项目中的最佳解决方案是什么?我错过了更好的解决方案吗?非常感谢任何指南或提示!

我从一开始就使用 CNTK,因为我只是想在 Visual Studio 留在我的 C++ 世界中,并且知道我想部署为我的 C++ 桌面应用程序的一部分。没有 Tensorflow,没有 Python,没有云,甚至没有 .NET,也没有翻译模型。从一开始就在 CNTK 中执行。我现在有一个使用深度学习的商业产品。酷!

我最终使用了解决方案 2。在 tensorflow 的新更新之后,现在可以更轻松地从 Windows 上的源代码构建 tensorflow。有了这个解决方案,我不需要担心我的模型的兼容性,因为我将 tensorflow 与 python 一起用于原型制作,并将它与 C++ 一起用于生产。

[编辑]:2021 年,我现在使用 ONNX 运行时 (ORT) 作为 C++ 应用程序的一部分在生产中部署我的模型。 ORT 的文档不是很好,但工具本身非常好。

我会考虑使用 ONNX 将您的 NN 模型(不限于 tensorflow)导出到 Intel Vino 或 TensorRT,以便将您的模型导出到 C++ 以优化 CPU 或优化 GPU

据称 here Intel Vino 的速度是 tensorflow

的两倍