
Faiss 1.15.0 RaBitQ 快掃檢索 QPS 提升 80%1 比特量化向量檢索走到哪了【免費(fèi)下載鏈接】faissA library for efficient similarity search and clustering of dense vectors.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/fa/faiss向量數(shù)到 1 億、維度 768 時(shí)一份裸 float32 索引要吃掉 300 多 GB 內(nèi)存多數(shù)團(tuán)隊(duì)到這里只能接受召回與 QPS 的折中。Faiss RaBitQ 走了另一條路把每個(gè)向量壓到幾個(gè)比特讓找最近鄰?fù)嘶梢淮挝贿\(yùn)算計(jì)數(shù)問題。從 1.11.0 落地到 1.15.0它經(jīng)歷了從能用到敢上生產(chǎn)的連續(xù)迭代——1.15.0 把 RaBitQ 快掃路徑的檢索 QPS 再抬高 80%見 CHANGELOG.md 變更描述并補(bǔ)上了多比特、mmap 與 RISC-V 向量化內(nèi)核的缺口。RaBitQ 壓掉了什么300 字講清原理RaBitQRandomized Binary Quantization隨機(jī)二值量化只記錄向量經(jīng)隨機(jī)旋轉(zhuǎn)后的符號(hào)每個(gè)維度相對(duì)質(zhì)心取正還是取負(fù)1 比特。類比成記地址不寫精確坐標(biāo)只記河的哪邊、橋的哪側(cè)維度越高編碼越精細(xì)。符號(hào)本身會(huì)丟精度所以每個(gè)向量額外存了范數(shù)、量化向量與原向量的點(diǎn)積等幾個(gè)系數(shù)查詢時(shí)用系數(shù)做距離估計(jì)而非精確重算。真正讓它快的有兩件事一是隨機(jī)旋轉(zhuǎn)矩陣相當(dāng)于先把向量隨機(jī)攪勻讓符號(hào)位均勻攜帶信息避免數(shù)據(jù)分布偏斜導(dǎo)致估計(jì)誤差二是 FastScan 批打包——32 個(gè)向量的符號(hào)位被拼進(jìn) SIMD 友好的塊里CPU 一條指令處理一批。距離估計(jì)的主體是位平面上的 popcount統(tǒng)計(jì) 1 的個(gè)數(shù)這正是 AVX-512 的 vpopcntdq 指令擅長的事。實(shí)現(xiàn)見 faiss/IndexIVFRaBitQFastScan.h 與 faiss/impl/RaBitQuantizer.h。1.15.0 關(guān)鍵變更新增、優(yōu)化、修復(fù)類別變更說明優(yōu)化RaBitQ 快掃查詢初始化重構(gòu) AND 點(diǎn)積與 popcount 融合QPS 提升 80%并新增 AVX-512 LUT 量化路徑新增IndexIVFRaBitQFastScan轉(zhuǎn)換構(gòu)造函數(shù)先建 IVFRaBitQ可原地轉(zhuǎn)成 FastScan 變體新增RISC-V RVV RaBitQ 內(nèi)核RISC-V 向量指令平臺(tái)也可跑 RaBitQ新增Flat 與靜態(tài) Vamana SVS 索引的 mmap 支持用內(nèi)存映射加載大索引免去整塊反序列化進(jìn)內(nèi)存修復(fù)大 bbs 下快掃輔助偏移錯(cuò)誤批大小超過默認(rèn)值時(shí)結(jié)果會(huì)算錯(cuò)1.15.0 修正修復(fù)L2 距離估計(jì)鉗制到 ≥ 0消除舊版本偶發(fā)輸出的微小負(fù)距離怎么建 IVFRaBitQ 索引最小可運(yùn)行示例工廠字符串是最省事的入口IVF1000,RaBitQ4表示 nlist1000 的 IVF倒排文件索引先分桶再檢索配 4 比特 RaBitQ想要 SIMD 批處理就寫RaBitQfs默認(rèn) 1 比特、批大小 32。import numpy as np import faiss d, nb, nq, k 768, 200_000, 1_000, 100 xb np.random.rand(nb, d).astype(float32) xq np.random.rand(nq, d).astype(float32) index faiss.index_factory(d, IVF1000,RaBitQ4) index.train(xb) index.add(xb) params faiss.IVFRaBitQSearchParameters() params.nprobe 32 params.qb 8 # 查詢向量量化位數(shù)0 僅非 FastScan 變體支持 D, I faiss.search_with_parameters(index, xq, k, params)內(nèi)存賬可以直接算1 比特下 d768 的向量符號(hào)碼 96 字節(jié)加幾字節(jié)系數(shù)約為 float32 原尺寸的 1/30。容易踩的坑qb、nb_bits 與訓(xùn)練量?? qb 默認(rèn)值在 1.14.0 從 0 改成了 4且 FastScan 變體不支持 qb0SIMD 查找表必須用量化后的查詢。老代碼里硬編碼 qb0 的換到 RaBitQfs 路徑會(huì)直接報(bào)錯(cuò)。RaBitQ工廠串默認(rèn) 1 比特2~9 比特寫成RaBitQ4這種形式1.13.1 起支持多比特。多比特?fù)Q召回內(nèi)存按比特?cái)?shù)線性漲別默認(rèn)拉滿。訓(xùn)練樣本建議至少 39×nlist——這是 faiss k-means 每個(gè)質(zhì)心的默認(rèn)最小樣本數(shù)不夠會(huì)導(dǎo)致分桶嚴(yán)重偏斜。官方基準(zhǔn) benchs/bench_rabitq.py 用的正是 10 萬訓(xùn)練點(diǎn) nlist1000 這條下限。評(píng)估前先確認(rèn) CPU 支持 AVX2/AVX-512位平面掃描是 RaBitQ 的速度來源標(biāo)量路徑與 SIMD 差距非常大跨機(jī)器復(fù)現(xiàn)數(shù)字時(shí)先看指令集。延伸資源benchs/bench_rabitq.py官方基準(zhǔn)條件為 20 萬合成向量、d∈{256, 512, 768, 1024}、k100、nprobe∈{4, 16, 32}對(duì)照 SQ、PQFastScan、HNSW。要在自己機(jī)器上拿數(shù)照這個(gè)腳本跑最公平。tests/test_rabitq.py內(nèi)含按 RaBitQ 論文逐行翻譯的參考實(shí)現(xiàn)適合核對(duì)理解或做跨 SIMD 級(jí)別的等價(jià)校驗(yàn)。faiss/IndexRaBitQ.hqb、centered、nb_bits 等字段語義都有注釋比翻文檔快。GPU 側(cè)目前還沒有 RaBitQ 內(nèi)核上億向量想全壓到 GPU 的實(shí)用組合仍是 IVFPQFastScan。后續(xù)版本大概率繼續(xù)補(bǔ)多比特快掃融合與更廣的平臺(tái)覆蓋但 1.15.0 的 CPU 路徑已經(jīng)可以直接進(jìn)生產(chǎn)評(píng)估了?!久赓M(fèi)下載鏈接】faissA library for efficient similarity search and clustering of dense vectors.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/fa/faiss創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考