出品 | 智東西公開(kāi)課
講師 | 邸志惠 京東高級(jí)算法工程師
提醒 | 關(guān)注智東西公開(kāi)課公眾號(hào),并回復(fù)關(guān)鍵詞 CV研究08,即可獲取課件。
導(dǎo)讀:
6月10日,京東高級(jí)算法工程師邸志惠在智東西公開(kāi)課進(jìn)行了CV前沿講座第八講的直播講解,主題為《大規(guī)模圖像檢索系統(tǒng)的挑戰(zhàn)與實(shí)踐》。
在本次講解中,邸志惠老師從大規(guī)模圖像檢索任務(wù)所面臨的挑戰(zhàn)入手,詳細(xì)解析了Vearch的原理,最后通過(guò)三個(gè)案例展示Vearch如何在實(shí)踐場(chǎng)景中助力深度學(xué)習(xí)應(yīng)用落地。
本文為此次課程主講環(huán)節(jié)的圖文整理:
正文:
大家好,我是邸志惠,今天我要分享的主題為《大規(guī)模圖像檢索系統(tǒng)的挑戰(zhàn)與實(shí)踐》,我們會(huì)分為3個(gè)部分:
1、大規(guī)模圖像檢索任務(wù)所面臨的挑戰(zhàn)
2、Vearch原理解析
3、Vearch在深度學(xué)習(xí)場(chǎng)景中的實(shí)踐
大規(guī)模圖像檢索任務(wù)所面臨的挑戰(zhàn)
隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展,它的相關(guān)應(yīng)用也滲透到了我們生活的方方面面。深度學(xué)習(xí)是通過(guò)將圖片、文本、視頻等編碼成高維特征向量來(lái)解決問(wèn)題的,這就出現(xiàn)了海量高維特征向量的存儲(chǔ)與計(jì)算問(wèn)題,這些問(wèn)題急需得到很好的解決。
人臉識(shí)別與拍照購(gòu)場(chǎng)景:

智能助理與娛樂(lè)場(chǎng)景:

我們現(xiàn)在的生活已經(jīng)被AI所包圍,比如早上進(jìn)辦公室時(shí),需要過(guò)人臉閘機(jī),但就是這簡(jiǎn)單的生活場(chǎng)景,想一下之前傳統(tǒng)的方案是什么樣子?若有陌生人來(lái),我們靠保安去識(shí)別時(shí),怎么去判斷準(zhǔn)確性?即使保安熟悉天天進(jìn)出的人,他也不會(huì)記憶這么多人的信息,而且對(duì)每個(gè)人的精準(zhǔn)識(shí)別也是有限的。所以,傳統(tǒng)的方案在應(yīng)對(duì)這些場(chǎng)景時(shí)都是會(huì)有很大的瓶頸。然而深度學(xué)習(xí)可以利用生物特征的唯一性以及難以作假的特性。
以上這些場(chǎng)景,都是新的query與數(shù)據(jù)庫(kù)中數(shù)據(jù)做搜索對(duì)比得到排序結(jié)果的應(yīng)用。傳統(tǒng)方案是采用人工提取特征,但是由于特征量少,無(wú)法刻畫(huà)事物的唯一性,比如人臉識(shí)別過(guò)閘機(jī)場(chǎng)景,證件等外部性證明都容易作假,靠保安人員記憶,容貌相近的無(wú)關(guān)人員有可能亂入,還有銀行卡靠賬戶(hù)密碼轉(zhuǎn)賬的盜刷事件時(shí)有發(fā)生。上述杯子拍照購(gòu)場(chǎng)景,無(wú)論搜卡通杯,還是白色陶瓷杯,還是白色卡通陶瓷杯都無(wú)法精確得到上圖結(jié)果。
深度學(xué)習(xí)的出現(xiàn),通過(guò)編碼圖片、文本、視頻等的高維度信息為固定維特征向量,使事物得到精準(zhǔn)量化表示,導(dǎo)致搜索結(jié)果可以高質(zhì)量精準(zhǔn)排序。比如上述人臉場(chǎng)景,深層網(wǎng)絡(luò)會(huì)提取人臉的眼睛、鼻子、嘴巴、皮膚紋理等上萬(wàn)維特征編碼成向量來(lái)唯一刻畫(huà)人臉的唯一性。在智能助理外賣(mài)推薦場(chǎng)景,深層網(wǎng)絡(luò)可以分別把用戶(hù)畫(huà)像(口味,位置距離,性別,薪資)等多個(gè)維度的信息與商家畫(huà)像(菜品,菜價(jià),評(píng)論,風(fēng)格,距離)多個(gè)維度信息編碼成高維特征向量,計(jì)算二者的相似度,做精準(zhǔn)量化匹配。
但是深度學(xué)習(xí)的使用也面臨新的棘手的問(wèn)題:
海量高維特征的存儲(chǔ)問(wèn)題
特征向量的相似性計(jì)算搜索問(wèn)題
這兩大問(wèn)題,傳統(tǒng)數(shù)據(jù)庫(kù)是基于key/value的模糊查詢(xún)搜索原理,無(wú)法完成向量計(jì)算的操作。目前落地環(huán)節(jié)都是針對(duì)各自場(chǎng)景自己訓(xùn)練深度學(xué)習(xí)算法,在開(kāi)發(fā)對(duì)應(yīng)的向量檢索系統(tǒng),存在大量重復(fù)工作,這對(duì)算法工程師也不友好。目前尚沒(méi)有通用的在線(xiàn)解決方案,我們開(kāi)源的vearch專(zhuān)門(mén)針對(duì)上述問(wèn)題開(kāi)發(fā)的在線(xiàn)易用的,用以解決海量特征向量的存儲(chǔ)、計(jì)算、相似向量檢索問(wèn)題。
Vearch原理解析
Vearch 是對(duì)大規(guī)模深度學(xué)習(xí)向量進(jìn)行高性能相似搜索的彈性分布式系統(tǒng),主要解決數(shù)億級(jí)別向量的存儲(chǔ)和計(jì)算查詢(xún)的問(wèn)題。
Vearch整體架構(gòu)如下:
分為三個(gè)組件:Master,Router,PartitionServer
Master:負(fù)責(zé)schema管理,集群級(jí)別的源數(shù)據(jù)和資源協(xié)調(diào)。
Router:提供RESTful API: create、delete、search、update; 請(qǐng)求路由轉(zhuǎn)發(fā)及結(jié)果合并。
PartitionServer(PS):基于raft復(fù)制的文檔分片;Gamma向量搜索引擎,它提供了存儲(chǔ)、索引和檢索向量、標(biāo)量的能力。
Vearch功能簡(jiǎn)介
支持CPU與GPU兩種版本。
支持實(shí)時(shí)添加數(shù)據(jù)到索引。
支持單個(gè)文檔定義多個(gè)向量字段, 添加、搜索批量操作。
支持?jǐn)?shù)值字段范圍過(guò)濾與string字段標(biāo)簽過(guò)濾。
支持IVFPQ、HNSW、二進(jìn)制等索引方式。
支持內(nèi)存、磁盤(pán)兩種數(shù)據(jù)存儲(chǔ)方式,支持超大數(shù)據(jù)規(guī)模
自研g(shù)amma引擎,提供高性能的向量檢索,同時(shí)IVFPQ倒排索引支持compaction,檢索性能不受文檔更新次數(shù)的影響
基于raft協(xié)議實(shí)現(xiàn)數(shù)據(jù)多副本存儲(chǔ)
支持內(nèi)積(InnerProduct)與歐式距離(L2)方法計(jì)算向量距離
Vearch支持如下三種使用方式,同時(shí)支持分布式
Restful API
Python SDK
Plugin
Vearch的相關(guān)性能與效果測(cè)評(píng)
下面的性能測(cè)評(píng)有助于我們?cè)趯?shí)踐過(guò)程中根據(jù)自己的使用場(chǎng)景選擇合適的參數(shù)。
Nprobe實(shí)驗(yàn),由下圖可知,recall在10左右,recall與qps都能得到很好的效果。開(kāi)源系統(tǒng)默認(rèn)值為10。

IVFPQ檢索模型相關(guān)對(duì)比實(shí)驗(yàn)
Ncentroids實(shí)驗(yàn),IVFPQ是適合億級(jí)別數(shù)據(jù)的檢索方式,檢索時(shí)會(huì)提前對(duì)數(shù)據(jù)庫(kù)里的數(shù)據(jù)聚類(lèi),Ncentroids是聚類(lèi)的質(zhì)心個(gè)數(shù),大家可根據(jù)自己的使用場(chǎng)景及數(shù)據(jù)量手動(dòng)設(shè)置如下指標(biāo)。

IVFPQ檢索模型相關(guān)對(duì)比實(shí)驗(yàn)
分布式測(cè)試實(shí)驗(yàn),不同線(xiàn)代表的是不同數(shù)據(jù)級(jí)別,綠色代表是最大的億級(jí)別的數(shù)據(jù),藍(lán)色代表500MB的數(shù)據(jù)量,紅色代表100MB數(shù)據(jù)量,測(cè)試模型是VGG,測(cè)試集群為三臺(tái)Master,三臺(tái)Router,三臺(tái)partition。虛線(xiàn)部分是采用過(guò)濾字段后的效果,可以看到QPS提高2.5倍。故在設(shè)定數(shù)據(jù)表時(shí),如有額外可利用的字段,一定要建進(jìn)去,后續(xù)提升搜索性能。

大規(guī)模CPU服務(wù)器集群測(cè)試
下圖是不同量級(jí)數(shù)據(jù)集在相關(guān)算法上的效率,從測(cè)評(píng)結(jié)果來(lái)看,vearch不論在大數(shù)據(jù)集還是小數(shù)據(jù)集上,都有較高召回率,表現(xiàn)都優(yōu)于其他檢索算法。

Vearch在深度學(xué)習(xí)場(chǎng)景中的實(shí)踐
下文結(jié)合三個(gè)實(shí)踐場(chǎng)景詳細(xì)說(shuō)明vearch的三個(gè)使用方式。
Vearch的安裝:
Vearch的github地址:https://github.com/vearch/vearch
Vearch使用文檔:https://vearch.readthedocs.io/zh_CN/latest/quick-start-guide.html
Vearch可通過(guò)編譯的方式使用restful API接口,簡(jiǎn)單單機(jī)驗(yàn)證型場(chǎng)景可通過(guò)
Pip install vearch安裝,編譯完成后,配置如下配置文件:
執(zhí)行命令:./vearch -conf config.toml,同時(shí)啟動(dòng)master,ps,router機(jī)器

3.1 Vearch和resnet構(gòu)建圖像搜索引擎
針對(duì)人臉識(shí)別場(chǎng)景,基于resnet50跟vearch四步搭建人臉識(shí)別搜索系統(tǒng)。需要提前訓(xùn)練并已部署好的圖片特征向量提取模型resnet50,準(zhǔn)備好人臉數(shù)據(jù)庫(kù)。
下面以restful API使用方式展示詳細(xì)搭建步驟:

Step1:創(chuàng)建人臉引擎

Step2:創(chuàng)建人臉數(shù)據(jù)表
max_size:數(shù)據(jù)庫(kù)中數(shù)據(jù)尺寸大小
retrieval_type有IVFPQ跟HNSW以及二進(jìn)制三種選擇,IVFPQ存儲(chǔ)的是壓縮后的特征向量,這可以大大提升搜索效率,但是搜索精度也會(huì)有所下降,nsubvector表示壓縮后的維度設(shè)置,故IVFPQ適合數(shù)億級(jí)別數(shù)據(jù)集。HNSW是存儲(chǔ)原始特征向量,故適合千萬(wàn)級(jí)別數(shù)據(jù)。Ncentroids表示搜索時(shí)數(shù)據(jù)的聚類(lèi)的類(lèi)別數(shù)目,可根據(jù)特定場(chǎng)景靈活設(shè)置。
如果數(shù)據(jù)有明顯的字段可設(shè)置的話(huà),建議設(shè)置,比如人臉識(shí)別的性別,商品的品類(lèi)等,后期搜索可大大提升檢索速度

Step3:插入人臉數(shù)據(jù)

可以單條插入也可以批量插入
Step4:查詢(xún)

查詢(xún)時(shí)可以通過(guò)設(shè)置字段過(guò)濾的方式,極大提升搜索速度,比如人臉識(shí)別中性別字段與年齡字段。當(dāng)查詢(xún)face是男兒童時(shí),可以通過(guò)設(shè)置性別與年齡范圍大大縮小查詢(xún)數(shù)據(jù)集的大小,極大地提升搜索速度與效率。也可通過(guò)size字段設(shè)置查詢(xún)結(jié)果數(shù)量。
3.2 vearch在拍照購(gòu)場(chǎng)景搭建搜索引擎
訓(xùn)練并部署商品圖片特征提取模型,也用上述resnet50,準(zhǔn)備電商場(chǎng)景各品類(lèi)商品圖片庫(kù),采用python SDK方式搭建拍照購(gòu)索索引擎,同樣四步搭建。
Step1:創(chuàng)建拍照購(gòu)引擎

Step2:創(chuàng)建商品數(shù)據(jù)表

Step3:插入商品數(shù)據(jù)

Step4:查詢(xún)及結(jié)果展示

3.3 vearch的分布式使用
Vearch的分布式部署如下圖,只需要修改集群配置文件,修改如果master的ip部分,并將配置文件復(fù)制到集群每臺(tái)機(jī)器中,分別在master,ps,router機(jī)器上執(zhí)行對(duì)應(yīng)啟動(dòng)命令即可。

3.4 vearch的plugin使用方式
Plugin方式是我們針對(duì)常用文本,圖像場(chǎng)景內(nèi)置了通用提取文本特征的bert模型跟提取圖片特征向量的resnet,vgg模型等常規(guī)模型,很多精確度需求不高且需要快速獲取結(jié)果的場(chǎng)景使用,此時(shí)引擎配置時(shí)model部分設(shè)置預(yù)置的模型即可,直接構(gòu)建自己的向量數(shù)據(jù)庫(kù)進(jìn)行相似性搜索即可。如下圖

Plugin使用

總結(jié)
Vearch具有實(shí)時(shí)查詢(xún)、方便維護(hù),易于擴(kuò)展等特性,同時(shí)提供了多種使用方式且部署靈活,同時(shí)支持深度學(xué)習(xí)落地絕大多數(shù)相似性向量搜索場(chǎng)景,不論輸入是文本、圖片、音頻還是視頻,只要能通過(guò)深度學(xué)習(xí)編碼成高維特征向量,就可用vearch來(lái)一鍵部署對(duì)應(yīng)的搜索系統(tǒng)。