出品 | 智東西公開課講師 | 邸志惠 京東高級算法工程師
導讀:
6月10日,京東高級算法工程師邸志惠在智東西公開課進行了CV前沿講座第八講的直播講解,主題為《大規模圖像檢索系統的挑戰與實踐》。
在本次講解中,邸志惠老師從大規模圖像檢索任務所面臨的挑戰入手,詳細解析了Vearch的原理,最後通過三個案例展示Vearch如何在實踐場景中助力深度學習應用落地。
本文為此次課程主講環節的圖文整理:
正文:
大家好,我是邸志惠,今天我要分享的主題為《大規模圖像檢索系統的挑戰與實踐》,我們會分為3個部分:
1、大規模圖像檢索任務所面臨的挑戰2、Vearch原理解析3、Vearch在深度學習場景中的實踐
大規模圖像檢索任務所面臨的挑戰
隨著深度學習技術的快速發展,它的相關應用也滲透到了我們生活的方方面面。深度學習是通過將圖片、文本、視頻等編碼成高維特徵向量來解決問題的,這就出現了海量高維特徵向量的存儲與計算問題,這些問題急需得到很好的解決。
人臉識別與拍照購場景:
智能助理與娛樂場景:
我們現在的生活已經被AI所包圍,比如早上進辦公室時,需要過人臉閘機,但就是這簡單的生活場景,想一下之前傳統的方案是什麼樣子?若有陌生人來,我們靠保安去識別時,怎麼去判斷準確性?即使保安熟悉天天進出的人,他也不會記憶這麼多人的信息,而且對每個人的精準識別也是有限的。所以,傳統的方案在應對這些場景時都是會有很大的瓶頸。然而深度學習可以利用生物特徵的唯一性以及難以作假的特性。
以上這些場景,都是新的query與資料庫中數據做搜索對比得到排序結果的應用。傳統方案是採用人工提取特徵,但是由於特徵量少,無法刻畫事物的唯一性,比如人臉識別過閘機場景,證件等外部性證明都容易作假,靠保安人員記憶,容貌相近的無關人員有可能亂入,還有銀行卡靠帳戶密碼轉帳的盜刷事件時有發生。上述杯子拍照購場景,無論搜卡通杯,還是白色陶瓷杯,還是白色卡通陶瓷杯都無法精確得到上圖結果。
深度學習的出現,通過編碼圖片、文本、視頻等的高維度信息為固定維特徵向量,使事物得到精準量化表示,導致搜索結果可以高質量精準排序。比如上述人臉場景,深層網絡會提取人臉的眼睛、鼻子、嘴巴、皮膚紋理等上萬維特徵編碼成向量來唯一刻畫人臉的唯一性。在智能助理外賣推薦場景,深層網絡可以分別把用戶畫像(口味,位置距離,性別,薪資)等多個維度的信息與商家畫像(菜品,菜價,評論,風格,距離)多個維度信息編碼成高維特徵向量,計算二者的相似度,做精準量化匹配。
但是深度學習的使用也面臨新的棘手的問題:
海量高維特徵的存儲問題 特徵向量的相似性計算搜索問題
這兩大問題,傳統資料庫是基於key/value的模糊查詢搜索原理,無法完成向量計算的操作。目前落地環節都是針對各自場景自己訓練深度學習算法,在開發對應的向量檢索系統,存在大量重複工作,這對算法工程師也不友好。目前尚沒有通用的在線解決方案,我們開源的vearch專門針對上述問題開發的在線易用的,用以解決海量特徵向量的存儲、計算、相似向量檢索問題。
Vearch原理解析
Vearch 是對大規模深度學習向量進行高性能相似搜索的彈性分布式系統,主要解決數億級別向量的存儲和計算查詢的問題。
Vearch整體架構如下:
分為三個組件:Master,Router,PartitionServer
Master:負責schema管理,集群級別的源數據和資源協調。 Router:提供RESTful API: create、delete、search、update; 請求路由轉發及結果合併。 PartitionServer(PS):基於raft複製的文檔分片;Gamma向量搜尋引擎,它提供了存儲、索引和檢索向量、標量的能力。
Vearch功能簡介
支持CPU與GPU兩種版本。 支持實時添加數據到索引。 支持單個文檔定義多個向量欄位, 添加、搜索批量操作。 支持數值欄位範圍過濾與string欄位標籤過濾。 支持IVFPQ、HNSW、二進位等索引方式。 支持內存、磁碟兩種數據存儲方式,支持超大數據規模 自研gamma引擎,提供高性能的向量檢索,同時IVFPQ倒排索引支持compaction,檢索性能不受文檔更新次數的影響 基於raft協議實現數據多副本存儲 支持內積(InnerProduct)與歐式距離(L2)方法計算向量距離
Vearch支持如下三種使用方式,同時支持分布式
Restful API Python SDK Plugin
Vearch的相關性能與效果測評
下面的性能測評有助於我們在實踐過程中根據自己的使用場景選擇合適的參數。
Nprobe實驗,由下圖可知,recall在10左右,recall與qps都能得到很好的效果。開源系統默認值為10。
IVFPQ檢索模型相關對比實驗
Ncentroids實驗,IVFPQ是適合億級別數據的檢索方式,檢索時會提前對資料庫裡的數據聚類,Ncentroids是聚類的質心個數,大家可根據自己的使用場景及數據量手動設置如下指標。
IVFPQ檢索模型相關對比實驗
分布式測試實驗,不同線代表的是不同數據級別,綠色代表是最大的億級別的數據,藍色代表500MB的數據量,紅色代表100MB數據量,測試模型是VGG,測試集群為三臺Master,三臺Router,三臺partition。虛線部分是採用過濾欄位後的效果,可以看到QPS提高2.5倍。故在設定數據表時,如有額外可利用的欄位,一定要建進去,後續提升搜索性能。
大規模CPU伺服器集群測試
下圖是不同量級數據集在相關算法上的效率,從測評結果來看,vearch不論在大數據集還是小數據集上,都有較高召回率,表現都優於其他檢索算法。
Vearch在深度學習場景中的實踐
下文結合三個實踐場景詳細說明vearch的三個使用方式。
Vearch的安裝:
Vearch的github地址:https://github.com/vearch/vearchVearch使用文檔:https://vearch.readthedocs.io/zh_CN/latest/quick-start-guide.htmlVearch可通過編譯的方式使用restful API接口,簡單單機驗證型場景可通過Pip install vearch安裝,編譯完成後,配置如下配置文件:執行命令:./vearch -conf config.toml,同時啟動master,ps,router機器
3.1 Vearch和resnet構建圖像搜尋引擎
針對人臉識別場景,基於resnet50跟vearch四步搭建人臉識別搜索系統。需要提前訓練並已部署好的圖片特徵向量提取模型resnet50,準備好人臉資料庫。
下面以restful API使用方式展示詳細搭建步驟:
Step1:創建人臉引擎
Step2:創建人臉數據表
max_size:資料庫中數據尺寸大小
retrieval_type有IVFPQ跟HNSW以及二進位三種選擇,IVFPQ存儲的是壓縮後的特徵向量,這可以大大提升搜索效率,但是搜索精度也會有所下降,nsubvector表示壓縮後的維度設置,故IVFPQ適合數億級別數據集。HNSW是存儲原始特徵向量,故適合千萬級別數據。Ncentroids表示搜索時數據的聚類的類別數目,可根據特定場景靈活設置。
如果數據有明顯的欄位可設置的話,建議設置,比如人臉識別的性別,商品的品類等,後期搜索可大大提升檢索速度
Step3:插入人臉數據
可以單條插入也可以批量插入
Step4:查詢
查詢時可以通過設置欄位過濾的方式,極大提升搜索速度,比如人臉識別中性別欄位與年齡欄位。當查詢face是男兒童時,可以通過設置性別與年齡範圍大大縮小查詢數據集的大小,極大地提升搜索速度與效率。也可通過size欄位設置查詢結果數量。
3.2 vearch在拍照購場景搭建搜尋引擎
訓練並部署商品圖片特徵提取模型,也用上述resnet50,準備電商場景各品類商品圖片庫,採用python SDK方式搭建拍照購索索引擎,同樣四步搭建。
Step1:創建拍照購引擎
Step2:創建商品數據表
Step3:插入商品數據
Step4:查詢及結果展示
3.3 vearch的分布式使用Vearch的分布式部署如下圖,只需要修改集群配置文件,修改如果master的ip部分,並將配置文件複製到集群每臺機器中,分別在master,ps,router機器上執行對應啟動命令即可。
3.4 vearch的plugin使用方式
Plugin方式是我們針對常用文本,圖像場景內置了通用提取文本特徵的bert模型跟提取圖片特徵向量的resnet,vgg模型等常規模型,很多精確度需求不高且需要快速獲取結果的場景使用,此時引擎配置時model部分設置預置的模型即可,直接構建自己的向量資料庫進行相似性搜索即可。如下圖
Plugin使用
總結
Vearch具有實時查詢、方便維護,易於擴展等特性,同時提供了多種使用方式且部署靈活,同時支持深度學習落地絕大多數相似性向量搜索場景,不論輸入是文本、圖片、音頻還是視頻,只要能通過深度學習編碼成高維特徵向量,就可用vearch來一鍵部署對應的搜索系統。