gpt4 book ai didi

python - 在 docker 容器之间共享 gensim 的 KeyedVectors 对象的内存

转载 作者:行者123 更新时间:2023-12-01 01:43:42 27 4
gpt4 key购买 nike

已关注 related question solution我创建了 docker 容器,它在 docker 容器内加载 GoogleNews-vectors-negative300 KeyedVector 并将其全部加载到内存

KeyedVectors.load(model_path, mmap='r')
word_vectors.most_similar('stuff')

我还有另一个 Docker 容器,它提供 REST API,可以使用

加载此模型
KeyedVectors.load(model_path, mmap='r')

我观察到满载的容器需要超过 5GB 的内存,每个 Gunicorn Worker 需要 1.7GB 的内存。

CONTAINER ID        NAME                        CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
acbfd080ab50 vectorizer_model_loader_1 0.00% 5.141GiB / 15.55GiB 33.07% 24.9kB / 0B 32.9MB / 0B 15
1a9ad3dfdb8d vectorizer_vectorizer_1 0.94% 1.771GiB / 15.55GiB 11.39% 26.6kB / 0B 277MB / 0B 17

但是,我希望所有这些进程都为 KeyedVector 共享相同的内存,因此所有容器之间只需要共享 5.4 GB。

有人尝试过实现这一目标并取得成功吗?

编辑:我尝试了以下代码片段,它确实在不同容器之间共享相同的内存。

import mmap
from threading import Semaphore

with open("data/GoogleNews-vectors-negative300.bin", "rb") as f:
# memory-map the file, size 0 means whole file
fileno = f.fileno()
mm = mmap.mmap(fileno, 0, access=mmap.ACCESS_READ)
# read whole content
mm.read()
Semaphore(0).acquire()
# close the map
mm.close()

所以问题是 KeyedVectors.load(model_path, mmap='r') 不共享内存

编辑2:研究gensim的源代码我发现调用了np.load(subname(fname, attrib), mmap_mode=mmap)来打开memmaped文件。以下代码示例在多个容器之间共享内存。

from threading import Semaphore

import numpy as np

data = np.load('data/native_format.bin.vectors.npy', mmap_mode='r')
print(data.shape)
# load whole file to memory
print(data.mean())
Semaphore(0).acquire()

最佳答案

经过大量调试后,我发现 mmap 对于 KeyedVectors 对象中的 numpy 数组按预期工作。

但是,KeyedVectors 还有其他属性,例如 self.vocabself.index2wordself.index2entity,这些属性不共享并且消耗约 1.7每个对象的 GB 内存。

关于python - 在 docker 容器之间共享 gensim 的 KeyedVectors 对象的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51616074/

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