【问题标题】:Best practice of deploying a flask-api on google production kubernetes cluster在谷歌生产Kubernetes集群上部署flask-api的最佳实践
【发布时间】:2020-07-17 16:38:09
【问题描述】:

flask-api(使用 gunicorn)用作深度学习模型的推理 api。 这个特定的推理过程非常消耗 cpu(还没有使用 gpu)。

基于这些方面,将其部署到 Kubernetes 集群的最佳实践是什么:

  1. 我应该使用单个 gunicorn 工作者创建多个 pod 处理请求还是使用更少的 pod 来启用 gunicorn 多个工作者? (节点内存占用)

  2. 由于 google 提供使用外部负载均衡器将您的部署公开为服务, 我的 flask-gunicorn 堆栈上是否需要一个 nginx Web 服务器?

  3. 在同一个节点上创建多个相同的 Pod,是否比在单个 Pod 上使用多线程处理所有这些请求更占用内存?

【问题讨论】:

    标签: nginx flask kubernetes google-kubernetes-engine gunicorn


    【解决方案1】:
    1. 如果您保持在“数千”以下,则通常越小 pod 越好。集群放置一个需要 1 个 CPU 和 1 GB RAM 的 Pod 16 次要比放置一个需要 16 个 CPU 和 16 GB RAM 的单个 Pod 更容易。您通常需要多个副本来实现冗余、容忍节点故障以及在任何情况下进行零停机升级。

    2. 如果 Istio Ingress 系统适合您,您可能不需要在集群内单独设置 URL 路由层 (Nginx)。如果您可以直接访问 Gunicorn 服务器而无需在其前面进行路由或过滤,那么直接将 LoadBalancer 服务指向它们是一个有效的选择。

    3. 运行 16 个副本的 1 个应用程序通常需要比 16 个线程的 1 个副本更多的内存;还有多少取决于应用程序。

      特别是,如果您将模型加载到内存中并且模型本身很大,但您的多线程设置可以共享它的单个副本,则 1 个大型 pod 使用的内存可能比 16 个小型 pod 少得多。如果模型直接COPYed 到 Docker 映像中并且应用程序代码 mmap()s 它,那么您可能会在内核层共享内存。

      如果模型本身很小,并且大部分内存都用于处理,它仍然会使用“更多”内存来拥有多个 pod,但这只是你的运行时系统和 HTTP 服务的成本;如果不是以其他方式共享的话,它不应该显着改变每个线程/任务/pod 所需的内存。

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 1970-01-01
      • 2019-02-01
      • 2016-02-11
      • 2018-11-02
      • 2020-04-06
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多