使用 Intel Gaudi 2 和 Intel Xeon 构建高成本效益的企业级 RAG 应用程序

发布于 2024 年 5 月 9 日
在 GitHub 上更新


检索增强生成 (RAG) 通过结合存储在外部数据存储中的新鲜领域知识,增强了大型语言模型的文本生成能力。将公司数据与语言模型在训练过程中学习到的知识分开对于平衡性能、准确性和安全隐私目标至关重要。

在本博客中,您将学习英特尔如何帮助您作为 OPEA(企业 AI 开放平台)的一部分开发和部署 RAG 应用程序。您还将了解英特尔 Gaudi 2 AI 加速器和 Xeon CPU 如何通过一个真实的 RAG 用例显著提升企业性能。

开始

在深入细节之前,让我们先了解一下硬件。Intel Gaudi 2 专为加速数据中心和云端的深度学习训练和推理而设计。它可在 Intel Developer Cloud (IDC) 上公开获取,也可用于本地部署。IDC 是开始使用 Gaudi 2 的最简单方式。如果您还没有账户,请注册一个,订阅“高级版”,然后申请访问权限。

在软件方面,我们将使用 LangChain 构建应用程序,LangChain 是一个旨在简化使用 LLM 创建 AI 应用程序的开源框架。它提供基于模板的解决方案,允许开发人员使用自定义嵌入、向量数据库和 LLM 构建 RAG 应用程序。LangChain 文档提供了更多信息。英特尔一直积极为 LangChain 贡献多项优化,使开发人员能够在英特尔平台上高效部署 GenAI 应用程序。

在 LangChain 中,我们将使用 rag-redis 模板创建 RAG 应用程序,其中使用 BAAI/bge-base-en-v1.5 嵌入模型和 Redis 作为默认向量数据库。下图显示了高级架构。

嵌入模型将运行在 Intel Granite Rapids CPU 上。Intel Granite Rapids 架构经过优化,可为高核心性能敏感型工作负载和通用计算工作负载提供最低的总拥有成本 (TCO)。GNR 还支持 AMX-FP16 指令集,可为混合 AI 工作负载带来 2-3 倍的性能提升。

LLM 将运行在 Intel 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

我们将使用 Hugging Face Text Generation Inference (TGI) 服务器在 Gaudi2 上运行我们的聊天模型。这种组合可以在 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

服务默认使用单个 Gaudi 加速器。运行更大的模型(例如,70B)可能需要多个加速器。在这种情况下,请添加适当的参数,例如 --sharded true--num_shard 8。对于 LlamaStarCoder 等受限模型,您还需要使用您的 Hugging Face token 指定 -e HUGGING_FACE_HUB_TOKEN=<token>

容器运行后,我们通过向 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 运行正常,您现在可以在 Gaudi 2 上享受高性能推理!

TGI Gaudi 容器默认使用 bfloat16 数据类型。为了获得更高的吞吐量,您可能希望启用 FP8 量化。根据我们的测试结果,FP8 量化应该比 BF16 带来 1.8 倍的吞吐量提升。FP8 指令可在 README 文件中找到。

最后,您可以使用 Meta Llama Guard 模型启用内容审核。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 端点应在 localhost 的 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 环境变量中的 localhost IP 地址 (127.0.0.1) 替换为 GUI 运行服务器的实际 IP 地址来更新它。

我们运行以下命令安装所需依赖项

npm install

最后,我们使用以下命令启动 GUI 服务器

nohup npm run dev &

这将运行前端服务并启动应用程序。

基准测试结果

我们对不同的模型和配置进行了密集的实验。下面两图展示了 Llama2-70B 模型在 16 个并发用户下,在四个 Intel Gaudi 2 和四个 Nvidia H100 平台上端到端吞吐量和每美元性能的相对比较。

在这两种情况下,向量数据库和嵌入模型都使用了相同的 Intel Granite Rapids CPU 平台。对于每美元性能比较,我们使用公开定价计算平均训练每美元性能,这与 MosaicML 团队在 2024 年 1 月报告的相同。

如您所见,基于 H100 的系统吞吐量高出 1.13 倍,但每美元性能仅为 Gaudi 2 的 0.44 倍。这些比较可能会因不同云提供商的客户特定折扣而异。详细的基准测试配置列于文章末尾。

结论

上述部署示例成功展示了基于 RAG 的聊天机器人在英特尔平台上的运行。此外,随着英特尔不断发布即用型 GenAI 示例,开发人员受益于经过验证的工具,这些工具简化了创建和部署过程。这些示例具有通用性和易于定制的特点,使其成为英特尔平台上广泛应用的理想选择。

在运行企业 AI 应用程序时,基于 Intel Granite Rapids CPU 和 Gaudi 2 加速器的系统具有更低的总体拥有成本。通过 FP8 优化,还可以进一步提高性能。

以下开发者资源应能帮助您自信地启动您的 GenAI 项目。

如果您有任何问题或反馈,我们很乐意在 Hugging Face 论坛上回答。感谢阅读!

致谢:我们感谢 Chaitanya Khened、Suyue Chen、Mikolaj Zyczynski、Wenjiao Yue、Wenxin Zhang、Letong Han、Sihan Chen、Hanwen Cheng、Yuan Wu 和 Yi Wang 在 Intel Gaudi 2 上构建企业级 RAG 系统方面做出的杰出贡献。


基准测试配置

  • Gaudi2 配置:HLS-Gaudi2,带八块 Habana Gaudi2 HL-225H Mezzanine 卡和两颗 Intel® Xeon® Platinum 8380 CPU @ 2.30GHz,以及 1TB 系统内存;操作系统:Ubuntu 22.04.03,5.15.0 内核

  • H100 SXM 配置:Lambda labs 实例 gpu_8x_h100_sxm5;8xH100 SXM 和两颗 Intel Xeon® Platinum 8480 CPU@2 GHz,以及 1.8TB 系统内存;操作系统 Ubuntu 20.04.6 LTS,5.15.0 内核

  • Intel Xeon:预生产的 Granite Rapids 平台,配备 2Sx120C @ 1.9GHz 和 8800 MCR DIMM,以及 1.5TB 系统内存。操作系统:CentOS 9,6.2.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

  • 总拥有成本参考:https://www.databricks.com/blog/llm-training-and-inference-intel-gaudi2-ai-accelerators

社区

注册登录 发表评论