Zephyrnet-logo

Bouw een pijplijn voor RAG-gegevensopname voor grootschalige ML-workloads | Amazon-webservices

Datum:

Voor het bouwen van elke generatieve AI-toepassing is het verrijken van de grote taalmodellen (LLM's) met nieuwe gegevens absoluut noodzakelijk. Dit is waar de Retrieval Augmented Generation (RAG)-techniek in beeld komt. RAG is een machine learning (ML)-architectuur die externe documenten (zoals Wikipedia) gebruikt om zijn kennis uit te breiden en state-of-the-art resultaten te bereiken voor kennisintensieve taken. . Voor het opnemen van deze externe gegevensbronnen zijn vectordatabases ontwikkeld, die vectorinsluitingen van de gegevensbron kunnen opslaan en zoeken naar overeenkomsten mogelijk maken.

In dit bericht laten we zien hoe u een RAG-opnamepijplijn kunt bouwen, transformeren en laden (ETL) om grote hoeveelheden gegevens op te nemen in een Amazon OpenSearch-service clusteren en gebruiken Amazon Relational Database Service (Amazon RDS) voor PostgreSQL met de pgvector-extensie als vectorgegevensopslag. Elke service implementeert algoritmen voor k-dichtstbijzijnde buur (k-NN) of geschatte naaste buur (ANN) en afstandsmetrieken om de gelijkenis te berekenen. We introduceren de integratie van straal in het RAG-mechanisme voor het ophalen van contextuele documenten. Ray is een open source, Python, gedistribueerde computerbibliotheek voor algemene doeleinden. Het maakt gedistribueerde gegevensverwerking mogelijk om inbedding voor een grote hoeveelheid gegevens te genereren en op te slaan, parallellisatie over meerdere GPU's. We gebruiken een Ray-cluster met deze GPU's om voor elke service parallelle opname en query's uit te voeren.

In dit experiment proberen we de volgende aspecten te analyseren voor OpenSearch Service en de pgvector-extensie op Amazon RDS:

  • Als vectoropslag de mogelijkheid om een โ€‹โ€‹grote dataset met tientallen miljoenen records voor RAG te schalen en te verwerken
  • Mogelijke knelpunten in de ingest-pijplijn voor RAG
  • Hoe u optimale prestaties kunt bereiken op het gebied van opname en ophaaltijden van zoekopdrachten voor OpenSearch Service en Amazon RDS

Raadpleeg voor meer informatie over vectorgegevensopslag en hun rol bij het bouwen van generatieve AI-toepassingen De rol van vectordatastores in generatieve AI-toepassingen.

Overzicht van de OpenSearch-service

OpenSearch Service is een beheerde service voor het veilig analyseren, zoeken en indexeren van zakelijke en operationele gegevens. OpenSearch Service ondersteunt gegevens op petabyteschaal met de mogelijkheid om meerdere indexen op tekst- en vectorgegevens te maken. Met een geoptimaliseerde configuratie streeft het naar een hoge herinnering voor de zoekopdrachten. OpenSearch Service ondersteunt zowel ANN als exact k-NN zoeken. OpenSearch Service ondersteunt een selectie algoritmen uit de NMSLIB, FAISS en Luceen bibliotheken om de k-NN-zoekopdracht mogelijk te maken. We hebben de ANN-index voor OpenSearch gemaakt met het Hierarchical Navigable Small World (HNSW)-algoritme, omdat dit wordt beschouwd als een betere zoekmethode voor grote datasets. Voor meer informatie over de keuze van het indexalgoritme, zie Kies het k-NN-algoritme voor uw gebruiksscenario op miljarden schaal met OpenSearch.

Overzicht van Amazon RDS voor PostgreSQL met pgvector

De pgvector-extensie voegt een open source vectorgelijkeniszoekopdracht toe aan PostgreSQL. Door gebruik te maken van de pgvector-extensie kan PostgreSQL overeenkomsten zoeken op vectorinbedding, waardoor bedrijven een snelle en bekwame oplossing krijgen. pgvector biedt twee soorten zoekopdrachten naar vectorgelijkenis: exacte dichtstbijzijnde buur, wat resulteert in een herinnering van 100%, en geschatte dichtstbijzijnde buur (ANN), wat betere prestaties oplevert dan exacte zoekopdracht met een afweging tussen terugroepen. Voor zoekopdrachten via een index kunt u kiezen hoeveel centra u bij de zoekopdracht wilt gebruiken, waarbij meer centra een betere herinnering opleveren met een wisselwerking tussen de prestaties.

Overzicht oplossingen

Het volgende diagram illustreert de oplossingsarchitectuur.

Laten we de belangrijkste componenten in meer detail bekijken.

dataset

We gebruiken OSCAR-gegevens als ons corpus en de SQUAD-gegevensset om voorbeeldvragen te bieden. Deze gegevenssets worden eerst geconverteerd naar Parquet-bestanden. Vervolgens gebruiken we een Ray-cluster om de Parquet-gegevens naar inbedding te converteren. De gemaakte insluitingen worden met pgvector opgenomen in de OpenSearch Service en Amazon RDS.

OSCAR (Open Super-large Crawled Aggregated corpus) is een enorm meertalig corpus dat wordt verkregen door taalclassificatie en filtering van de Gemeenschappelijke crawl corpus met behulp van de onaardig architectuur. Gegevens worden per taal verspreid, zowel in originele als in gededupliceerde vorm. De Oscar Corpus-dataset omvat ongeveer 609 miljoen records en neemt ongeveer 4.5 TB in beslag als onbewerkte JSONL-bestanden. De JSONL-bestanden worden vervolgens geconverteerd naar Parquet-indeling, waardoor de totale grootte wordt geminimaliseerd tot 1.8 TB. We hebben de dataset verder verkleind tot 25 miljoen records om tijd te besparen tijdens de opname.

SQuAD (Stanford Question Answering Dataset) is een dataset voor begrijpend lezen die bestaat uit vragen die door crowdworkers worden gesteld over een reeks Wikipedia-artikelen, waarbij het antwoord op elke vraag een stuk tekst is, of span, uit de overeenkomstige leespassage, anders is de vraag mogelijk niet te beantwoorden. We gebruiken SQUAD, gelicentieerd als CC-BY-SA 4.0, om voorbeeldvragen te geven. Het bevat ongeveer 100,000 vragen, waarvan meer dan 50,000 onbeantwoordbare vragen, geschreven door crowdworkers, die lijken op beantwoordbare vragen.

Stralencluster voor opname en het creรซren van vectorinbedding

Tijdens onze tests hebben we ontdekt dat de GPU's de grootste impact hebben op de prestaties bij het maken van de insluitingen. Daarom hebben we besloten een Ray-cluster te gebruiken om onze onbewerkte tekst te converteren en de insluitingen te maken. straal is een open source unified compute-framework waarmee ML-ingenieurs en Python-ontwikkelaars Python-applicaties kunnen schalen en ML-workloads kunnen versnellen. Ons cluster bestond uit 5 g4dn.12xlarge Amazon Elastic Compute-cloud (Amazon EC2)-instanties. Elke instantie was geconfigureerd met 4 NVIDIA T4 Tensor Core GPU's, 48 โ€‹โ€‹vCPU en 192 GiB geheugen. Voor onze tekstrecords hebben we ze uiteindelijk in 1,000 stukjes opgedeeld met een overlap van 100 stukjes. Dit komt uit op ongeveer 200 per record. Voor het model dat wordt gebruikt om inbedding te maken, zijn we uitgekomen all-mpnet-base-v2 om een โ€‹โ€‹768-dimensionale vectorruimte te creรซren.

Opstelling infrastructuur

We hebben de volgende RDS-instantietypen en OpenSearch-serviceclusterconfiguraties gebruikt om onze infrastructuur op te zetten.

Dit zijn onze eigenschappen voor het RDS-instantietype:

  • Instantietype: db.r7g.12xlarge
  • Toegewezen opslag: 20 TB
  • Multi-AZ: waar
  • Versleutelde opslag: waar
  • Prestatie-inzichten inschakelen: Waar
  • Behoud van prestatie-inzichten: 7 dagen
  • Opslagtype: gp3
  • Voorziene IOPS: 64,000
  • Indextype: IVF
  • Aantal lijsten: 5,000
  • Afstandsfunctie: L2

Dit zijn onze OpenSearch Service-clustereigenschappen:

  • Versie: 2.5
  • Gegevensknooppunten: 10
  • Type gegevensknooppuntinstantie: r6g.4xlarge
  • Primaire knooppunten: 3
  • Primair knooppuntinstantietype: r6g.xlarge
  • Index: HNSW-motor: nmslib
  • Vernieuwingsinterval: 30 seconden
  • ef_construction: 256
  • m: 16
  • Afstandsfunctie: L2

We hebben grote configuraties gebruikt voor zowel het OpenSearch Service-cluster als de RDS-instanties om prestatieknelpunten te voorkomen.

We implementeren de oplossing met behulp van een AWS Cloud-ontwikkelingskit (AWS-CDK) stack, zoals beschreven in de volgende sectie.

Implementeer de AWS CDK-stack

Met de AWS CDK-stack kunnen we OpenSearch Service of Amazon RDS kiezen voor het opnemen van gegevens.

Voorafgaande vereisten

Voordat u doorgaat met de installatie, wijzigt u onder cdk, bin, src.tc de Booleaanse waarden voor Amazon RDS en OpenSearch Service in waar of onwaar, afhankelijk van uw voorkeur.

Je hebt ook een servicegekoppelde versie nodig AWS Identiteits- en toegangsbeheer (IAM)-rol voor het OpenSearch Service-domein. Voor meer details, zie Amazon OpenSearch Service Construct-bibliotheek. U kunt ook de volgende opdracht uitvoeren om de rol te maken:

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

npm install
cdk deploy

Deze AWS CDK-stack zal de volgende infrastructuur inzetten:

  • Een VPC
  • Een jumphost (binnen de VPC)
  • Een OpenSearch Service-cluster (als u de OpenSearch-service gebruikt voor opname)
  • Een RDS-instantie (bij gebruik van Amazon RDS voor opname)
  • An AWS-systeembeheerder document voor het inzetten van de Ray-cluster
  • An Amazon eenvoudige opslagservice (Amazon S3) emmer
  • An AWS lijm taak voor het converteren van de JSONL-bestanden van de OSCAR-gegevensset naar Parquet-bestanden
  • Amazon Cloud Watch dashboards

Download de gegevens

Voer de volgende opdrachten uit vanaf de jumphost:

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 )

Voordat je de git repository gaat klonen, zorg ervoor dat je een Hugging Face-profiel hebt en toegang hebt tot het OSCAR-gegevenscorpus. U moet de gebruikersnaam en het wachtwoord gebruiken voor het klonen van de OSCAR-gegevens:

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/

Converteer JSONL-bestanden naar Parquet

De AWS CDK-stack heeft de AWS Glue ETL-taak gemaakt oscar-jsonl-parquet om de OSCAR-gegevens van JSONL naar Parquet-indeling te converteren.

Nadat u het oscar-jsonl-parquet job, moeten de bestanden in Parquet-indeling beschikbaar zijn onder de parketmap in de S3-bucket.

Download de vragen

Download vanaf uw jumphost de vraaggegevens en upload deze naar uw S3-bucket:

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

Zet het Ray-cluster op

Als onderdeel van de AWS CDK-stack-implementatie hebben we een Systems Manager-document gemaakt met de naam CreateRayCluster.

Voer de volgende stappen uit om het document uit te voeren:

  1. Op de Systems Manager-console, onder Documenten in het navigatievenster, kies Van mij.
  2. Open de CreateRayCluster document.
  3. Kies lopen.

Op de run-opdrachtpagina worden de standaardwaarden voor het cluster ingevuld.

De standaardconfiguratie vraagt โ€‹โ€‹5 g4dn.12xlarge. Zorg ervoor dat uw account limieten heeft om dit te ondersteunen. De relevante servicelimiet is het uitvoeren van On-Demand G- en VT-instanties. De standaard hiervoor is 64, maar deze configuratie vereist 240 CPUS.

  1. Nadat u de clusterconfiguratie hebt gecontroleerd, selecteert u de jumphost als doel voor de run-opdracht.

Met deze opdracht worden de volgende stappen uitgevoerd:

  • Kopieer de Ray-clusterbestanden
  • Zet het Ray-cluster op
  • Stel de OpenSearch Service-indexen in
  • Stel de RDS-tabellen in

U kunt de uitvoer van de opdrachten controleren op de Systems Manager-console. Dit proces duurt 10 tot 15 minuten voor de eerste lancering.

Inname uitvoeren

Maak vanaf de jumphost verbinding met het Ray-cluster:

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

De eerste keer dat u verbinding maakt met de host, installeert u de vereisten. Deze bestanden moeten al aanwezig zijn op het hoofdknooppunt.

pip install -r requirements.txt

Als u bij een van de opnamemethoden een foutmelding als de volgende krijgt, heeft dit te maken met verlopen inloggegevens. De huidige oplossing (op het moment van schrijven) is het plaatsen van referentiebestanden in het Ray-hoofdknooppunt. Om veiligheidsrisico's te voorkomen, mag u geen IAM-gebruikers gebruiken voor authenticatie wanneer u speciaal gebouwde software ontwikkelt of met echte gegevens werkt. Gebruik in plaats daarvan federatie met een identiteitsprovider zoals AWS IAM Identity Center (opvolger van 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.

Meestal worden de inloggegevens in het bestand opgeslagen ~/.aws/credentials op Linux- en macOS-systemen, en %USERPROFILE%.awscredentials op Windows, maar dit zijn referenties voor de korte termijn met een sessietoken. U kunt het standaardgegevensbestand ook niet overschrijven en daarom moet u langetermijngegevens aanmaken zonder het sessietoken met behulp van een nieuwe IAM-gebruiker.

Om inloggegevens voor de lange termijn aan te maken, moet u een AWS-toegangssleutel en een geheime AWS-toegangssleutel genereren. U kunt dat doen vanuit de IAM-console. Voor instructies, zie Authenticeer met IAM-gebruikersreferenties.

Nadat u de sleutels hebt gemaakt, maakt u verbinding met de jumphost met behulp van Session Manager, een mogelijkheid van Systems Manager, en voer de volgende opdracht uit:

$ 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

Nu kunt u de opnamestappen opnieuw uitvoeren.

Neem gegevens op in de OpenSearch-service

Als u de OpenSearch-service gebruikt, voert u het volgende script uit om de bestanden op te nemen:

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

Wanneer het voltooid is, voert u het script uit dat gesimuleerde query's uitvoert:

python query_os.py

Neem gegevens op in Amazon RDS

Als u Amazon RDS gebruikt, voert u het volgende script uit om de bestanden op te nemen:

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

Als het klaar is, zorg er dan voor dat u een volledig vacuรผm uitvoert op de RDS-instantie.

Voer vervolgens het volgende script uit om gesimuleerde query's uit te voeren:

python query_rds.py

Stel het Ray-dashboard in

Voordat u het Ray-dashboard instelt, moet u het AWS-opdrachtregelinterface (AWS CLI) op uw lokale computer. Voor instructies, zie Installeer of update de nieuwste versie van de AWS CLI.

Voer de volgende stappen uit om het dashboard in te stellen:

  1. Installeer de Sessiebeheer-plug-in voor de AWS CLI.
  2. Kopieer in het Isengard-account de tijdelijke inloggegevens voor bash/zsh en voer deze uit in uw lokale terminal.
  3. Maak een session.sh-bestand op uw machine en kopieer de volgende inhoud naar het bestand:
#!/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. Wijzig de map waarin dit session.sh-bestand is opgeslagen.
  2. Voer het commando uit Chmod +x om uitvoerbare toestemming aan het bestand te geven.
  3. Voer het volgende commando uit:
./session.sh <Ray cluster head node instance ID> 8265 8265

Bijvoorbeeld:

./session.sh i-021821beb88661ba3 8265 8265

U ziet een bericht zoals het volgende:

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...

Open een nieuw tabblad in uw browser en voer localhost:8265 in.

U ziet het Ray-dashboard en statistieken van de lopende taken en clusters. U kunt vanaf hier statistieken volgen.

U kunt bijvoorbeeld het Ray-dashboard gebruiken om de belasting op het cluster te observeren. Zoals te zien is in de volgende schermafbeelding, worden de GPU's tijdens opname bijna 100% benut.

U kunt ook gebruik maken van de RAG_Benchmarks CloudWatch-dashboard om de opnamesnelheid en responstijden van zoekopdrachten te bekijken.

Uitbreidbaarheid van de oplossing

U kunt deze oplossing uitbreiden om andere AWS-vectorwinkels of vectorwinkels van derden aan te sluiten. Voor elke nieuwe vectoropslag moet u scripts maken voor het configureren van de gegevensopslag en voor het opnemen van gegevens. De rest van de pijpleiding kan indien nodig worden hergebruikt.

Conclusie

In dit bericht hebben we een ETL-pijplijn gedeeld die u kunt gebruiken om gevectoriseerde RAG-gegevens in zowel OpenSearch Service als Amazon RDS te plaatsen met de pgvector-extensie als vectorgegevensopslag. De oplossing maakte gebruik van een Ray-cluster om de noodzakelijke parallelliteit te bieden om een โ€‹โ€‹groot datacorpus op te nemen. U kunt deze methodologie gebruiken om elke vectordatabase van uw keuze te integreren om RAG-pijplijnen te bouwen.


Over de auteurs

Randy DeFauw is een Senior Principal Solutions Architect bij AWS. Hij heeft een MSEE-diploma behaald aan de Universiteit van Michigan, waar hij werkte aan computervisie voor autonome voertuigen. Hij heeft ook een MBA van de Colorado State University. Randy heeft diverse functies in de technologiesector bekleed, variรซrend van software-engineering tot productmanagement. Hij betrad de big data-ruimte in 2013 en blijft dat gebied verkennen. Hij werkt actief aan projecten op het gebied van ML en heeft gepresenteerd op tal van conferenties, waaronder Strata en GlueCon.

David Christian is een Principal Solutions Architect gevestigd in Zuid-Californiรซ. Hij heeft zijn bachelor Informatiebeveiliging en een passie voor automatisering. Zijn aandachtsgebieden zijn DevOps-cultuur en transformatie, infrastructuur als code en veerkracht. Voordat hij bij AWS kwam, bekleedde hij functies in beveiliging, DevOps en systeemtechniek, waarbij hij grootschalige private en publieke cloudomgevingen beheerde.

Prachi Kulkarni is een Senior Solutions Architect bij AWS. Haar specialisatie is machine learning en ze werkt actief aan het ontwerpen van oplossingen met behulp van verschillende AWS ML-, big data- en analysemogelijkheden. Prachi heeft ervaring in meerdere domeinen, waaronder de gezondheidszorg, uitkeringen, detailhandel en onderwijs, en heeft in verschillende functies gewerkt op het gebied van productengineering en -architectuur, management en klantensucces.

Richa Gupta is een oplossingsarchitect bij AWS. Ze heeft een passie voor het ontwerpen van end-to-end oplossingen voor klanten. Haar specialisatie is machine learning en hoe dit kan worden gebruikt om nieuwe oplossingen te bouwen die leiden tot operationele uitmuntendheid en de bedrijfsopbrengsten stimuleren. Voordat ze bij AWS kwam, werkte ze als Software Engineer en Solutions Architect, waar ze oplossingen bouwde voor grote telecomoperatoren. Buiten haar werk verkent ze graag nieuwe plekken en houdt ze van avontuurlijke activiteiten.

spot_img

Laatste intelligentie

spot_img