Faiss 如何選擇索引

2021-10-09 02:34:05 字數 1044 閱讀 6892

faiss 如何選擇索引

flyfish

問題一:是否需要精確結果?

如果是,那麼應該使用 「flat」

能保證精確結果的只有 indexflatl2 或 indexflatip(inner product). 它們作為其他索引的基線結果.

問題二:是否關心記憶體?

請記住,所有faiss索引都儲存在ram中。 以下內容認為,如果不需要精確的結果,則ram是限制因素,並且在記憶體限制內,我們優化了精度與速度之間的權衡。

如果不在乎記憶體,那麼應該使用 「hnswx」

如果你的記憶體很大,或資料集很小,那麼 hnsw 是最好的選擇, 它是非常快、精確的索引.

如果稍微有點在意,那麼應該使用 「…,flat」

"…"表示必須事先執行資料集的聚類。 聚類後​​,「flat」僅將向量安排到儲存桶(bucket)中,因此不會壓縮它們,儲存的是原始資料,儲存大小與原始資料集相同。 速度和精度之間的權衡是通過nprobe引數設定的。

如果很在意,那麼應該使用 「pcarx,…,sq8」

如果儲存所有的向量開銷太大, 那麼可以如下兩個操作:

1、用主成分分析來減小到x維以減小維度

2、每個向量分量的標量量化為1個位元組

如果非常非常在意,那麼應該使用 「opqx_y,…,pqx」

問題三:根據資料集的大小,應該怎麼選擇?

m=百萬個向量

b=十億個向量

如果小於1m, 應該使用 「…,ivfx,…」

如果在1m-10m, 應該使用 「…,ivf65536_hnsw32,…」

如果在10m-100m,使用"…,ivf262144_hnsw32,…"

如果在100m-1b: 「…,ivf1048576_hnsw32,…」

官網針對典型的使用者案例進行了詳細的說明

indexing 1m vectors(1百萬)

indexing 1g vectors (10億)

indexing 1t vectors (1萬億)

Faiss教程 索引 2

所有的函式都是深複製,我們不需要關心物件關係。i o函式 複製函式 index factory通過字串來建立索引,字串包括三部分 預處理 倒排 編碼。預處理支援 倒排支援 編碼支援 如 index index factory 128,opq16 64,imi2x8,pq8 16 處理128維的向量,...

Faiss建立索引並儲存(C )

faiss 建立索引並儲存。如果用indexhnswflat,就採用indexidmap進行對映。這裡的距離不是ip,是l2 include index io.h include indexivf.h include indexivfflat.h include indexhnsw.h includ...

mysql 選擇索引 mysql選擇索引

1 盡量為用來搜尋 分類或分組的資料列編制索引,不要為作為輸出顯示的資料列編制索引。最適合有索引的資料列是那些在where子句中資料列,在聯結子句 現的資料列,或者是在group by order by子句 現的資料列。select 後的資料列最好不要用索引。2 綜合考慮各資料列的維度。資料列的維度...