圖像搜索的新紀(jì)元:Milvus與CLIP模型相伴的搜圖引擎
1 背景介紹
??作為電商公司的風(fēng)控部門,承擔(dān)著維護(hù)平臺(tái)內(nèi)容安全的職責(zé)。因?yàn)檎叩恼{(diào)整,或者一些突發(fā)情況,我們需要回溯線上歷史的商品圖片、用戶頭像信息等,確保平臺(tái)的圖片內(nèi)容的合規(guī)性。??在以前我們會(huì)讓算法同學(xué)離線將平臺(tái)數(shù)據(jù)用相關(guān)的模型跑一遍,但是這會(huì)用到大量的計(jì)算資源,并且會(huì)花費(fèi)幾天甚至更長(zhǎng)的時(shí)間。??我們是否有更便捷的辦法對(duì)圖片做搜索,比如像普通的數(shù)據(jù)庫那樣,通過內(nèi)容甚至另一張圖去搜索圖片呢?可否將文本、圖片等信息轉(zhuǎn)換成另一種可以對(duì)比,可以計(jì)算的形式呢???解決方案:可以通過深度模型提取出圖像的特征向量,建立向量庫,然后用目標(biāo)文本或圖片的特征向量進(jìn)行搜索匹配,得出最接近的結(jié)果。CLIP模型提供了生成文本和圖片特征向量的能力,Milvus向量數(shù)據(jù)庫提供了對(duì)海量向量的存儲(chǔ)、管理和檢索能力。
圖片
2 CLIP模型
2.1 關(guān)于CLIP模型
??CLIP(Contrastive Language-Image Pretraining)模型是一種由OpenAI開發(fā)的多模態(tài)預(yù)訓(xùn)練模型,結(jié)合了圖像和文本的理解能力。CLIP的目標(biāo)是讓模型能夠理解圖片和文本之間的關(guān)聯(lián)關(guān)系,從而能夠在語言和視覺任務(wù)上表現(xiàn)出色。CLIP模型的主要作用是在圖像和文本領(lǐng)域?qū)崿F(xiàn)多模態(tài)的交叉理解能力,拓展了計(jì)算機(jī)視覺和自然語言處理的邊界,為各種任務(wù)提供了更全面和準(zhǔn)確的解決方案。
2.2 CLIP模型的應(yīng)用
??轉(zhuǎn)轉(zhuǎn)風(fēng)控主要使用CLIP對(duì)圖像根據(jù)文本提示詞進(jìn)行分類風(fēng)險(xiǎn)識(shí)別,同時(shí)因?yàn)镃LIP模型輸出為特征向量,所以同時(shí)使用Milvus向量數(shù)據(jù)庫保存這些圖片的特征向量。
圖片
3 Milvus
3.1 什么是Milvus
??Milvus是一款云原生向量數(shù)據(jù)庫,它具備高可用、高性能、易拓展的特點(diǎn),用于海量向量數(shù)據(jù)的實(shí)時(shí)召回。Milvus 基于 FAISS、Annoy、HNSW 等向量搜索庫構(gòu)建,核心是解決稠密向量相似度檢索的問題。
3.2 Milvus核心概念
非結(jié)構(gòu)化數(shù)據(jù):非結(jié)構(gòu)化數(shù)據(jù)指的是數(shù)據(jù)結(jié)構(gòu)不規(guī)則,沒有統(tǒng)一的預(yù)定義數(shù)據(jù)模型,不方便用數(shù)據(jù)庫二維邏輯表來表現(xiàn)的數(shù)據(jù),包括文本、音頻、視頻等。非結(jié)構(gòu)化數(shù)據(jù)可以使用深度學(xué)習(xí)模型或者機(jī)器學(xué)習(xí)模型轉(zhuǎn)化為向量后進(jìn)行處理。特征向量:向量又稱為embedding vector,是指由embedding技術(shù)從離散變量轉(zhuǎn)變而來的連續(xù)向量。在數(shù)學(xué)表示上,向量是一個(gè)由浮點(diǎn)數(shù)或者二值型數(shù)據(jù)組成的n維數(shù)組。向量相似度檢索:相似度檢索是指將目標(biāo)對(duì)象與數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行比對(duì),并召回最相似的結(jié)果。同理,向量相似度檢索返回的是最相似的向量數(shù)據(jù)。近似最近鄰搜索(ANN)算法能夠計(jì)算向量之間的距離,從而提升向量相似度檢索的速度。如果兩條向量十分相似,這就意味著他們所代表的源數(shù)據(jù)也十分相似。Collection-集合:包含一組Entity,可以等價(jià)于關(guān)系型數(shù)據(jù)庫系統(tǒng)中的表。Entity-實(shí)體:包含一組Field。Field與實(shí)際對(duì)象相對(duì)應(yīng)。對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫中的行。Field-字段:Entity的組成部分。Field可以是結(jié)構(gòu)化數(shù)據(jù),例如數(shù)字和字符串,也可以是向量。對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫中的表字段。Partition-分區(qū):分區(qū)是集合(Collection)的一個(gè)分區(qū)。Milvus 支持將收集數(shù)據(jù)劃分為物理存儲(chǔ)上的多個(gè)部分。索引:索引基于原始向量數(shù)據(jù)構(gòu)建,可以提高對(duì)Collection數(shù)據(jù)搜索的速度。支持倒排列表、k-d樹以及高維哈希等。這種索引結(jié)構(gòu)可以在大規(guī)模向量數(shù)據(jù)集中高效地定位相似向量。
3.3 相似性計(jì)算原理
??常用的向量相似度度量方法包括余弦相似度、歐氏距離、漢明距離等。此處以歐氏距離為例:中學(xué)學(xué)過的二維空間的歐氏距離:
圖片
三維空間的歐式距離:
圖片
以此類推,多維空間的歐式距離:
圖片
3.4 Milvus系統(tǒng)架構(gòu)
Milvus 2.0 是一款云原生向量數(shù)據(jù)庫,采用存儲(chǔ)與計(jì)算分離的架構(gòu)設(shè)計(jì),所有組件均為無狀態(tài)組件,極大地增強(qiáng)了系統(tǒng)彈性和靈活性。
圖片
整個(gè)系統(tǒng)分為四個(gè)層次:接入層(Access Layer):系統(tǒng)的門面,由一組無狀態(tài) proxy 組成。對(duì)外提供用戶連接的 endpoint,負(fù)責(zé)驗(yàn)證客戶端請(qǐng)求并合并返回結(jié)果。協(xié)調(diào)服務(wù)(Coordinator Service):系統(tǒng)的大腦,負(fù)責(zé)分配任務(wù)給執(zhí)行節(jié)點(diǎn)。協(xié)調(diào)服務(wù)共有四種角色,分別為 root coord、data coord、query coord 和 index coord。執(zhí)行節(jié)點(diǎn)(Worker Node):系統(tǒng)的四肢,負(fù)責(zé)完成協(xié)調(diào)服務(wù)下發(fā)的指令和 proxy 發(fā)起的數(shù)據(jù)操作語言(DML)命令。執(zhí)行節(jié)點(diǎn)分為三種角色,分別為 data node、query node 和 index node。存儲(chǔ)服務(wù) (Storage):系統(tǒng)的骨骼,負(fù)責(zé) Milvus 數(shù)據(jù)的持久化,分為元數(shù)據(jù)存儲(chǔ)(meta store)、消息存儲(chǔ)(log broker)和對(duì)象存儲(chǔ)(object storage)三個(gè)部分。各個(gè)層次相互獨(dú)立,獨(dú)立擴(kuò)展和容災(zāi)。
3.5 選擇Milvus的理由
高性能:性能高超,可對(duì)海量數(shù)據(jù)集進(jìn)行向量相似度檢索。Milvus不但集成了業(yè)界成熟的向量搜索技術(shù)如Faiss和SPTAG,Milvus也實(shí)現(xiàn)了高效的NSG圖索引。同時(shí),Milvus團(tuán)隊(duì)針對(duì)Faiss IVF索引進(jìn)行了深度優(yōu)化,實(shí)現(xiàn)了CPU與多GPU的融合計(jì)算,大幅提高了向量搜索性能。Milvus可以在單機(jī)環(huán)境下完成SIFT1b十億級(jí)向量搜索任務(wù)。高可用、高可靠:Milvus支持在云上擴(kuò)展,其容災(zāi)能力能夠保證服務(wù)高可用。混合查詢:Milvus支持在向量相似度檢索過程中進(jìn)行標(biāo)量字段過濾,實(shí)現(xiàn)混合查詢。開發(fā)者友好:支持多語言、多工具的Milvus生態(tài)系統(tǒng)。Milvus提供了向量數(shù)據(jù)管理服務(wù),以及集成的應(yīng)用開發(fā)SDK(Java/Python/C++/RESTful API)。相比直接調(diào)用Faiss和SPTAG那樣的程序庫,Milvus開發(fā)使用更便捷,數(shù)據(jù)管理更簡(jiǎn)單。
4 轉(zhuǎn)轉(zhuǎn)風(fēng)控的實(shí)踐
4.1 Milvus的部署方式
??Milvus支持基于Docker Compose的單例部署模式,以及基于k8s的集群部署模式。目前我們使用的是單例部署模式,1是對(duì)于我們的使用場(chǎng)景而言,單機(jī)性能目前沒有問題;2是單例部署模式更簡(jiǎn)單易上手。
4.2 特征向量的生成
??前文已經(jīng)說過我們使用CLIP模型來進(jìn)行特征向量的生成。原因主要有2個(gè),1是節(jié)省計(jì)算資源,CLIP模型已經(jīng)在線上應(yīng)用,再用其它模型進(jìn)行特征向量生成需要再進(jìn)行一次計(jì)算,浪費(fèi)計(jì)算資源;2是CLIP模型本身提供了非常好的文本和圖片交叉理解能力,為文搜圖提供了基礎(chǔ)。
4.3 索引結(jié)構(gòu)的選擇
??索引的選擇對(duì)于向量召回的性能至關(guān)重要,Milvus支持了Annoy,F(xiàn)AISS,HNSW,DiskANN等多種不同的索引,用戶可以根據(jù)對(duì)延遲,內(nèi)存使用和召回率的需求進(jìn)行選擇。對(duì)于我們的使用場(chǎng)景,我們對(duì)響應(yīng)時(shí)長(zhǎng)要求不高,主要為離線或后臺(tái)使用,但是要求100%召回,不能漏召回,所以使用近似查找的壓縮索引都不符合要求,只能使用FAISS的Flat索引。
4.4 數(shù)據(jù)過濾的實(shí)現(xiàn)
??基于產(chǎn)品的使用的數(shù)據(jù)過濾需求,以及需要對(duì)歷史數(shù)據(jù)進(jìn)行定期清理的目標(biāo),目前我們是根據(jù)時(shí)間以及數(shù)據(jù)源類型創(chuàng)建的分區(qū)。??為什么沒有使用Milvus的標(biāo)量過濾特性去做過濾呢???主要是基于性能考量,Milvus使用的是前過濾,即先做標(biāo)量過濾生成Bitset,在向量檢索的過程中基于Bitset去除掉不滿足條件的Entity。在一些場(chǎng)景下標(biāo)量過濾不僅不會(huì)加速查詢反而會(huì)導(dǎo)致性能變差。而且目前我們的過濾場(chǎng)景很確定,用指定分區(qū)來實(shí)現(xiàn)數(shù)據(jù)過濾的方式可以獲得更好的性能。
4.5 一次搜索結(jié)果展示
圖片
??圖片為以薩摩耶為搜索詞,搜索2023-11-19至2023-11-23的商品數(shù)據(jù)得出的相似度最高的top20的結(jié)果。
關(guān)于作者
許作紅,轉(zhuǎn)轉(zhuǎn)風(fēng)控后端研發(fā)工程師,主要負(fù)責(zé)風(fēng)控模型工程的開發(fā)維護(hù)。熱愛運(yùn)動(dòng),擁抱生活。