python - Tensorflow - 在生产中尽可能高效地执行模型
问题描述
我有一个使用 Keras 创建的语义分割模型。
现在我想在生产中使用它,我需要在一个包含 10k-100k 图像的大文件夹上执行模型,每天几次。这需要几个小时,所以每一次改进都是有帮助的。
我想知道在生产中使用它的正确方法是什么。我目前只是model.predict()
在创建的Sequence
. 但无论在哪里,我都能看到各种不同的库或似乎相关的技术。
Tensorflow-serving
,转换为 C,由英特尔和其他人提供的不同库。
我想知道以生产级和尽可能高效的方式执行模型的底线推荐方法是什么。
解决方案
我不确定这是否有一个规范的答案——因为很多事情在不同的选择之间有很多权衡——但我会尝试给出一个答案。
我很高兴使用 TensorFlow Serving 进行模型部署,使用单独的服务执行业务逻辑,调用这些模型并处理预测。这提供了一个小的提升,因为不会有太多的资源争用——TensorFlow Serving 实例除了运行模型什么都不做。我们通过 Kubernetes 部署它们,如果您还想水平扩展以获得更高的吞吐量,这使得对 TensorFlow Serving 实例集群进行分组非常容易。
通过确保 TensorFlow Serving 部署使用正确的标志编译以使用英特尔的所有矢量指令之类的事情搞乱边缘,您不太可能获得有意义的改进。最大的提升是在快速的 C++ 代码中运行所有内容。提高性能的一种(可能非常明显)方法是在 GPU 而不是 CPU 上运行推理。这将或多或少地以您期望的方式扩展:GPU 越强大,推理的速度就越快。
您可能可以做更多涉及的事情来使我们获得更多的单个百分点收益。但这在速度和灵活性之间取得了很好的平衡。拥有这种单独的服务架构肯定有点挑剔:如果你没有做太复杂的事情,那么在 Python 脚本中“按原样”使用模型可能会更容易(如果速度慢一些),而不是麻烦设置TensorFlow服务。另一方面,加速非常显着,而且很容易管理。另一方面,我不知道你可以做些什么疯狂的事情来勉强获得更多的边际性能提升,但直觉告诉我它们将非常奇特,因此很难维持。
推荐阅读
- typescript - 传单地图不显示 GeoJSON 数据
- css - 如何将跨度放置在角度 4 中的 mat-icon 上并在 Click 上下拉
- pandas - pandas dataframe 传递值的形状为 (1, 4),索引意味着 (4, 4)
- z3 - z3Exception:文件访问错误
- java - 带有入站通道和响应通道的 TCP 客户端的动态生成
- sql - 检索 sql 查询
- android - Kotlin OnClick 监听器
- mysql - 如何编写 MySQL 查询以使用 JOINS 获取嵌套的 JSON 数组?
- php - SOAP Providr 登录信息?
- ios - 为什么 beginAccessingResourcesWithCompletionHandler 会抛出意外的状态异常