文章目錄
0 概述
Vearch 對大規模深度學習向量進行高效相似搜索的彈性分佈式系統。
參考文檔:
- github地址:https://github.com/vearch/vearch
- 中文文檔:https://vearch.readthedocs.io/zh_CN/latest/overview.html
參考實例:
- 官方部署實例:https://github.com/vearch/vearch/blob/master/docs/Quickstart.md
- 中文大佬ansj的文章:https://my.oschina.net/ansj/blog/3117596
1 安裝
由於公司服務器不能上網,所有操作儘量離線安裝。
參考:官方安裝部署教程:https://github.com/vearch/vearch/blob/master/docs/Deploy.md
參考:官方安裝部署教程:https://vearch.readthedocs.io/zh_CN/latest/quick-start-guide.html
1.1 安裝anaconda
參考《linux安裝jdk以及eclipse,安裝Anaconda與pyChram》 https://blog.csdn.net/u012052268/article/details/77160683
安裝完成後,別忘記配置環境變量:
vi ~/.bashrc
加入以下幾句話:
PATH=/home/myName/anaconda3/bin:$PATH
export PATH
使配置生效:
source ~/.bashrc
1.2 安裝docker
按照文章《20191120離線安裝docker》的方式安裝好docker。
並下哦那個docker hub離線下載鏡像 vearch_env
。這個鏡像是編譯 vearch的基礎環境,有了它就不用裝哪些那七八糟的東西了。
1.3 安裝vearch
1.3.1 下載vearch源碼
cd /home/vearch
1.3.2 準備編譯環境
docker pull ansj/vearch_env:0.3 # 或者 從離線的地方load進來,有了vearch_env 就可以編譯vearch了
1.3.3 運行
cd vearch/cloud/
bash run_docker.sh
這個打包命令將進行一下所有操作(1.2.3.1-1.2.3.4),以下的都不用做了。
如果啓動成功你將會看到如下信息:
2019/10/15 04:58:13 startup.go:63: [INFO] start server by version:[0.1] commitID:[3a0ed89b690ea2cf566a45fc5681b0a1ca170726]
2019/10/15 04:58:13 startup.go:72: [INFO] The Config File Is: /vearch/config.toml
2019/10/15 04:58:13 startup.go:76: [INFO] The configuration content is:
打開瀏覽器訪問 http://127.0.0.1:8817/ (或者 服務器地址加8817)可以看到下圖說明啓動是ok的:
1.3.3.1 編譯Vearch
docker pull ansj/vearch_env # 或者 從離線的地方load進來,有了vearch_env 就可以編譯vearch了
cd vearch/cloud/
bash compile.sh
這一步將自動生成容器vearch_env,運行docker ps -a
命令可以看到;
並在vearch_env的容器中編譯vearch代碼;
然後自動把編譯後的代碼拷貝出容器 到宿主機的:$vearch/build/bin
,$vearch/build/lib
文件夾中。
1.3.3.2 創建vearch可運行鏡像
# 繼續在cloud文件夾中:
bash build.sh
這一步會得到一個vearch的docker鏡像iamge。分爲7步:
- 構建centos7 基礎環境
- Step 2/7 : ADD compile/bin /vearch/bin/
- Step 3/7 : ADD compile/lib /vearch/lib/
- Step 4/7 :
ENV MASTER_NAME="___MASTER_NAME___"
- Step 5/7 :
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/vearch/lib/"
- Step 6/7 : RUN yum install -y libgomp blas-devel lapack-devel
- ENTRYPOINT ["/vearch/bin/vearch","-conf" ,"/vearch/config.toml","-master","$MASTER_NAME"]
運行docker images
命令可以看到,多了一個ansj/vearch:0.3
的image
1.3.3.3 copy exaple配置文件過來作爲單機配置
# 繼續在cloud中
cat ../config/config.toml.example > config.toml
1.3.3.4 啓動Vearch
# 直接運行
docker run -it -p 8817:8817 -p 9001:9001 -p 2378:2378 -p 2390:2390 -p 2370:2370 -p 6062:6062 -p 8818:8818 -p 6061:6061 -p 8081:8081 -p 8898:8898 -p 8899:8899 -p 6060:6060 -v $PWD/config.toml:/vearch/config.toml ansj/vearch:0.3 all
### 其實 單機模式中 只對外暴露 8817、9001 兩個端口即可運行。
### 但是爲了以後分佈式部署方便。 把所有使用到的端口 都暴露出來。這樣,多臺機器之間的數據連接端口無障礙。
1.3.4 運行圖像檢索插件
這裏會調用 python環境 以及訓練好的VGG16模型。 所以需要安裝一些python包,提前安裝好的可以忽略:
- shortuuid
- opencv-python-4.1.1.26
- opencv-python_headless (一定要裝,否則會報
ImportError: libSM.so.6
錯誤) - msgpack
- torch1.2 (一定要在官網 安裝cpu版本啊 血的教訓)
- torchvision 0.4 (一定要在官網 安裝cpu版本啊 血的教訓)
- pytorch官網上下載的
vgg16.pth
放到~/.cache/torch/checkpoints/
裏面 - 下載yolov3.weights 放入
/home/CVpy36/xuqingtang/vearch/plugin/model/
以上環境準備好了,啓動圖片插件
cd /home/vearch/vearch/plugin
nohup ./bin/run.sh image &
看到 ↓ 信息就成功了:
load model success
或者進入src直接運行python文件
cd /home/vearch/vearch/plugin/src
nohup python main.py --model_name=image_retrieval &
這個插件寫好了flask接口,所有的請求通過4101訪問,不用8817了。
2 測試使用
參考:
- https://github.com/vearch/vearch/blob/master/docs/Quickstart.md
- https://github.com/vearch/vearch/blob/master/docs/APIVisualSearch.md
- https://vearch.readthedocs.io/zh_CN/latest/use_op/op_db.html
2.1 建庫建表:
建立一個名爲testDb 的庫,其中有名爲 testSpace的表;
並且使用 vgg16 建模。
curl -XPOST -H "content-type:application/json" -d '{
"db": true,
"method": 0,
"columns": {
"imageurl": {
"type": "keyword"
},
"boundingbox": {
"type": "keyword"
},
"label": {
"type": "keyword"
}
},
"feature": {
"type": "vector",
"filed": "imageurl",
"model_id": "vgg16",
"dimension": 512
}
}' http://127.0.0.1:4101/testDb/testSpace/_create
如果成功之後,會返回:
{"code": 200, "db_msg": "success", "space_msg": "success"}
2.2 刪除表格
curl -XPOST -H "content-type:application/json" -d '{
"db": false,
"space": true
}' http://127.0.0.1:4101/test/test/_delete
成功的響應如下所示:
{"code": 200, "db_msg": null, "space_msg": "success"}
2.3 數據插入
- 單條數據插入:
# single insert
curl -XPOST -H "content-type:application/json" -d '{
"imageurl": "../images/image_retrieval/test/COCO_val2014_000000123599.jpg",
"detection": false,
"boundingbox": "10,10,290,290",
"label": "coat"
}' http://127.0.0.1:4101/test/test/_insert
返回值爲:
{"db": "testDb", "space": "testSpace", "ids": [{"AW3tYgdsAkKsEQACQOnu": "successful"}], "successful": 1}
- csv批量導入演示的方法:
# bulk insert
curl -XPOST -H "content-type:application/json" -d '{
"method": "bulk",
"imageurl": "../images/image_retrieval/test.csv",
"detection": true
}' http://127.0.0.1:4101/test/test/_insert
imageurl 字段可以直接輸入base64字符串
2.4 嘗試圖片搜索
curl -XPOST -H "content-type:application/json" -d '{
"imageurl": "http://www.gming.org/uploadfile/2015/0914/20150914104444833.jpg",
"size": 5
}' http://127.0.0.1:4101/testDb/testSpace/_search
size爲你想獲取的幾個返回值。
插件內部編寫了多種圖像輸入格式,所以可以
- 使用base64編碼的本地圖像進行搜索;
- 也可以使用圖像URI搜索可公開訪問的在線圖像
- 或存儲在本地圖像文件夾中的圖像。
搜索結果看起來像這樣:
2.5 刪除數據
使用以下curl命令按ID刪除記錄
# request
curl -XDELETE http://127.0.0.1:4101/test/test/AWz2IFBSJG6WicwQVTog
# response
{
"code": 200,
"msg": "success"
}
2.6 Update record by ID
# request
curl -XPOST -H "content-type:application/json" -d '{
"imageurl": "../images/image_retrieval/test/COCO_val2014_000000123599.jpg",
"detection": true
}' http://127.0.0.1:4101/test/test/_update?id=AWz2IFBSJG6WicwQVTog
# response
{
"db": "test",
"space": "test",
"ids": [
{
"AWz2IFBSJG6WicwQVTog": "successful"
}
],
"successful": 1
}