如何避免每次调用 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 中冻结模型,使用全局变量访问它。然后在您的代码中使用它。
我有两个文件,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 中冻结模型,使用全局变量访问它。然后在您的代码中使用它。