Optimizați costul de implementare al modelelor de bază Amazon SageMaker JumpStart cu puncte finale asincrone Amazon SageMaker | Amazon Web Services

Optimizați costul de implementare al modelelor de bază Amazon SageMaker JumpStart cu puncte finale asincrone Amazon SageMaker | Amazon Web Services

Succesul aplicațiilor AI generative într-o gamă largă de industrii a atras atenția și interesul companiilor din întreaga lume care caută să reproducă și să depășească realizările concurenților sau să rezolve cazuri de utilizare noi și interesante. Acești clienți caută modele de bază, cum ar fi TII Falcon, Stable Diffusion XL sau GPT-3.5 de la OpenAI, ca motoarele care alimentează inovația generativă AI.

Modelele de bază sunt o clasă de modele AI generative care sunt capabile să înțeleagă și să genereze conținut asemănător omului, datorită cantităților mari de date nestructurate pe care au fost instruiți. Aceste modele au revoluționat diverse sarcini de viziune computerizată (CV) și procesare a limbajului natural (NLP), inclusiv generarea de imagini, traducerea și răspunsul la întrebări. Ele servesc ca elemente de bază pentru multe aplicații AI și au devenit o componentă crucială în dezvoltarea sistemelor inteligente avansate.

Cu toate acestea, implementarea modelelor de fundație poate veni cu provocări semnificative, în special în ceea ce privește costurile și cerințele de resurse. Aceste modele sunt cunoscute pentru dimensiunile lor, variind adesea de la sute de milioane la miliarde de parametri. Dimensiunea lor mare necesită resurse de calcul extinse, inclusiv hardware puternic și capacitate semnificativă de memorie. De fapt, implementarea modelelor de bază necesită, de obicei, cel puțin unul (adesea mai multe) GPU-uri pentru a gestiona eficient sarcina de calcul. De exemplu, modelul TII Falcon-40B Instruct necesită cel puțin o instanță ml.g5.12xlarge pentru a fi încărcată cu succes în memorie, dar funcționează cel mai bine cu instanțe mai mari. Drept urmare, rentabilitatea investiției (ROI) a implementării și menținerii acestor modele poate fi prea scăzută pentru a dovedi valoarea afacerii, în special în timpul ciclurilor de dezvoltare sau pentru sarcinile de lucru înțepenite. Acest lucru se datorează costurilor de funcționare ale instanțelor alimentate cu GPU pentru sesiuni lungi, potențial 24/7.

La începutul acestui an, am anunțat Amazon Bedrock, un API fără server pentru a accesa modele de bază de la Amazon și partenerii noștri generativi de inteligență artificială. Deși se află în prezent în Private Preview, API-ul său fără server vă permite să utilizați modele de bază de la Amazon, Anthropic, Stability AI și AI21, fără a fi nevoie să implementați singur niciun punct final. Cu toate acestea, modelele open-source din comunități precum Hugging Face au crescut foarte mult și nu toate au fost puse la dispoziție prin Amazon Bedrock.

În această postare, vizam aceste situații și rezolvăm problema riscului de costuri mari prin implementarea unor modele mari de fundații pentru Amazon SageMaker puncte finale asincrone din Amazon SageMaker JumpStart. Acest lucru poate ajuta la reducerea costurilor arhitecturii, permițând punctului final să ruleze numai atunci când solicitările sunt în coadă și pentru o perioadă scurtă de viață, în timp ce se reduce la zero atunci când nicio solicitare nu așteaptă să fie deservită. Acest lucru sună grozav pentru o mulțime de cazuri de utilizare; cu toate acestea, un punct final care s-a redus la zero va introduce un timp de pornire la rece înainte de a putea servi deducții.

Prezentare generală a soluțiilor

Următoarea diagramă ilustrează arhitectura soluției noastre.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Arhitectura pe care o implementăm este foarte simplă:

  • Interfața cu utilizatorul este un notebook, care poate fi înlocuit cu o interfață de utilizare web construită pe Streamlit sau tehnologie similară. În cazul nostru, caietul este un Amazon SageMaker Studio notebook, care rulează pe o instanță ml.m5.large cu nucleul CPU PyTorch 2.0 Python 3.10.
  • Notebook-ul interogează punctul final în trei moduri: SDK-ul SageMaker Python, SDK-ul AWS pentru Python (Boto3) și LangChain.
  • Punctul final rulează asincron pe SageMaker, iar pe punctul final, implementăm modelul Falcon-40B Instruct. În prezent, este cea mai avansată tehnologie în ceea ce privește modelele de instruire și este disponibil în SageMaker JumpStart. Un singur apel API ne permite să implementăm modelul pe punctul final.

Ce este inferența asincronă SageMaker

Inferența asincronă SageMaker este una dintre cele patru opțiuni de implementare din SageMaker, împreună cu punctele finale în timp real, inferența în loturi și inferența fără server. Pentru a afla mai multe despre diferitele opțiuni de implementare, consultați Implementați modele pentru inferență.

Inferența asincronă SageMaker pune în așteptare cererile primite și le procesează asincron, făcând această opțiune ideală pentru cererile cu dimensiuni mari de încărcare utilă de până la 1 GB, timpi lungi de procesare și cerințe de latență aproape în timp real. Cu toate acestea, principalul avantaj pe care îl oferă atunci când aveți de-a face cu modele mari de fundație, în special în timpul unei dovezi de concept (POC) sau în timpul dezvoltării, este capacitatea de a configura inferența asincronă pentru a scala la un număr de instanțe de zero atunci când nu există cereri de proces, economisind astfel costurile. Pentru mai multe informații despre inferența asincronă SageMaker, consultați Inferență asincronă. Următoarea diagramă ilustrează această arhitectură.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Pentru a implementa un punct final de inferență asincron, trebuie să creați un AsyncInferenceConfig obiect. Dacă creezi AsyncInferenceConfig fără a specifica argumentele sale, implicit S3OutputPath va fi s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} și S3FailurePath va fi s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

Ce este SageMaker JumpStart

Modelul nostru provine de la SageMaker JumpStart, o caracteristică a SageMaker care accelerează călătoria învățării automate (ML) oferind modele pre-instruite, șabloane de soluții și exemple de notebook-uri. Oferă acces la o gamă largă de modele pregătite în prealabil pentru diferite tipuri de probleme, permițându-vă să începeți sarcinile ML cu o bază solidă. SageMaker JumpStart oferă, de asemenea, șabloane de soluții pentru cazuri de utilizare obișnuite și exemple de notebook-uri pentru învățare. Cu SageMaker JumpStart, puteți reduce timpul și efortul necesar pentru a vă începe proiectele ML cu lansări de soluții cu un singur clic și resurse complete pentru o experiență practică ML.

Următoarea captură de ecran arată un exemplu de doar câteva dintre modelele disponibile pe interfața de utilizare SageMaker JumpStart.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Implementați modelul

Primul nostru pas este să implementăm modelul în SageMaker. Pentru a face acest lucru, putem folosi interfața de utilizare pentru SageMaker JumpStart sau SageMaker Python SDK, care oferă un API pe care îl putem folosi pentru a implementa modelul la punctul final asincron:

%%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()
)

Finalizarea acestui apel poate dura aproximativ 10 minute. În acest timp, punctul final este rotit, containerul împreună cu artefactele modelului sunt descărcate în punctul final, configurația modelului este încărcată din SageMaker JumpStart, apoi punctul final asincron este expus printr-un punct final DNS. Pentru a ne asigura că punctul nostru final se poate reduce la zero, trebuie să configuram scalarea automată pe punctul final asincron utilizând scalarea automată a aplicației. Mai întâi trebuie să vă înregistrați varianta punctului final cu Application Auto Scaling, să definiți o politică de scalare și apoi să aplicați politica de scalare. În această configurație, folosim o valoare personalizată folosind CustomizedMetricSpecification, Numit ApproximateBacklogSizePerInstance, așa cum se arată în codul următor. Pentru o listă detaliată a Amazon CloudWatch valorile disponibile cu punctul final de inferență asincron, consultați Monitorizare cu 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. },
)

Puteți verifica dacă această politică a fost setată cu succes navigând la consola SageMaker, alegând Puncte finale în deducție în panoul de navigare și căutând punctul final pe care tocmai l-am implementat.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Invocați punctul final asincron

Pentru a invoca punctul final, trebuie să plasați sarcina utilă a cererii Serviciul Amazon de stocare simplă (Amazon S3) și furnizați un indicator către această sarcină utilă ca parte a InvokeEndpointAsync cerere. La invocare, SageMaker pune în coadă cererea de procesare și returnează un identificator și o locație de ieșire ca răspuns. La procesare, SageMaker plasează rezultatul în locația Amazon S3. Puteți alege opțional să primiți notificări de succes sau de eroare cu Serviciul de notificare simplă Amazon (Amazon SNS).

SageMaker Python SDK

După finalizarea implementării, va returna un AsyncPredictor obiect. Pentru a efectua inferențe asincrone, trebuie să încărcați date pe Amazon S3 și să utilizați predict_async() metoda cu URI-ul S3 ca intrare. Va returna o AsyncInferenceResponse obiect și puteți verifica rezultatul folosind get_response() metodă.

Alternativ, dacă doriți să verificați periodic un rezultat și să-l returnați la generare, utilizați predict() metodă. Folosim această a doua metodă în următorul cod:

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

Să explorăm acum invoke_endpoint_async metoda din Boto3 sagemaker-runtime client. Acesta permite dezvoltatorilor să invoce asincron un punct final SageMaker, oferind un simbol pentru urmărirea progresului și recuperarea răspunsului mai târziu. Boto3 nu oferă o modalitate de a aștepta ca inferența asincronă să fie finalizată ca SDK-ul SageMaker Python get_result() Operațiune. Prin urmare, profităm de faptul că Boto3 va stoca rezultatul de inferență în Amazon S3 în response["OutputLocation"]. Putem folosi următoarea funcție pentru a aștepta ca fișierul de inferență să fie scris pe 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

Cu această funcție, acum putem interoga punctul final:

# 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 este un cadru open-source lansat în octombrie 2022 de Harrison Chase. Simplifica dezvoltarea aplicatiilor folosind modele de limbaj mari (LLM) prin furnizarea de integrari cu diverse sisteme si surse de date. LangChain permite analiza documentelor, rezumarea, crearea de chatbot, analiza codului și multe altele. A câștigat popularitate, cu contribuții de la sute de dezvoltatori și finanțare semnificativă din partea firmelor de risc. LangChain permite conectarea LLM-urilor cu surse externe, făcând posibilă crearea de aplicații dinamice, receptive la date. Oferă biblioteci, API-uri și documentație pentru a simplifica procesul de dezvoltare.

LangChain oferă biblioteci și exemple pentru utilizarea punctelor finale SageMaker cu cadrul său, facilitând utilizarea modelelor ML găzduite pe SageMaker ca „creier” al lanțului. Pentru a afla mai multe despre cum se integrează LangChain cu SageMaker, consultați SageMaker Endpoint în documentația LangChain.

Una dintre limitele implementării actuale a LangChain este că nu acceptă puncte finale asincrone în mod nativ. Pentru a folosi un punct final asincron la LangChain, trebuie să definim o nouă clasă, SagemakerAsyncEndpoint, care extinde SagemakerEndpoint clasă deja disponibilă în LangChain. În plus, oferim următoarele informații:

  • Bucket-ul S3 și prefixul în care inferența asincronă va stoca intrările (și ieșirile)
  • Un număr maxim de secunde de așteptat înainte de expirarea timpului
  • An updated _call() funcția pentru a interoga punctul final invoke_endpoint_async() în loc de invoke_endpoint()
  • O modalitate de a trezi punctul final asincron dacă este la pornire la rece (scărcat la zero)

Pentru a revizui noul creat SagemakerAsyncEndpoint, Puteți verifica afară sagemaker_async_endpoint.py fişier disponibil pe 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']))

A curăța

Când ați terminat de testat generarea de inferențe de la punctul final, nu uitați să ștergeți punctul final pentru a evita costurile suplimentare:

predictor.delete_endpoint()

Concluzie

Atunci când implementați modele mari de fundație precum TII Falcon, optimizarea costurilor este crucială. Aceste modele necesită hardware puternic și capacitate substanțială de memorie, ceea ce duce la costuri mari de infrastructură. Inferența asincronă SageMaker, o opțiune de implementare care procesează cererile în mod asincron, reduce cheltuielile prin scalarea numărului de instanțe la zero atunci când nu există cereri în așteptare. În această postare, am demonstrat cum să implementăm modele mari de fundație SageMaker JumpStart la punctele finale asincrone SageMaker. Am oferit exemple de cod folosind SDK-ul SageMaker Python, Boto3 și LangChain pentru a ilustra diferite metode de invocare a punctelor finale asincrone și de preluare a rezultatelor. Aceste tehnici permit dezvoltatorilor și cercetătorilor să optimizeze costurile în timp ce folosesc capabilitățile modelelor de bază pentru sistemele avansate de înțelegere a limbii.

Pentru a afla mai multe despre inferența asincronă și SageMaker JumpStart, consultați următoarele postări:


Despre autor

Poza cu DavideDavide Gallitelli este arhitect specializat în soluții pentru AI/ML în regiunea EMEA. Are sediul la Bruxelles și lucrează îndeaproape cu clienții din Benelux. Este dezvoltator încă de când era foarte mic, începând să codeze la vârsta de 7 ani. A început să învețe AI/ML la universitate și de atunci s-a îndrăgostit de el.

Timestamp-ul:

Mai mult de la Învățare automată AWS