首页 > 其他分享 >利用英特尔 Gaudi 2 和至强 CPU 构建经济高效的企业级 RAG 应用

利用英特尔 Gaudi 2 和至强 CPU 构建经济高效的企业级 RAG 应用

时间:2024-05-24 20:18:31浏览次数:12  
标签:RAG 英特尔 模型 企业级 Gaudi TGI CPU

检索增强生成 (Retrieval Augmented Generation,RAG) 可将存储在外部数据库中的新鲜领域知识纳入大语言模型以增强其文本生成能力。其提供了一种将公司数据与训练期间语言模型学到的知识分开的方式,有助于我们在性能、准确性及安全隐私之间进行有效折衷。

通过本文,你将了解到英特尔如何通过企业 AI 开放平台 OPEA 开源项目帮助你开发和部署 RAG 应用。你还将通过真实的 RAG 使用案例了解英特尔 Gaudi 2 AI 加速器和至强 CPU 如何助力企业级应用性能的显著飞跃。

导入

在深入了解细节之前,我们先要获取硬件。英特尔 Gaudi 2 专为加速数据中心和云上的深度学习训练和推理而设计。你可在 英特尔开发者云 (IDC) 上获取其公开实例,也可在本地部署它。IDC 是尝试 Gaudi 2 的最简单方法,如果你尚没有帐户,可以考虑注册一个帐户,订阅 “Premium”,然后申请相应的访问权限。

在软件方面,我们主要使用 LangChain 来构建我们的应用。LangChain 是一个开源框架,旨在简化 LLM AI 应用的构建流程。其提供了基于模板的解决方案,允许开发人员使用自定义嵌入模型、向量数据库和 LLM 构建 RAG 应用,用户可通过 LangChain 文档获取其更多信息。英特尔一直积极为 LangChain 贡献多项优化,以助力开发者在英特尔平台上高效部署 GenAI 应用。

在 LangChain 中,我们将使用 rag-redis 模板来创建我们的 RAG 应用。选型上,我们使用 BAAI/bge-base-en-v1.5 作为嵌入模型,并使用 Redis 作为默认向量数据库。下图展示了该应用的高层架构图。

在我们的应用中,嵌入模型跑在 英特尔 Granite Rapids CPU 上。英特尔 Granite Rapids 架构专为高核数、性能敏感型工作负载以及通用计算工作负载而优化,并为此类工作负载提供最低的总拥有成本 (Cost Of Ownership,TCO)。GNR 还支持 AMX-FP16 指令集,这会为混合 AI 工作负载带来 2-3 倍的性能提升。

我们将 LLM 跑在英特尔 Gaudi 2 加速器上。至于如何使用 Hugging Face 模型,Optimum Habana 库可将 Hugging Face TransformersDiffusers 库桥接至 Gaudi 加速器。因此,用户可以用它针对各种下游任务在单卡和多卡场景下轻松进行模型加载、训练及推理。

我们提供了一个 Dockerfile 以简化 LangChain 开发环境的配置。启动 Docker 容器后,你就可以开始在 Docker 环境中构建向量数据库、RAG 流水线以及 LangChain 应用。详细的分步说明,请参照 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 来连接提示、向量数据库以及嵌入模型。

你可在 该代码库 中找到完整代码。

# 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 。对于受限访问的模型,如 LlamaStarCoder,你还需要指定 -e HUGGING_FACE_HUB_TOKEN= <kbd> 以使用你自己的 Hugging Face 令牌 获取模型。

容器启动后,我们可以通过向 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 文件中找到。

最后,你还可以使用 Meta Llama Guard 模型对生成的内容进行审核。OPEA 的 README 文件提供了在 TGI Gaudi 上部署 Llama Guard 的说明。

运行 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 &

上述命令会运行前端服务并启动应用。

基准测试结果

我们针对不同的模型和配置进行了深入的实验。下面两张图展示了 Llama2-70B 模型在四卡英特尔 Gaudi 2 和四卡英伟达 H100 平台上,面对 16 个并发用户时的相对端到端吞吐量和性价比对比。


在这两种测例中,向量数据库和嵌入模型都运行在相同的英特尔 Granite Rapids CPU 平台上。为了比较每美元的性能,我们使用了与 MosaicML 团队于 2024 年 1 月使用的数据相同的公开定价数据来计算每美元的平均训练性能。

如你所见,与 Gaudi 2 相比,基于 H100 的系统虽然吞吐量提高了 1.13 倍,但每美元性能仅为 0.44 倍。这些比较可能会因云厂商不同以及客户折扣不同而有所不同,我们在文末列出了详细的基准配置。

总结

上例成功演示了如何在英特尔平台上部署基于 RAG 的聊天机器人。此外,英特尔会不断发布成熟的 GenAI 示例,以期通过这些经过验证的工具助力开发人员简化创建、部署流程。这些示例功能多样且易于定制,非常适合用户基于其在英特尔平台上开发各种应用。

运行企业级 AI 应用时,基于英特尔 Granite Rapids CPU 和 Gaudi 2 加速器的系统的总拥有成本更低。另外,还可通过 FP8 优化进一步优化成本。

以下开发者资源应该可以帮助大家更平滑地启动 GenAI 项目。

如果你有任何问题或反馈,我们很乐意在 Hugging Face 论坛 上与你互动。感谢垂阅!

致谢:

我们要感谢 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 [email protected],以及 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 模型在各模态数据上的应用及大规模模型的训练推理。

标签:RAG,英特尔,模型,企业级,Gaudi,TGI,CPU
From: https://www.cnblogs.com/huggingface/p/18211613

相关文章

  • 来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析
    背景介绍前面介绍过有道QAnything源码解析,通过深入了解工业界的知识库RAG服务,得到了不少调优RAG服务的新想法。因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源RAG服务RagFlow的完整实现流程,希望同样有所收获。项目概述框架设计首先依旧可以先......
  • SwiftUI中的手势(DragGesture拖拽手势及Drag动画组件)
    上一篇文章我们了解了如何使用.gesture修饰符和@GestureState属性包装器,让我们看看另一种常见的手势:DragGesture拖拽手势。下面先看个效果图:这个效果中,我们实现了一个Text文本,并添加了拖拽手势,可以拖动到屏幕的任意位置,松手后停留在目标位置,而非回到原来的起点位置。UI......
  • 使用RAG和文本转语音功能,我构建了一个 QA 问答机器人
    节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。汇总合集:《大模型实战宝典》(2024版)正式发......
  • VMware vSphere 8.0 Update 2c 下载 - 企业级工作负载平台
    VMwarevSphere8.0Update2c下载-企业级工作负载平台ESXi8.0U2&vCenterServer8.0U2请访问原文链接:https://sysin.org/blog/vmware-vsphere-8-u2/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org企业级工作负载平台vSphere将云计算的优势引入本地部署工作......
  • LlamaIndex RAG 和ReAct结合使用
    LlamaIndexRAG和ReAct结合使用示例代码:importosos.environ['OpenAI_API_KEY']='sk-pxxxxhU7F5Zrc'os.environ['SERPAPI_API_KEY']='950fbdxxxx9b0fexxxx'#加载电商财报数据fromllama_index.coreimportSimpleDirectoryReaderA_doc......
  • 【Azure Storage Account】使用Azure Policy来检查Storage Account中是否有开启匿名访
    问题描述因为StorageAccount中的Container可以开启匿名访问,因安全要求,需要检测出那些Container开启了匿名访问。所以使用AzurePolicy策略来进行检测。但是,想使用以上规则,保存报错。Thepolicydefinition'xxxxxxx'ruleisinvalid.Theresourcetype'storageAccounts/bl......
  • YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架
    前言今天大姚给大家分享一款基于.NETCoreWeb+Bootstrap的企业级快速后台开发框架、权限管理系统,代码简单易懂、界面简洁美观(基于MITLicense开源,免费可商用):YiShaAdmin。项目官方介绍YiShaAdmin基于.NETCoreWeb开发,借鉴了很多开源项目的优点,让你开发Web管理系统和移动端A......
  • 使用RAG-GPT集成智谱AI、DeepSeek快速搭建OpenAI Cookbook智能客服
    使用RAG-GPT集成智谱AI、DeepSeek快速搭建OpenAICookbook智能客服引言前面介绍了使用RAG-GPT和OpenAI快速搭建LangChain官网智能客服,目前国内也有一些比较不错的云端大模型API服务。本文将介绍通过RAG-GPT集成智谱AI和DeepSeek,快速搭建OpenAICookbook智能客服。RAG技术原理介......
  • 【Azure Storage Account】Azure 存储服务计算Blob的数量和大小的Python代码
    问题描述介绍一段Python脚本,可以在微软云中国区使用。用于计算AzureStorageAccount中Container中Blob类型文件的数量和大小,脚本中允许按照容器,层(热/冷/归档),前缀,软删除/非软删除来计算数量和容量大小,默认使用的时间为以Blob的最后修改时间作为参考。执行结果参考: 参数......
  • html------拖拽属性draggable
    draggable用于定义元素是否可以拖拽,在拖拽过程中鼠标会变成禁止标志<imgdraggable="true"/>下面是一个简单的图片拖拽属性添加<!DOCTYPEhtml><html><head> <metacharset="UTF-8"> <title>draggable属性</title></head><body>......