🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI

1.index_file_size

  • Engineering
February 26, 2020
milvus

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 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 會導致需要搜尋更多的資料桶。因此,計算負載會增加,搜尋效能會降低,但搜尋精確度會提高。不同的資料集分佈情況可能不同。設定nlistnprobe 時,您也應該考慮資料集的大小。一般而言,建議nlist 可以是4 * sqrt(n) ,其中 n 是向量的總數。至於nprobe ,您必須在精確度和效率之間作出取捨,最好的方法是透過試誤來決定數值。

下表顯示使用 sift50m 對nlistnprobe 進行的測試。索引類型為 SQ8。

sq8-index-test-sift50m.png sq8-index-test-sift50m.png

該表格比較使用nlist/nprobe 的不同值的搜尋效能和精確度。只顯示 GPU 的結果,因為 CPU 和 GPU 的測試結果相似。在此測試中,當nlist/nprobe 的值增加相同的百分比時,搜尋精確度也會增加。當nlist = 4096 且nprobe 為 128 時,Milvus 的搜尋效能最佳。總括而言,在決定nlistnprobe 的值時,您必須考慮不同的資料集和需求,在效能和精確度之間作出權衡。

總結

index_file_size:當資料大小大於index_file_size 時,index_file_size 的值越大,搜尋效能越好。nlistnprobe:您必須在效能和精確度之間作出取捨。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

繼續閱讀