如何将 word2vec 模型保存到 redis?

问题描述

在每次搜索请求期间都会使用此功能并需要 2 秒的时间:

def get_model(config:dict):
    return gensim.models.Word2Vec.load(config['path_model']).wv

是否可以打开一次,将其保存在缓存或redis中,然后再次使用以加快搜索速度?

我已经尝试过这个选项:

model = get_model(config)
pickled_object = pickle.dumps(model)
key = 'model_object'
redis_instance.set(key,pickled_object)

然后我明白了:

 t0 = time.time()
 get_object = redis_instance.get('model_object')
 t1 = time.time()
 total = t1-t0
 print('Get object',total)
 t0 = time.time()
 model = pickle.loads(get_object)
 t1 = time.time()
 total = t1-t0
 print('Pickle loads',total)

但处理时间没有改变。

Mar 30 09:47:54 ip-172-31-25-211 gunicorn[27354]: Get object 1.2066564559936523
Mar 30 09:47:54 ip-172-31-25-211 gunicorn[27354]: Pickle loads 0.854522705078125

解决方法

您想将模型保存在内存中是正确的,因此加载成本不会在每个请求中都被重复支付。

但是将它混入 Redis 并不是最好的方法。

有关相关想法,请参阅此旧答案:

How to speed up Gensim Word2vec model load time?

但请注意,在刚刚发布的 Gensim-4.0.0 中事情变得更容易了 - 您不需要进行 init_simssyn0norm 修补。简单地用 mmap='r' 加载它可能就足够了,通常的相似性操作不会使用那么多额外的内存或步骤。