FlagEmbedding icon indicating copy to clipboard operation
FlagEmbedding copied to clipboard

在CPU模式下,使用 bge-m3 或bge-large-zh 模型的同一个 BGEM3FlagModel 对象实例在多线程中调用 encode 计算向量会导致计算的向量不正确吗?

Open lotuswater opened this issue 8 months ago • 2 comments

在CPU模式下,加载 bge-m3 或bge-large-zh 模型。 同一个 BGEM3FlagModel 的对象实例在多线程中调用其 encode 方法计算向量会导致计算的向量不正确吗?

lotuswater avatar Apr 02 '25 01:04 lotuswater

我自己写了一段测试代码,结果显示所有线程计算结果都是一样,但我不确定这是不是正确的结论。测试代码如下:

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()

lotuswater avatar Apr 02 '25 02:04 lotuswater

只要是同一模型,得到的embedding就会是相同的

545999961 avatar Apr 10 '25 06:04 545999961