1.index_file_size
在Milvus 配置的最佳實踐中,介紹了一些 Milvus 0.6.0 配置的最佳實踐。在這篇文章中,我們也將介紹一些在 Milvus 客戶端設置關鍵參數的最佳實踐,這些操作包括創建表、創建索引和搜索。這些參數會影響搜尋效能。
1.index_file_size
創建表時,index_file_size 參數用來指定用來儲存資料的單一檔案的大小,單位是 MB。預設值為 1024。在匯入向量資料時,Milvus 會以增量方式將資料合併到檔案中。當檔案大小達到 index_file_size 時,這個檔案不接受新的資料,Milvus 會將新的資料儲存到另一個檔案。這些都是原始資料檔案。建立索引時,Milvus 會為每個原始資料檔案產生一個索引檔案。對於 IVFLAT 索引類型,索引檔案大小大約等於相對應的原始資料檔案大小。對於 SQ8 索引,索引檔案大小約為對應原始資料檔案的 30%。
在搜尋過程中,Milvus 會逐一搜尋每個索引檔案。根據我們的經驗,當 index_file_size 從 1024 變更為 2048 時,搜尋效能會提升 30% 到 50%。然而,如果值太大,大檔案可能無法載入 GPU 記憶體 (甚至 CPU 記憶體)。例如,如果 GPU 記憶體是 2 GB,而 index_file_size 是 3 GB,索引檔案就無法載入 GPU 記憶體。通常,我們會將 index_file_size 設定為 1024 MB 或 2048 MB。
下表顯示使用 sift50m 對 index_file_size 進行的測試。索引類型為 SQ8。
1-sift50m-test-results-milvus.png
我們可以看到,在 CPU 模式和 GPU 模式下,當 index_file_size 為 2048 MB 而非 1024 MB 時,搜尋效能顯著提升。
2.nlist
和 nprobe
nlist
參數用於建立索引,而nprobe
參數用於搜尋。IVFLAT 和 SQ8 都使用聚類演算法將大量向量分割成群組,或稱為 bucket。nlist
是聚類時的 bucket 數量。
使用索引搜尋時,第一步是找出一定數量最接近目標向量的 buckets,第二步則是依向量距離從這些 buckets 中找出最相似的 k 個向量。nprobe
是第一步中的 buckets 數量。
一般而言,在聚類過程中,增加nlist
會導致更多的桶和桶中更少的向量。因此,計算負載會減少,搜尋效能也會提高。然而,由於比較相似性的向量較少,可能會遺漏正確的結果。
增加nprobe
會導致需要搜尋更多的資料桶。因此,計算負載會增加,搜尋效能會降低,但搜尋精確度會提高。不同的資料集分佈情況可能不同。設定nlist
和nprobe
時,您也應該考慮資料集的大小。一般而言,建議nlist
可以是4 * sqrt(n)
,其中 n 是向量的總數。至於nprobe
,您必須在精確度和效率之間作出取捨,最好的方法是透過試誤來決定數值。
下表顯示使用 sift50m 對nlist
和nprobe
進行的測試。索引類型為 SQ8。
sq8-index-test-sift50m.png
該表格比較使用nlist
/nprobe
的不同值的搜尋效能和精確度。只顯示 GPU 的結果,因為 CPU 和 GPU 的測試結果相似。在此測試中,當nlist
/nprobe
的值增加相同的百分比時,搜尋精確度也會增加。當nlist
= 4096 且nprobe
為 128 時,Milvus 的搜尋效能最佳。總括而言,在決定nlist
和nprobe
的值時,您必須考慮不同的資料集和需求,在效能和精確度之間作出權衡。
總結
index_file_size
:當資料大小大於index_file_size
時,index_file_size
的值越大,搜尋效能越好。nlist
和nprobe
:您必須在效能和精確度之間作出取捨。
- 2.nlist 和 nprobe
- 總結
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word