Optimizirajte stroške uvedbe temeljnih modelov Amazon SageMaker JumpStart z asinhronimi končnimi točkami Amazon SageMaker | Spletne storitve Amazon

Optimizirajte stroške uvedbe temeljnih modelov Amazon SageMaker JumpStart z asinhronimi končnimi točkami Amazon SageMaker | Spletne storitve Amazon

Uspeh generativnih aplikacij AI v številnih panogah je pritegnil pozornost in zanimanje podjetij po vsem svetu, ki želijo reproducirati in preseči dosežke konkurentov ali rešiti nove in vznemirljive primere uporabe. Te stranke iščejo temeljne modele, kot so TII Falcon, Stable Diffusion XL ali OpenAI GPT-3.5, kot motorje, ki poganjajo generativne inovacije AI.

Temeljni modeli so razred generativnih modelov umetne inteligence, ki so sposobni razumeti in ustvariti človeško podobno vsebino, zahvaljujoč ogromnim količinam nestrukturiranih podatkov, na katerih so bili usposobljeni. Ti modeli so revolucionirali različne naloge računalniškega vida (CV) in obdelave naravnega jezika (NLP), vključno z ustvarjanjem slik, prevajanjem in odgovarjanjem na vprašanja. Služijo kot gradniki za številne aplikacije AI in so postali ključna komponenta pri razvoju naprednih inteligentnih sistemov.

Vendar pa lahko uvedba temeljnih modelov predstavlja precejšnje izzive, zlasti v smislu stroškov in potreb po virih. Ti modeli so znani po svoji velikosti, ki se pogosto giblje od sto milijonov do milijard parametrov. Njihova velika velikost zahteva obsežne računalniške vire, vključno z zmogljivo strojno opremo in veliko pomnilniško zmogljivostjo. Pravzaprav uvajanje temeljnih modelov običajno zahteva vsaj eno (pogosto več) GPU za učinkovito obvladovanje računalniške obremenitve. Na primer, model TII Falcon-40B Instruct zahteva vsaj en primerek ml.g5.12xlarge, da se uspešno naloži v pomnilnik, vendar najbolje deluje pri večjih primerkih. Posledično je donosnost naložbe (ROI) pri uvajanju in vzdrževanju teh modelov lahko prenizka, da bi dokazali poslovno vrednost, zlasti med razvojnimi cikli ali pri visokih delovnih obremenitvah. To je posledica tekočih stroškov instanc, ki jih poganja GPE, za dolge seje, potencialno 24/7.

V začetku tega leta smo napovedali Amazon Bedrock, API brez strežnika za dostop do temeljnih modelov Amazona in naših generativnih partnerjev AI. Čeprav je trenutno v zasebnem predogledu, vam njegov API brez strežnika omogoča uporabo temeljnih modelov Amazon, Anthropic, Stability AI in AI21, ne da bi vam bilo treba sami namestiti katere koli končne točke. Vendar pa odprtokodni modeli iz skupnosti, kot je Hugging Face, močno rastejo in vsi niso bili na voljo prek Amazon Bedrock.

V tem prispevku ciljamo na te situacije in rešujemo problem tveganja visokih stroškov z uporabo velikih modelov temeljev Amazon SageMaker asinhrone končne točke iz Amazon SageMaker JumpStart. To lahko pomaga zmanjšati stroške arhitekture, saj omogoča, da se končna točka izvaja samo, ko so zahteve v čakalni vrsti in za kratek čas življenja, medtem ko se zmanjša na nič, ko nobena zahteva ne čaka na storitev. To zveni odlično za veliko primerov uporabe; vendar bo končna točka, ki se je zmanjšala na nič, uvedla čas hladnega zagona, preden bo lahko služila sklepanjem.

Pregled rešitev

Naslednji diagram ponazarja našo arhitekturo rešitev.

Optimizirajte stroške uvedbe temeljnih modelov Amazon SageMaker JumpStart z asinhronimi končnimi točkami Amazon SageMaker | Spletne storitve Amazon PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Arhitektura, ki jo uporabljamo, je zelo enostavna:

  • Uporabniški vmesnik je notebook, ki ga lahko nadomesti spletni uporabniški vmesnik, zgrajen na Streamlit ali podobni tehnologiji. V našem primeru je zvezek an Amazon SageMaker Studio prenosni računalnik, ki se izvaja na ml.m5.large instanci z jedrom procesorja PyTorch 2.0 Python 3.10.
  • Beležnica poizveduje po končni točki na tri načine: SageMaker Python SDK, AWS SDK za Python (Boto3) in LangChain.
  • Končna točka deluje asinhrono na SageMakerju, na končni točki pa uvedemo model Falcon-40B Instruct. Trenutno je najsodobnejši v smislu modelov navodil in je na voljo v SageMaker JumpStart. En sam klic API nam omogoča uvedbo modela na končni točki.

Kaj je asinhroni sklep SageMaker

Asinhrono sklepanje SageMaker je ena od štirih možnosti uvajanja v SageMakerju, skupaj s končnimi točkami v realnem času, paketnim sklepanjem in sklepanjem brez strežnika. Če želite izvedeti več o različnih možnostih uvajanja, glejte Razmestite modele za sklepanje.

Asinhrono sklepanje SageMaker postavlja dohodne zahteve v čakalno vrsto in jih asinhrono obdeluje, zaradi česar je ta možnost idealna za zahteve z velikimi obremenitvami do 1 GB, dolgimi časi obdelave in zahtevami zakasnitve v skoraj realnem času. Vendar pa je glavna prednost, ki jo ponuja pri obravnavi velikih temeljnih modelov, zlasti med dokazom koncepta (POC) ali med razvojem, zmožnost konfiguriranja asinhronega sklepanja za povečanje števila primerkov na nič, ko ni zahtev za postopek, s čimer prihranite stroške. Za več informacij o asinhronem sklepanju SageMaker glejte Asinhrono sklepanje. Naslednji diagram ponazarja to arhitekturo.

Optimizirajte stroške uvedbe temeljnih modelov Amazon SageMaker JumpStart z asinhronimi končnimi točkami Amazon SageMaker | Spletne storitve Amazon PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Če želite razmestiti končno točko asinhronega sklepanja, morate ustvariti AsyncInferenceConfig predmet. Če ustvarjate AsyncInferenceConfig brez podajanja svojih argumentov, privzeto S3OutputPath bo s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} in S3FailurePath bo s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

Kaj je SageMaker JumpStart

Naš model izvira iz SageMaker JumpStart, funkcije SageMaker, ki pospešuje potovanje strojnega učenja (ML), tako da ponuja vnaprej pripravljene modele, predloge rešitev in primere zvezkov. Omogoča dostop do širokega nabora vnaprej usposobljenih modelov za različne vrste težav, kar vam omogoča, da začnete svoje naloge ML s trdnimi temelji. SageMaker JumpStart ponuja tudi predloge rešitev za pogoste primere uporabe in primere zvezkov za učenje. S SageMaker JumpStart lahko zmanjšate čas in trud, ki sta potrebna za začetek vaših projektov ML, z zagonom rešitev z enim klikom in obsežnimi viri za praktično izkušnjo ML.

Naslednji posnetek zaslona prikazuje primer samo nekaterih modelov, ki so na voljo v uporabniškem vmesniku SageMaker JumpStart.

Optimizirajte stroške uvedbe temeljnih modelov Amazon SageMaker JumpStart z asinhronimi končnimi točkami Amazon SageMaker | Spletne storitve Amazon PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Namestite model

Naš prvi korak je uvedba modela v SageMaker. Za to lahko uporabimo uporabniški vmesnik za SageMaker JumpStart ali SDK za SageMaker Python, ki ponuja API, ki ga lahko uporabimo za uvajanje modela v asinhrono končno točko:

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

Ta klic lahko traja približno 10 minut. V tem času se končna točka zavrti, vsebnik skupaj z artefakti modela se prenese na končno točko, konfiguracija modela se naloži iz SageMaker JumpStart, nato pa je asinhrona končna točka izpostavljena prek končne točke DNS. Da bi zagotovili, da se naša končna točka lahko zmanjša na nič, moramo konfigurirati samodejno skaliranje na asinhroni končni točki s samodejnim skaliranjem aplikacije. Najprej morate registrirati svojo različico končne točke s samodejnim skaliranjem aplikacije, določiti pravilnik o skaliranju in nato uporabiti pravilnik o skaliranju. V tej konfiguraciji uporabljamo meritev po meri z uporabo CustomizedMetricSpecification, klical ApproximateBacklogSizePerInstance, kot je prikazano v naslednji kodi. Za podroben seznam amazoncloudwatch metrike, ki so na voljo z vašo končno točko asinhronega sklepanja, glejte Spremljanje z 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. },
)

Lahko preverite, ali je bil ta pravilnik uspešno nastavljen, tako da se pomaknete na konzolo SageMaker in izberete Končne točke pod Sklepanje v navigacijskem podoknu in iščemo končno točko, ki smo jo pravkar uvedli.

Optimizirajte stroške uvedbe temeljnih modelov Amazon SageMaker JumpStart z asinhronimi končnimi točkami Amazon SageMaker | Spletne storitve Amazon PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Prikličite asinhrono končno točko

Če želite priklicati končno točko, morate vanjo vnesti koristni tovor zahteve Preprosta storitev shranjevanja Amazon (Amazon S3) in zagotovite kazalec na to koristno obremenitev kot del InvokeEndpointAsync prošnja. Po priklicu SageMaker postavi zahtevo v čakalno vrsto za obdelavo in kot odgovor vrne identifikator in izhodno lokacijo. Po obdelavi SageMaker rezultat postavi na lokacijo Amazon S3. Po želji lahko izberete prejemanje obvestil o uspehu ali napaki z Amazon Simple notification Service (Amazon SNS).

SDK SageMaker Python

Ko je uvajanje končano, bo vrnilo AsyncPredictor predmet. Če želite izvesti asinhrono sklepanje, morate naložiti podatke v Amazon S3 in uporabiti predict_async() metoda z URI S3 kot vhodom. Vrnil bo an AsyncInferenceResponse objekt, rezultat pa lahko preverite z uporabo get_response() metoda.

Druga možnost je, če želite občasno preveriti rezultat in ga vrniti ob ustvarjanju, uporabite predict() metoda. To drugo metodo uporabljamo v naslednji kodi:

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

Raziščimo zdaj invoke_endpoint_async metoda iz Boto3's sagemaker-runtime stranka. Razvijalcem omogoča, da asinhrono prikličejo končno točko SageMaker, s čimer zagotovijo žeton za sledenje napredka in kasnejše pridobivanje odgovora. Boto3 ne ponuja načina čakanja na dokončanje asinhronega sklepanja, kot SDK SageMaker Python get_result() delovanje. Zato izkoriščamo dejstvo, da bo Boto3 shranil rezultat sklepanja v Amazon S3 v response["OutputLocation"]. Uporabimo lahko naslednjo funkcijo, da počakamo, da se sklepna datoteka zapiše v 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

S to funkcijo lahko zdaj poizvedujemo po končni točki:

# 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 je odprtokodno ogrodje, ki ga je oktobra 2022 predstavil Harrison Chase. Poenostavlja razvoj aplikacij z uporabo velikih jezikovnih modelov (LLM) z zagotavljanjem integracij z različnimi sistemi in viri podatkov. LangChain omogoča analizo dokumentov, povzemanje, ustvarjanje chatbota, analizo kode itd. Pridobil je priljubljenost s prispevki več sto razvijalcev in znatnim financiranjem tveganih podjetij. LangChain omogoča povezovanje LLM z zunanjimi viri, kar omogoča ustvarjanje dinamičnih podatkovno odzivnih aplikacij. Ponuja knjižnice, API-je in dokumentacijo za poenostavitev razvojnega procesa.

LangChain ponuja knjižnice in primere za uporabo končnih točk SageMaker s svojim ogrodjem, kar olajša uporabo modelov ML, ki jih gosti SageMaker kot »možgani« verige. Če želite izvedeti več o tem, kako se LangChain integrira s SageMaker, glejte Končna točka SageMaker v dokumentaciji LangChain.

Ena od omejitev trenutne implementacije LangChain je, da izvorno ne podpira asinhronih končnih točk. Če želimo uporabiti asinhrono končno točko za LangChain, moramo definirati nov razred, SagemakerAsyncEndpoint, ki podaljšuje SagemakerEndpoint razred, ki je že na voljo v LangChainu. Poleg tega nudimo naslednje informacije:

  • Vedro S3 in predpona, kamor bo asinhrono sklepanje shranilo vhode (in izhode)
  • Največje število sekund za čakanje pred iztekom časa
  • An updated _call() funkcija za poizvedovanje končne točke invoke_endpoint_async() Namesto invoke_endpoint()
  • Način za prebujanje asinhrone končne točke, če je v hladnem zagonu (pomanjšano na nič)

Za pregled novonastalih SagemakerAsyncEndpoint, si lahko ogledate sagemaker_async_endpoint.py datoteka na voljo na 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']))

Čiščenje

Ko končate s testiranjem ustvarjanja sklepov iz končne točke, ne pozabite izbrisati končne točke, da se izognete dodatnim stroškom:

predictor.delete_endpoint()

zaključek

Pri uvajanju velikih modelov temeljev, kot je TII Falcon, je optimizacija stroškov ključnega pomena. Ti modeli zahtevajo zmogljivo strojno opremo in veliko pomnilniško kapaciteto, kar povzroča visoke stroške infrastrukture. Asinhrono sklepanje SageMaker, možnost uvajanja, ki asinhrono obdeluje zahteve, zmanjša stroške s skaliranjem števila instanc na nič, ko ni čakajočih zahtev. V tej objavi smo pokazali, kako razmestiti velike temeljne modele SageMaker JumpStart v asinhrone končne točke SageMaker. Za ponazoritev različnih metod za priklic asinhronih končnih točk in pridobivanje rezultatov smo zagotovili primere kode z uporabo SDK-ja SageMaker Python, Boto3 in LangChain. Te tehnike razvijalcem in raziskovalcem omogočajo optimizacijo stroškov ob uporabi zmožnosti temeljnih modelov za napredne sisteme za razumevanje jezika.

Če želite izvedeti več o asinhronem sklepanju in SageMaker JumpStart, si oglejte naslednje objave:


O avtorju

Slika DavideDavide Gallitelli je specializirani arhitekt rešitev za AI/ML v regiji EMEA. Ima sedež v Bruslju in tesno sodeluje s strankami po vsem Beneluksu. Razvijalec je že od malih nog, kodirati je začel pri 7 letih. AI/ML se je začel učiti na univerzi in od takrat se je vanj zaljubil.

Časovni žig:

Več od Strojno učenje AWS