Docker下SPTAG的安裝與測(cè)試

關(guān)于SPTAG

SPTAG是微軟開發(fā)的一款近似最近鄰搜索( approximate nearest neighbor search)的庫(kù)生巡,可以用它來做dense vector的索引。

最常見的就是圖像搜索這樣的應(yīng)用,當(dāng)然文本檢索做語(yǔ)義匹配也可以用到聊闯。


Docker 環(huán)境安裝

因?yàn)镾PTAG目前不支持mac版本史简,所以安裝在docker里面就好了。我試了一下官方的dockerfile寫的有點(diǎn)兒?jiǎn)栴}顽频,我沒運(yùn)行起來藤肢。于是打算直接建一個(gè)docker鏡像安裝。

docker run -it ubuntu:18.04 "/bin/bash"

進(jìn)入docker后運(yùn)行:

apt update
apt -y install wget build-essential openjdk-8-jdk python3-pip swig 
apt -y install software-properties-common git

安裝boost1.67

add-apt-repository ppa:mhier/libboost-latest
apt update
apt install libboost1.67 libboost1.67-dev

安裝cmake3.15.5

wget https://cmake.org/files/v3.15/cmake-3.15.5.tar.gz
tar zvxf cmake-3.15.5.tar.gz
cd cmake-3.15.5
./bootstrap
make -j2 && make install

編譯SPTAG

git clone https://github.com/microsoft/SPTAG.git
cd SPTAG && mkdir build && cd build
cmake ..
make -j2

到這里環(huán)境就算搞好了糯景。把編譯好的結(jié)果放到/app下

mkdir /app
mv Release /app

裝一下測(cè)試用到的python庫(kù)

pip3 install numpy rpyc

Docker鏡像的保存

這里算是裝好了基本的環(huán)境嘁圈,這里再把環(huán)境保存一下。

先查看一下自己的container id蟀淮。

docker ps

docker ps

我這里是:46b0c72411dc

docker commit -m "create SPTAG env" 46b0c72411dc nladuo/sptag-rpc-server:latest

再看下當(dāng)前的鏡像最住。


docker images

編寫rpc服務(wù)

因?yàn)镾PTAG不支持Mac,所以為了能在Mac上訪問怠惶,這里可以編寫一個(gè)簡(jiǎn)單的Rpc Demo服務(wù)涨缚,將接口稍微封裝一下即可。

這里代碼放到了:https://github.com/nladuo/SPTAG-rpc-service

SPTAG_rpc_demo_server.py需要放到docker中策治,SPTAG_rpc_demo_client.py則直接import到自己的包里即可脓魏。

這里我們先把之前的鏡像停掉,重新開一個(gè)帶端口映射的容器(我這里用的8888端口)通惫。

docker run -p 8888:8888 -t -i nladuo/sptag-rpc-server:latest "/bin/bash"

這里先把SPTAG_rpc_demo_server.py拷貝到新的docker容器中(注意容器的id的變化)茂翔。

docker cp SPTAG_rpc_demo_server.py 25042d741f07:/app/Release/

然后通過python運(yùn)行起來:


到這里SPTAG的rpc服務(wù)算是搞好了,我們可以摁下Ctrl+p 然后再摁下Ctrl+q把服務(wù)放到后臺(tái)運(yùn)行履腋。

測(cè)試Demo API

添加索引測(cè)試

import numpy as np
from SPTAG_rpc_demo_client import SPTAG_RpcDemoClient, DataBean

client = SPTAG_RpcDemoClient("127.0.0.1", "8888")
beans = []
for i in range(5):
    vec = i * np.ones((10,), dtype=np.float32)
    beans.append(DataBean(_id=f"s{i}", vec=vec))

index_name = "test"
print("Adding Data:", client.add_data(index_name, beans))

這里添加了5個(gè)向量珊燎,分別是10個(gè)0,10個(gè)1,..., 10個(gè)4俐末。


搜索測(cè)試

print("Test Search")
q = DataBean(_id=f"s{0}", vec=0 * np.ones((10,), dtype=np.float32))
print(client.search(index_name, [q], 3))

然后測(cè)試下搜索料按,我們搜索10個(gè)0的向量,可以看到返回的10個(gè)0(本身)的距離是0卓箫,10個(gè)1的距離為10*(1-0)^2=10载矿,10個(gè)2的距離為10*(2-0)^2=40。沒有問題

刪除數(shù)據(jù)測(cè)試

print("*"*100)
print("Test Delete:", client.delete_data(index_name, [q]))

print("*"*100)
print("Test Search After Deletion")
print(client.search(index_name, [q], 3))

刪除之后烹卒,本身不在了闷盔。第三近的變成了10個(gè)3,10*(3-0)^2=90

刪除索引測(cè)試

print("*"*100)
print("Test Delete Index:", client.delete_index(index_name))

最后是刪除索引旅急,可以看到返回結(jié)果為True逢勾,刪除成功。

真實(shí)場(chǎng)景下的接口

在真實(shí)場(chǎng)景中藐吮,

  • 1 . 索引文件可能非常大溺拱,我們不會(huì)一批一批的添加數(shù)據(jù),也不會(huì)使用網(wǎng)絡(luò)開銷很大的數(shù)據(jù)傳輸谣辞。
  • 2 . 每次搜索時(shí)候不會(huì)每次都重新導(dǎo)入index迫摔,然后再調(diào)用搜索。

基于以上兩個(gè)缺陷泥从,這里我想到了以下解決方法:

  • 1 . 針對(duì)索引的很大的問題句占,直接使用SPTAG提供的indexbuilder工具建立索引。
  • 2 . 對(duì)于搜索問題躯嫉,直接編寫一個(gè)專門的搜索服務(wù)接口纱烘,在剛啟動(dòng)的時(shí)候就導(dǎo)入index。(如有需要可以對(duì)索引做定期更新祈餐,而非每次都重新加載)

通過indexbuilder建立索引

這里先導(dǎo)出一批測(cè)試數(shù)據(jù)到test_index_input.txt

import numpy as np

with open("test_index_input.txt", "w") as f:
    for i in range(5):
        _id = f"s{i}"
        vec = i * np.ones((10,), dtype=np.float32)
        vec_str = "|".join([str(i) for i in vec.tolist()])
        f.write(f"{_id}\t{vec_str}\n")

然后把test_index_input.txt放到docker里面

然后進(jìn)入到/app/Release目錄建立索引

cd /app/Release
./indexbuilder -d 10 -v Float  -i ./test_index_input.txt -o data/test_index -a BKT -t 2 Index.DistCalcMethod=L2

測(cè)試搜索服務(wù)

然后和上面的demo API類似擂啥,這里我編寫了個(gè)search API。還是在這個(gè)項(xiàng)目里:https://github.com/nladuo/SPTAG-rpc-service

SPTAG_rpc_search_server.py需要放到docker中昼弟,SPTAG_rpc_search_client.py則直接import到自己的包里即可啤它。

這里把SPTAG_rpc_search_server.py放到/app/Release目錄后,啟動(dòng)起來舱痘。

python3 SPTAG_rpc_search_server.py -i test_index

然后再測(cè)一下搜索客戶端变骡。



和之前的一樣,沒問題芭逝。

到這里SPTAG的安裝和測(cè)試就結(jié)束了塌碌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旬盯,隨后出現(xiàn)的幾起案子台妆,更是在濱河造成了極大的恐慌翎猛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件接剩,死亡現(xiàn)場(chǎng)離奇詭異切厘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懊缺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門疫稿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹃两,你說我怎么就攤上這事遗座。” “怎么了俊扳?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵途蒋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我馋记,道長(zhǎng)号坡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任梯醒,我火速辦了婚禮筋帖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冤馏。我一直安慰自己,他們只是感情好寄啼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布逮光。 她就那樣靜靜地躺著,像睡著了一般墩划。 火紅的嫁衣襯著肌膚如雪涕刚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天乙帮,我揣著相機(jī)與錄音杜漠,去河邊找鬼。 笑死察净,一個(gè)胖子當(dāng)著我的面吹牛驾茴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氢卡,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼锈至,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了译秦?” 一聲冷哼從身側(cè)響起峡捡,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤击碗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后们拙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稍途,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年砚婆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了械拍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡射沟,死狀恐怖殊者,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情验夯,我是刑警寧澤猖吴,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站挥转,受9級(jí)特大地震影響海蔽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绑谣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一党窜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧借宵,春花似錦幌衣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至欲间,卻和暖如春楚里,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猎贴。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工班缎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人她渴。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓达址,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親趁耗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苏携,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349