[Python] How to add index to python FAISS incrementally

Discussão em 'Python' iniciado por Stack, Março 3, 2025.

  1. Stack

    Stack Membro Participativo

    I am using Faiss to index my huge dataset embeddings, embedding generated from bert model. I want to add the embeddings incrementally, it is working fine if I only add it with faiss.IndexFlatL2 , but the problem is while saving it the size of it is too large. So I tried with faiss.IndexIVFPQ, but it needs to train embeddings before I add the data, so I can not add it incrementally, I have to compute all embeddings first and then train and add it, it is having issue because all the data should be kept in RAM till I write it. Is there any way to do this incrementally. Here is my code:

    # It is working fine when using with IndexFlatL2
    def __init__(self, sentences, model):
    self.sentences = sentences
    self.model = model
    self.index = faiss.IndexFlatL2(768)

    def process_sentences(self):
    result = self.model(self.sentences)
    self.sentence_ids = []
    self.token_ids = []
    self.all_tokens = []
    for i, (toks, embs) in enumerate(tqdm(result)):
    # initialize all_embeddings for every new sentence (INCREMENTALLY)
    all_embeddings = []
    for j, (tok, emb) in enumerate(zip(toks, embs)):
    self.sentence_ids.append(i)
    self.token_ids.append(j)
    self.all_tokens.append(tok)
    all_embeddings.append(emb)

    all_embeddings = np.stack(all_embeddings) # Add embeddings after every sentence
    self.index.add(all_embeddings)

    faiss.write_index(self.index, "faiss_Model")


    ANd when using with IndexIVFPQ:

    def __init__(self, sentences, model):
    self.sentences = sentences
    self.model = model
    self.quantizer = faiss.IndexFlatL2(768)
    self.index = faiss.IndexIVFPQ(self.quantizer, 768, 1000, 16, 8)

    def process_sentences(self):
    result = self.model(self.sentences)
    self.sentence_ids = []
    self.token_ids = []
    self.all_tokens = []
    all_embeddings = []
    for i, (toks, embs) in enumerate(tqdm(result)):
    for j, (tok, emb) in enumerate(zip(toks, embs)):
    self.sentence_ids.append(i)
    self.token_ids.append(j)
    self.all_tokens.append(tok)
    all_embeddings.append(emb)

    all_embeddings = np.stack(all_embeddings)
    self.index.train(all_embeddings) # Train
    self.index.add(all_embeddings) # Add to index
    faiss.write_index(self.index, "faiss_Model_mini")

    Continue reading...

Compartilhe esta Página