gpt4 book ai didi

python - 使用 --preload 在 gunicorn 中的 worker 之间共享内存

转载 作者:行者123 更新时间:2023-12-03 15:50:27 57 4
gpt4 key购买 nike

我有一个大型模型文件,用于在 Flask 中构建的网络服务中,然后通过 Gunicorn 提供服务。文件夹的结构是这样的:

A.py
Folder_1\
__init__.py
B.py

模型加载于 __init__.py并用于 B.py入口点是 A.py包含 @app.routes, etc.
我开始 A.py使用 gunicorn 并使用 --preload 预加载应用程序选项,还有 8名 worker .

我在 8 核上面临 100% 的 CPU 利用率;显然请求被卡住了
在应用程序服务器上,而不是转发到数据库。
该模型是否也已预加载并可供所有 8 个工作人员使用,即它是否在工作进程之间共享?
如果没有,我必须在 A.py 中加载模型以便为所有工作人员预加载模型。

我认为每个工作进程都在加载模型,并且由于模型很大,工作人员被困在那里。

编辑 1 :由于我被告知这可能是一个重复的问题,我想澄清一下我不是在问如何 python 处理共享对象。我知道使用 multiprocessing 是可能的.就我而言,我使用 --preload 选项从 gunicorn 启动了 8 个工作人员的 flask 服务器,我的应用程序有 8 个实例正在运行。我的问题是,由于代码是在 worker fork 之前预加载的,gunicorn worker 将共享相同的模型对象,或者他们每个人都有一个单独的副本。?

最佳答案

My question is, since the code was preloaded before workers were forked, gunicorn workers will share the same model object, or they will have a separate copy each.?



这将是一个单独的副本。

预加载只是利用了当您调用操作系统的 fork() 时这一事实。调用创建一个新进程,操作系统能够在两个进程之间共享未修改的内存部分。通过预加载尽可能多的代码,进程之间可以共享更多内存。

这只是一个幕后的操作系统优化:从每个单独的 Python 进程的角度来看,他们拥有每个对象的唯一副本。

关于python - 使用 --preload 在 gunicorn 中的 worker 之间共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45071875/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com