99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何搭建高效推薦系統(tǒng)?用Milvus和NVIDIA Merlin搭建高效推薦系統(tǒng)

NVIDIA英偉達(dá) ? 來(lái)源:NVIDIA英偉達(dá) ? 作者:NVIDIA英偉達(dá) ? 2023-11-01 09:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

如何搭建一個(gè)高效的推薦系統(tǒng)?

簡(jiǎn)單來(lái)說(shuō),現(xiàn)代推薦系統(tǒng)由訓(xùn)練/推斷流水線(pipeline)組成,涉及數(shù)據(jù)獲取、數(shù)據(jù)預(yù)處理、模型訓(xùn)練和調(diào)整檢索、過(guò)濾、排名和評(píng)分相關(guān)的超參數(shù)等多個(gè)階段。走遍這些流程之后,推薦系統(tǒng)能夠給出高度個(gè)性化的推薦結(jié)果,從而提升產(chǎn)品的用戶體驗(yàn)。

為了方便大家對(duì)此進(jìn)行深入了解,我們邀請(qǐng)到 NVIDIA Merlin團(tuán)隊(duì),他們將詳細(xì)介紹推薦系統(tǒng)的上述多個(gè)階段的工作流程,以及推薦系統(tǒng)在電商、流媒體、社交媒體等多個(gè)行業(yè)領(lǐng)域的實(shí)踐和用例。

NVIDIA Merlin & Milvus

推薦系統(tǒng) pipeline 中至關(guān)重要的一環(huán)便是為用戶檢索并找到最相關(guān)的商品。為了實(shí)現(xiàn)這一目標(biāo),通常會(huì)使用低維向量(embedding)表示商品,使用數(shù)據(jù)庫(kù)存儲(chǔ)及索引數(shù)據(jù),最終對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)進(jìn)行近似最近鄰(ANN)搜索。這些向量表示是通過(guò)深度學(xué)習(xí)模型獲取的,而這些深度學(xué)習(xí)模型基于用戶和產(chǎn)品或服務(wù)之間的交互進(jìn)行訓(xùn)練。使用計(jì)算機(jī)視覺(jué)算法或語(yǔ)言模型,還可以從各種數(shù)據(jù)模態(tài)(例如圖像、視頻或產(chǎn)品與用戶的文本描述)中生成向量表示。獲取向量表示后便迎來(lái)關(guān)鍵步驟——對(duì)數(shù)十萬(wàn)甚至數(shù)百萬(wàn)/數(shù)十億的向量嵌入數(shù)據(jù)集(例如電商庫(kù)存產(chǎn)品 embedding)進(jìn)行高效的 top-k(即 k 個(gè)最相似)搜索。

NVIDIA Merlin 是一個(gè)開(kāi)源框架,用于訓(xùn)練端到端模型,從而為各類規(guī)模的數(shù)據(jù)生成推薦,輕松集成高效的向量數(shù)據(jù)庫(kù)索引和搜索框架。而 Milvus 作為大模型時(shí)代備受關(guān)注的向量數(shù)據(jù)庫(kù)可以提供高效索引和查詢功能。

最近,Milvus 新增支持 NVIDIA GPU加速,可提升查詢的并發(fā)和速度,這對(duì)于現(xiàn)代推薦系統(tǒng)十分有用。截至 2023 年 10月,Milvus 獲得了 599 萬(wàn)次 docker pull 及 2.3 萬(wàn)顆 GitHub Star,被業(yè)界廣泛應(yīng)用。

接下來(lái),我們將演示 Milvus 是如何與 Merlin RecSys 框架集成、Milvus 如何在項(xiàng)目檢索階段與高效的 top-k 向量搜索技術(shù)相結(jié)合,以及如何在推斷時(shí)使用 NVIDIA Triton Inference Server (TIS)。根據(jù) NVIDIA 性能測(cè)試結(jié)果顯示:使用 Merlin 模型生成向量并使用 GPU 加速版的 Milvus 可以將搜索速度提升 37 至 91 倍。我們使用的 Merlin-Milvus 集成代碼和詳細(xì)性能測(cè)試結(jié)果均可在 https://github.com/bbozkaya/merlin-milvus/tree/main 處獲取。

wKgZomVBq0eAIs15AAE-CJrkfAw565.jpg

圖 1. Milvus 框架為多階段推薦系統(tǒng)的

檢索階段做出貢獻(xiàn)

挑戰(zhàn)

由于推薦系統(tǒng)具備多階段的性質(zhì)以及各種組件和庫(kù)的可用性問(wèn)題,其主要挑戰(zhàn)就是在端到端流程中無(wú)縫集成所有組件,因此我們的目標(biāo)是在示例 notebook 中盡可能簡(jiǎn)化集成工作。

另一個(gè)挑戰(zhàn)是加速整個(gè)推薦流程。雖然加速在訓(xùn)練大型神經(jīng)網(wǎng)絡(luò)中扮演著重要的角色,但 GPU 是在近期才被添加到向量數(shù)據(jù)庫(kù)和 ANN 搜索領(lǐng)域中的。隨著電商庫(kù)存產(chǎn)品、流媒體等數(shù)據(jù)規(guī)模爆炸式增長(zhǎng)和用戶數(shù)量的井噴,CPU 從性能上而言已經(jīng)無(wú)法滿足服務(wù)數(shù)百萬(wàn)用戶的推薦系統(tǒng)的需求。為了解決這個(gè)挑戰(zhàn),需要在流程的其他部分進(jìn)行 GPU 加速。本文提出的解決方案展示了 ANN 搜索時(shí)使用 GPU 加速可以有效解決這一問(wèn)題。

技術(shù)棧

正式開(kāi)始前,先介紹一下即將用到的技術(shù)棧。

首先需要一個(gè)推薦系統(tǒng)框架作為基礎(chǔ),本例中我們使用 NVIDIA Merlin,因?yàn)檫@個(gè)開(kāi)源庫(kù)提供在 NVIDIA GPU 上加速推薦系統(tǒng)的高級(jí) API (high-level API)。Merlin 可以助力數(shù)據(jù)科學(xué)家、機(jī)器學(xué)習(xí)工程師和研究人員構(gòu)建高性能推薦系統(tǒng)。除了 Merlin 以外,本例中還使用了以下開(kāi)源工具/庫(kù):

  • NVTabular:用于預(yù)處理輸入表格數(shù)據(jù)和特征工程。

  • Merlin Models:用于訓(xùn)練深度學(xué)習(xí)模型,從用戶交互數(shù)據(jù)中學(xué)習(xí)獲取用戶和商品向量。

  • Merlin Systems:用于集成基于 TensorFlow 的推薦模型與其他組件(例如特征存儲(chǔ)、Milvus 的 ANN 搜索功能),以便在 TIS 中提供服務(wù)。

  • Triton Inference Server:用于在推斷階段傳遞用戶特征向量并生成產(chǎn)品推薦。

  • 容器化:上述所有內(nèi)容都可以在 NVIDIA 提供的 NGC 目錄中獲取。本例使用 Merlin TensorFlow 23.06 容器。

  • Milvus 2.3:用于啟用 GPU 加速的向量索引和查詢。

  • Milvus 2.2.11:與上述相同,但在 CPU 上執(zhí)行向量索引和查詢。

  • pymilvus SDK:用于連接 Milvus 服務(wù)器、創(chuàng)建向量數(shù)據(jù)庫(kù)索引并通過(guò) Python 接口運(yùn)行查詢命令。

  • Feast:用作端到端 RecSys 流程中保存和檢索用戶、商品向量的(開(kāi)源)特征存儲(chǔ)。

此外,我們還用到了許多底層庫(kù)和框架。例如,Merlin 依賴于 cuDF 和 Dask 等其他 NVIDIA 庫(kù),這兩個(gè)庫(kù)均可在 RAPIDS cuDF 中獲取。同樣,Milvus 依賴于 NVIDIA RAFT 實(shí)現(xiàn) GPU 加速,HNSW 和 FAISS 等庫(kù)進(jìn)行搜索。

了解向量數(shù)據(jù)庫(kù)

ANN 搜索是關(guān)系型數(shù)據(jù)庫(kù)無(wú)法提供的功能。關(guān)系型數(shù)據(jù)庫(kù)只能用于處理具有預(yù)定義結(jié)構(gòu)、可直接比較值的表格型數(shù)據(jù)。因此,關(guān)系數(shù)據(jù)庫(kù)索引也是基于這一點(diǎn)來(lái)比較數(shù)據(jù)。但是 Embedding 向量無(wú)法通過(guò)這種方式直接相互比較。因?yàn)槲覀儾恢老蛄恐械拿總€(gè)值代表什么意思,無(wú)法使用關(guān)系型數(shù)據(jù)庫(kù)來(lái)確定一個(gè)向量是否一定小于另一個(gè)向量,唯一能做的就是計(jì)算兩個(gè)向量之間的距離。

如果兩個(gè)向量之間的距離很小,可以假設(shè)它們所代表的特征相似;如果距離很大,可以假設(shè)它們代表的數(shù)據(jù)十分不同。對(duì)我們而言,向量距離及其含義是有用的。我們可以創(chuàng)建索引結(jié)構(gòu),高效搜索這些數(shù)據(jù)。但是為向量數(shù)據(jù)構(gòu)建索引也有不小挑戰(zhàn):計(jì)算兩個(gè)向量間距離成本高昂,而且向量索引一旦構(gòu)建完成后,不易于修改。因此,我們無(wú)法直接使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)來(lái)處理向量數(shù)據(jù),需要使用專為向量數(shù)據(jù)而打造的向量數(shù)據(jù)庫(kù)。

Milvus 是一款專為向量數(shù)據(jù)處理而設(shè)計(jì)的向量數(shù)據(jù)庫(kù),可以解決傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)無(wú)法處理向量的問(wèn)題,為海量向量數(shù)據(jù)高效構(gòu)建索引。為了滿足云原生的要求,Milvus 將計(jì)算和存儲(chǔ)以及不同的計(jì)算任務(wù)(查詢、數(shù)據(jù)處理和索引)分離開(kāi)來(lái)。用戶可以根據(jù)不同的應(yīng)用靈活擴(kuò)展每個(gè)組件。無(wú)論是數(shù)據(jù)插入密集型應(yīng)用還是搜索密集型應(yīng)用,Milvus 都能夠輕松應(yīng)對(duì)。如果有大量插入請(qǐng)求涌入,用戶可以臨時(shí)水平和垂直擴(kuò)展索引節(jié)點(diǎn)以處理數(shù)據(jù)。同樣,如果沒(méi)有大量插入數(shù)據(jù),但有大量搜索操作,用戶可以減少索引節(jié)點(diǎn)的數(shù)量,并提高查詢節(jié)點(diǎn)的吞吐量。Milvus 的系統(tǒng)架構(gòu)設(shè)計(jì)(見(jiàn)圖 2)采用并行計(jì)算的思維方式,助力我們進(jìn)一步優(yōu)化本例中的推薦系統(tǒng)應(yīng)用。

wKgZomVBq0eANB9YAADyOckTW6I941.jpg

圖 2. Milvus 框架設(shè)計(jì)

此外,Milvus 還整合了許多最先進(jìn)的索引庫(kù),以便為用戶提供盡可能多的系統(tǒng)自定義功能。稍后,我們將討論這些索引的區(qū)別以及各自的優(yōu)缺點(diǎn)。

向量數(shù)據(jù)索引

大多數(shù)向量索引可以分成兩種類型——聚類和圖形。IVF 是聚類類別中的一種算法,它使用 k-means 來(lái)計(jì)算最近鄰的聚類。然后,將查詢向量與最近的質(zhì)心聚類進(jìn)行比較,并在搜索時(shí)進(jìn)行搜索。HNSW、DiskANN 和圖形類別中的其他算法主要圍繞著導(dǎo)航擴(kuò)展圖進(jìn)行搜索,這些圖形在 ANN 搜索時(shí)效率更高。但是圖形算法往往也更加復(fù)雜。如果大家對(duì)此感興趣,可以閱讀:https://zilliz.com/learn/hierarchical-navigable-small-worlds-HNSW

除了上述這些算法,還有一類叫做乘積量化 (PQ) 的算法。PQ 是一種將向量數(shù)據(jù)壓縮以減少資源使用并提高性能的方法,但其代價(jià)是降低召回率/準(zhǔn)確性。該領(lǐng)域中的大多數(shù)算法都是量化的變體,以允許降低內(nèi)存使用或提高其方法的性能。

所有這些算法和組合之間的區(qū)別是什么?為什么有這么多算法呢?它們之間的區(qū)別在于性能、召回率和內(nèi)存使用之間的權(quán)衡。例如,IVF_FLAT 索引是一個(gè)平衡了上述 3 個(gè)方面的索引,可以在不過(guò)多增加內(nèi)存開(kāi)銷的情況下以較快的速度獲得良好的結(jié)果?;趬嚎s的索引,如 IVF_SQ8 和 IVF_PQ,在速度和減少內(nèi)存使用方面更強(qiáng)大,但根據(jù)所使用的壓縮級(jí)別,會(huì)降低召回率。HNSW 則以性能和召回率為目標(biāo),但代價(jià)是內(nèi)存消耗。與其他索引相比,DiskANN 是最獨(dú)特的,因?yàn)樗且环N基于磁盤(pán)的索引。前面的索引都完全存儲(chǔ)在內(nèi)存中,需要大量的 RAM。DiskANN 只在內(nèi)存中保存少量索引數(shù)據(jù),并將大部分?jǐn)?shù)據(jù)保存在磁盤(pán)存儲(chǔ)器中,這樣可以大大減少內(nèi)存使用量,同時(shí)仍然保持較高的召回率。但是,使用 DiskANN 會(huì)降低吞吐性能,并且根據(jù)所使用的 SSD 類型,會(huì)影響延遲性能。

如今,并非只有大型用戶/公司才能訪問(wèn)非常大的數(shù)據(jù)集,小型用戶可能會(huì)從其數(shù)據(jù)中生成數(shù)十億個(gè)向量,并需要以最經(jīng)濟(jì)的方式進(jìn)行搜索。相比之下,大型用戶可能只有幾十萬(wàn)個(gè)數(shù)據(jù),每秒需要處理數(shù)萬(wàn)個(gè)查詢。為了解決這些問(wèn)題,索引層面提供很多定制化的參數(shù)來(lái)支持不同的用例。更多詳情,請(qǐng)?jiān)L問(wèn) https://milvus.io/docs/index.md 查看。

GPU vs CPU

對(duì)于大多數(shù)用戶來(lái)說(shuō),GPU 索引是獲得所需性能的關(guān)鍵。GPU 索引提供了許多用例所需的高吞吐量,同時(shí)從長(zhǎng)期而言可以節(jié)省成本。

構(gòu)建和搜索索引主要依賴向量化計(jì)算,可以在 CPU 上完成,但使用 GPU 效率大大提升。Milvus 將搜索計(jì)算遷移到 GPU 后,查詢每秒 (QPS) 的性能提高了 37 至 91 倍,性能提升非常顯著。想要獲得如此大的性能提升的唯一其他途徑就是擴(kuò)展集群規(guī)模。但是這種方式開(kāi)銷較大。通過(guò)使用 GPU,用戶可以在提升性能的同時(shí)簡(jiǎn)化集群,減少額外節(jié)點(diǎn)和調(diào)度開(kāi)銷。

然而,基于 GPU 的搜索有一個(gè)限制,那就是低并發(fā)情況。當(dāng)并發(fā)較高且在 CPU 和 GPU 內(nèi)存之間傳輸數(shù)據(jù)的減速小于搜索時(shí)間的總節(jié)省時(shí),GPU 的性能比 CPU 好得多。在低并發(fā)情況下,GPU 的延遲較大,因?yàn)?CPU 可以比將數(shù)據(jù)傳輸?shù)?GPU 再?gòu)?GPU 傳回的時(shí)間內(nèi)更快地完成搜索。

示例

我們提供的示例演示了在商品檢索階段如何集成 Milvus 與 Merlin,其中用到了來(lái)自 RecSys Challenge 2015 的真實(shí)數(shù)據(jù)集進(jìn)行訓(xùn)練。同時(shí),我們也訓(xùn)練了一個(gè)雙塔深度學(xué)習(xí)模型,用于學(xué)習(xí)用戶和商品向量。在本章節(jié)的最后,我們還會(huì)提供一些性能測(cè)試相關(guān)的信息,包括在性能測(cè)試過(guò)程中觀察的指標(biāo)和使用的參數(shù)范圍。

數(shù)據(jù)集

在集成和性能測(cè)試時(shí),我們使用了由 YOOCHOOSE GmbH 在 RecSys Challenge 2015 中提供的數(shù)據(jù)集,可在 Kaggle 上下載。這個(gè)數(shù)據(jù)集中包含了歐洲在線零售商提供的用戶點(diǎn)擊/購(gòu)買事件,其中包括與點(diǎn)擊/購(gòu)買相關(guān)的會(huì)話 ID、時(shí)間戳、商品 ID 和商品類別等信息。這些內(nèi)容均可在文件 yoochoose-clicks.dat 中獲取。各個(gè)會(huì)話都是獨(dú)立的,不考慮回購(gòu)用戶的情況。因此我們將每個(gè)會(huì)話視為屬于不同用戶的會(huì)話。該數(shù)據(jù)集包含 9,249,729 個(gè)會(huì)話(用戶)和 52,739 個(gè)商品。

工作流程主要包括:a) 數(shù)據(jù)獲取和預(yù)處理。b) 搭建雙塔深度學(xué)習(xí)模型,訓(xùn)練數(shù)據(jù)。c) 在 Milvus 向量數(shù)據(jù)庫(kù)中創(chuàng)建索引。d) 在 Milvus 向量數(shù)據(jù)庫(kù)中進(jìn)行向量相似性搜索。接下來(lái),我們會(huì)簡(jiǎn)要描述每個(gè)步驟,如果大家對(duì)每個(gè)步驟的詳情感興趣,請(qǐng)參考:https://github.com/bbozkaya/merlin-milvus/tree/main/notebooks

數(shù)據(jù)獲取和預(yù)處理

用 NVTabular 對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。這個(gè)工具利用了 Merlin 的 GPU 加速能力,是高度可擴(kuò)展的特征提取和預(yù)處理組件,能夠幫助我們輕松處理 T 太字節(jié)級(jí)別的數(shù)據(jù)集、搭建訓(xùn)練基于深度學(xué)習(xí)的推薦系統(tǒng)。

NVTabular 經(jīng)過(guò)抽象,提供一套簡(jiǎn)化的代碼,使用 RAPIDS 的 Dask-cuDF 庫(kù)在 GPU 上實(shí)現(xiàn)加速計(jì)算。用 NVTabular 將數(shù)據(jù)讀入 GPU 內(nèi)存,并按需重新排列特征,最終導(dǎo)出為 Parquet 文件。最終得到了 7,305,761 個(gè)用戶向量和 49,008 個(gè)商品向量以供后續(xù)訓(xùn)練使用。在預(yù)處理時(shí),我們還會(huì)將每列數(shù)據(jù)和值進(jìn)行分類,轉(zhuǎn)換為整數(shù)值。

模型訓(xùn)練

用 Two-Tower 深度學(xué)習(xí)模型來(lái)生成用戶和商品向量,隨后為這些向量創(chuàng)建索引并查詢向量。我們將用戶屬性(user_id, user_age)和商品屬性(item_id, item_category)輸入到 Two-Tower 模型中。這個(gè)過(guò)程中,可以選擇是否要包含一個(gè)目標(biāo)列,只包括具有正交互作用的行。模型訓(xùn)練完成后,提取學(xué)習(xí)到的用戶和商品嵌入向量。

接下來(lái)是兩個(gè)可選步驟:

1. 使用 DLRM 模型對(duì)檢索到的商品進(jìn)行排序。

2. 使用特征存儲(chǔ)(在本例中為 Feast)存儲(chǔ)和檢索用戶和商品特征。在本示例中,加入了這兩個(gè)步驟從而更為完整地展示推薦系統(tǒng)的多階段工作流程。

最后,將用戶和商品向量導(dǎo)出為 parquet 文件,稍后可以重新加載并為其在 Milvus 中創(chuàng)建向量索引。現(xiàn)在,可以啟動(dòng) Milvus 服務(wù)器并上傳商品向量、創(chuàng)建向量索引。然后,在推理時(shí)使用 NVIDIA TIS 和自定義的 Merlin 系統(tǒng) Operator 對(duì)現(xiàn)有用戶和新用戶進(jìn)行相似性搜索查詢。請(qǐng)參見(jiàn) notebook 中的第二個(gè)示例。

構(gòu)建和查詢 Milvus 索引

Milvus 通過(guò)在推理機(jī)上啟動(dòng)一個(gè)“服務(wù)器”來(lái)實(shí)現(xiàn)向量索引和相似度搜索。在 notebook 2 中,我們通過(guò) pip 安裝了 milvus 服務(wù)器和 pymilvus,然后使用默認(rèn)的監(jiān)聽(tīng)端口啟動(dòng)了服務(wù)器。接下來(lái),我們將演示如何使用兩個(gè)函數(shù) setup_milvus 和 query_milvus 來(lái)構(gòu)建一個(gè)簡(jiǎn)單的索引(IVF_FLAT)并對(duì)其進(jìn)行查詢。

當(dāng)我們將相同任務(wù)作為 TIS 框架中的多階段推理的一部分完成時(shí),事情變得更有趣了。Merlin 提供了一個(gè)高級(jí) API,Merlin Systems,允許將推薦系統(tǒng)的不同階段組合成一個(gè)單獨(dú)的鏈?zhǔn)健凹赡P汀薄R虼?,上述所有階段都在對(duì) TIS 發(fā)送的單個(gè)請(qǐng)求中執(zhí)行。在這里,我們實(shí)現(xiàn)了一個(gè)自定義的 Merlin Systems 操作符作為集成的一部分,名為 QueryMilvus。

細(xì)心的朋友可能已經(jīng)注意到,pymilvus 庫(kù)沒(méi)有使用 GPU 加速,而 NVTabular 和 Merlin Models 卻使用了 GPU。這是因?yàn)?Milvus 的 GPU 加速版本需要啟動(dòng)多個(gè)容器,而我們使用的 Merlin 容器不支持這樣做。相反,通過(guò) pymilvus,在 notebook 所在的同一個(gè)容器中將 Milvus 服務(wù)器作為一個(gè)進(jìn)程啟動(dòng)。要在 GPU 上運(yùn)行 Milvus,可以參考最新的 Milvus 發(fā)版說(shuō)明:https://github.com/milvus-io/milvus/releases/tag/v2.3.1

下面性能測(cè)試是在 GPU 上完成的,使用的是 Milvus 最新版。

基準(zhǔn)測(cè)試

為了證明使用快速高效的向量索引/搜索庫(kù)(如 Milvus)的必要性,我們?cè)O(shè)計(jì)了兩組性能測(cè)試。

1. 使用 Milvus 構(gòu)建向量索引,我們生成了兩組向量:1)針對(duì) 730 萬(wàn)個(gè)用戶向量,按照 85% 的訓(xùn)練集(用于索引)和 15% 的測(cè)試集(用于查詢)進(jìn)行劃分;2)針對(duì) 4.9 萬(wàn)個(gè)商品向量,按照 50% 的訓(xùn)練集(用于索引)和 50% 的測(cè)試集(用于查詢)進(jìn)行劃分。性能測(cè)試針對(duì)每個(gè)向量數(shù)據(jù)集獨(dú)立進(jìn)行,生成獨(dú)立的結(jié)果。

2. 使用 Milvus 構(gòu)建一個(gè)針對(duì) 4.9 萬(wàn)個(gè)商品向量數(shù)據(jù)集的索引,并基于該索引使用 730 萬(wàn)個(gè)用戶向量進(jìn)行相似性搜索。

在性能測(cè)試中,我們使用了 GPU 和 CPU 版的 IVF_PQ 和 HNSW 索引算法,并嘗試了各種參數(shù)組合。詳細(xì)信息請(qǐng)參見(jiàn):https://github.com/bbozkaya/merlin-milvus/tree/main/results

在生產(chǎn)環(huán)境中,一個(gè)重要的性能考量指標(biāo)是搜索質(zhì)量吞吐量之間的平衡(tradeoff)。Milvus 允許完全控制索引參數(shù),以探索這個(gè) tradeoff,以達(dá)到與基準(zhǔn)結(jié)果相關(guān)的更好搜索結(jié)果。這可能意味著減少吞吐率或每秒查詢數(shù)(QPS),增加計(jì)算成本。我們使用召回率指標(biāo)來(lái)衡量 ANN 搜索的質(zhì)量,并提供了 QPS -召回率曲線來(lái)展示 tradeoff。然后,您可以根據(jù)計(jì)算資源、延遲/吞吐量需求來(lái)決定可接受的搜索質(zhì)量水平。

還請(qǐng)注意我們基準(zhǔn)測(cè)試中使用的查詢批處理大?。╪q)。這在工作流中非常有用,其中會(huì)同時(shí)向推理發(fā)送多個(gè)請(qǐng)求(例如,將離線推薦請(qǐng)求發(fā)送給一系列電子郵件收件人,或者通過(guò)匯集并同時(shí)處理到達(dá)的并發(fā)請(qǐng)求生成在線推薦)。根據(jù)具體情況,TIS 還可以幫助以批處理方式處理這些請(qǐng)求。

結(jié)果

以下展示基于 CPU 和 GPU 的 3 組性能測(cè)試結(jié)果。該測(cè)試使用了 Milvus 的 HNSW(僅 CPU)和 IVF_PQ(CPU 和 GPU)索引類型。

商品向量間相似度搜索

對(duì)于給定的參數(shù)組合,將 50% 的商品向量作為查詢向量,并從剩余的向量中查詢出 top-100 個(gè)相似向量。我們發(fā)現(xiàn),在測(cè)試的參數(shù)設(shè)置范圍內(nèi),HNSW 和 IVF_PQ 的召回率很高,分別在 0.958 - 1.0 和 0.665 - 0.997 之間。這表明 HNSW 在召回率方面表現(xiàn)更好,但是 IVF_PQ 在 nlist 較小的情況下也能得到非常高的召回率。此外,召回率的值隨著索引和查詢參數(shù)的變化也會(huì)發(fā)生很大的變化。報(bào)告結(jié)果是在對(duì)一般參數(shù)范圍進(jìn)行初步實(shí)驗(yàn)并進(jìn)一步深入選擇子集之后獲得的。

在給定參數(shù)組合下,使用 HNSW 在 CPU 上執(zhí)行所有查詢的總時(shí)間范圍在 5.22 到 5.33 秒之間(在 ef 不變的情況下,隨著 m 的增大而更快),而使用 IVF_PQ 在 13.67 到 14.67 秒之間(隨著 nlist 和 nprobe 的增大而變慢)。如圖 3 所示,GPU 加速確實(shí)效果更明顯。

圖 3 顯示了在 CPU 和 GPU 上,使用 IVF_PQ 和這個(gè)小數(shù)據(jù)集時(shí)召回率和吞吐量之間的 tradeoff。我們發(fā)現(xiàn),GPU 在所有測(cè)試的參數(shù)組合下都實(shí)現(xiàn)了 4 到 15 倍的加速(隨著 nprobe 的增大而加速更明顯)。這個(gè)結(jié)果是比較每個(gè)參數(shù)組合下 GPU 的每秒查詢數(shù)與 CPU 的每秒查詢數(shù)得出的??傮w而言,這個(gè)小數(shù)據(jù)集對(duì)于 CPU 或 GPU 來(lái)說(shuō)都很容易處理,而且不難看出,還有進(jìn)一步加速空間。

wKgZomVBq0eAJE0yAACYh81VuRQ829.jpg

圖 3. 在 NVIDIA A100 GPU 上運(yùn)行

Milvus IVF_PQ 算法的GPU 加

(商品與商品相似性搜索)

用戶向量間相似性搜索

對(duì)于更大的第二個(gè)數(shù)據(jù)集(730 萬(wàn)個(gè)用戶),我們將 85%(約 620 萬(wàn)個(gè))的向量用于“訓(xùn)練”(要建立索引的向量集),剩下的 15%(約 110 萬(wàn)個(gè))作為“測(cè)試”或查詢向量集。在這種情況下,HNSW 和 IVF_PQ 表現(xiàn)非常出色,召回率分別為 0.884-1.0 和 0.922-0.999。然而,它們?cè)谟?jì)算上要求更高,尤其是在 CPU 上使用 IVF_PQ 的情況。使用 HNSW 在 CPU 上執(zhí)行所有查詢的總時(shí)間范圍為 279.89 至 295.56 秒,而使用 IVF_PQ 的總時(shí)間范圍為 3082.67 至 10932.33 秒。注意,這些查詢時(shí)間是對(duì) 110 萬(wàn)個(gè)向量進(jìn)行查詢的累積時(shí)間,因此可以說(shuō)針對(duì)索引的單個(gè)查詢?nèi)匀环浅??。然而,如果推理服?wù)器要對(duì)數(shù)百萬(wàn)個(gè)商品并發(fā)請(qǐng)求運(yùn)行查詢,不推薦使用 CPU 查詢。

使用 IVF_PQ 和 A100 GPU 時(shí),吞吐量(QPS)提升 37 至 91倍 (平均為 76.1 倍)。這與我們?cè)谛?shù)據(jù)集中觀察到的結(jié)果一致,這表明處理數(shù)百萬(wàn)向量數(shù)據(jù)時(shí),Milvus 結(jié)合 GPU 加速可以大幅提升性能。

wKgZomVBq0iAY5oLAACX0zl1eKk952.jpg

圖 4. 在 NVIDIA A100 GPU 上運(yùn)行

Milvus IVF_PQ 算法的GPU 加速比

(用戶-用戶相似性搜索)

此外,圖 5 顯示了在 CPU 和 GPU 上使用 IVF_PQ 測(cè)試的所有參數(shù)組合的召回率- QPS tradeoff。該圖中每個(gè)點(diǎn)(上為 GPU,下為 CPU)展示了在改變向量索引/查詢參數(shù)時(shí)召回率和吞吐量的 tradeoff:更高召回率的代價(jià)是較低吞吐量。注意,在使用 GPU 的情況下,提高召回率時(shí),QPS 會(huì)大幅降低。

wKgZomVBq0iARUr1AACApzqKdZU635.jpg

圖 5. 在 CPU 和 GPU 上使用 IVF_PQ

進(jìn)行測(cè)試的參數(shù)組合及其召回率-吞吐量

tradeoff(user-use)

用戶與商品向量間相似度搜索

最后,考慮另一個(gè)現(xiàn)實(shí)場(chǎng)景,即將用戶向量與商品向量進(jìn)行比較(如上面的 notebook 1 所示)。在這種情況下,我們?yōu)?49000 個(gè)商品向量創(chuàng)建索引,為每個(gè)用戶向量查詢其 top-100 最相似的商品。

在 CPU 上進(jìn)行向量批量查詢非常耗時(shí),無(wú)論是使用 HNSW 還是 IVF_PQ 索引(請(qǐng)參見(jiàn)圖 6)。而 GPU 在這種情況下表現(xiàn)更好。當(dāng) nlist = 100 時(shí),IVF_PQ 在 CPU 上平均計(jì)算時(shí)間約為 86 分鐘。但計(jì)算時(shí)間隨著 nprobe 值的增加而變化很大(當(dāng) nprobe = 5 時(shí)為 51 分鐘,而當(dāng) nprobe = 20 時(shí)為 128 分鐘)。NVIDIA A100 GPU 能夠?qū)⑿阅芴嵘?strong>4 至 17 倍(當(dāng) nprobe 較大時(shí),速度提升更高)。前文也提到,通過(guò)其量化技術(shù),IVF_PQ 算法還可以減少內(nèi)存占用。這樣看來(lái),如果結(jié)合 GPU 加速方案,能夠得到一個(gè)計(jì)算上更可行的 ANN 搜索解決方案。

wKgZomVBq0iAZwlUAACSQVJuLKA449.jpg

圖 6. 在 NVIDIA A100 GPU 上運(yùn)行

Milvus IVF_PQ 算法的GPU 加速比

(用戶-商品相似性搜索)

與圖 5 類似,圖 7 顯示了使用 IVF_PQ 測(cè)試的所有參數(shù)組合的召回率-吞吐量間的 tradeoff。我們?nèi)匀豢梢钥吹皆?ANN 搜索中,為了提高吞吐量,可能需要稍微犧牲一些準(zhǔn)確性,尤其是在使用 GPU 的情況下。也就是說(shuō),我們可以在 GPU 的計(jì)算性能上保持相當(dāng)高的水平,同時(shí)實(shí)現(xiàn)高召回率。

wKgZomVBq0iAN4-cAAB7kEQboH8822.jpg

圖 7. 使用 IVF_PQ 索引在 CPU 和 GPU 上

測(cè)試的所有參數(shù)組合及其對(duì)應(yīng)召回率-吞吐量

tradoff(用戶 vs 商品)

結(jié)論

最后,和大家分享一些思考。

現(xiàn)代推薦系統(tǒng)復(fù)雜和多階段的特質(zhì)對(duì)每個(gè)環(huán)節(jié)的性能和效率都有很高的要求。因此,大家可以考慮在推薦系統(tǒng)流程中使用以下兩個(gè)關(guān)鍵功能:

  • NVIDIA Merlin 及其 Merlin Systems 庫(kù):您能夠輕松插入高效的 GPU 加速向量搜索引擎 Milvus。

  • 使用 GPU 加速計(jì)算,用諸如 RAPIDS RAFT 等技術(shù)來(lái)進(jìn)行向量數(shù)據(jù)庫(kù)索引和 ANN 搜索。

wKgZomVBq0iABkE8AABwaGGe-BE091.png

上述測(cè)試結(jié)果表明,本文所提出的 Merlin-Milvus 集成方案在訓(xùn)練和推理方面都非常高效且比其他方案更簡(jiǎn)單。而且,這兩個(gè)框架都在積極開(kāi)發(fā)中,每個(gè)版本都會(huì)添加許多新功能,例如,Milvus 新增了基于 GPU 加速的向量數(shù)據(jù)庫(kù)索引。向量相似性搜索是計(jì)算機(jī)視覺(jué)、大語(yǔ)言模型系統(tǒng)、推薦系統(tǒng)等工作流程中的關(guān)鍵組成部分,因此十分推薦您嘗試使用 Milvus 向量數(shù)據(jù)庫(kù)。

最后,要感謝 Zilliz/Milvus 和 Merlin 以及 RAFT 團(tuán)隊(duì)為完成這個(gè)項(xiàng)目和這篇博客文章所做出的貢獻(xiàn)。當(dāng)然,如果大家在自己的推薦系統(tǒng)或其他工作流程中使用了 Merlin 和 Milvus, 也歡迎和我們分享。

參考文獻(xiàn)和資源鏈接:

  • Public repo for this blog:https://github.com/bbozkaya/merlin-milvus

  • Yoochoose dataset:https://www.kaggle.com/datasets/chadgostopp/recsys-challenge-2015

  • Recommender Systems, Not Just Recommender Models:https://medium.com/nvidia-merlin/recommender-systems-not-just-recommender-models-485c161c755e

  • Exploring Production Ready Recommender Systems with Merlin:https://medium.com/nvidia-merlin/exploring-production-ready-recommender-systems-with-merlin-66bba65d18f2

  • Scale faster with less code using Two Tower with Merlin:https://medium.com/nvidia-merlin/scale-faster-with-less-code-using-two-tower-with-merlin-c16f32aafa9f

  • Transformers4Rec: A flexible library for Sequential and Session-based recommendation:https://medium.com/nvidia-merlin/transformers4rec-4523cc7d8fa8

  • NVIDIA Merlin:https://github.com/NVIDIA-Merlin

  • Milvus repo:https://github.com/milvus-io/milvus

  • Milvus use-cases:https://medium.com/vector-database/tagged/use-cases-of-milvus

  • Hierarchical navigable small worlds (HNSW):https://zilliz.com/blog/hierarchical-navigable-small-worlds-HNSW

  • Triton inference server:https://github.com/triton-inference-server

  • NVIDIA RAFT:https://github.com/rapidsai/raft

  • Vectordb benchmarking library:https://github.com/zilliztech/vectordb-benchmark


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5309

    瀏覽量

    106412
  • 英偉達(dá)
    +關(guān)注

    關(guān)注

    22

    文章

    3953

    瀏覽量

    93791
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5561

    瀏覽量

    122795

原文標(biāo)題:使用 Milvus 和 NVIDIA Merlin 搭建高效推薦系統(tǒng)

文章出處:【微信號(hào):NVIDIA_China,微信公眾號(hào):NVIDIA英偉達(dá)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    電商API集成入門(mén):從零開(kāi)始搭建高效接口

    零開(kāi)始,逐步引導(dǎo)您搭建一個(gè)高效、可靠的電商API接口。目標(biāo)讀者為初學(xué)者,我們將使用簡(jiǎn)單語(yǔ)言和實(shí)用示例,確保內(nèi)容真實(shí)可靠。 什么是電商API? API是軟件系統(tǒng)間交互的橋梁,允許不同應(yīng)用交換數(shù)據(jù)。電商API常見(jiàn)于平臺(tái)如淘寶、京東或
    的頭像 發(fā)表于 07-10 14:23 ?129次閱讀
    電商API集成入門(mén):從零開(kāi)始<b class='flag-5'>搭建</b><b class='flag-5'>高效</b>接口

    搭建樹(shù)莓派網(wǎng)絡(luò)監(jiān)控系統(tǒng):頂級(jí)工具與技術(shù)終極指南!

    樹(shù)莓派網(wǎng)絡(luò)監(jiān)控系統(tǒng)是一種經(jīng)濟(jì)高效且功能多樣的解決方案,可用于監(jiān)控網(wǎng)絡(luò)性能、流量及整體運(yùn)行狀況。借助樹(shù)莓派,我們可以搭建一個(gè)網(wǎng)絡(luò)監(jiān)控系統(tǒng),實(shí)時(shí)洞察網(wǎng)絡(luò)活動(dòng),從而幫助識(shí)別問(wèn)題、優(yōu)化性能并確
    的頭像 發(fā)表于 05-14 15:32 ?692次閱讀
    <b class='flag-5'>搭建</b>樹(shù)莓派網(wǎng)絡(luò)監(jiān)控<b class='flag-5'>系統(tǒng)</b>:頂級(jí)工具與技術(shù)終極指南!

    歸類繽紛:如何輕松搭建一套用于塑料分揀的高光譜檢測(cè)系統(tǒng)

    多光譜技術(shù)和高光譜技術(shù)能夠高效經(jīng)濟(jì)地幫助塑料實(shí)現(xiàn)準(zhǔn)確回收。本文詳述了友思特 BlackIndustry 系列高光譜相機(jī)系統(tǒng)搭建方式,清晰解讀了高光譜技術(shù)在回收領(lǐng)域的優(yōu)勢(shì)應(yīng)用。
    的頭像 發(fā)表于 02-25 10:56 ?476次閱讀
    歸類繽紛:如何輕松<b class='flag-5'>搭建</b>一套用于塑料分揀的高光譜檢測(cè)<b class='flag-5'>系統(tǒng)</b>?

    直擊 MBR2054:低正向壓降如何成就高效電路,應(yīng)用實(shí)例解讀#

    高效電路
    杰克船長(zhǎng)6262
    發(fā)布于 :2025年02月22日 14:23:54

    低代碼平臺(tái):快速搭建與優(yōu)化MES系統(tǒng),提升生產(chǎn)效率

    和交付應(yīng)用軟件,全方位降低軟件的開(kāi)發(fā)、配置、部署和培訓(xùn)的成本。 二、低代碼平臺(tái)搭建MES系統(tǒng)的優(yōu)勢(shì) 1、快速開(kāi)發(fā): 低代碼平臺(tái)提供了豐富的模板和組件,IT人員可以通過(guò)拖拽、配置等圖形化操作,快速搭建MES
    的頭像 發(fā)表于 01-23 09:37 ?352次閱讀
    低代碼平臺(tái):快速<b class='flag-5'>搭建</b>與優(yōu)化MES<b class='flag-5'>系統(tǒng)</b>,提升生產(chǎn)效率

    如何用mac電腦搭建云存儲(chǔ),怎么Mac電腦搭建云存儲(chǔ)呢?

    在數(shù)字時(shí)代,我們的生活和工作都離不開(kāi)數(shù)據(jù)的存儲(chǔ)與管理。對(duì)于Mac電腦用戶而言,搭建屬于自己的云存儲(chǔ),能讓數(shù)據(jù)管理更加高效、安全和便捷。無(wú)論是工作文檔的實(shí)時(shí)共享,還是珍貴照片、視頻的備份存儲(chǔ),云存儲(chǔ)
    的頭像 發(fā)表于 01-17 14:15 ?644次閱讀
    如何用mac電腦<b class='flag-5'>搭建</b>云存儲(chǔ),怎么<b class='flag-5'>用</b>Mac電腦<b class='flag-5'>搭建</b>云存儲(chǔ)呢?

    蘋(píng)果電腦搭建私有云,蘋(píng)果電腦搭建私有云的詳細(xì)操作步驟

    ? ? 隨著云計(jì)算技術(shù)的飛速發(fā)展,云電腦逐漸走進(jìn)了人們的視野。它像一朵神奇的云,承載著我們的數(shù)據(jù)和應(yīng)用,讓我們隨時(shí)隨地都能享受到高效的計(jì)算服務(wù)。今天就為大家介紹蘋(píng)果電腦搭建私有云的詳細(xì)操作步驟
    的頭像 發(fā)表于 01-17 10:17 ?1174次閱讀
    蘋(píng)果電腦<b class='flag-5'>搭建</b>私有云,蘋(píng)果電腦<b class='flag-5'>搭建</b>私有云的詳細(xì)操作步驟

    普通電腦搭建私有云,普通電腦搭建私有云教程

    隨著云存儲(chǔ)的普及,越來(lái)越多的用戶開(kāi)始考慮搭建自己的私有云系統(tǒng)。那普通電腦也能搭建私有云嗎?當(dāng)然可以,并且方法很簡(jiǎn)單。首先,私有云是什么?與公有云存儲(chǔ)不同,私有云存儲(chǔ)是指將文件存儲(chǔ)和管理完全控制在自己
    的頭像 發(fā)表于 01-13 13:55 ?702次閱讀
    <b class='flag-5'>用</b>普通電腦<b class='flag-5'>搭建</b>私有云,<b class='flag-5'>用</b>普通電腦<b class='flag-5'>搭建</b>私有云教程

    華為 Flexus 云服務(wù)器搭建螢火商城 2.0

    在浩瀚的數(shù)字海洋中探索未知的寶藏。 華為 Flexus 云服務(wù)器:強(qiáng)大的根基 華為 Flexus 云服務(wù)器,宛如一座巍峨的數(shù)字大廈,以其卓越的性能和堅(jiān)如磐石的穩(wěn)定性,成為搭建電商系統(tǒng)的理想之選。它那獨(dú)特的架構(gòu),仿佛是精心設(shè)計(jì)的建筑藍(lán)圖,能夠
    的頭像 發(fā)表于 01-13 13:36 ?503次閱讀
    華為 Flexus 云服務(wù)器<b class='flag-5'>搭建</b>螢火商城 2.0

    自己電腦搭建云主機(jī),自己電腦如何搭建云主機(jī)?

    ? 如今,服務(wù)器遠(yuǎn)程連接技術(shù)正逐漸成為行業(yè)的新寵,它代表著服務(wù)器管理領(lǐng)域向高效化、智能化邁進(jìn)的發(fā)展趨勢(shì)。本文將帶你剖析自己電腦如何搭建云主機(jī)。 自己電腦搭建云主機(jī)是一種經(jīng)濟(jì)實(shí)惠且具有可行性的選擇
    的頭像 發(fā)表于 01-06 09:55 ?926次閱讀
    自己電腦<b class='flag-5'>搭建</b>云主機(jī),自己電腦如何<b class='flag-5'>搭建</b>云主機(jī)?

    如何搭建企業(yè)AI開(kāi)發(fā)環(huán)境

    搭建企業(yè)AI開(kāi)發(fā)環(huán)境是一個(gè)復(fù)雜而細(xì)致的過(guò)程,涉及硬件選擇、操作系統(tǒng)配置、軟件安裝、工具選用以及實(shí)踐等多個(gè)方面。下面,AI部落小編將詳細(xì)介紹如何搭建企業(yè)AI開(kāi)發(fā)環(huán)境。
    的頭像 發(fā)表于 12-20 10:37 ?700次閱讀

    企業(yè)云服務(wù)器平臺(tái)設(shè)計(jì)與搭建

    企業(yè)云服務(wù)器平臺(tái)的設(shè)計(jì)與搭建是一個(gè)復(fù)雜但系統(tǒng)的過(guò)程,涉及多個(gè)環(huán)節(jié)和因素。主機(jī)推薦小編為您整理發(fā)布企業(yè)云服務(wù)器平臺(tái)設(shè)計(jì)與搭建這一過(guò)程的詳細(xì)闡述。
    的頭像 發(fā)表于 12-04 09:51 ?546次閱讀

    怎樣搭建基于 ChatGPT 的聊天系統(tǒng)

    搭建一個(gè)基于ChatGPT的聊天系統(tǒng)是一個(gè)涉及多個(gè)步驟的過(guò)程,包括理解ChatGPT的API、設(shè)計(jì)用戶界面、處理數(shù)據(jù)和集成ChatGPT模型。以下是一個(gè)簡(jiǎn)化的指南,用于創(chuàng)建一個(gè)基本的聊天系統(tǒng)。 1.
    的頭像 發(fā)表于 10-25 16:23 ?1025次閱讀

    如何搭建智能制造工廠

     搭建智能制造工廠是一個(gè)復(fù)雜而系統(tǒng)的工程,需要從多個(gè)方面入手,包括規(guī)劃與設(shè)計(jì)、基礎(chǔ)設(shè)施建設(shè)、系統(tǒng)集成與測(cè)試、上線與試運(yùn)行以及持續(xù)優(yōu)化與升級(jí)等階段。以下是一個(gè)詳細(xì)的搭建智能制造工廠的步驟
    的頭像 發(fā)表于 09-15 14:17 ?1197次閱讀

    TINA如何搭建仿真模型?

    使用TINA仿真單極運(yùn)放的環(huán)路,仿真模型知道怎么搭建,現(xiàn)在要仿真由兩級(jí)TL082搭建的兩級(jí)運(yùn)放的環(huán)路穩(wěn)定性,請(qǐng)教,TINA如何搭建仿真模型,謝謝!
    發(fā)表于 08-15 08:10