如何避免每次调用 python 脚本时都重新加载 ML 模型?

How to avoid reloading ML model every time when I call python script?

我有两个文件,file1.py 的 ML 模型大小为 1GB,file2.py 从 file1 调用 get_vec() 方法并在 return 中接收向量。每次调用 file1 get_vec() 方法时都会加载 ML model。这是从磁盘加载模型需要花费大量时间(大约 10 秒)的地方。

我想以某种方式告诉 file1 不要每次都重新加载模型,而是利用之前调用的加载模型。

示例代码如下

# File1.py

import spacy
nlp = spacy.load('model')

def get_vec(post):
    doc = nlp(post)
    return doc.vector

File2.py

from File1 import get_vec

df['vec'] = df['text'].apply(lambda x: get_vec(x))

所以在这里,每次调用需要 10 到 12 秒。这看起来很小的代码,但它是一个大项目的一部分,我不能把它们放在同一个文件中。

更新1:

我做了一些研究,知道我可以使用 Redis 在第一次运行时将模型存储在缓存中,然后我可以直接从缓存中读取模型。我尝试使用 Redis 进行测试,如下所示

import spacy
import redis

nlp = spacy.load('en_core_web_lg')
r = redis.Redis(host = 'localhost', port = 6379, db = 0)
r.set('nlp', nlp)

它抛出一个错误

DataError: Invalid input of type: 'English'. Convert to a bytes, string, int or float first.

看来,type(nlp)English(),需要转换成合适的格式。所以我也尝试使用 pickle 来转换它。但同样,pickle 在编码和解码方面花费了大量时间。无论如何都可以将其存储在 Redis 中吗?

有人可以建议我怎样才能让它更快吗?谢谢。

训练后保存模型。
并开始使用 python 作为面向对象的编程语言而不是脚本语言。

使用Flask。 在此处查看该用户如何尝试实施:

通过HTTP请求将你的数据框数据发送到你的Flask。或者您可以保存为文件并将文件发送到服务器。

只需将模型加载到全局变量并在应用程序代码中使用该变量。

我不清楚你的问题。 nlp = spacy.load('model') 此行在导入时仅在给定代码中执行一次。 由于每次调用 get_vec 都不会加载模型,即使每次调用 get_vec 需要 10-12 秒,那么在你的情况下什么也做不了。

如果您的所有语法都正确,则不应多次加载模型。 (仅在ml的构造函数中class)

# File1.py

import spacy
class ml:
   def __init__(self, model_path):
       self.nlp = spacy.load(model_path) # 'model'
   def get_vec(self, post):
       return self.nlp(post).vector


# File2.py

from File1 import ml

my_ml = ml('model') # pass model path

df['vec'] = df['text'].apply(lambda x: my_ml.get_vec(x))

这里是如何做的

步骤 1) 在 python 中创建一个函数并在该函数中加载您的模型

model=None
def load_model():

    global model
    model = ResNet50(weights="imagenet")

如果你仔细观察,我首先将变量 model 分配给了 None。然后在 load_model 函数中我加载了一个模型。

我还确保变量 model 是全局变量,以便可以从该函数外部访问它。这里的直觉是我们在全局变量中加载模型对象。这样我们就可以在代码中的任何地方访问这个变量。

现在我们已经准备好工具(即我们可以从这段代码中的任何地方访问模型)让我们在您的计算机 RAM 中冻结这个模型。这是通过以下方式完成的:

if __name__ == "__main__":
    print(("* Loading Keras model and Flask starting server..."
        "please wait until server has fully started"))
    load_model()
    app.run()

现在不使用它在 RAM 中冻结模型有什么用。所以,为了使用它,我在 flask

中使用 POST 请求
@app.route("/predict", methods=["POST"])
def predict():

    if flask.request.method == "POST":

            output=model.predict(data)  #what you want to do with frozen model goes here

所以使用这个技巧你可以在 RAM 中冻结模型,使用全局变量访问它。然后在您的代码中使用它。