多模态语义检索 | 基于 MetaSpore 快速部署 HuggingFace 预训练模型
首先,附上 Github 鏈接MetaSpore:https://github.com/meta-soul/MetaSpore,可搜索公眾號元靈數智,在底部菜單了解我們 - 用戶交流獲取官方技術交流群二維碼,進群與業內大佬進行技術交流。
隨著深度學習技術在計算機視覺、自然語言處理、語音理解等領域不斷取得創新性突破,越來越多的非結構化數據被機器進行感知、理解和加工。這些進展主要得益于深度學習的強大表征學習能力,通過在海量數據上對深度模型進行預訓練,使得模型捕捉到數據內在模式,進而對大量下游任務帶來幫助。隨著工業界和學術界投入越來越多精力在預訓練技術研究上,陸續出現了 HuggingFace 和 Timm 這樣的預訓練模型分發倉庫,預訓練大模型紅利正在被開源社區以前所未有的速度在釋放著。
近年來機器建模和理解的數據形態逐漸從單模態向多模態演進,不同模態之間的語義鴻溝正在消弭,使得跨模態檢索落地成為可能。以 OpenAI 的開源工作 CLIP 為例,在 4 億圖文數據集上對圖文雙塔模型進行預訓練,將圖像和文本之間的語義銜接了起來,學術界已經有不少研究人員在基于這項技術解決圖文生成、檢索等多模態問題。回到工業界來看,雖然前沿技術打通了多模態數據之間的語義鴻溝,但依然存在繁復的模型調優、離線數據處理、高性能的線上推理架構設計、異構計算以及在線算法應用落地等多個流程和挑戰,這些都阻礙了前沿多模態檢索技術的落地和普惠。
北京數元靈科技針對以上技術痛點,對模型訓練優化、線上推理、算法實驗等多個環節進行抽象統一,形成一套可以快速應用離線預訓練模型到線上的解決方案。本文將向大家介紹,如何基于 MetaSpore 技術生態來使用 HuggingFace 社區預訓練模型進行線上推理和算法實驗,讓預訓練模型紅利更充分釋放到工業界、普惠到中小企業的具體業務中,并且我們會給出以文搜文和以文搜圖兩個多模態檢索演示樣例供大家參考。
1.多模態語義檢索
本文介紹的多模態檢索演示樣例架構如下:
我們的多模態檢索系統同時支撐以文搜文和以文搜圖應用場景,含有離線處理、模型推理以及在線服務等核心模塊:
1.離線處理,含有以文搜文和以文搜圖不同應用場景的離線數據處理流程,包括模型調優、模型導出、數據索引建庫、數據推送等。
2.模型推理,離線模型訓練完畢之后,我們基于 MetaSpore Serving 框架,部署我們的 NLP、CV 大模型,MetaSpore Serving 可以幫助我們方便地進行在線推理、彈性調度、負載均衡,以及在異構環境中進行資源調度。
3.在線服務,我們基于 MetaSpore 在線算法應用框架,打造了一套完整可重用的在線檢索服務,包括:前端檢索 UI、多模態數據預處理、向量召回和排序算法、AB 實驗框架等,同時支撐以文搜文和以文搜圖場景,并可低成本遷移到其它應用場景。
一般來說,對于類似的多模態檢索問題,HuggingFace 開源社區已經提供了很多優秀的基線模型,工業界的實際優化往往也是以此為起點。我們在以文搜文和以文搜圖的線上服務中同樣使用了 HuggingFace 社區的預訓練模型,其中以文搜文基于我們調優的問答領域語義相似模型,以文搜圖基于開箱即用的社區預訓練模型。
這些社區開源預訓練模型會被導出為通用 ONNX 格式,并載入 MetaSpore Serving 進行在線推理,下文會對模型的導出上線、數據的檢索建庫以及在線檢索算法服務等內容展開詳細的介紹。其中模型推理的部分,是標準化的 SAAS 服務,和業務的耦合性較低,感興趣的讀者可以參考我們之前的公眾號文章:揭秘!新一代一站式機器學習平臺MetaSpore的設計理念。
1.1 離線處理
離線處理主要涉及到上線模型的導出和載入以及文檔庫的索引建庫和推送,大家可以按照下文逐步指引來完成以文搜文和以文搜圖檢索的離線處理工作,通過這兩個樣例大家也可以了解離線預訓練模型是怎樣實現在 MetaSpore Serving 上推理的。
1.1.1 以文搜文
傳統的文本檢索系統基于 BM25 之類的字面匹配算法實現,由于用戶表達 query 查詢詞多種多樣,往往會遇到查詢詞跟文檔之間語義鴻溝的問題,比如用戶把 “iPhone” 錯拼為 “Ihone”、查詢詞極為長尾 “1~3月齡男嬰秋季小尺碼包包褲”等,傳統文本檢索系統會利用拼寫糾錯、同義詞擴展、查詢詞改寫等手段來緩解語義鴻溝問題,但未能從根本上解決這個問題。檢索系統只有充分理解了用戶查詢詞和文檔的語義,才能夠在語義層面滿足用戶的檢索訴求,近年來隨著預訓練和表征學習技術不斷進步,一些商業搜索引擎不斷將基于表征學習的語義向量檢索方法融入到檢索生態中。
語義檢索模型
本文介紹的以文搜文是一套完全基于語義向量檢索的應用,我們以百科問答數據為基礎,構建了一套問答語義檢索系統。我們采用了 Sentence-BERT 模型作為語義向量表示模型,該模型通過監督或無監督方式來對雙塔 BERT 進行微調,使得模型更適配檢索任務,模型結構如下:
以文搜文問答檢索在這里使用的是 query-doc?對稱雙塔模型,也即線上 query 的向量表示和離線 doc 的向量表示共用一個向量表示模型,因此一定要保證離線 doc 建庫模型和在線 query 推理模型的一致性。這里使用了我們在開源語義相似數據集上調優的文本表示模型 sbert-chinese-qmc-domain-v1,離線建庫時問答數據會被該模型表示為向量,在線檢索時也是用該模型來把用戶查詢 query 表示為向量,這樣保證了 query-doc 在同一個語義空間中,用戶語義檢索訴求可以用向量相似度量計算得到保證。
由于文本表示模型要在線上對 query 進行向量編碼,因此我們需要導出該模型,以供在線服務使用。進入問答數據的建庫代碼目錄,參照說明文檔將模型導出,在腳本中會利用 Pytorch 的 Tracing 機制來完成導出。模型將被導出到 ./export 目錄,導出內容主要有線上推理使用的 ONNX 模型和預處理模型 Tokenizer 以及有關配置文件,導出模型會被下文介紹的線上服務體系載入到 MetaSpore Serving 中進行模型推理(注:由于導出模型會被拷貝到云存儲,需要在 env.sh 中配置相關變量)。
文本搜索建庫
以文搜文檢索基于百萬級百科問答數據集來構建檢索庫,大家需要下載此數據并根據說明文檔完成建庫,問答數據會被離線模型編碼為向量,然后建庫數據將被推送到服務組件中。整個建庫過程說明如下:
1.預處理,把原始數據轉換為較為通用的 jsonline 格式以供建庫使用;
2.構建索引,使用跟線上相同的模型 sbert-chinese-qmc-domain-v1 來索引文檔(每行一個文檔對象);
3.推送倒排和正排,把倒排(向量)和正排(文檔字段)數據分別推送到各個組件服務端。
建庫數據格式樣例如下所示。離線建庫完成后,各種數據被推送到對應的服務組件中,比如 Milvus會存儲文檔的向量表示、 MongoDB會存儲文檔的摘要信息,這些服務組件會被在線檢索算法服務所調用來獲取相關數據。
# 預處理 {"id": "0", "question": "人站在地球上為什么沒有頭朝下的感覺 ", "answer": "地球上重力作用一直是指向球心的,因此<br/>只要頭遠離球心,人們就回感到頭朝上。", "category": ["教育/科學", "理工學科", "地球科學"]}# Milvus {"id": 0, "image_emb": [-0.058228425681591034, -0.006109456066042185, -0.005825215484946966,...,-0.04344896227121353, 0.004351312294602394]}# MongoDB {"question" : "人站在地球上為什么沒有頭朝下的感覺 ", "answer" : "地球上重力作用一直是指向球心的,因此<br/>只要頭遠離球心,人們就回感到頭朝上。", "category": ["教育/科學", "理工學科", "地球科學"], "queryid" : "0" }1.1.2 以文搜圖
文本和圖像對于人類來說很容易把它們的語義關聯起來,但對機器來說卻較為困難。首先從數據形式上來看,文本是基于字和詞的離散 ID 型一維數據,而圖像則是連續型的二維或三維數據;還有文本是人類主觀的創作,其表達能力極為豐富,含有各種轉折、隱喻等表述方式,而圖像則是對客觀世界的機器表示;總之,要將文本和圖像數據之間的語義鴻溝打通遠比上述以文搜文要難很多。傳統以文搜圖檢索技術,一般會依賴圖片的外部文本描述數據或者近鄰檢索技術,通過圖像關聯文本進行檢索本質上就是將問題退化為了以文搜文,但這樣也會面臨諸多問題,比如圖片關聯文本如何獲取、以文搜文本身準確度是否足夠高等等。近年深度模型逐漸從單模態向多模態演進,以 OpenAI 的開源工作 CLIP為例,通過互聯網上海量的圖文數據對模型進行訓練,將文本和圖像數據映射到同一個語義空間中,使得基于語義向量的以文搜圖技術落地成為可能。
CLIP圖文模型
本文介紹的以文搜圖基于語義向量檢索來實現,以 CLIP 預訓練模型作為雙塔檢索架構,由于 CLIP 模型已經在海量圖文數據上對雙塔的文本和圖像側模型進行了語義對齊訓練,使其特別適合以文搜圖場景,模型結構如下:
由于圖片和文本數據形態不同,以文搜圖檢索使用了 query-doc 非對稱雙塔模型,離線建庫時需要用到雙塔的圖像側模型,線上檢索時需要用到雙塔的文本側模型,最終在線檢索時文本側模型編碼 query 后會對圖像側模型的建庫數據進行查找,而圖文之間的語義相關性則由 CLIP 預訓練模型得到保證(通過在海量圖文數據上預訓練,模型能夠將圖文對在向量空間中不斷拉近)。
這里我們需要把文本側模型導出以供線上 MetaSpore Serving 推理。由于我們檢索場景是基于中文的,所以選用了支持中文理解的 CLIP 模型。模型導出的具體操作參見文末說明文檔,跟以文搜文類似,導出內容主要有線上推理使用的 ONNX 模型和預處理模型 Tokenizer,MetaSpore Serving 可以通過導出內容來載入模型推理。
圖像搜索建庫
以文搜圖檢索使用了 Unsplash Lite 圖庫數據,需要前往下載該數據并根據說明文檔指引完成建庫操作。整個建庫過程說明如下:
1.預處理,指定圖片目錄,然后生成一個較為通用的 jsonline 文件供建庫使用;
2.構建索引,使用 openai/clip-vit-base-patch32 預訓練模型對圖庫進行索引,輸出索引數據每行一個文檔對象;
3.推送倒排和正排,把倒排(向量)和正排(文檔字段)數據分別推送到各個組件服務端。
同以文搜文類似,離線建庫完成后,相關數據會被推送到服務組件,這些服務組件會被在線檢索算法服務所調用來獲取相關數據。
1.2 在線服務
整套在線服務體系架構圖如下:
多模態檢索線上服務體系,同時支撐以文搜文、以文搜圖等應用場景,整套線上服務由以下幾部分構成:
1.Query 預處理服務:對預訓練模型的預處理邏輯(含文本/圖像等)封裝,以 gRPC 接口提供服務;
2.檢索算法服務:含有 AB 實驗切流配置、MetaSpore Serving 調用、向量召回、排序、文檔摘要等整個算法處理鏈路;
3.用戶入口服務:提供檢索 Web UI 界面,便于用戶對檢索服務進行調試、問題追查。
從用戶請求視角看,以上幾個服務從后往前依次形成調用依賴關系,所以要把多模態樣例搭建起來,就需要從前往后依次把各個服務先跑起來。當然做這些之前,要記得先把離線的模型導出、上線和建庫先搞定哈!接下來我們會依此介紹在線服務體系中的各部分服務,按照下文引導一步一步把整個服務體系搭建起來,更多細節參見文末說明文檔。
1.2.1 Query 預處理服務
我們知道深度學習模型一般都是基于張量(Tensor)的運算,不過 NLP/CV 模型往往有一個前置預處理部分,這部分的功能就在于把原始的文本和圖片數據轉換為深度學習模型可接受的張量形式。比如 NLP 類模型往往有一個前置的 Tokenizer 用來把字符串類型的文本數據轉變為離散型的張量數據,還有 CV 類模型也有類似的處理邏輯會通過前置預處理來完成對輸入圖片的裁剪、縮放、變換等處理。一方面考慮到這部分預處理邏輯跟深度模型的張量推理是解耦的,另一方面深度模型的推理有基于 ONNX 獨立的技術體系,所以我們把預處理這部分邏輯拆解了出來。
在這里我們重點針對 HuggingFace NLP/CV 模型的預處理邏輯進行了拆解,目前 NLP 預處理 Tokenizer 已經整合進入了 Query 預處理服務。我們以較為通用的約定進行拆解,用戶只需要提供預處理邏輯文件實現載入和預測接口,并導出必要的數據和配置文件,就可以被載入到預處理服務中。后續 CV 預處理邏輯也將以這種方式被集成進來。
目前預處理服務對外提供 gRPC 接口調用,被檢索算法服務中的 Query 預處理(QP)模塊依賴,用戶請求到達檢索算法服務后會轉發到該服務完成數據預處理,然后再繼續后面的處理。關于預處理服務如何啟動、離線導出到云存儲的預處理模型如何進入服務以及如何調試服務等細節可以參考說明文檔。
為了進一步提升模型推理的效率和穩定性,我們正在 MetaSpore Serving 中實現 Python 預處理子模塊,可以通過用戶指定的 preprocessor.py 提供 gRPC 服務,完成 NLP 中的 Tokenizer 或者 CV 相關的預處理,將請求轉成深度模型可處理的 Tensor,然后由 MetaSpore Serving 后續子模塊進行模型推理。
這里給出我們在 GitHub 上的代碼實現:https://github.com/meta-soul/MetaSpore/compare/add_python_preprocessor
1.2.2 檢索算法服務
檢索算法服務是整個在線服務體系中的核心,負責實驗的分流,預處理、召回、排序等算法鏈組裝以及依賴組件服務的調用等。整個檢索算法服務基于 Java Spring 框架開發,同時支持以文搜文和以文搜圖多模態檢索場景,由于內部進行了較好的抽象和模塊化設計,靈活性較高,可以低成本的遷移到類似的應用場景中。
接下來簡單地向大家介紹如何配置環境把檢索算法服務搭建起來,更多細節參見說明文檔:
1.安裝依賴組件,使用 maven 來安裝 online-serving 組件
2.檢索服務配置,拷貝模版配置文件并根據開發/生產環境對里面 MongoDB、Milvus 等配置進行替換。
3.安裝配置 Consul,我們通過 Consul 來實時同步檢索服務的配置,包括實驗的切流、召回參數、排序參數等都可以通過 Consul 實時配置。當前以文搜文和以文搜圖應用的配置參數見項目中的配置文件,其中預處理和召回階段的參數 modelName 就是我們在離線處理中導出的相應模型。
4.啟動服務,上述配置完成后可以通過入口腳本來啟動檢索服務。
服務啟動后就可以進行測試啦!舉例來說,對于 userId=10 的用戶,想要查詢 “如何補辦身份證”,訪問以文搜文檢索服務:
curl -H "Content-Type: application/json" -X POST -d '{"query":"如何補辦身份證"}' http://localhost:8080/qa/user/10將得到如下檢索結果:
{"queryModel" : {"query" : "如何補辦身份證"},"searchItemModels" : [ [ {"id" : "823067","originalRetrievalScoreMap" : {"ann_matcher" : 0.9867960810661316},"finalRetrievalScore" : 3.9989876453053745,"originalRankingScoreMap" : {"dummy" : 3.9989876453053745},"finalRankingScore" : 3.9989876453053745,"score" : 3.9989876453053745,"summary" : {"question" : "怎樣補辦身份證 ","answer" : "去戶口所在地的公安局辦理 <br/>","category" : [ "生活", "美容/塑身", "化妝" ]}}, ...] ] }1.2.3 用戶入口服務
考慮到檢索算法服務是 API 接口形式,較難對問題定位追查,尤其對于以文搜圖場景能夠直觀的展現檢索結果便于檢索算法的迭代優化。為此我們針對以文搜文和以文搜圖檢索場景提供了一個輕量的 Web UI 界面,為用戶提供了一個搜索輸入框和結果展示頁面。服務基于 Flask 開發,可以方便的集成其它檢索應用,該服務會調用檢索算法服務并把返回結果展示到頁面中。
服務安裝和啟動也很方便,啟動完成后,前往 http://127.0.0.1:8090 去查看搜索 UI 服務是否運行正常,具體細節參考文末說明文檔。
多模態系統演示
當按照上述指引完成離線處理和在線服務環境配置后,我們就可以啟動多模態檢索服務啦!
可以點擊鏈接下滑至末尾查看視頻教程
多模態語義檢索 | 基于 MetaSpore 快速部署 HuggingFace 預訓練模型 (qq.com)
2.1 以文搜文—百科問答
我們進入到以文搜文應用的入口,來探究一下問答語義檢索系統,輸入 “給寶寶起名字”,檢索返回前 3 個結果都是關于給寶寶起名字相關的問答內容:
再讓我們把檢索詞加強一下,添加一個性別屬性的約束,改為 “給男孩子寶寶起名字” 來查詢一下,檢索結果可以看到有男性寶寶起名字有關的內容:
我們在繼續對檢索詞添加一個屬相約束,改為 “給男孩子寶寶起名字,屬牛”,可以看到返回第一條結果就是關于牛年男寶寶起名字的內容:
在上述示例中,我們圍繞“給寶寶起名字”這個主題,不斷對檢索詞添加約束,檢索訴求越來越精確,語義檢索系統都能夠返回相關內容。
2.2 以文搜圖—圖庫檢索
我們再進入以文搜圖應用的入口,先來輸入 “貓” ,可以看到返回結果前 3 位都是貓:
如果我們給“貓”加一個顏色約束,來檢索 “黑貓” 的話,可以看到確實返回結果是黑色的貓:
我們進一步對檢索詞加強約束,改為 “黑貓在床上”,返回結果中含有黑色貓爬在床上的圖片:
在上述示例中,我們對貓進行了顏色以及場景修飾后,依然可以通過以文搜圖系統找到相關圖片。
結束語
前沿預訓練技術打通不同模態之間的語義鴻溝,而 HuggingFace 社區又極大的降低開發人員使用預訓練模型的成本,再結合我們提供的 MetaSpore 線上推理和線上微服務的技術生態,預訓練模型不再停留于離線的淺嘗輒止,而是可以真正實現從前沿技術到工業場景的端到端落地,充分釋放預訓練大模型的紅利!未來我們會不斷完善優化 MetaSpore 技術生態:
1.更自動化、更廣泛的接入 HuggingFace 社區生態,近期我們會發布一套通用模型上線機制,使得 HuggingFace 生態接入更為方便,同時后續會把預處理服務集成到在線服務中;
2.多模態檢索離線算法優化,針對多模態檢索場景,我們會持續迭代優化離線算法組件,包含文本召回/排序模型,圖文召回/排序模型等,提升檢索算法的精度和效率。
本文中相關的代碼、參考文檔,請訪問鏈接:http://github.com/meta-soul/MetaSpore/blob/main/demo/multimodal/online/README-CN.md
部分圖片來源:
https://github.com/openai/CLIP/raw/main/CLIP.png
https://www.sbert.net/examples/training/sts/README.html
官方資料
GitHub:
LakeSou:?https://github.com/meta-soul/LakeSoul
MetaSpore:?https://github.com/meta-soul/MetaSpore
官網:元靈數智-云原生一站式數據智能平臺-北京數元靈科技有限公司 (dmetasoul.com)
官方交流群:微信群:關注公眾號,點擊“了解我們-用戶交流”或掃描下方二維碼
Slack:https://join.slack.com/t/dmetasoul-user/shared_invite/zt-1681xagg3-4YouyW0Y4wfhPnvji~OwFg
總結
以上是生活随笔為你收集整理的多模态语义检索 | 基于 MetaSpore 快速部署 HuggingFace 预训练模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql将小数取整,mysql的取整函
- 下一篇: SVN(subversion )服务端和