Ottimizza i costi di distribuzione dei modelli base Amazon SageMaker JumpStart con endpoint asincroni Amazon SageMaker | Servizi Web di Amazon

Ottimizza i costi di distribuzione dei modelli base Amazon SageMaker JumpStart con endpoint asincroni Amazon SageMaker | Servizi Web di Amazon

Il successo delle applicazioni di intelligenza artificiale generativa in un’ampia gamma di settori ha attirato l’attenzione e l’interesse delle aziende di tutto il mondo che desiderano riprodurre e superare i risultati della concorrenza o risolvere casi d’uso nuovi ed entusiasmanti. Questi clienti stanno esaminando modelli di base, come TII Falcon, Stable Diffusion XL o GPT-3.5 di OpenAI, come motori che alimentano l'innovazione dell'intelligenza artificiale generativa.

I Foundation Model sono una classe di modelli di intelligenza artificiale generativa in grado di comprendere e generare contenuti simili a quelli umani, grazie alle grandi quantità di dati non strutturati su cui sono stati addestrati. Questi modelli hanno rivoluzionato varie attività di visione artificiale (CV) e di elaborazione del linguaggio naturale (PNL), tra cui la generazione di immagini, la traduzione e la risposta alle domande. Fungono da elementi costitutivi per molte applicazioni di intelligenza artificiale e sono diventati una componente cruciale nello sviluppo di sistemi intelligenti avanzati.

Tuttavia, l’implementazione di modelli di fondazione può comportare sfide significative, in particolare in termini di costi e requisiti di risorse. Questi modelli sono noti per le loro dimensioni, che spesso vanno da centinaia di milioni a miliardi di parametri. Le loro grandi dimensioni richiedono ampie risorse computazionali, tra cui hardware potente e significativa capacità di memoria. In effetti, la distribuzione di modelli di base richiede solitamente almeno una (spesso più) GPU per gestire il carico computazionale in modo efficiente. Ad esempio, il modello TII Falcon-40B Instruct richiede che almeno un'istanza ml.g5.12xlarge venga caricata correttamente in memoria, ma offre prestazioni migliori con istanze più grandi. Di conseguenza, il ritorno sull’investimento (ROI) derivante dall’implementazione e dal mantenimento di questi modelli può essere troppo basso per dimostrare il valore aziendale, soprattutto durante i cicli di sviluppo o per carichi di lavoro impegnativi. Ciò è dovuto ai costi di gestione derivanti dalla disponibilità di istanze basate su GPU per sessioni lunghe, potenzialmente 24 ore su 7, XNUMX giorni su XNUMX.

All'inizio di quest'anno, abbiamo annunciato Roccia Amazzonica, un'API serverless per accedere ai modelli di base di Amazon e dei nostri partner di intelligenza artificiale generativa. Sebbene sia attualmente in anteprima privata, la sua API serverless ti consente di utilizzare modelli di base di Amazon, Anthropic, Stability AI e AI21, senza dover distribuire manualmente alcun endpoint. Tuttavia, i modelli open source di comunità come Hugging Face sono cresciuti molto e non tutti sono stati resi disponibili tramite Amazon Bedrock.

In questo post, affrontiamo queste situazioni e risolviamo il problema di rischiare costi elevati distribuendo modelli di base di grandi dimensioni Amazon Sage Maker endpoint asincroni da JumpStart di Amazon SageMaker. Ciò può aiutare a ridurre i costi dell'architettura, consentendo all'endpoint di funzionare solo quando le richieste sono in coda e per un breve periodo di vita, riducendo al contempo la scalabilità fino a zero quando nessuna richiesta è in attesa di essere soddisfatta. Sembra fantastico per molti casi d'uso; tuttavia, un endpoint ridotto a zero introdurrà un'ora di avvio a freddo prima di poter fornire inferenze.

Panoramica della soluzione

Il diagramma seguente illustra l'architettura della nostra soluzione.

Ottimizza i costi di distribuzione dei modelli base Amazon SageMaker JumpStart con endpoint asincroni Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

L'architettura che implementiamo è molto semplice:

  • L'interfaccia utente è un notebook, che può essere sostituito da un'interfaccia utente Web basata su Streamlit o tecnologia simile. Nel nostro caso, il notebook è un Amazon Sage Maker Studio notebook, in esecuzione su un'istanza ml.m5.large con il kernel CPU PyTorch 2.0 Python 3.10.
  • Il notebook esegue query sull'endpoint in tre modi: SageMaker Python SDK, AWS SDK for Python (Boto3) e LangChain.
  • L'endpoint viene eseguito in modo asincrono su SageMaker e sull'endpoint distribuiamo il modello Falcon-40B Instruct. Attualmente rappresenta lo stato dell'arte in termini di modelli di istruzioni ed è disponibile in SageMaker JumpStart. Una singola chiamata API ci consente di distribuire il modello sull'endpoint.

Cos'è l'inferenza asincrona di SageMaker

L'inferenza asincrona di SageMaker è una delle quattro opzioni di distribuzione in SageMaker, insieme a endpoint in tempo reale, inferenza batch e inferenza serverless. Per ulteriori informazioni sulle diverse opzioni di distribuzione, fare riferimento a Distribuire modelli per l'inferenza.

L'inferenza asincrona di SageMaker accoda le richieste in entrata e le elabora in modo asincrono, rendendo questa opzione ideale per richieste con grandi dimensioni di payload fino a 1 GB, tempi di elaborazione lunghi e requisiti di latenza quasi in tempo reale. Tuttavia, il vantaggio principale che offre quando si ha a che fare con modelli di base di grandi dimensioni, in particolare durante una prova di concetto (POC) o durante lo sviluppo, è la capacità di configurare l'inferenza asincrona per scalare fino a un conteggio di istanze pari a zero quando non ci sono richieste di processo, risparmiando così sui costi. Per ulteriori informazioni sull'inferenza asincrona di SageMaker, fare riferimento a Inferenza asincrona. Il diagramma seguente illustra questa architettura.

Ottimizza i costi di distribuzione dei modelli base Amazon SageMaker JumpStart con endpoint asincroni Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Per distribuire un endpoint di inferenza asincrona, è necessario creare un file AsyncInferenceConfig oggetto. Se crei AsyncInferenceConfig senza specificare i suoi argomenti, il default S3OutputPath sarà s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} ed S3FailurePath sarà s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

Cos'è SageMaker JumpStart

Il nostro modello deriva da SageMaker JumpStart, una funzionalità di SageMaker che accelera il percorso di machine learning (ML) offrendo modelli preaddestrati, modelli di soluzioni e notebook di esempio. Fornisce l'accesso a un'ampia gamma di modelli preaddestrati per diversi tipi di problemi, consentendoti di iniziare le tue attività di ML con solide basi. SageMaker JumpStart offre anche modelli di soluzioni per casi d'uso comuni e notebook di esempio per l'apprendimento. Con SageMaker JumpStart, puoi ridurre il tempo e gli sforzi necessari per avviare i tuoi progetti ML con lanci di soluzioni con un solo clic e risorse complete per un'esperienza pratica di ML.

Lo screenshot seguente mostra un esempio solo di alcuni dei modelli disponibili nell'interfaccia utente JumpStart di SageMaker.

Ottimizza i costi di distribuzione dei modelli base Amazon SageMaker JumpStart con endpoint asincroni Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Distribuire il modello

Il nostro primo passo è distribuire il modello su SageMaker. Per fare ciò, possiamo utilizzare l'interfaccia utente per SageMaker JumpStart o SageMaker Python SDK, che fornisce un'API che possiamo utilizzare per distribuire il modello sull'endpoint asincrono:

%%time
from sagemaker.jumpstart.model import JumpStartModel, AsyncInferenceConfig
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer model_id, model_version = "huggingface-llm-falcon-40b-instruct-bf16", "*"
my_model = JumpStartModel(model_id=model_id)
predictor = my_model.deploy( initial_instance_count=0, instance_type="ml.g5.12xlarge", async_inference_config=AsyncInferenceConfig()
)

Il completamento di questa chiamata può richiedere circa 10 minuti. Durante questo periodo, l'endpoint viene avviato, il contenitore insieme agli artefatti del modello vengono scaricati sull'endpoint, la configurazione del modello viene caricata da SageMaker JumpStart, quindi l'endpoint asincrono viene esposto tramite un endpoint DNS. Per garantire che il nostro endpoint possa ridimensionarsi fino a zero, dobbiamo configurare la scalabilità automatica sull'endpoint asincrono utilizzando Application Auto Scaling. È necessario prima registrare la variante dell'endpoint con Application Auto Scaling, definire una policy di dimensionamento e quindi applicare la policy di dimensionamento. In questa configurazione utilizziamo una metrica personalizzata utilizzando CustomizedMetricSpecification, chiamato ApproximateBacklogSizePerInstance, come mostrato nel codice seguente. Per un elenco dettagliato di Amazon Cloud Watch disponibili con l'endpoint di inferenza asincrona, fare riferimento a Monitoraggio con CloudWatch.

import boto3 client = boto3.client("application-autoscaling")
resource_id = "endpoint/" + my_model.endpoint_name + "/variant/" + "AllTraffic" # Configure Autoscaling on asynchronous endpoint down to zero instances
response = client.register_scalable_target( ServiceNamespace="sagemaker", ResourceId=resource_id, ScalableDimension="sagemaker:variant:DesiredInstanceCount", MinCapacity=0, # Miminum number of instances we want to scale down to - scale down to 0 to stop incurring in costs MaxCapacity=1, # Maximum number of instances we want to scale up to - scale up to 1 max is good enough for dev
) response = client.put_scaling_policy( PolicyName="Invocations-ScalingPolicy", ServiceNamespace="sagemaker", # The namespace of the AWS service that provides the resource. ResourceId=resource_id, # Endpoint name ScalableDimension="sagemaker:variant:DesiredInstanceCount", # SageMaker supports only Instance Count PolicyType="TargetTrackingScaling", # 'StepScaling'|'TargetTrackingScaling' TargetTrackingScalingPolicyConfiguration={ "TargetValue": 5.0, # The target value for the metric. - here the metric is - SageMakerVariantInvocationsPerInstance "CustomizedMetricSpecification": { "MetricName": "ApproximateBacklogSizePerInstance", "Namespace": "AWS/SageMaker", "Dimensions": [{"Name": "EndpointName", "Value": my_model.endpoint_name}], "Statistic": "Average", }, "ScaleInCooldown": 600, # The amount of time, in seconds, after a scale in activity completes before another scale in activity can start. "ScaleOutCooldown": 300, # ScaleOutCooldown - The amount of time, in seconds, after a scale out activity completes before another scale out activity can start. # 'DisableScaleIn': True|False - indicates whether scale in by the target tracking policy is disabled. # If the value is true, scale in is disabled and the target tracking policy won't remove capacity from the scalable resource. },
)

Puoi verificare che questa policy sia stata impostata correttamente accedendo alla console SageMaker, scegliendo endpoint per Inferenza nel riquadro di navigazione e cercando l'endpoint appena distribuito.

Ottimizza i costi di distribuzione dei modelli base Amazon SageMaker JumpStart con endpoint asincroni Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Invocare l'endpoint asincrono

Per richiamare l'endpoint, è necessario inserire il payload della richiesta Servizio di archiviazione semplice Amazon (Amazon S3) e fornire un puntatore a questo payload come parte del file InvokeEndpointAsync richiesta. Al momento della chiamata, SageMaker mette in coda la richiesta per l'elaborazione e restituisce un identificatore e una posizione di output come risposta. Durante l'elaborazione, SageMaker inserisce il risultato nella posizione Amazon S3. Facoltativamente puoi scegliere di ricevere notifiche di successo o di errore con Servizio di notifica semplice Amazon (SNS Amazon).

SDK Python di SageMaker

Una volta completata la distribuzione, verrà restituito un file AsyncPredictor oggetto. Per eseguire l'inferenza asincrona, è necessario caricare i dati su Amazon S3 e utilizzare il file predict_async() metodo con l'URI S3 come input. Restituirà un file AsyncInferenceResponse oggetto e puoi controllare il risultato usando il file get_response() metodo.

In alternativa, se desideri verificare periodicamente la presenza di un risultato e restituirlo dopo la generazione, utilizza il file predict() metodo. Usiamo questo secondo metodo nel seguente codice:

import time # Invoking the asynchronous endpoint with the SageMaker Python SDK
def query_endpoint(payload): """Query endpoint and print the response""" response = predictor.predict_async( data=payload, input_path="s3://{}/{}".format(bucket, prefix), ) while True: try: response = response.get_result() break except: print("Inference is not ready ...") time.sleep(5) print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {response[0]['generated_text']}") query_endpoint(payload)

Boto3

Esploriamo ora il invoke_endpoint_async metodo da Boto3 sagemaker-runtime cliente. Consente agli sviluppatori di invocare in modo asincrono un endpoint SageMaker, fornendo un token per il monitoraggio dei progressi e il recupero della risposta in un secondo momento. Boto3 non offre un modo per attendere il completamento dell'inferenza asincrona come l'SDK di SageMaker Python get_result() operazione. Pertanto, approfittiamo del fatto che Boto3 memorizzerà l'output dell'inferenza in Amazon S3 nel file response["OutputLocation"]. Possiamo utilizzare la seguente funzione per attendere che il file di inferenza venga scritto su Amazon S3:

import json
import time
import boto3
from botocore.exceptions import ClientError s3_client = boto3.client("s3") # Wait until the prediction is generated
def wait_inference_file(bucket, prefix): while True: try: response = s3_client.get_object(Bucket=bucket, Key=prefix) break except ClientError as ex: if ex.response['Error']['Code'] == 'NoSuchKey': print("Waiting for file to be generated...") time.sleep(5) next else: raise except Exception as e: print(e.__dict__) raise return response

Con questa funzione ora possiamo interrogare l'endpoint:

# Invoking the asynchronous endpoint with the Boto3 SDK
import boto3 sagemaker_client = boto3.client("sagemaker-runtime") # Query the endpoint function
def query_endpoint_boto3(payload): """Query endpoint and print the response""" response = sagemaker_client.invoke_endpoint_async( EndpointName=my_model.endpoint_name, InputLocation="s3://{}/{}".format(bucket, prefix), ContentType="application/json", Accept="application/json" ) output_url = response["OutputLocation"] output_prefix = "/".join(output_url.split("/")[3:]) # Read the bytes of the file from S3 in output_url with Boto3 output = wait_inference_file(bucket, output_prefix) output = json.loads(output['Body'].read())[0]['generated_text'] # Emit output print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {output}") query_endpoint_boto3(payload)

LangChain

LangChain è un framework open source lanciato nell'ottobre 2022 da Harrison Chase. Semplifica lo sviluppo di applicazioni utilizzando modelli linguistici di grandi dimensioni (LLM) fornendo integrazioni con vari sistemi e origini dati. LangChain consente l'analisi dei documenti, il riepilogo, la creazione di chatbot, l'analisi del codice e altro ancora. Ha guadagnato popolarità, con il contributo di centinaia di sviluppatori e finanziamenti significativi da parte di società di venture capital. LangChain consente la connessione di LLM con fonti esterne, rendendo possibile la creazione di applicazioni dinamiche e sensibili ai dati. Offre librerie, API e documentazione per semplificare il processo di sviluppo.

LangChain fornisce librerie ed esempi per l'utilizzo degli endpoint SageMaker con il suo framework, semplificando l'utilizzo dei modelli ML ospitati su SageMaker come "cervello" della catena. Per ulteriori informazioni su come LangChain si integra con SageMaker, fare riferimento al Endpoint SageMaker nella documentazione di LangChain.

Uno dei limiti dell'attuale implementazione di LangChain è che non supporta nativamente gli endpoint asincroni. Per utilizzare un endpoint asincrono su LangChain, dobbiamo definire una nuova classe, SagemakerAsyncEndpoint, che estende il SagemakerEndpoint classe già disponibile in LangChain. Inoltre, forniamo le seguenti informazioni:

  • Il bucket S3 e il prefisso in cui l'inferenza asincrona memorizzerà gli input (e gli output)
  • Un numero massimo di secondi di attesa prima del timeout
  • An updated _call() funzione con cui interrogare l'endpoint invoke_endpoint_async() invece di invoke_endpoint()
  • Un modo per riattivare l'endpoint asincrono se è in avvio a freddo (ridotto a zero)

Per rivedere il file appena creato SagemakerAsyncEndpoint, È possibile controllare il sagemaker_async_endpoint.py filetto disponibili su GitHub.

from typing import Dict
from langchain import PromptTemplate
from langchain.llms.sagemaker_endpoint import LLMContentHandler
from langchain.chains import LLMChain
from sagemaker_async_endpoint import SagemakerAsyncEndpoint class ContentHandler(LLMContentHandler): content_type:str = "application/json" accepts:str = "application/json" len_prompt:int = 0 def transform_input(self, prompt: str, model_kwargs: Dict) -> bytes: self.len_prompt = len(prompt) input_str = json.dumps({"inputs": prompt, "parameters": {"max_new_tokens": 100, "do_sample": False, "repetition_penalty": 1.1}}) return input_str.encode('utf-8') def transform_output(self, output: bytes) -> str: response_json = output.read() res = json.loads(response_json) ans = res[0]['generated_text'] return ans chain = LLMChain( llm=SagemakerAsyncEndpoint( input_bucket=bucket, input_prefix=prefix, endpoint_name=my_model.endpoint_name, region_name=sagemaker.Session().boto_region_name, content_handler=ContentHandler(), ), prompt=PromptTemplate( input_variables=["query"], template="{query}", ),
) print(chain.run(payload['inputs']))

ripulire

Una volta terminato il test della generazione di inferenze dall'endpoint, ricorda di eliminare l'endpoint per evitare di incorrere in costi aggiuntivi:

predictor.delete_endpoint()

Conclusione

Quando si distribuiscono modelli di fondamenta di grandi dimensioni come TII Falcon, l'ottimizzazione dei costi è fondamentale. Questi modelli richiedono hardware potente e notevole capacità di memoria, il che comporta costi infrastrutturali elevati. L'inferenza asincrona di SageMaker, un'opzione di distribuzione che elabora le richieste in modo asincrono, riduce le spese portando il conteggio delle istanze a zero quando non ci sono richieste in sospeso. In questo post, abbiamo dimostrato come distribuire modelli base SageMaker JumpStart di grandi dimensioni su endpoint asincroni SageMaker. Abbiamo fornito esempi di codice utilizzando SageMaker Python SDK, Boto3 e LangChain per illustrare diversi metodi per richiamare endpoint asincroni e recuperare risultati. Queste tecniche consentono a sviluppatori e ricercatori di ottimizzare i costi utilizzando al tempo stesso le capacità dei modelli di base per sistemi avanzati di comprensione del linguaggio.

Per ulteriori informazioni sull'inferenza asincrona e SageMaker JumpStart, consulta i seguenti post:


Circa l'autore

Foto di DavideDavide Gallitelli è uno Specialist Solutions Architect per AI/ML nella regione EMEA. Ha sede a Bruxelles e lavora a stretto contatto con i clienti in tutto il Benelux. È uno sviluppatore sin da quando era molto giovane, iniziando a programmare all'età di 7 anni. Ha iniziato a studiare AI/ML all'università e da allora se ne è innamorato.

Timestamp:

Di più da Apprendimento automatico di AWS