← 返回卷宗
隨意雜談

高維數據檢索的一些算法庫

人工智能
對向量進行索引化是實際使用中的必然需求,按ann-benchmarks上的benchmark看,考察如下的算法庫 Annoy FLANN scikit-learn: LSHForest, KDTree, BallTree PANNS NearPy KGraph NMSLIB (Non-Metric Space Library): SWGraph, HNSW, BallTree, MPLSH hnswlib (a part of nmslib project) RPForest FAISS DolphinnPy Datasketch PyNNDescent MRPT NGT: ONNG, PANNG SPTAG PUFFINN N2 ScaNN 綜合比較來看,常見的annoy算法庫是最為中規中矩的,並非是其中最優秀的,比較穩定的而優異的應當是NGT的PANNG算法,還有NMSLIB中的HNSW算法,尤其是NGT的PANNG算法,在Last.fm的50000次測試中表現仍然很優異,召回率很優秀,其它的各項測試中也比較穩健。 從Issue裡看到有人指出,如果採用多核進程進行運算,很多結果會有不同,一個典型的是HNSW算法會出現大幅度的提升,hnsw還有一個ivf-hnsw的改進算法,可以用於在20G內存以下的機器上實現不錯的結果。 根據這個測試,一些其它算法也在被推薦,例如純C++的實現的NSG算法,不過已經兩年沒去跟進了,看作者的github主頁上表現性能也相當優秀,並用淘寶的數據做了測試。 還有一個叫Product-Quantization-Tree算法的,雖然作者沒有提供圖表,但它是一個GPU實現的方案,可能會有不錯的性能,但硬件依賴似乎有些過強了,畢竟現在GPU成本不低。 在ANN算法之外的,有個叫libnabo的算法庫,聲稱要普遍比ANN算法更快20%以上,並且支持python。 在這些評測之外的,京東的vearch作為分佈式向量搜索系統,按其自身說法,不僅性能優秀,重點是可以進行分佈式搜索,提供了restful的請求接口,基本上屬於開箱即用,可以直接拿來就行。 而在vearch之外的, Milvus也頗具名聲,在GPU的支持下,甚至可以16G的PC上實現輕鬆的億級搜索。 常用的Annoy雖然性能中規中矩,但它有一個非常大的優勢就是內存佔用最小,如果不是極為高頻的數據請求,它可以在低內存的機器上表現良好。

本文由 三符道長 撰於 2020年8月9日。轉載請註明出處。