前往
大廳
主題

Faiss IndexIVFPQ encode_multiple 筆記

Alermes | 2021-06-23 17:13:47 | 巴幣 0 | 人氣 230

最近這幾天一直在弄faiss 的PQ,因為想拿被PQ量化後的資料來做實驗
原本以為應該會有個簡單的function直接把原始資料丟進去就會吐出量化後的資料,結果要自己encode再decode
稍微搜尋一下就可以在官方的github找到程式碼

很直接地寫了encoder跟decoder要放什麼進去,但很可惜的是,我實做的時候卡了超級久,一直出現問題,大概卡了四天吧,雖然也沒有一直一直在做

接著我找到了整理Faiss API的網站
可惜沒有比較清楚,但是可以跟其他的 function的輸入參數一起比對是比較確定應該要傳什麼樣的資料進去,像是size_t n就丟個正整數進去就可以了,idx_t要是int64的整數,但程式還是一直報錯
TypeError: Wrong number or type of arguments for overloaded function 'IndexIVFPQ_encode_multiple'

不出所料,在issue的地方有人有發問
有好心的強者幫忙解答了,不過解答的問題是只能encoder單一vector的encoder而不是encode_multiple,解答部分也有提到
notice `encode` **only** operate one vector; for vectors use `encode_multiple` instead
不過也很接近我遇到的問題的解答了
最重要的部分是1.要先分配記憶體給output,也就是codes這個參數,2.用faiss.swig_ptr傳指標
然後我卡在指標這邊也卡很久

encode 跟encode_multiple的差異只在前面要多傳要給PQ轉換的vector總數跟keys變成指標的形式,所有的指標都要用faiss.swig_ptr來傳
我寫的能正常運行的程式碼如下
這是從faiss的範例改的,nb=100000為data數量,xb是random出來的data vector,然後要注意float都要是float32,idx_t 的int都要是int64
這樣就可以正常執行了

----------------------------------------分隔線---------------------------------------

不過其實我到現在都還不知道Keys到底代表什麼意思,所以我只是隨便都個值進去而且,而且我確定Keys給不同值會影響很多,我只知道posting list ids for those vectors (size n)而且,但不知道posting list ids是什麼意思
如果有強者看到然後知道的話希望能教育不成材的我
謝謝看到這裡的你

創作回應

Alermes
總之keys的部分我是用compute_keys = True來讓它自己找,但還是不知道keys是什麼意思
2021-06-30 12:11:13
Alermes
index.encode_multiple(nb, faiss.swig_ptr(list_nos), faiss.swig_ptr(xb), faiss.swig_ptr(codes), compute_keys =True)
2022-02-15 14:40:40
Alermes
這樣list_nos的那個for迴圈就可以拿掉,雖然那邊本來就是拿來測試的就是了
2022-02-15 14:42:20

更多創作