Tensorflow - 尽可能高效地在生产中执行模型

Tensorflow - executing a model in production as efficiently as possible

我有一个使用 Keras 创建的语义分割模型。

现在我想在生产中使用它,我需要每天在包含 10k-100k 图像的大文件夹上执行模型几次。这需要几个小时,所以每一项改进都是有帮助的。

我想知道在生产中使用它的正确方法是什么。我目前只在创建的 Sequence 上使用 model.predict()。但无论我在哪里,我都会看到各种不同的库或技术似乎相关。

Tensorflow-serving,转换为 C,intel 和其他公司的不同库。

我想知道将模型作为生产级并尽可能高效地执行的底线推荐方法是什么。

我不确定这是否有一个规范的答案——因为很多事情在不同的选择之间有很多权衡——但我会尝试给出一个答案。

我一直很高兴使用 TensorFlow Serving 进行模型部署,使用单独的服务执行调用这些模型的业务逻辑并对预测做一些事情。这提供了一个小的提升,因为不会有太多的资源争用——TensorFlow Serving 实例除了 运行 模型什么都不做。我们通过 Kubernetes 部署了它们,如果您还想水平扩展以获得更高的吞吐量,这使得对 TensorFlow Serving 实例集群进行分组变得非常容易。

你不太可能通过在边缘搞乱一些事情来获得有意义的改进,比如确保 TensorFlow Serving 部署使用正确的标志编译以使用英特尔的所有矢量指令。最大的提升是 运行 在快速 C++ 代码中整合所有内容。提高性能的一种(可能非常明显)方法是 运行 在 GPU 上进行推理,而不是 CPU。这将或多或少地按您预期的方式扩展:GPU 越强大,推理速度就越快。

您可能需要做更多复杂的事情来维持我们更多的单个百分点收益。但这在速度和灵活性之间取得了很好的平衡。拥有这个单独的服务架构肯定有点挑剔:如果你没有做太复杂的事情,可能更容易(如果相当慢)在 [=] 中使用你的模型“as-is” 19=] 脚本而不是去设置 TensorFlow 服务的麻烦。另一方面,加速非常显着,而且很容易管理。另一方面,我不知道你可以做些什么疯狂的事情来获得更多的边际性能提升,但直觉告诉我它们会非常奇特,因此很难维护。

很难回答,但我会考虑以下正交方面

  1. 我可以 运行 一个较低分辨率的模型吗?如果是这样,请在 运行 调整模型之前调整图像大小——这应该会给您带来 X**2 倍的加速,其中 X 是您使用的下采样因子。
  2. 生产模型通常是远程执行的。所以了解你的远程机器配置是非常重要的。如果您只有 CPU-only 台机器,像 OpenVINO 这样的选项通常比原生 tensorflow 提供更多 speed-up。如果你有 GPU 机器,像 tensorRT 这样的选项也可以帮助你。实际 speed-up 很难估计,但我会说至少快 2 倍。
  3. Uploading/downloading JPEG 图像而不是 PNG 或 BMP。这应该会大大减少您的沟通时间。