产品展示

构建适用于大规模机器学习工作负载的 RAG 数据摄取管道 大数据博客

构建适用于大规模机器学习工作负载的 RAG 数据摄取管道 大数据博客

为大规模 ML 工作负载构建 RAG 数据摄取管道

作者:Randy DeFauw David Christian Prachi Kulkarni Richa Gupta发布日期:2024年3月13日来源:AWS 博客

关键要点

在构建生成性 AI 应用时,为大型语言模型 (LLMs) 提供新的数据非常重要。这可以通过 Retrieval Augmented Generation (RAG) 技术来实现,该技术利用外部文档来增强模型的知识,并在知识密集型任务中获得优异结果。本文介绍了如何构建 RAG 提取、转换和加载 (ETL) 数据摄取管道,以将大量数据摄取到 Amazon OpenSearch Service 集群中,并使用 Amazon RDS for PostgreSQL 和 pgvector 扩展作为向量数据存储。我们还探讨了性能优化和潜在瓶颈等关键方面。

在构建任何生成性 AI 应用时,向大型语言模型 (LLMs) 注入新的数据至关重要。这正是 Retrieval Augmented Generation (RAG) 技术发挥作用的地方。RAG 是一种机器学习 (ML) 架构,它利用外部文档如维基百科来增强其知识,从而在知识密集型任务中实现领先的结果。为了摄取这些外部数据源,向量数据库应运而生,这类数据库能够存储数据源的向量嵌入,并支持相似性搜索。

本文中,我们将展示如何构建 RAG 数据摄取管道,使用 Amazon OpenSearch Service 集群和 Amazon RDS for PostgreSQL使用 pgvector 扩展作为向量数据存储以摄取大量数据。每项服务均实现了 k近邻 (kNN) 或近似最近邻 (ANN) 算法及距离度量,以计算相似度。同时,我们引入了 Ray 以增强 RAG 上下文文档检索机制。Ray 是一个开源的 Python 通用分布式计算库,支持分布式数据处理,生成和存储大量数据的嵌入,并在多个 GPU 中并行运行。我们使用了一个 Ray 集群来为每项服务并行执行摄取和查询。

在本实验中,我们将分析 OpenSearch Service 和 Amazon RDS 上 pgvector 扩展的以下几个方面:

作为向量存储的能力,如何扩展并处理拥有千万级记录的大型数据集。RAG 摄取管道可能出现的瓶颈。如何在 OpenSearch Service 和 Amazon RDS 中实现摄取和查询检索时间的最佳性能。

有关向量数据存储及其在构建生成性 AI 应用中的作用的更多信息,请参见 向量数据存储在生成性 AI 应用中的角色。

OpenSearch Service 概述

OpenSearch Service 是一种托管服务,便于安全分析、搜索和索引业务及操作数据。它支持 PB 级数据,并能够在文本和向量数据上创建多个索引。经优化配置后,旨在对查询实现较高的召回率。OpenSearch Service 支持 ANN 和精确 kNN 搜索,采用来自 NMSLIB、FAISS 和 Lucene 库的多种算法来支持 kNN 搜索。我们为 OpenSearch 创建了使用分层可导航小世界 (HNSW) 算法的 ANN 索引,因为该算法被认为是处理大型数据集的更优搜索方法。有关索引算法选择的更多信息,请参见 为你的十亿规模用例选择 kNN 算法。

Amazon RDS for PostgreSQL 与 pgvector 概述

pgvector 扩展为 PostgreSQL 添加了开源的向量相似性搜索功能。通过使用 pgvector 扩展,PostgreSQL 能够在向量嵌入上执行相似性搜索,为企业提供快速而高效的解决方案。pgvector 提供两种类型的向量相似性搜索:精确最近邻,召回率为 100;以及近似最近邻 (ANN),在召回率上有所折衷,但性能更优。在索引搜索时,可以选择使用的中心数量,更多的中心提供更好的召回率,但性能可能会下降。

解决方案概述

下图展示了解决方案架构。

我们将详细介绍关键组件。

数据集

我们使用 OSCAR 数据集作为语料库,并用 SQUAD 数据集提供示例问题。这些数据集首先转换为 Parquet 文件。然后,我们使用 Ray 集群将 Parquet 数据转换为嵌入,生成的嵌入将被摄取到 OpenSearch Service 和使用 pgvector 的 Amazon RDS 中。

OSCAR开放超级大规模抓取聚合语料库是通过对 Common Crawl 语料库进行语言分类和过滤而获得的大型多语言语料库。数据按语言分发,既有原始形式,也有去重过的形式。Oscar 语料库包含大约 609 亿条记录,占用约 45 TB 原始 JSONL 文件。然后,将 JSONL 文件转换为 Parquet 格式,减少到 18 TB。为了节省摄取时间,我们进一步将数据集缩减至 2500 万条记录。

SQuAD斯坦福问答数据集是由众包工作者基于一组维基百科文章提出的问题的阅读理解数据集,其中每个问题的答案都是相应阅读段落中的一段文本,或者该问题可能没有答案。我们使用 SQUAD,其许可证为 CCBYSA 40,提供示例问题。该数据集大约包含 100000 个问题,其中超过 50000 个是众包工作者撰写的、看起来类似于可回答问题的无答案问题。

Ray 集群用于摄取和创建向量嵌入

在我们的测试中,我们发现 GPU 对性能的影响最大,因此决定使用 Ray 集群来转换原始文本并创建嵌入。Ray 是一个开源统一计算框架,使机器学习工程师和 Python 开发人员可以扩展 Python 应用程序并加速 ML 工作负载。我们的集群由 5 台 g4dn12xlarge Amazon Elastic Compute Cloud 实例组成。每个实例配置 4 个 NVIDIA T4 Tensor Core GPU、48 个 vCPU 和 192 GiB 内存。对于我们的文本记录,最终将每个记录分块为 1000 个片段,重叠 100 个片段。每个记录大约为 200 个块。我们选择使用 allmpnetbasev2 模型来创建 768 维向量空间。

基础设施设置

我们使用如下 RDS 实例类型和 OpenSearch Service 集群配置来设置基础设施。

以下是 RDS 实例类型属性:

属性值实例类型dbr7g12xlarge分配存储20 TB多可用区 (MultiAZ)是存储加密是启用性能洞察是性能洞察保留期7 天存储类型gp3预配置 IOPS64000索引类型IVF列表数量5000距离函数L2

以下是 OpenSearch Service 集群属性:

属性值版本25数据节点10数据节点实例类型r6g4xlarge主节点3主节点实例类型r6gxlarge索引HNSW 引擎 nmslib刷新间隔30 秒efconstruction256m16距离函数L2

我们使用了较大的配置来避免 OpenSearch Service 集群和 RDS 实例出现任何性能瓶颈。

我们通过 AWS Cloud Development Kit (AWS CDK) 堆栈 部署解决方案,如下所示。

部署 AWS CDK 堆栈

AWS CDK 堆栈可以让我们选择 OpenSearch Service 或 Amazon RDS 用于数据摄取。

前提条件

在安装之前,在 cdk 的 bin 和 srctc 下,根据个人偏好将 Amazon RDS 和 OpenSearch Service 的布尔值更改为 true 或 false。

还需要为 OpenSearch Service 域创建一个服务相关的 AWS 身份与访问管理 (IAM) 角色。有关更多详细信息,请参见 Amazon OpenSearch Service 构造库。您还可以运行以下命令创建角色:

bashaws iam createservicelinkedrole awsservicename esamazonawscomnpm installcdk deploy

此 AWS CDK 堆栈将部署以下基础设施:

一个 VPC一个跳转主机位于 VPC 内一个 OpenSearch Service 集群如果使用 OpenSearch Service 进行摄取一个 RDS 实例如果使用 Amazon RDS 进行摄取一个 AWS 系统管理器 文件,用于部署 Ray 集群一个 Amazon 简单存储服务 (Amazon S3) 桶一个 AWS Glue 作业,将 OSCAR 数据集 JSONL 文件转换为 Parquet 文件Amazon CloudWatch 仪表板

下载数据

在跳转主机上运行以下命令:

bashstackname=RAGStackoutputkey=S3bucketexport AWSREGION=(curl s http//169254169254/latest/metadata/placement/availabilityzone sed s/()[az]/1/)aws configure set region AWSREGIONbucketname=(aws cloudformation describestacks stackname stackname query Stacks[0]Outputs[OutputKey==bucketName]OutputValue output text )

在克隆 git repo 之前,请确保您拥有 Hugging Face 账户并可访问 OSCAR 数据集。您需要用户名和密码来克隆 OSCAR 数据:

bashGITLFSSKIPSMUDGE=1 git clone https//huggingfaceco/datasets/oscarcorpus/OSCAR2301cd OSCAR2301git lfs pull include enmetacd enmetafor F in ls zst do zstd d F donerm zstcd aws s3 sync enmeta s3//bucketname/oscar/jsonl/

将 JSONL 文件转换为 Parquet

AWS CDK 堆栈创建了 AWS Glue ETL 作业 oscarjsonlparquet,用于将 OSCAR 数据从 JSONL 转换为 Parquet 格式。

在运行 oscarjsonlparquet 作业后,Parquet 格式的文件应可在 S3 桶的 parquet 文件夹中找到。

下载问题数据

在跳转主机上,下载问题数据,并将其上传到您的 S3 桶中:

bashstackname=RAGStackoutputkey=S3bucketexport AWSREGION=(curl s http//169254169254/latest/metadata/placement/availabilityzone sed s/()[az]/1/)aws configure set region AWSREGIONbucketname=(aws cloudformation describestacks stackname stackname query Stacks[0]Outputs[OutputKey==bucketName]OutputValue output text )

wget https//rajpurkargithubio/SQuADexplorer/dataset/trainv20jsoncat trainv20json jq data[]paragraphs[]qas[]question gt questionscsvaws s3 cp questionscsv s3//bucketname/oscar/questions/questionscsv

设置 Ray 集群

作为 AWS CDK 堆栈部署的一部分,我们创建了一个名为 CreateRayCluster 的系统管理器文档。

要运行该文档,请执行以下步骤:

在系统管理器控制台的导航窗格下选择 文档,然后选择 Owned by Me。打开 CreateRayCluster 文档。选择 运行。

运行命令页面将为集群填充默认值。

默认配置请求 5 个 g4dn12xlarge,确保您的账户有足够的限制支持此操作。相关的服务限制是正在运行的按需 G 和 VT 实例的数量。默认限制为 64,但此配置需要 240 个 CPU。

在审核集群配置后,将跳转主机选择为运行命令的目标。

该命令将执行以下步骤:

复制 Ray 集群文件设置 Ray 集群设置 OpenSearch Service 索引设置 RDS 表

您可以在系统管理器控制台上监控命令的输出。此过程的初次启动将需要 1015 分钟。

运行数据摄取

从跳转主机连接到 Ray 集群:

bashsudo icd /ragray attach llmbatchinferenceyaml

首次连接到主机时,请安装所需的库。这些文件应已经存在于主节点上。

bashpip install r requirementstxt

对于任何摄取方法,如果您遇到类似以下的错误,它与过期的凭证有关。当前的解决方法截至本文章撰写时是在 Ray 主节点上放置凭证文件。为了避免安全风险,在开发专门的软件或处理真实数据时,不要使用 IAM 用户进行认证,而应使用身份提供者如 AWS IAM 身份中心AWS Single SignOn 的继任者进行联合身份。

bashOSError When reading information for key oscar/parquetdata/part00497f09c5d2b0e974743ba2f1b2ad4f36bb1c000snappyparquet in bucket ragstacks3bucket076829931e3dic0fvr3rf AWS Error [code 15] No response body

通常,凭证存储在 Linux 和 macOS 系统的 /aws/credentials 文件中,以及 Windows 系统的 USERPROFILEawscredentials 中,但这些是带有会话令牌的短期凭证。您也无法覆盖默认凭证文件,因此需要创建没有会话令牌的新 IAM 用户的长期凭证。

创建长期凭证,您需要生成 AWS 访问密钥和 AWS 秘密访问密钥。这可以从 IAM 控制台进行。有关说明,请参见 使用 IAM 用户凭证进行身份验证。

生成密钥后,使用 Session Manager 连接到跳转主机,这是一种系统管理器的能力,并运行以下命令:

bash aws configureAWS Access Key ID [None] ltYour AWS Access KeygtAWS Secret Access Key [None] ltYour AWS Secret access keygtDefault region name [None] useast1Default output format [None] json

现在您可以重新运行摄取步骤。

向 OpenSearch Service 摄取数据

如果您使用 OpenSearch Service,请运行以下脚本来摄取文件:

bashexport AWSREGION=(curl s http//169254169254/latest/metadata/placement/availabilityzone sed s/()[az]/1/)aws configure set region AWSREGION

python embeddingrayospy

当操作完成后,运行模拟查询的脚本:

bashpython queryospy

黑豹加速器app下载

向 Amazon RDS 摄取数据

如果您使用 Amazon RDS,请运行以下脚本来摄取文件:

bashexport AWSREGION

构建适用于大规模机器学习工作负载的 RAG 数据摄取管道 大数据博客

  1. 将 Amazon Q Business 连接到 Microsoft SharePoint Onlin 将 Amazon Q Business 连接到 Microsoft SharePoint Onlin

    将 Amazon Q Business 连接到 Microsoft SharePoint Online 的最小权限访问控制关键要点本文介绍如何将 Amazon Q Business 与 SharePoint Online 连接,使用最小权限访问控制以确保数据安全。分享了创建和配置 Amazon Q ...

  1. 通过联邦学习启用数据共享:首席数字官的政策方法 机器学习博客 通过联邦学习启用数据共享:首席数字官的政策方法 机器学习博客

    通过联邦学习实现数据共享:首席数字官的政策思考重点摘要在医疗领域,联邦学习作为一项新技术,能够显著加速对中风患者的诊断过程,提升研究质量与决策水平。通过将数据安全地分散在不同医疗机构而不会移出其防火墙,联邦学习为医生和研究人员提供了使用人工智能处理医疗数据的新模式。这种方法不仅遵循各类数据保护法规,...