Logo Zéphyrnet

Créer un pipeline d'ingestion de données RAG pour les charges de travail de ML à grande échelle | Services Web Amazon

Date :

Pour créer une application d’IA générative, il est impératif d’enrichir les grands modèles de langage (LLM) avec de nouvelles données. C'est là qu'intervient la technique de Retrieval Augmented Generation (RAG). RAG est une architecture d'apprentissage automatique (ML) qui utilise des documents externes (comme Wikipédia) pour augmenter ses connaissances et obtenir des résultats de pointe sur des tâches à forte intensité de connaissances. . Pour ingérer ces sources de données externes, des bases de données vectorielles ont évolué, qui peuvent stocker des intégrations vectorielles de la source de données et permettre des recherches de similarité.

Dans cet article, nous montrons comment créer un pipeline d'ingestion RAG d'extraction, de transformation et de chargement (ETL) pour ingérer de grandes quantités de données dans un Service Amazon OpenSearch cluster et utilisation Amazon Relational Database Service (Amazon RDS) pour PostgreSQL avec l'extension pgvector comme magasin de données vectorielles. Chaque service implémente des algorithmes du k-voisin le plus proche (k-NN) ou du voisin le plus proche (ANN) et des mesures de distance pour calculer la similarité. Nous introduisons l'intégration de rayon dans le mécanisme de récupération de documents contextuels RAG. Ray est une bibliothèque informatique distribuée open source, Python, à usage général. Il permet au traitement de données distribué de générer et de stocker des intégrations pour une grande quantité de données, en les parallélisant sur plusieurs GPU. Nous utilisons un cluster Ray avec ces GPU pour exécuter une ingestion et une requête parallèles pour chaque service.

Dans cette expérience, nous tentons d'analyser les aspects suivants pour OpenSearch Service et l'extension pgvector sur Amazon RDS :

  • En tant que magasin de vecteurs, possibilité de mettre à l'échelle et de gérer un vaste ensemble de données contenant des dizaines de millions d'enregistrements pour RAG.
  • Goulots d'étranglement possibles dans le pipeline d'ingestion pour RAG
  • Comment obtenir des performances optimales en termes de temps d'ingestion et de récupération des requêtes pour OpenSearch Service et Amazon RDS

Pour en savoir plus sur les magasins de données vectorielles et leur rôle dans la création d'applications d'IA générative, reportez-vous à Le rôle des banques de données vectorielles dans les applications d'IA générative.

Présentation du service OpenSearch

OpenSearch Service est un service géré pour l'analyse, la recherche et l'indexation sécurisées des données commerciales et opérationnelles. OpenSearch Service prend en charge les données à l'échelle du pétaoctet avec la possibilité de créer plusieurs index sur des données textuelles et vectorielles. Avec une configuration optimisée, il vise un rappel élevé pour les requêtes. OpenSearch Service prend en charge ANN ainsi que la recherche exacte k-NN. OpenSearch Service prend en charge une sélection d'algorithmes du NMSLIB, FAISSet Lucene bibliothèques pour alimenter la recherche k-NN. Nous avons créé l'index ANN pour OpenSearch avec l'algorithme Hierarchical Navigable Small World (HNSW), car il est considéré comme une meilleure méthode de recherche pour les grands ensembles de données. Pour plus d'informations sur le choix de l'algorithme d'indexation, reportez-vous à Choisissez l'algorithme k-NN pour votre cas d'utilisation à l'échelle d'un milliard avec OpenSearch.

Présentation d'Amazon RDS pour PostgreSQL avec pgvector

L'extension pgvector ajoute une recherche de similarité vectorielle open source à PostgreSQL. En utilisant l'extension pgvector, PostgreSQL peut effectuer des recherches de similarité sur les intégrations vectorielles, offrant ainsi aux entreprises une solution rapide et efficace. pgvector propose deux types de recherches de similarité vectorielle : le voisin le plus proche exact, qui aboutit à un rappel à 100 %, et le voisin le plus proche approximatif (ANN), qui offre de meilleures performances que la recherche exacte avec un compromis sur le rappel. Pour les recherches sur un index, vous pouvez choisir le nombre de centres à utiliser dans la recherche, un plus grand nombre de centres offrant un meilleur rappel avec un compromis en termes de performances.

Vue d'ensemble de la solution

Le diagramme suivant illustre l'architecture de la solution.

Examinons les composants clés plus en détail.

Ensemble de données

Nous utilisons les données OSCAR comme corpus et l'ensemble de données SQUAD pour fournir des exemples de questions. Ces ensembles de données sont d'abord convertis en fichiers Parquet. Ensuite, nous utilisons un cluster Ray pour convertir les données Parquet en intégrations. Les intégrations créées sont ingérées dans OpenSearch Service et Amazon RDS avec pgvector.

OSCAR (Open Super-large Crawled Aggregated corpus) est un immense corpus multilingue obtenu par classification linguistique et filtrage des Exploration commune corpus utilisant le impoli architecture. Les données sont distribuées par langue sous forme originale et dédupliquée. L'ensemble de données Oscar Corpus contient environ 609 millions d'enregistrements et occupe environ 4.5 To sous forme de fichiers JSONL bruts. Les fichiers JSONL sont ensuite convertis au format Parquet, ce qui minimise la taille totale à 1.8 To. Nous avons ensuite réduit l'ensemble de données à 25 millions d'enregistrements pour gagner du temps lors de l'ingestion.

SQuAD (Stanford Question Answering Dataset) est un ensemble de données de compréhension écrite composé de questions posées par des travailleurs participatifs sur un ensemble d'articles Wikipédia, où la réponse à chaque question est un segment de texte, ou envergure, du passage de lecture correspondant, sinon la question pourrait être sans réponse. Nous utilisons ÉQUIPE, autorisé comme CC-BY-SA 4.0, pour fournir des exemples de questions. Il contient environ 100,000 50,000 questions, dont plus de XNUMX XNUMX sans réponse, écrites par des travailleurs participatifs pour ressembler à celles auxquelles il est possible de répondre.

Cluster de rayons pour l'ingestion et la création d'intégrations vectorielles

Lors de nos tests, nous avons constaté que les GPU ont le plus grand impact sur les performances lors de la création des intégrations. Par conséquent, nous avons décidé d'utiliser un cluster Ray pour convertir notre texte brut et créer les intégrations. rayon est un framework de calcul unifié open source qui permet aux ingénieurs ML et aux développeurs Python de faire évoluer les applications Python et d'accélérer les charges de travail ML. Notre cluster était composé de 5 g4dn.12xlarge Cloud de calcul élastique Amazon (Amazon EC2). Chaque instance a été configurée avec 4 GPU NVIDIA T4 Tensor Core, 48 vCPU et 192 Go de mémoire. Pour nos enregistrements texte, nous avons fini par les diviser en 1,000 100 morceaux avec un chevauchement de 200 morceaux. Cela s'élève à environ XNUMX par enregistrement. Pour le modèle utilisé pour créer les intégrations, nous avons opté pour tout-mpnet-base-v2 pour créer un espace vectoriel de 768 dimensions.

Configuration des infrastructures

Nous avons utilisé les types d'instances RDS et les configurations de cluster de services OpenSearch suivants pour configurer notre infrastructure.

Voici nos propriétés de type d'instance RDS :

  • Type d'instance : db.r7g.12xlarge
  • Stockage alloué : 20 To
  • Multi-AZ : vrai
  • Stockage chiffré : Vrai
  • Activer les informations sur les performances : vrai
  • Rétention de Performance Insight : 7 jours
  • Type de stockage : gp3
  • IOPS provisionnées : 64,000 XNUMX
  • Type d'index : FIV
  • Nombre de listes : 5,000 XNUMX
  • Fonction distance : L2

Voici nos propriétés de cluster OpenSearch Service :

  • Version: 2.5
  • Nœuds de données : 10
  • Type d'instance de nœud de données : r6g.4xlarge
  • Nœuds principaux : 3
  • Type d'instance de nœud principal : r6g.xlarge
  • Indice : Moteur HNSW : nmslib
  • Intervalle de rafraîchissement : 30 secondes
  • ef_construction: 256
  • m : 16
  • Fonction distance : L2

Nous avons utilisé des configurations volumineuses pour le cluster OpenSearch Service et les instances RDS afin d'éviter tout goulot d'étranglement en termes de performances.

Nous déployons la solution à l'aide d'un Kit de développement AWS Cloud (AWSCDK) empiler, comme indiqué dans la section suivante.

Déployer la pile AWS CDK

La pile AWS CDK nous permet de choisir OpenSearch Service ou Amazon RDS pour ingérer des données.

Pré-requis

Avant de procéder à l'installation, sous cdk, bin, src.tc, modifiez les valeurs booléennes d'Amazon RDS et d'OpenSearch Service sur true ou false selon vos préférences.

Vous avez également besoin d'un service lié Gestion des identités et des accès AWS (IAM) pour le domaine OpenSearch Service. Pour plus de détails, reportez-vous à Bibliothèque de constructions Amazon OpenSearch Service. Vous pouvez également exécuter la commande suivante pour créer le rôle :

aws iam create-service-linked-role --aws-service-name es.amazonaws.com

npm install
cdk deploy

Cette pile AWS CDK déploiera l'infrastructure suivante :

  • Un VPC
  • Un hôte de saut (à l'intérieur du VPC)
  • Un cluster OpenSearch Service (si vous utilisez le service OpenSearch pour l'ingestion)
  • Une instance RDS (si vous utilisez Amazon RDS pour l'ingestion)
  • An Gestionnaire de systèmes AWS document de déploiement du cluster Ray
  • An Service de stockage simple Amazon (Amazon S3) compartiment
  • An Colle AWS travail de conversion des fichiers JSONL de l'ensemble de données OSCAR en fichiers Parquet
  • Amazon Cloud Watch tableaux de bord

Télécharger les données

Exécutez les commandes suivantes à partir de l'hôte de saut :

stack_name="RAGStack"
output_key="S3bucket"

export AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/(.*)[a-z]/1/')
aws configure set region $AWS_REGION

bucket_name=$(aws cloudformation describe-stacks --stack-name "$stack_name" --query "Stacks[0].Outputs[?OutputKey=='bucketName'].OutputValue" --output text )

Avant de cloner le dépôt git, assurez-vous d'avoir un profil Hugging Face et d'avoir accès au corpus de données OSCAR. Vous devez utiliser le nom d'utilisateur et le mot de passe pour cloner les données OSCAR :

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/datasets/oscar-corpus/OSCAR-2301
cd OSCAR-2301
git lfs pull --include en_meta
cd en_meta
for F in `ls *.zst`; do zstd -d $F; done
rm *.zst
cd ..
aws s3 sync en_meta s3://$bucket_name/oscar/jsonl/

Convertir des fichiers JSONL en Parquet

La pile AWS CDK a créé la tâche AWS Glue ETL oscar-jsonl-parquet pour convertir les données OSCAR du format JSONL au format Parquet.

Après avoir exécuté le oscar-jsonl-parquet travail, les fichiers au format Parquet doivent être disponibles dans le dossier parquet dans le compartiment S3.

Téléchargez les questions

Depuis votre hôte Jump, téléchargez les données des questions et téléchargez-les dans votre compartiment S3 :

stack_name="RAGStack"
output_key="S3bucket"

export AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/(.*)[a-z]/1/')
aws configure set region $AWS_REGION

bucket_name=$(aws cloudformation describe-stacks --stack-name "$stack_name" --query "Stacks[0].Outputs[?OutputKey=='bucketName'].OutputValue" --output text )

wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json
cat train-v2.0.json| jq '.data[].paragraphs[].qas[].question' > questions.csv
aws s3 cp questions.csv s3://$bucket_name/oscar/questions/questions.csv

Configurer le cluster Ray

Dans le cadre du déploiement de la pile AWS CDK, nous avons créé un document Systems Manager appelé CreateRayCluster.

Pour exécuter le document, procédez comme suit :

  1. Sur la console Systems Manager, sous DOCUMENTS dans le volet de navigation, choisissez Appartenant à moi.
  2. Ouvrez le CreateRayCluster document.
  3. Selectionnez Courir.

La page de commande d'exécution aura les valeurs par défaut renseignées pour le cluster.

La configuration par défaut demande 5 g4dn.12xlarge. Assurez-vous que votre compte a des limites pour prendre en charge cela. La limite de service pertinente est l'exécution d'instances G et VT à la demande. La valeur par défaut est 64, mais cette configuration nécessite 240 CPU.

  1. Après avoir examiné la configuration du cluster, sélectionnez l'hôte de saut comme cible de la commande d'exécution.

Cette commande effectuera les étapes suivantes :

  • Copiez les fichiers du cluster Ray
  • Configurer le cluster Ray
  • Configurer les index du service OpenSearch
  • Configurer les tables RDS

Vous pouvez surveiller le résultat des commandes sur la console Systems Manager. Ce processus prendra 10 à 15 minutes pour le lancement initial.

Exécuter l'ingestion

Depuis l'hôte de saut, connectez-vous au cluster Ray :

sudo -i
cd /rag
ray attach llm-batch-inference.yaml

Lors de la première connexion à l'hôte, installez la configuration requise. Ces fichiers doivent déjà être présents sur le nœud principal.

pip install -r requirements.txt

Pour l’une ou l’autre des méthodes d’ingestion, si vous obtenez une erreur comme celle-ci, elle est liée à des informations d’identification expirées. La solution de contournement actuelle (au moment d'écrire ces lignes) consiste à placer les fichiers d'informations d'identification dans le nœud principal Ray. Pour éviter les risques de sécurité, n'utilisez pas les utilisateurs IAM pour l'authentification lorsque vous développez des logiciels spécialement conçus ou lorsque vous travaillez avec des données réelles. Utilisez plutôt la fédération avec un fournisseur d'identité tel que AWS IAM Identity Center (successeur d'AWS Single Sign-On).

OSError: When reading information for key 'oscar/parquet_data/part-00497-f09c5d2b-0e97-4743-ba2f-1b2ad4f36bb1-c000.snappy.parquet' in bucket 'ragstack-s3bucket07682993-1e3dic0fvr3rf': AWS Error [code 15]: No response body.

Habituellement, les informations d'identification sont stockées dans le fichier ~/.aws/credentials sur les systèmes Linux et macOS, et %USERPROFILE%.awscredentials sous Windows, mais il s'agit d'informations d'identification à court terme avec un jeton de session. Vous ne pouvez pas non plus remplacer le fichier d'informations d'identification par défaut et vous devez donc créer des informations d'identification à long terme sans le jeton de session à l'aide d'un nouvel utilisateur IAM.

Pour créer des informations d'identification à long terme, vous devez générer une clé d'accès AWS et une clé d'accès secrète AWS. Vous pouvez le faire depuis la console IAM. Pour obtenir des instructions, reportez-vous à S'authentifier avec les identifiants de l'utilisateur IAM.

Après avoir créé les clés, connectez-vous à l'hôte de saut en utilisant Session Manager, une fonctionnalité de Systems Manager, et exécutez la commande suivante :

$ aws configure
AWS Access Key ID [None]: <Your AWS Access Key>
AWS Secret Access Key [None]: <Your AWS Secret access key>
Default region name [None]: us-east-1
Default output format [None]: json

Vous pouvez désormais réexécuter les étapes d’ingestion.

Ingérer des données dans OpenSearch Service

Si vous utilisez le service OpenSearch, exécutez le script suivant pour ingérer les fichiers :

export AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/(.*)[a-z]/1/')
aws configure set region $AWS_REGION

python embedding_ray_os.py

Une fois l'opération terminée, exécutez le script qui exécute les requêtes simulées :

python query_os.py

Ingérer des données dans Amazon RDS

Si vous utilisez Amazon RDS, exécutez le script suivant pour ingérer les fichiers :

export AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/(.*)[a-z]/1/')
aws configure set region $AWS_REGION

python embedding_ray_rds.py

Une fois l'opération terminée, assurez-vous de faire un vide complet sur l'instance RDS.

Exécutez ensuite le script suivant pour exécuter des requêtes simulées :

python query_rds.py

Configurer le tableau de bord Ray

Avant de configurer le tableau de bord Ray, vous devez installer le Interface de ligne de commande AWS (AWS CLI) sur votre ordinateur local. Pour obtenir des instructions, reportez-vous à Installer ou mettre à jour la dernière version de l'AWS CLI.

Effectuez les étapes suivantes pour configurer le tableau de bord :

  1. Installez l' Plugin du gestionnaire de sessions pour l'AWS CLI.
  2. Dans le compte Isengard, copiez les informations d'identification temporaires pour bash/zsh et exécutez-les dans votre terminal local.
  3. Créez un fichier session.sh sur votre ordinateur et copiez le contenu suivant dans le fichier :
#!/bin/bash
echo Starting session to $1 to forward to port $2 using local port $3
aws ssm start-session --target $1 --document-name AWS-StartPortForwardingSession --parameters ‘{“portNumber”:[“‘$2’“], “localPortNumber”:[“‘$3’“]}'

  1. Modifiez le répertoire dans lequel ce fichier session.sh est stocké.
  2. Exécuter la commande Chmod +x pour donner l'autorisation exécutable au fichier.
  3. Exécutez la commande suivante:
./session.sh <Ray cluster head node instance ID> 8265 8265

Par exemple :

./session.sh i-021821beb88661ba3 8265 8265

Vous verrez un message comme celui-ci :

Starting session to i-021821beb88661ba3 to forward to port 8265 using local port 8265

Starting session with SessionId: abcdefgh-Isengard-0d73d992dfb16b146
Port 8265 opened for sessionId abcdefgh-Isengard-0d73d992dfb16b146.
Waiting for connections...

Ouvrez un nouvel onglet dans votre navigateur et saisissez localhost:8265.

Vous verrez le tableau de bord Ray et les statistiques des tâches et du cluster en cours d'exécution. Vous pouvez suivre les métriques à partir d’ici.

Par exemple, vous pouvez utiliser le tableau de bord Ray pour observer la charge sur le cluster. Comme le montre la capture d'écran suivante, lors de l'ingestion, les GPU fonctionnent à près de 100 % d'utilisation.

Vous pouvez également utiliser la RAG_Benchmarks Tableau de bord CloudWatch pour voir le taux d'ingestion et les temps de réponse aux requêtes.

Extensibilité de la solution

Vous pouvez étendre cette solution pour connecter d'autres magasins de vecteurs AWS ou tiers. Pour chaque nouveau magasin de vecteurs, vous devrez créer des scripts pour configurer le magasin de données ainsi que pour ingérer des données. Le reste du pipeline peut être réutilisé selon les besoins.

Conclusion

Dans cet article, nous avons partagé un pipeline ETL que vous pouvez utiliser pour placer des données RAG vectorisées dans OpenSearch Service ainsi que dans Amazon RDS avec l'extension pgvector en tant que banques de données vectorielles. La solution utilisait un cluster Ray pour fournir le parallélisme nécessaire pour ingérer un grand corpus de données. Vous pouvez utiliser cette méthodologie pour intégrer n'importe quelle base de données vectorielle de votre choix afin de créer des pipelines RAG.


À propos des auteurs

Randy DeFauw est architecte principal de solutions senior chez AWS. Il est titulaire d'un MSEE de l'Université du Michigan, où il a travaillé sur la vision par ordinateur pour les véhicules autonomes. Il est également titulaire d'un MBA de la Colorado State University. Randy a occupé divers postes dans le domaine technologique, allant de l'ingénierie logicielle à la gestion de produits. Il est entré dans l’espace du Big Data en 2013 et continue d’explorer ce domaine. Il travaille activement sur des projets dans le domaine du ML et a fait des présentations à de nombreuses conférences, notamment Strata et GlueCon.

David Christian est un architecte de solutions principal basé en Californie du Sud. Il est titulaire d'un baccalauréat en sécurité de l'information et est passionné par l'automatisation. Ses domaines d'intervention sont la culture et la transformation DevOps, l'infrastructure en tant que code et la résilience. Avant de rejoindre AWS, il a occupé des postes dans les domaines de la sécurité, du DevOps et de l'ingénierie système, gérant des environnements de cloud privé et public à grande échelle.

Prachi Kulkarni est architecte de solutions senior chez AWS. Sa spécialisation est l'apprentissage automatique et elle travaille activement à la conception de solutions utilisant diverses offres AWS ML, Big Data et analytiques. Prachi possède de l'expérience dans plusieurs domaines, notamment les soins de santé, les avantages sociaux, la vente au détail et l'éducation, et a occupé divers postes dans les domaines de l'ingénierie et de l'architecture de produits, de la gestion et de la réussite des clients.

Richa Gupta est architecte de solutions chez AWS. Elle est passionnée par l'architecture de solutions de bout en bout pour les clients. Sa spécialisation est l'apprentissage automatique et la manière dont il peut être utilisé pour créer de nouvelles solutions menant à l'excellence opérationnelle et générant des revenus pour l'entreprise. Avant de rejoindre AWS, elle a travaillé en tant qu'ingénieur logiciel et architecte de solutions, créant des solutions pour de grands opérateurs de télécommunications. En dehors du travail, elle aime explorer de nouveaux endroits et adore les activités aventureuses.

spot_img

Dernières informations

spot_img