在面向机器的部署中,人们通常会使用gunicorn
来启动一些工作线程来为传入的请求提供服务。(是的,worker_class
将进一步定义工作进程中的行为)
在 Kubernetes 集群中部署时,我们是否仍然gunicorn
(或者确切地说,我们还需要多进程部署)?
基本上,每个正在运行的容器都是一个进程(在每个容器一个容器的配置中)。在服务后面运行的多个 pod 已经等同于gunicorn
所提供的。换句话说,依赖 Kubernetes 服务而不是gunicorn
还需要gunicorn
吗?
是的,pod 与进程并不完全相同(每个 pod 中伴侣容器都有一些开销),但除此之外,我们可能因为没有gunicorn
而错过的任何其他内容?
编辑
澄清:是的,仍然需要gunicorn
或其他wsgi
http
服务器来运行python应用程序。我的问题实际上是关于multiprocess
方面(作为标题中的多进程/枪手)。
Gunicorn用于为WSGI(Web服务器网关接口)应用程序提供服务,因此它是一个服务器,而不仅仅是多进程编排工具。Kubernetes 是一种编排工具,有助于管理基础设施。它不会说HTTP,也不了解WSGI规范。 换句话说,你不能在裸露的 kubernetes pod 上运行 WSGI 应用程序,你仍然需要一个 WSGI 服务器 liike Gunicorn、uWSGI 等来为应用程序提供服务。
还需要古尼角兽吗?
真的不需要。Kubernetes 可以处理向上和向下扩展(pod/容器),就像 gunicorn 使用 HPA 或 VPA 一样,并结合集群自动缩放器等其他东西。
事实上,你不需要它,它不需要你不能使用枪角兽。 您可以在一个由资源限制控制的 pod/容器中完美地拥有多个进程。请记住,Kubernetes 资源管理器最终将决定容器(在 Pod 中运行)的请求和资源上限。
这实际上取决于您的用例。如果一种解决方案比另一种解决方案更适合您,那么这里就没有对错之分。
我们有一个类似的用例。 我们正在运行同一服务的大约 30 个副本。每个 Pod 运行 1 个容器,该容器再次运行 50 个重复服务。
我们本可以得到 1500 个 pod 运行一个服务,但我们已经测试过,当只运行 30 个副本(每个副本运行 50 个服务)时,性能与所需资源要好得多。
我们唯一要做的额外事情是监控每个 pod 的 50 个服务,因此如果其中一个停止,它就会重新启动。如果它们都存在一些错误,我们会在 Pod 上运行运行状况检查,然后重新创建 Pod。
您可能需要考虑使用Tensorflow模型服务器(请参阅 https://www.tensorflow.org/tfx/tutorials/serving/rest_simple)。
在实践中,在执行模型预测时,我经历过,如果尝试并行运行多个预测(即多进程),则给定相同 CPU/GPU 资源的性能会更差。矩阵计算倾向于通过库使用低级并行性,并且尝试使用多个进程确实会导致我的经验变慢。正如其他人所评论的那样,为您的用例进行自己的性能测试始终是最好的方法。