Optimalizálja az Amazon SageMaker JumpStart alapozó modellek telepítési költségeit Amazon SageMaker aszinkron végpontokkal | Amazon webszolgáltatások

Optimalizálja az Amazon SageMaker JumpStart alapozó modellek telepítési költségeit Amazon SageMaker aszinkron végpontokkal | Amazon webszolgáltatások

A generatív mesterségesintelligencia-alkalmazások számos iparágban elért sikere világszerte felkeltette azoknak a vállalatoknak a figyelmét és érdeklődését, amelyek a versenytársak eredményeit reprodukálni és felülmúlni, vagy új és izgalmas felhasználási eseteket szeretnének megoldani. Ezek az ügyfelek olyan alapmodelleket keresnek, mint a TII Falcon, a Stable Diffusion XL vagy az OpenAI GPT-3.5, mint a generatív AI-innovációt hajtó motorok.

Az alapmodellek a generatív mesterséges intelligencia modellek egy osztálya, amelyek képesek megérteni és létrehozni az emberhez hasonló tartalmat, köszönhetően a rengeteg strukturálatlan adatnak, amelyre betanították őket. Ezek a modellek forradalmasították a különféle számítógépes látás (CV) és természetes nyelvi feldolgozási (NLP) feladatokat, beleértve a képalkotást, a fordítást és a kérdések megválaszolását. Számos mesterségesintelligencia-alkalmazás építőköveként szolgálnak, és a fejlett intelligens rendszerek fejlesztésének kulcsfontosságú elemévé váltak.

Az alapozási modellek bevezetése azonban jelentős kihívásokkal járhat, különösen a költség- és erőforrásigény tekintetében. Ezek a modellek méretükről ismertek, gyakran százmillióktól több milliárd paraméterig terjednek. Nagy méretük kiterjedt számítási erőforrásokat igényel, beleértve az erős hardvert és a jelentős memóriakapacitást. Valójában az alapmodellek telepítéséhez általában legalább egy (gyakran több) GPU-ra van szükség a számítási terhelés hatékony kezelésére. Például a TII Falcon-40B Instruct modellhez legalább egy ml.g5.12xlarge példány szükséges a memóriába való sikeres betöltéséhez, de a legjobban nagyobb példányokkal teljesít. Ennek eredményeként a beruházások megtérülése (ROI) ezeknek a modelleknek az üzembe helyezésével és karbantartásával túl alacsony lehet ahhoz, hogy bizonyítsa az üzleti értéket, különösen a fejlesztési ciklusok vagy a nagy munkaterhelések esetén. Ez annak köszönhető, hogy a GPU-val hajtott példányok hosszú munkamenetekhez szükségesek, esetleg a hét minden napján, 24 órában.

Az év elején bejelentettük Amazon alapkőzet, egy szerver nélküli API, amellyel hozzáférhet az Amazon és generatív AI-partnereink alapmodelljeihez. Bár jelenleg Private Preview verzióban van, kiszolgáló nélküli API-ja lehetővé teszi az Amazon, az Anthropic, a Stability AI és az AI21 alapmodelleinek használatát anélkül, hogy saját végpontokat kellene telepítenie. Az olyan közösségek nyílt forráskódú modelljei azonban, mint például a Hugging Face, sokat nőttek, és nem mindegyiket tette elérhetővé az Amazon Bedrockon keresztül.

Ebben a bejegyzésben ezeket a helyzeteket célozzuk meg, és megoldjuk a magas költségek kockázatának problémáját nagy alapozási modellek telepítésével Amazon SageMaker aszinkron végpontok ból ből Amazon SageMaker JumpStart. Ez segíthet csökkenteni az architektúra költségeit, lehetővé téve, hogy a végpont csak akkor futhasson, ha a kérések a sorban vannak, és csak rövid ideig élnek, miközben nullára kicsinyítik, ha egyetlen kérés sem vár kiszolgálásra. Ez nagyon jól hangzik sok felhasználási esetben; azonban a nullára kicsinyített végpont hidegindítási időt vezet be, mielőtt következtetéseket szolgálhatna ki.

Megoldás áttekintése

Az alábbi ábra szemlélteti megoldásunk architektúráját.

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

Az általunk telepített architektúra nagyon egyszerű:

  • A felhasználói felület egy notebook, amelyet Streamlit vagy hasonló technológiára épülő webes felhasználói felület helyettesíthet. Esetünkben a notebook egy Amazon SageMaker Studio notebook, amely ml.m5.large példányon fut PyTorch 2.0 Python 3.10 CPU kernellel.
  • A notebook háromféleképpen kérdezi le a végpontot: a SageMaker Python SDK, az AWS SDK for Python (Boto3) és a LangChain.
  • A végpont aszinkron módon fut a SageMakeren, és a végponton a Falcon-40B Instruct modellt telepítjük. Jelenleg ez a legkorszerűbb az instrukciós modellek tekintetében, és elérhető a SageMaker JumpStartban. Egyetlen API-hívás lehetővé teszi a modell telepítését a végponton.

Mi az a SageMaker aszinkron következtetés?

A SageMaker aszinkron következtetés a SageMaker négy telepítési lehetőségének egyike, a valós idejű végpontokkal, a kötegelt következtetéssel és a kiszolgáló nélküli következtetéssel együtt. Ha többet szeretne megtudni a különböző telepítési lehetőségekről, lásd: Telepítsen modelleket a következtetéshez.

A SageMaker aszinkron következtetése sorba állítja a bejövő kéréseket, és aszinkron módon feldolgozza azokat, így ez a beállítás ideális a nagy, akár 1 GB-os hasznos adatmennyiséggel, hosszú feldolgozási időkkel és közel valós idejű késleltetési követelményekkel rendelkező kérésekhez. Azonban a fő előnye, amelyet nagy alapozási modellek kezelésekor nyújt, különösen a koncepció bizonyítása (POC) vagy a fejlesztés során, hogy az aszinkron következtetést úgy konfigurálhatja, hogy nulla példányszámra skálázza, amikor nincs kérés folyamatot, ezáltal költséget takarít meg. A SageMaker aszinkron következtetéssel kapcsolatos további információkért lásd: Aszinkron következtetés. A következő diagram ezt az architektúrát szemlélteti.

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

Aszinkron következtetési végpont üzembe helyezéséhez létre kell hoznia egy AsyncInferenceConfig tárgy. Ha létrehoz AsyncInferenceConfig argumentumainak megadása nélkül az alapértelmezett S3OutputPath lesz s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} és a S3FailurePath lesz s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

Mi az a SageMaker JumpStart

Modellünk a SageMaker JumpStarttól származik, amely a SageMaker egy olyan funkciója, amely felgyorsítja a gépi tanulási (ML) utat azáltal, hogy előre betanított modelleket, megoldássablonokat és példajegyzetfüzeteket kínál. Hozzáférést biztosít a különféle problématípusokhoz előre betanított modellek széles skálájához, lehetővé téve, hogy szilárd alapokkal kezdje meg ML feladatait. A SageMaker JumpStart megoldássablonokat is kínál a gyakori használati esetekhez, valamint példafüzeteket a tanuláshoz. A SageMaker JumpStart segítségével csökkentheti az ML-projektek elindításához szükséges időt és erőfeszítést az egykattintásos megoldások elindításával és a gyakorlati ML-tapasztalat átfogó erőforrásaival.

A következő képernyőkép a SageMaker JumpStart UI-n elérhető néhány modellre mutat példát.

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

Telepítse a modellt

Első lépésünk a modell telepítése a SageMaker rendszerbe. Ehhez használhatjuk a SageMaker JumpStart felhasználói felületét vagy a SageMaker Python SDK-t, amely egy API-t biztosít, amellyel a modellt az aszinkron végpontra telepíthetjük:

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

Ez a hívás körülbelül 10 percig tarthat. Ezalatt a végpont felpörgetik, a tároló a modell melléktermékeivel együtt letöltődik a végpontra, a modell konfigurációja betöltődik a SageMaker JumpStartból, majd az aszinkron végpont egy DNS-végponton keresztül elérhetővé válik. Annak érdekében, hogy a végpontunk nullára skálázható legyen, be kell állítanunk az automatikus skálázást az aszinkron végponton az Application Auto Scaling segítségével. Először regisztrálnia kell a végpont-változatot az Alkalmazásautomatikus skálázással, meg kell határoznia a méretezési szabályzatot, majd alkalmaznia kell a méretezési házirendet. Ebben a konfigurációban egyéni mérőszámot használunk CustomizedMetricSpecification, hívták ApproximateBacklogSizePerInstance, ahogy az a következő kódban is látható. A részletes listáért amazonfelhőóra Az aszinkron következtetési végponttal elérhető metrikák, lásd Monitoring a CloudWatch segítségével.

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. },
)

Ellenőrizheti, hogy a házirend sikeresen be lett állítva, ha a SageMaker konzolra navigál, és kiválasztja Végpontok alatt Következtetés a navigációs ablakban, és megkeresi az imént telepített végpontot.

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

Hívja meg az aszinkron végpontot

A végpont meghívásához el kell helyeznie a kérés hasznos terhét Amazon egyszerű tárolási szolgáltatás (Amazon S3), és adjon meg egy mutatót erre a hasznos adatra a InvokeEndpointAsync kérés. Meghíváskor a SageMaker sorba állítja a kérést feldolgozásra, és válaszként visszaadja az azonosítót és a kimeneti helyet. A feldolgozás után a SageMaker az eredményt az Amazon S3 helyére helyezi. Opcionálisan kiválaszthatja, hogy siker- vagy hibaértesítéseket kíván-e kapni Amazon Simple Notification Service (Amazon SNS).

SageMaker Python SDK

A telepítés befejezése után visszaadja a AsyncPredictor tárgy. Az aszinkron következtetés végrehajtásához adatokat kell feltöltenie az Amazon S3-ba, és használnia kell a predict_async() módszert az S3 URI bemenettel. Vissza fog adni egy AsyncInferenceResponse objektumot, és ellenőrizheti az eredményt a get_response() módszer.

Alternatív megoldásként, ha rendszeresen ellenőrizni szeretné az eredményt, és generáláskor vissza szeretné adni, használja a predict() módszer. Ezt a második módszert használjuk a következő kódban:

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

Most fedezzük fel a invoke_endpoint_async módszer a Boto3-tól sagemaker-runtime ügyfél. Lehetővé teszi a fejlesztők számára, hogy aszinkron módon meghívjanak egy SageMaker-végpontot, amely tokent biztosít az előrehaladás nyomon követéséhez és a válasz későbbi lekéréséhez. A Boto3 nem kínál lehetőséget arra, hogy megvárja az aszinkron következtetés befejezését, mint a SageMaker Python SDK get_result() művelet. Ezért kihasználjuk azt a tényt, hogy a Boto3 az Amazon S3 következtetési kimenetét a response["OutputLocation"]. A következő függvény segítségével megvárhatjuk, amíg a következtetésfájl az Amazon S3-ba íródik:

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

Ezzel a függvénnyel most lekérdezhetjük a végpontot:

# 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

A LangChain egy nyílt forráskódú keretrendszer, amelyet 2022 októberében indított el Harrison Chase. Leegyszerűsíti a nagy nyelvi modelleket (LLM) használó alkalmazások fejlesztését azáltal, hogy integrációt biztosít különféle rendszerekkel és adatforrásokkal. A LangChain lehetővé teszi a dokumentumelemzést, az összegzést, a chatbot létrehozását, a kódelemzést stb. Népszerűségre tett szert, több száz fejlesztő hozzájárulásával és jelentős kockázati cégek finanszírozásával. A LangChain lehetővé teszi az LLM-ek összekapcsolását külső forrásokkal, lehetővé téve dinamikus, adatérzékeny alkalmazások létrehozását. Könyvtárakat, API-kat és dokumentációt kínál a fejlesztési folyamat egyszerűsítésére.

A LangChain könyvtárakat és példákat kínál a SageMaker végpontok keretrendszerével való használatához, megkönnyítve a SageMaker-en tárolt ML modellek használatát a lánc „agyaként”. Ha többet szeretne megtudni arról, hogyan integrálódik a LangChain a SageMakerrel, tekintse meg a SageMaker végpont a LangChain dokumentációjában.

A LangChain jelenlegi megvalósításának egyik korlátja, hogy nem támogatja natívan az aszinkron végpontokat. Ahhoz, hogy aszinkron végpontot használjunk a LangChainhez, meg kell határoznunk egy új osztályt, SagemakerAsyncEndpoint, amely kiterjeszti a SagemakerEndpoint osztály már elérhető a LangChainben. Ezenkívül a következő információkat adjuk meg:

  • Az S3 vödör és előtag, ahol az aszinkron következtetés tárolja a bemeneteket (és a kimeneteket)
  • Maximum másodpercnyi várakozási idő az időkorlát előtt
  • An updated _call() függvény a végpont lekérdezéséhez invoke_endpoint_async() helyett invoke_endpoint()
  • Módszer az aszinkron végpont felébresztésére, ha hidegindításban van (nullára kicsinyítve)

Az újonnan létrehozott áttekintéshez SagemakerAsyncEndpoint, nézd meg a sagemaker_async_endpoint.py filé elérhető a GitHub-on.

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']))

Tisztítsuk meg

Ha végzett a végpontból származó következtetések tesztelésével, ne felejtse el törölni a végpontot, hogy elkerülje a további költségeket:

predictor.delete_endpoint()

Következtetés

A nagy alapozómodellek, például a TII Falcon telepítésekor a költségek optimalizálása kulcsfontosságú. Ezek a modellek erős hardvert és jelentős memóriakapacitást igényelnek, ami magas infrastrukturális költségekhez vezet. A SageMaker aszinkron következtetés, a kéréseket aszinkron módon feldolgozó telepítési lehetőség, csökkenti a költségeket azáltal, hogy nullára skálázza a példányszámot, ha nincsenek függőben lévő kérések. Ebben a bejegyzésben bemutattuk, hogyan lehet nagy SageMaker JumpStart alapmodelleket telepíteni a SageMaker aszinkron végpontjaira. Kódpéldákat mutattunk be a SageMaker Python SDK, Boto3 és LangChain használatával, hogy szemléltessem az aszinkron végpontok meghívásának és az eredmények lekérésének különböző módszereit. Ezek a technikák lehetővé teszik a fejlesztők és kutatók számára a költségek optimalizálását, miközben a fejlett nyelvértő rendszerek alapmodelljeit használják.

Ha többet szeretne megtudni az aszinkron következtetésről és a SageMaker JumpStartról, tekintse meg a következő bejegyzéseket:


A szerzőről

Davide képeDavide Gallitelli az EMEA régióban az AI/ML speciális megoldások építésze. Székhelye Brüsszelben van, és szorosan együttműködik az ügyfelekkel a Benelux államokban. Egészen kicsi kora óta fejlesztő, 7 évesen kezdett el kódolni. Az AI/ML-t az egyetemen kezdte tanulni, és azóta beleszeretett.

Időbélyeg:

Még több AWS gépi tanulás