FlagEmbedding
FlagEmbedding copied to clipboard
在CPU模式下,使用 bge-m3 或bge-large-zh 模型的同一个 BGEM3FlagModel 对象实例在多线程中调用 encode 计算向量会导致计算的向量不正确吗?
在CPU模式下,加载 bge-m3 或bge-large-zh 模型。 同一个 BGEM3FlagModel 的对象实例在多线程中调用其 encode 方法计算向量会导致计算的向量不正确吗?
我自己写了一段测试代码,结果显示所有线程计算结果都是一样,但我不确定这是不是正确的结论。测试代码如下:
import numpy as np
import threading
from FlagEmbedding import BGEM3FlagModel
from typing import Union, Dict, List, Any, Optional
model = BGEM3FlagModel('BAAI/bge-m3', normalize_embeddings=True, use_fp16=False, devices='cpu', batch_size=128)
def get_embeddgins(texts):
embeddings = model.encode(texts, return_dense=True, max_length=512)
return embeddings
class EmbeddingThread(threading.Thread):
def __init__(self, name, texts):
super().__init__(name=name)
self.texts = texts
self.embeddings = None
def run(self):
self.embeddings = get_embeddgins(self.texts)
print(f"thread: [{self.name}] run finished")
def run_test():
text = "BGE-M3通过预训练阶段的学习就已经获得了非常出色的长文档检索能力,单纯使用稠密检索(Dense-w.o.long)就可以实现与E5-mistral相当的实验效果"
threads: List[EmbeddingThread] = []
for i in range(1, 20):
th = EmbeddingThread(f"thread_{i+1}",text)
threads.append(th)
th.start()
print(f"thread num: {len(threads)}")
for th in threads:
th.join()
results = []
for i in range(0, len(threads)-1):
ret = np.array_equal(threads[i].embeddings['dense_vecs'], threads[i+1].embeddings['dense_vecs'])
results.append(ret)
print(results)
if __name__ == "__main__":
run_test()
只要是同一模型,得到的embedding就会是相同的