利用英特爾 Gaudi 2 和至強 CPU 構建經濟高效的企業級 RAG 應用

29a0a5b072b8b548fb12c737b43f34d6.jpeg

檢索增強生成 (Retrieval Augmented Generation,RAG) 可將存儲在外部數據庫中的新鮮領域知識納入大語言模型以增強其文本生成能力。其提供了一種將公司數據與訓練期間語言模型學到的知識分開的方式,有助于我們在性能、準確性及安全隱私之間進行有效折衷。

通過本文,你將了解到英特爾如何通過企業 AI 開放平臺 OPEA 開源項目幫助你開發和部署 RAG 應用。你還將通過真實的 RAG 使用案例了解英特爾 Gaudi 2 AI 加速器和至強 CPU 如何助力企業級應用性能的顯著飛躍。

  • OPEAhttps://opea.dev

導入

在深入了解細節之前,我們先要獲取硬件。英特爾 Gaudi 2 專為加速數據中心和云上的深度學習訓練和推理而設計。你可在 英特爾開發者云 (IDC) 上獲取其公開實例,也可在本地部署它。IDC 是嘗試 Gaudi 2 的最簡單方法,如果你尚沒有帳戶,可以考慮注冊一個帳戶,訂閱 “Premium”,然后申請相應的訪問權限。

  • 英特爾 Gaudi 2https://habana.ai/products/gaudi2/

  • 英特爾開發者云 (IDC)https://www.intel.com/content/www/us/en/developer/tools/devcloud/overview.html

在軟件方面,我們主要使用 LangChain 來構建我們的應用。LangChain 是一個開源框架,旨在簡化 LLM AI 應用的構建流程。其提供了基于模板的解決方案,允許開發人員使用自定義嵌入模型、向量數據庫和 LLM 構建 RAG 應用,用戶可通過 LangChain 文檔獲取其更多信息。英特爾一直積極為 LangChain 貢獻多項優化,以助力開發者在英特爾平臺上高效部署 GenAI 應用。

在 LangChain 中,我們將使用 rag-redis 模板來創建我們的 RAG 應用。選型上,我們使用 BAAI/bge-base-en-v1.5 作為嵌入模型,并使用 Redis 作為默認向量數據庫。下圖展示了該應用的高層架構圖。

  • BAAI/bge-base-en-v1.5https://hf.co/BAAI/bge-base-en-v1.5

724806649d9c5c5a61f976da56b38520.png

在我們的應用中,嵌入模型跑在 英特爾 Granite Rapids CPU 上。英特爾 Granite Rapids 架構專為高核數、性能敏感型工作負載以及通用計算工作負載而優化,并為此類工作負載提供最低的總擁有成本 (Cost Of Ownership,TCO)。GNR 還支持 AMX-FP16 指令集,這會為混合 AI 工作負載帶來 2-3 倍的性能提升。

  • 英特爾 Granite Rapidshttps://www.intel.com/content/www/us/en/newsroom/news/intel-unveils-future-generation-xeon.html#gs.6t3deu

我們將 LLM 跑在英特爾 Gaudi 2 加速器上。至于如何使用 Hugging Face 模型,Optimum Habana 庫可將 Hugging Face Transformers 和 Diffusers 庫橋接至 Gaudi 加速器。因此,用戶可以用它針對各種下游任務在單卡和多卡場景下輕松進行模型加載、訓練及推理。

  • Optimum Habanahttps://hf.co/docs/optimum/en/habana/index

  • Transformershttps://hf.co/docs/transformers/index

  • Diffusershttps://hf.co/docs/diffusers/index

我們提供了一個 Dockerfile 以簡化 LangChain 開發環境的配置。啟動 Docker 容器后,你就可以開始在 Docker 環境中構建向量數據庫、RAG 流水線以及 LangChain 應用。詳細的分步說明,請參照 ChatQnA 示例。

  • Dockerfilehttps://github.com/opea-project/GenAIExamples/tree/main/ChatQnA/langchain/docker

  • ChatQnAhttps://github.com/opea-project/GenAIExamples/tree/main/ChatQnA

創建向量數據庫

我們用耐克的公開財務文件創建一個向量數據庫,示例代碼如下:

#?Ingest?PDF?files?that?contain?Edgar?10k?filings?data?for?Nike.
company_name?=?"Nike"
data_path?=?"data"
doc_path?=?[os.path.join(data_path,?file)?for?file?in?os.listdir(data_path)][0]
content?=?pdf_loader(doc_path)
chunks?=?text_splitter.split_text(content)#?Create?vectorstore
embedder?=?HuggingFaceEmbeddings(model_name=EMBED_MODEL)_?=?Redis.from_texts(texts=[f"Company:?{company_name}.?"?+?chunk?for?chunk?in?chunks],embedding=embedder,index_name=INDEX_NAME,index_schema=INDEX_SCHEMA,redis_url=REDIS_URL,
)

定義 RAG 流水線

在 LangChain 中,我們使用 Chain API 來連接提示、向量數據庫以及嵌入模型。

你可在 該代碼庫 中找到完整代碼。

  • 該代碼庫https://github.com/opea-project/GenAIExamples/blob/main/ChatQnA/langchain/redis/rag_redis/chain.py

#?Embedding?model?running?on?Xeon?CPU
embedder?=?HuggingFaceEmbeddings(model_name=EMBED_MODEL)#?Redis?vector?database
vectorstore?=?Redis.from_existing_index(embedding=embedder,?index_name=INDEX_NAME,?schema=INDEX_SCHEMA,?redis_url=REDIS_URL
)#?Retriever
retriever?=?vectorstore.as_retriever(search_type="mmr")#?Prompt?template
template?=?"""…"""
prompt?=?ChatPromptTemplate.from_template(template)#?Hugging?Face?LLM?running?on?Gaudi?2
model?=?HuggingFaceEndpoint(endpoint_url=TGI_LLM_ENDPOINT,?…)#?RAG?chain
chain?=?(RunnableParallel({"context":?retriever,?"question":?RunnablePassthrough()})?|?prompt?|?model?|?StrOutputParser()
).with_types(input_type=Question)

在 Gaudi 2 上加載 LLM

我們在 Gaudi2 上使用 Hugging Face 文本生成推理 (TGI) 服務運行聊天模型。TGI 讓我們可以在 Gaudi2 硬件上針對流行的開源 LLM (如 MPT、Llama 以及 Mistral) 實現高性能的文本生成。

無需任何配置,我們可以直接使用預先構建的 Docker 映像并把模型名稱 (如 Intel NeuralChat) 傳給它。

model=Intel/neural-chat-7b-v3-3
volume=$PWD/data
docker?run?-p?8080:80?-v?$volume:/data?--runtime=habana?-e?HABANA_VISIBLE_DEVICES=all?-e?OMPI_MCA_btl_vader_single_copy_mechanism=none?--cap-add=sys_nice?--ipc=host?tgi_gaudi?--model-id?$model

TGI 默認使用單張 Gaudi 加速卡。如需使用多張卡以運行更大的模型 (如 70B),可添加相應的參數,如 --sharded true 以及 --num_shard 8 。對于受限訪問的模型,如 Llama 或 StarCoder,你還需要指定 -e HUGGING_FACE_HUB_TOKEN= <kbd> 以使用你自己的 Hugging Face 令牌 獲取模型。

  • Llamahttps://hf.co/meta-llama

  • StarCoderhttps://hf.co/bigcode/starcoder

  • Hugging Face 令牌https://hf.co/docs/hub/en/security-tokens

容器啟動后,我們可以通過向 TGI 終端發送請求以檢查服務是否正常。

curl?localhost:8080/generate?-X?POST?\
-d?'{"inputs":"Which?NFL?team?won?the?Super?Bowl?in?the?2010?season?",?\
"parameters":{"max_new_tokens":128,?"do_sample":?true}}'?\
-H?'Content-Type:?application/json'

如果你能收到生成的響應,則 LLM 運行正確。從現在開始,你就可以在 Gaudi2 上盡情享受高性能推理了!

TGI Gaudi 容器默認使用 bfloat16 數據類型。為獲得更高的吞吐量,你可能需要啟用 FP8 量化。根據我們的測試結果,與 BF16 相比,FP8 量化會帶來 1.8 倍的吞吐量提升。FP8 相關說明可在 README 文件中找到。

  • READMEhttps://github.com/opea-project/GenAIExamples/blob/main/ChatQnA/README.md

最后,你還可以使用 Meta Llama Guard 模型對生成的內容進行審核。OPEA 的 README 文件提供了在 TGI Gaudi 上部署 Llama Guard 的說明。

  • Llama Guardhttps://hf.co/meta-llama/LlamaGuard-7b

  • READMEhttps://github.com/opea-project/GenAIExamples/blob/main/ChatQnA/README.md

運行 RAG 服務

我們運行下述命令啟動 RAG 應用后端服務, server.py 腳本是用 fastAPI 實現的服務終端。

docker?exec?-it?qna-rag-redis-server?bash
nohup?python?app/server.py?&

默認情況下,TGI Gaudi 終端運行在本地主機的 8080 端口上 (即 http://127.0.0.1:8080 )。如果需將其運行至不同的地址或端口,可通過設置 TGI_ENDPOINT 環境變量來達成。

啟動 RAG GUI

運行以下命令以安裝前端 GUI 組件:

sudo?apt-get?install?npm?&&?\npm?install?-g?n?&&?\n?stable?&&?\hash?-r?&&?\npm?install?-g?npm@latest

然后,更新 .env 文件中的 DOC_BASE_URL 環境變量,將本地主機 IP 地址 ( 127.0.0.1 ) 替換為運行 GUI 的服務器的實際 IP 地址。

接著,運行以下命令以安裝所需的軟件依賴:

npm?install

最后,使用以下命令啟動 GUI 服務:

nohup?npm?run?dev?&

上述命令會運行前端服務并啟動應用。

034a842068df94712926d5158b1f7b88.png

基準測試結果

我們針對不同的模型和配置進行了深入的實驗。下面兩張圖展示了 Llama2-70B 模型在四卡英特爾 Gaudi 2 和四卡英偉達 H100 平臺上,面對 16 個并發用戶時的相對端到端吞吐量和性價比對比。

ddb0518ef956ee32891e498f9102d730.png 0d9ca1c0e471f80d96dc0227d149c86f.png

在這兩種測例中,向量數據庫和嵌入模型都運行在相同的英特爾 Granite Rapids CPU 平臺上。為了比較每美元的性能,我們使用了與 MosaicML 團隊于 2024 年 1 月使用的數據相同的公開定價數據來計算每美元的平均訓練性能。

  • MosaicMLhttps://www.databricks.com/blog/llm-training-and-inference-intel-gaudi2-ai-accelerators

如你所見,與 Gaudi 2 相比,基于 H100 的系統雖然吞吐量提高了 1.13 倍,但每美元性能僅為 0.44 倍。這些比較可能會因云廠商不同以及客戶折扣不同而有所不同,我們在文末列出了詳細的基準配置。

總結

上例成功演示了如何在英特爾平臺上部署基于 RAG 的聊天機器人。此外,英特爾會不斷發布成熟的 GenAI 示例,以期通過這些經過驗證的工具助力開發人員簡化創建、部署流程。這些示例功能多樣且易于定制,非常適合用戶基于其在英特爾平臺上開發各種應用。

運行企業級 AI 應用時,基于英特爾 Granite Rapids CPU 和 Gaudi 2 加速器的系統的總擁有成本更低。另外,還可通過 FP8 優化進一步優化成本。

以下開發者資源應該可以幫助大家更平滑地啟動 GenAI 項目。

  • OPEA GenAI 示例https://github.com/opea-project/GenAIExamples

  • 基于 Gaudi 2 的 TGIhttps://github.com/huggingface/tgi-gaudi

  • 英特爾 AI 生態之 Hugging Facehttps://www.intel.com/content/www/us/en/developer/ecosystem/hugging-face.html

  • Hugging Face hub 英特爾頁https://hf.co/Intel

如果你有任何問題或反饋,我們很樂意在 Hugging Face 論壇 上與你互動。感謝垂閱!

  • Hugging Face 論壇https://discuss.huggingface.co/

致謝:

我們要感謝 Chaitanya Khened、Suyue Chen、Mikolaj Zyczynski、Wenjiao Yue、Wenxin Zhu、Letong Han、Sihan Chen、Hanwen Cheng、Yuan Wu 和 Yi Wang 對在英特爾 Gaudi 2 上構建企業級 RAG 系統做出的杰出貢獻。


基準測試配置

  • Gaudi2 配置: HLS-Gaudi2 配備 8 張 Habana Gaudi2 HL-225H 夾層卡及 2 個英特爾至強鉑金 8380 CPU@2.30GHz,以及 1TB 系統內存; 操作系統: Ubuntu 22.04.03,5.15.0 內核

  • H100 SXM 配置: Lambda labs 實例 gpu_8x_h100_sxm5; 8 張 H100 SXM 及 2 個英特爾至強鉑金 8480 CPU@2 GHz,以及 1.8TB 系統內存; 操作系統 ubuntu 20.04.6 LTS,5.15.0 內核

  • Llama2 70B 部署至 4 張卡 (查詢歸一化至 8 卡)。Gaudi2 使用 BF16,H100 使用 FP16

  • 嵌入模型為 BAAI/bge-base v1.5 。測試環境: TGI-gaudi 1.2.1、TGI-GPU 1.4.5、Python 3.11.7、Langchain 0.1.11、sentence-transformers 2.5.1、langchain benchmarks 0.0.10、redis 5.0.2、cuda 12.2.r12.2/compiler.32965470_0, TEI 1.2.0

  • RAG 查詢最大輸入長度 1024,最大輸出長度 128。測試數據集: langsmith Q&A。并發客戶端數 16

  • Gaudi2 (70B) 的 TGI 參數: batch_bucket_size=22 , prefill_batch_bucket_size=4 , max_batch_prefill_tokens=5102 , max_batch_total_tokens=32256 , max_waiting_tokens=5 , streaming=false

  • H100 (70B) 的 TGI 參數: batch_bucket_size=8 , prefill_batch_bucket_size=4 , max_batch_prefill_tokens=4096 , max_batch_total_tokens=131072 , max_waiting_tokens=20 , max_batch_size=128 , streaming=false

  • TCO 參考:https://www.databricks.com/blog/llm-training-and-inference-intel-gaudi2-ai-accelerators


英文原文:?https://hf.co/blog/cost-efficient-rag-applications-with-intel

原文作者: Julien Simon,Haihao Shen,Antony Vance Jeyaraj,Matrix Yao,Leon Lv,Greg Serochi,Deb Bharadwaj,Ke Ding

譯者: Matrix Yao (姚偉峰),英特爾深度學習工程師,工作方向為 transformer-family 模型在各模態數據上的應用及大規模模型的訓練推理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15781.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

任推邦:實力強勁的APP推廣拉新平臺,號稱不扣量

任推邦簡介 任推邦是國內數一數二的項目分發平臺&#xff0c;也是一個不扣量的項目APP推廣拉新平臺&#xff0c;隸屬于聚名科技集團股份有限公司。聚名科技成立時間在2012年&#xff0c;是安徽省老牌互聯網企業&#xff0c;歷經11年的飛速發展&#xff0c;聚名科技成功布局打造…

小程序的這些知識你知道嗎?

一:導航傳參 無論是編程式還是聲明式導骯傳參都是在url?keyvalue&key1value1,無論是否是tabbar頁面. 對于回退頁面,沒辦法傳參. 這個參數是,跳轉到頁面的時候,跳轉到另一個頁面,這個頁面就是剛開始執行,等數據執行之后,觸發onload,傳遞的參數放在內存中,跳轉是內部底層觸…

云端力量:利用移動云服務器高效部署Spring Boot Web應用

文章目錄 一、移動云介紹二、移動云產品選擇三、體驗云主機ECS四、使用移動云服務器部署SpringBoot Web應用4.1移動云ECS安裝JDK4.2移動云ECS安裝MySQL4.3移動云ECS數據庫插入數據4.4移動云ECS部署Spring Boot Web應用 總結 一、移動云介紹 移動云是中國移動基于自研的先進技術…

Linux中常見的基本指令(上)

目錄 一、ls指令 1. ls 2. ls -l 3. ls -a 4.ls -F 二、qwd指令 三、cd指令 1. cd .. 2. cd / / / 3. cd ../ / / 4. cd ~ 5. cd - 五、mkdir指令 六、rmdir指令和rm指令 一、ls指令 語法 &#xff1a; ls [ 選項 ][ 目錄或文件 ] 。 功能 &#xff1a;對于目錄…

桶排序和基數排序

前言&#xff1a; 這篇文章&#xff0c;我們就來了解一些鮮為人知的排序&#xff0c;桶排序和基數排序。 桶排序&#xff1a; 桶排序的思想&#xff1a; 桶排序的思想就是把待排序的數盡量均勻地放到各個桶中&#xff0c;再對各個桶進行局部的排序&#xff0c;最后再按序將各…

AI Agent: Agent框架+7個實例

何謂Agent Agent 作為一種新興的人工智能技術&#xff0c;正在受到越來越多的關注。要說清楚什么是 Agent&#xff0c;先得看看人工智能的本質是什么。 人工智能這個名稱來自它試圖通過計算機程序或機器來模擬、擴展和增強人類智能的 一些方面。在這個定義中&#xff0c;“人…

C# WPF入門學習(四)—— 按鈕控件

上期介紹了WPF的實現架構和原理&#xff0c;之后我們開始來使用WPF來學習各種控件。 一、嘗試插入一個按鈕&#xff08;方法一&#xff09; 1. VS2019 在界面中&#xff0c;點擊工具欄中的視圖&#xff0c;在下拉菜單中選擇工具箱。 至于編譯器中的視圖怎么舒服怎么來布置&am…

Cocos Creator 幀動畫播放組件制作詳解

Cocos Creator 是一個強大的游戲開發工具&#xff0c;提供了豐富的功能和組件&#xff0c;其中幀動畫播放組件是游戲開發中常用的組件之一&#xff0c;通過幀動畫播放組件可以實現角色動畫、特效動畫等效果。本文將詳細介紹如何使用 Cocos Creator 制作幀動畫播放組件&#xff…

infoq學習筆記-云原生網關當道,三大主流廠商如何“競 技”?

注基礎組件的質量&#xff0c;這些基礎組件是用戶看不到的。這些組件包括代碼質量、自動化的CI/CD、端對端測試、混沌測試等。在APISIX中&#xff0c;我們內置了大 量的測試案例代碼&#xff0c;包括單元測試、E2E測試、混沌測試&#xff0c;以及一些基準測試等&#xff0c;從而…

沈陽師范大學文學院副教授傅贏

女&#xff0c;生于1971年6月&#xff0c;遼寧遼陽人&#xff0c;1995年6月畢業于沈陽師范學院中文系漢語言文學教育專業&#xff0c;2000年6月于東北師范大學獲中國現當代文學專業文學碩士學位&#xff0c;現為文學院漢語國際教育專業教師&#xff0c;副教授。 主要從事對外漢…

藍橋杯練習系統(算法訓練)ALGO-934 序列

資源限制 內存限制&#xff1a;256.0MB C/C時間限制&#xff1a;1.0s Java時間限制&#xff1a;3.0s Python時間限制&#xff1a;5.0s 問題描述 王神想要知道n的所有排列的逆序對數和&#xff0c;但是他覺得太水了&#xff0c;于是讓你算。 輸入格式 一行一個整數n 輸…

random和range

含義&#xff1a; random(1&#xff0c;10) 不包含10&#xff0c;用于生成隨機數。它可以生成浮點數或整數&#xff0c;取決于具體的使用方式。 range(0&#xff0c;1) 不包含1&#xff0c;用于生成一個整數序列。它可以生成一個指定范圍內的連續整數序列。 區別在于&#x…

Linux:Linux系統項目配置

linux高級 軟件安裝 rpm(redhat package manager)安裝 軟件已經按照redhat的包管理規范進行打包,使用rpm命令進行安裝,但包之間可能有依賴關系,因此不能自行解決庫依賴問題,比較麻煩 yum安裝 一種在線軟件安裝方式,本質上還是rpm安裝,自動下載安裝包并安裝,安裝過程中自動…

【MySQL精通之路】SQL優化(1)-查詢優化(23)-避免全表掃描

當MySQL使用全表掃描來解析查詢時&#xff0c;EXPLAIN的輸出在type列中顯示ALL。 這種情況通常發生在以下情況下&#xff1a; 該表非常小&#xff0c;因此執行全表掃描比查找關鍵字更快。這對于少于10行且行長較短的表來說很常見。 對于索引列&#xff0c;ON或WHERE子句中沒有…

服務器硬件全攻略:從入門到精通,全面解析服務器性能與穩定性!

服務器是計算機網絡中提供特定服務的計算機系統&#xff0c;其硬件配置和性能直接影響到整個網絡系統的運行效率和穩定性。作為一個資深的技術人員&#xff0c;本文將全面詳細地介紹服務器硬件基礎知識&#xff0c;包括介紹、命令或語法、主要作用以及使用方法等。 一、介紹 服…

Linux基礎(七):Linux 系統上的庫文件生成與使用

學過C語言我們知道&#xff0c;C語言有標準庫和自定義庫&#xff0c;這些方便了我們的實際開發&#xff0c;提供了已經實現好的函數接口&#xff0c;我們使用的時候&#xff0c;只需要引入頭文件即可&#xff0c;那具體的實現過程又是怎么樣的呢&#xff1f;我們又該如何實現我…

JS實現照片預覽

以下是一個簡單的JS代碼示例&#xff0c;用于實現照片預覽功能&#xff1a; <!DOCTYPE html> <html> <head><title>Photo Preview</title><script>function previewPhoto(event) {var reader new FileReader();reader.onload function(…

MySQL字符數據查詢拆分

MySQL字符數據查詢拆分 問題描述 數據表中某字段為特定單詞組字符串&#xff0c;特定字符分隔。 現有需求&#xff1a;在不影響原始數據的情況下&#xff0c;查詢顯示拆分后的單詞&#xff0c;方便后續對其進行后續操作。 演示 演示數據源 -- 測試表結構create table word_…

Java中創建不可變對象實現細節和例子

當我們在Java中創建不可變對象時&#xff0c;我們需要確保對象的狀態在創建之后不能被修改。以下是一些具體的實現細節和例子&#xff0c;展示了如何在Java中創建不可變對象。 實現細節 使用final關鍵字&#xff1a; 類定義前使用final關鍵字&#xff0c;表示該類不能被繼承&…

Mysql中的慢查詢

Mysql慢查詢的一些sql命令 慢查詢的默認事件為10秒 #注意&#xff1a;慢查詢一般是在調試階段開啟的&#xff0c;在開發階段中一般不會開啟&#xff0c;會對效率產生延誤 #查詢慢查詢是否開啟 show variables like %general%; #慢查詢時間設置 show variables like long_query…