最近這幾天一直在弄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是什麼意思
如果有強者看到然後知道的話希望能教育不成材的我
謝謝看到這裡的你