Distribuera och hantera enkelt hundratals LoRA-adaptrar med SageMaker effektiv multi-adaptrar slutledning

Tycka om
Gillade

Datum:

Den nya effektiva multi-adapter slutledningsfunktionen för Amazon SageMaker låser upp spännande möjligheter för kunder som använder finjusterade modeller. Denna funktion integreras med SageMaker slutledningskomponenter så att du kan distribuera och hantera hundratals finjusterade Low-Rank Adaptation (LoRA)-adaptrar genom SageMaker API:er. Multi-adapter inferens hanterar registreringen av finjusterade adaptrar med en basmodell och laddar dem dynamiskt från GPU-minne, CPU-minne eller lokal disk på millisekunder, baserat på begäran. Den här funktionen tillhandahåller atomoperationer för att lägga till, ta bort eller uppdatera individuella adaptrar över en SageMaker-slutpunkts körande instanser utan att påverka prestandan eller kräva en omdistribuering av slutpunkten.

Effektiviteten hos LoRA-adaptrar möjliggör ett brett utbud av hyperpersonalisering och uppgiftsbaserad anpassning som tidigare hade varit för resurskrävande och kostsam för att vara genomförbar. Till exempel kan marknadsföring och programvara som en tjänst (SaaS)-företag anpassa artificiell intelligens och maskininlärning (AI/ML) applikationer med hjälp av var och en av sina kunders bilder, konststil, kommunikationsstil och dokument för att skapa kampanjer och artefakter som representerar dem. På liknande sätt kan företag inom branscher som hälso- och sjukvård eller finansiella tjänster återanvända en gemensam basmodell med uppgiftsbaserade adaptrar för att effektivt hantera en mängd specialiserade AI-uppgifter. Oavsett om det handlar om att diagnostisera medicinska tillstånd, utvärdera låneansökningar, förstå komplexa dokument eller upptäcka ekonomiska bedrägerier, kan du helt enkelt byta in den lämpliga finjusterade LoRA-adaptern för varje användningsfall under körning. Denna flexibilitet och effektivitet låser upp nya möjligheter att distribuera kraftfull, anpassad AI i hela din organisation. Med denna nya effektiva multi-adaptrar slutledningskapacitet minskar SageMaker komplexiteten i att distribuera och hantera adaptrarna som driver dessa applikationer.

I det här inlägget visar vi hur man använder den nya effektiva multi-adapter-inferensfunktionen i SageMaker.

Problem uttalande

Du kan använda kraftfulla förtränade grundmodeller (FM) utan att behöva bygga dina egna komplexa modeller från grunden. Men dessa generella modeller kanske inte alltid passar dina specifika behov eller dina unika data. För att få dessa modeller att fungera för dig kan du använda PEFT-tekniker (Parameter-Efficient Fine-Tuning) som LoRA.

Fördelen med PEFT och LoRA är att de låter dig finjustera modeller snabbt och kostnadseffektivt. Dessa metoder bygger på tanken att endast en liten del av en stor FM behöver uppdateras för att anpassa den till nya uppgifter eller domäner. Genom att frysa basmodellen och bara uppdatera några extra adapterlager kan du finjustera modellerna mycket snabbare och billigare, samtidigt som du behåller hög prestanda. Denna flexibilitet innebär att du snabbt kan anpassa förtränade modeller till låg kostnad för att möta olika krav. Vid slutledning kan LoRA-adaptrarna laddas dynamiskt under körning för att förstärka resultaten från basmodellen för bästa prestanda. Du kan skapa ett bibliotek med uppgiftsspecifika, kundspecifika eller domänspecifika adaptrar som kan bytas in efter behov för maximal effektivitet. Detta gör att du kan bygga AI som är skräddarsydd exakt för ditt företag.

Även om finjusterade LoRA-adaptrar effektivt kan hantera målinriktade användningsfall, kan det vara utmanande i stor skala att hantera dessa adaptrar. Du kan använda bibliotek med öppen källkod eller den AWS-hanterade Large Model Inference (LMI) djupinlärningsbehållaren (DLC) för att dynamiskt ladda och ta bort adaptervikter. Aktuella distributionsmetoder använder fasta adaptrar eller Amazon enkel lagringstjänst (Amazon S3) platser, vilket gör ändringar efter implementeringen omöjliga utan att uppdatera modellens slutpunkt och lägga till onödig komplexitet. Denna distributionsmetod gör det också omöjligt att samla in mätvärden per adapter, vilket gör utvärderingen av deras hälsa och prestanda till en utmaning.

Lösningsöversikt

I den här lösningen visar vi hur man använder effektiv multi-adapter-inferens i SageMaker för att vara värd för och hantera flera LoRA-adaptrar med en gemensam basmodell. Tillvägagångssättet är baserat på en befintlig SageMaker-kapacitet, slutledningskomponenter, där du kan ha flera behållare eller modeller på samma slutpunkt och allokera en viss mängd beräkningar till varje behållare. Med inferenskomponenter kan du skapa och skala flera kopior av modellen, som var och en behåller den beräkning som du har allokerat. Med slutledningskomponenter blir det en mycket enklare process att distribuera flera modeller som har specifika hårdvarukrav, vilket möjliggör skalning och värd för flera FM:er. Ett exempel på implementering skulle se ut som följande bild.

Den här funktionen utökar slutledningskomponenter till en ny typ av komponent, inferenskomponentadaptrar, som du kan använda för att låta SageMaker hantera dina individuella LoRA-adaptrar i skala samtidigt som de har en gemensam slutledningskomponent för basmodellen som du distribuerar. I det här inlägget visar vi hur man skapar, uppdaterar och tar bort adaptrar för inferenskomponenter och hur man kallar dem för slutledning. Du kan föreställa dig denna arkitektur som följande figur.

IC och adaptrar

Förutsättningar

För att köra exempelanteckningsböckerna behöver du ett AWS-konto med en AWS identitets- och åtkomsthantering (IAM) roll med behörighet att hantera skapade resurser. För detaljer, se Skapa ett AWS-konto.

Om det här är första gången du arbetar med Amazon SageMaker Studio, måste du först skapa en SageMaker-domän. Dessutom kan du behöva begära en ökning av tjänstekvoten för motsvarande SageMaker-värdinstanser. I det här exemplet är du värd för basmodellen och flera adaptrar på samma SageMaker-slutpunkt, så du kommer att använda en ml.g5.12xlarge SageMaker-värdinstans.

I det här exemplet lär du dig hur du distribuerar en basmodell (Meta Llama 3.1 8B Instruktion) och LoRA-adaptrar på en SageMaker-slutpunkt i realtid som använder inferenskomponenter. Du kan hitta exempel på anteckningsboken i GitHub repository.

import sagemaker
import boto3
import json

role = sagemaker.get_execution_role() # execution role for the endpoint
sess = sagemaker.session.Session() # sagemaker session for interacting with different AWS APIs
bucket = sess.default_bucket() # bucket to house artifacts
region = sess._region_name

sm_client = boto3.client(service_name='sagemaker')
sm_rt_client = boto3.client(service_name='sagemaker-runtime')

Ladda ner basmodellen från modellnavet Hugging Face. Eftersom Meta Llama 3.1 8B Instruct är en gated modell, behöver du en Hugging Face-åtkomsttoken och för att skicka in en begäran om modellåtkomst på modellsidan. För mer information, se Tillgång till privata/gated modeller.

from huggingface_hub import snapshot_download

model_name = sagemaker.utils.name_from_base("llama-3-1-8b-instruct")

HF_TOKEN = "<<YOUR_HF_TOKEN>>"
model_id = "meta-llama/Llama-3.1-8B-Instruct"
model_id_pathsafe = model_id.replace("/","-")
local_model_path = f"./models/{model_id_pathsafe}"
s3_model_path = f"s3://{bucket}/models/{model_id_pathsafe}"

snapshot_download(repo_id=model_id, use_auth_token=HF_TOKEN, local_dir=local_model_path, allow_patterns=[".json", ".safetensors"])

Kopiera din modellartefakt till Amazon S3 för att förbättra modellens laddningstid under driftsättning:

!aws s3 cp —recursive {local_model_path} {s3_model_path}

Välj en av tillgängliga LMI-containerbilder för värdskap. Effektiv adapterförmåga finns tillgänglig i 0.31.0-lmi13.0.0 och högre.

inference_image_uri = "763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.31.0-lmi13.0.0-cu124"

Skapa en containermiljö för värdbehållaren. LMI-behållarparametrar finns i LMI Backend Användarguider.

Parametrarna OPTION_MAX_LORAS och OPTION_MAX_CPU_LORAS styr hur adaptrar flyttar mellan GPU, CPU och disk. OPTION_MAX_LORAS anger en gräns för antalet adaptrar som samtidigt lagras i GPU-minnet, med överflödiga adaptrar avlastade till CPU-minnet.  OPTION_MAX_CPU_LORAS bestämmer hur många adaptrar som är iscensatta i CPU-minnet, och överför överflödiga adaptrar till lokal SSD-lagring.

I följande exempel kan 30 adaptrar leva i GPU-minne och 70 adaptrar i CPU-minne innan de går till lokal lagring.

env = {
    "HF_MODEL_ID": f"{s3_model_path}",
    "OPTION_ROLLING_BATCH": "lmi-dist",
    "OPTION_MAX_ROLLING_BATCH_SIZE": "16",
    "OPTION_TENSOR_PARALLEL_DEGREE": "max",
    "OPTION_ENABLE_LORA": "true",
    "OPTION_MAX_LORAS": "30",
    "OPTION_MAX_CPU_LORAS": "70",
    "OPTION_DTYPE": "fp16",
    "OPTION_MAX_MODEL_LEN": "6000"
}

Med din behållarbild och miljö definierade kan du skapa ett SageMaker-modellobjekt som du kommer att använda för att skapa en slutledningskomponent senare:

model_name = sagemaker.utils.name_from_base("llama-3-1-8b-instruct")

create_model_response = sm_client.create_model(
    ModelName = model_name,
    ExecutionRoleArn = role,
    PrimaryContainer = {
        "Image": inference_image_uri,
        "Environment": env,
    },
)

Konfigurera en SageMaker-slutpunkt

För att skapa en SageMaker-slutpunkt behöver du en slutpunktskonfiguration. När du använder inferenskomponenter anger du inte en modell i slutpunktskonfigurationen. Du laddar modellen som en komponent senare.

endpoint_config_name = f"{model_name}"
variant_name = "AllTraffic"
instance_type = "ml.g5.12xlarge"
model_data_download_timeout_in_seconds = 900
container_startup_health_check_timeout_in_seconds = 900

initial_instance_count = 1

sm_client.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ExecutionRoleArn = role,
    ProductionVariants = [
        {
            "VariantName": variant_name,
            "InstanceType": instance_type,
            "InitialInstanceCount": initial_instance_count,
            "ModelDataDownloadTimeoutInSeconds": model_data_download_timeout_in_seconds,
            "ContainerStartupHealthCheckTimeoutInSeconds": container_startup_health_check_timeout_in_seconds,
            "RoutingConfig": {"RoutingStrategy": "LEAST_OUTSTANDING_REQUESTS"},
        }
    ]
)

Skapa SageMaker-slutpunkten med följande kod:

create_endpoint_response = sm_client.create_endpoint(
    EndpointName = endpoint_name, EndpointConfigName = endpoint_config_name
)

Med din slutpunkt skapad kan du nu skapa slutledningskomponenten för basmodellen. Detta kommer att vara baskomponenten som adapterkomponenterna du skapar senare kommer att bero på.

Anmärkningsvärda parametrar här är ComputeResourceRequirements. Dessa är en konfiguration på komponentnivå som bestämmer mängden resurser som komponenten behöver (minne, vCPU:er, acceleratorer). Adaptrarna kommer att dela dessa resurser med baskomponenten.

base_inference_component_name = f"base-{model_name}"

variant_name = "AllTraffic"

initial_copy_count = 1
min_memory_required_in_mb = 32000
number_of_accelerator_devices_required = 4

sm_client.create_inference_component(
    InferenceComponentName = base_inference_component_name,
    EndpointName = endpoint_name,
    VariantName = variant_name,
    Specification={
        "ModelName": model_name,
        "StartupParameters": {
            "ModelDataDownloadTimeoutInSeconds": model_data_download_timeout_in_seconds,
            "ContainerStartupHealthCheckTimeoutInSeconds": container_startup_health_check_timeout_in_seconds,
        },
        "ComputeResourceRequirements": {
            "MinMemoryRequiredInMb": min_memory_required_in_mb,
            "NumberOfAcceleratorDevicesRequired": number_of_accelerator_devices_required,
        },
    },
    RuntimeConfig={
        "CopyCount": initial_copy_count,
    },
)

 I det här exemplet skapar du en enda adapter, men du kan vara värd för upp till hundratals av dem per slutpunkt. De kommer att behöva komprimeras och laddas upp till Amazon S3.

Adapterpaketet har följande filer i roten av arkivet utan undermappar.

Adapterfiler

För det här exemplet finjusterades en adapter med QLoRA och Fullständigt delad data parallell (FSDP) på träningsuppdelningen av ECTSum dataset. Träningen tog 21 minuter på en ml.p4d.24xlarge och kostade cirka 13 USD med ström prissättning på begäran.

För varje adapter du ska distribuera måste du ange en InferenceComponentName, En ArtifactUrl med S3-platsen för adapterarkivet, och en BaseInferenceComponentName för att skapa kopplingen mellan basmodellens slutledningskomponent och de nya adapterns slutledningskomponenter. Du upprepar denna process för varje ytterligare adapter.

ic_ectsum_name = f"adapter-ectsum-{base_inference_component_name}"
adapter_s3_uri = "<<S3_PATH_FOR_YOUR_ADAPTER>>

sm_client.create_inference_component(
    InferenceComponentName = adapter_ic1_name,
    EndpointName = endpoint_name,
    Specification={
        "BaseInferenceComponentName": inference_component_name,
        "Container": {
            "ArtifactUrl": adapter_s3_uri
        },
    },
)

Använd den installerade adaptern

Först skapar du en uppmaning att åberopa modellen för resultatsammanfattning, och fyller i källtexten med ett slumpmässigt objekt från ECTSum dataset. Sedan lagrar du grundsanningssammanfattningen från objektet för jämförelse senare.

from datasets import load_dataset
dataset_name = "mrSoul7766/ECTSum"

test_dataset = load_dataset(dataset_name, trust_remote_code=True, split="test")

test_item = test_dataset.shuffle().select(range(1))

prompt =f"""
    <|begin_of_text|><|start_header_id|>system<|end_header_id|>
    You are an AI assistant trained to summarize earnings calls.
    Provide a concise summary of the call, capturing the key points and overall context.
    Focus on quarter over quarter revenue, earnings per share, changes in debt, highlighted risks, and growth opportunities.
    <|eot_id|><|start_header_id|>user<|end_header_id|>
    Summarize the following earnings call:

    {test_item["text"]}
    <|eot_id|><|start_header_id|>assistant<|end_header_id|>"""

ground_truth_response = test_item["summary"]

För att testa basmodellen, specificera EndpointName för slutpunkten du skapade tidigare och namnet på basinferenskomponenten som InferenceComponentName, tillsammans med din prompt och andra inferensparametrar i parametern Body:

component_to_invoke = base_inference_component_name

response_model = sm_rt_client.invoke_endpoint(
    EndpointName = endpoint_name,
    InferenceComponentName = component_to_invoke,
    Body = json.dumps(
        {
            "inputs": prompt,
            "parameters": {"max_new_tokens": 100, "temperature":0.9}
        }
    ),
    ContentType = "application/json",
)

base_model_reponse = response_model["Body"].read().decode("utf8")["generated_text"]

För att anropa adaptern, använd namnet på adapterns inferenskomponent i din invoke_endpoint ringa upp:

component_to_invoke = adapter_ic1_name

response_model = sm_rt_client.invoke_endpoint(
    EndpointName = endpoint_name,
    InferenceComponentName = component_to_invoke,
    Body = json.dumps(
        {
            "inputs": prompt,
            "parameters": {"max_new_tokens": 100, "temperature":0.9}
        }
    ),
    ContentType = "application/json",
)

adapter_reponse = response_model["Body"].read().decode("utf8")["generated_text"]

Jämför utgångar

Jämför basmodellens och adapterns utdata med jord sanning. Även om basmodellen kan verka subjektivt bättre i det här testet, är adapterns svar faktiskt mycket närmare grundsvaret. Detta kommer att bevisas med statistik i nästa avsnitt.

Ground Truth:

q3 non-gaap earnings per share $3.71.
q3 sales rose 15.4 percent to $747 million.
bio rad laboratories - now anticipates 2021 non-gaap currency-neutral revenue growth between 12 to 13 percent.
sees 2021 estimated non-gaap operating margin of about 19.5 percent.
qtrly gaap income per share $129.96.

----------------------------------

Base Model Response:

Here is a summary of the earnings call:

**Key Points:**

* Revenue: $747 million, up 15.4% year-over-year (13.8% on a currency-neutral basis)
* Earnings per share: $129.96, up from $3 per share in Q3 2020
* Gross margin: 58.6% on a GAAP basis, 57.9% on a non-GAAP basis
* Operating income: $156.8 million, up from $109.6 million in Q3 2020
* Net income: $3.928

----------------------------------

Adapter Model Response:

                Here is a concise summary of the call:

                q3 revenue $747.6 million versus refinitiv ibes estimate of $753.9 million.
q3 earnings per share $3.71.
sees fy earnings per share $11.85 to $12.05.
sees fy 2021 non-gaap revenue growth to be 12% to 13%.
sees fy 2021 non-gaap gross margin to be 57.5% to 57.8%.
sees fy 2021 non-gaap operating margin to be 19.5%.

För att validera den verkliga adapterns prestanda kan du använda ett verktyg som fmeval att göra en utvärdering av summeringsnoggrannheten. Detta kommer att beräkna METEOR-, ROUGE- och BertScore-måtten för adaptern kontra basmodellen. Att göra det mot provdelningen av ECTSum ger följande resultat.

Testa poängtext

Den finjusterade adaptern visar en ökning med 59 % i METEOR-poäng, 159 % ökning av ROUGE-poäng och 8.6 % ökning i BertScore.

Följande diagram visar frekvensfördelningen av poängen för de olika mätvärdena, med adaptern konsekvent poäng bättre oftare i alla mätvärden.

Testresultat

Vi observerade en änd-till-ände latensskillnad på upp till 10 % mellan basmodellanropet och adaptern i våra tester. Om adaptern laddas från CPU-minne eller disk kommer det att medföra en ytterligare kallstartsfördröjning för den första laddningen till GPU. Men beroende på dina behållarkonfigurationer och den valda instanstypen kan dessa värden variera.

Uppdatera en befintlig adapter

Eftersom adaptrar hanteras som slutledningskomponenter kan du uppdatera dem på en slutpunkt som körs. SageMaker hanterar avlastning och avregistrering av den gamla adaptern och laddning och registrering av den nya adaptern på varje basinferenskomponent på alla instanser som den körs på för denna slutpunkt. För att uppdatera en adapterinferenskomponent, använd update_inference_component API och ange det befintliga inferenskomponentnamnet och Amazon S3-sökvägen till det nya komprimerade adapterarkivet.

Du kan träna en ny adapter eller ladda upp den befintliga adapterartefakten igen för att testa den här funktionen.

update_inference_component_response = sm_client.update_inference_component(
    InferenceComponentName = adapter_ic1_name,
    Specification={
        "Container": {
            "ArtifactUrl": new_adapter_s3_uri
        },
    },
)

Ta bort adaptrarna

Om du behöver ta bort en adapter, anropa delete_inference_component API med inferenskomponentens namn för att ta bort den:

sess = sagemaker.session.Session()
sess.delete_inference_component(adapter_ic1_name, wait = True)

Om du tar bort basmodellens slutledningskomponent raderas basinferenskomponenten automatiskt och alla tillhörande adapterkomponenter:

sess.delete_inference_component(base_inference_component_name, wait = True)

Priser

SageMaker multi-adapter inferens är allmänt tillgänglig i AWS-regioner USA East (N. Virginia, Ohio), USA West (Oregon), Asia Pacific (Jakarta, Mumbai, Seoul, Singapore, Sydney, Tokyo), Kanada (Central), Europa ( Frankfurt, Irland, London, Stockholm), Mellanöstern (Förenade Arabemiraten) och Sydamerika (São Paulo) och är tillgänglig utan extra kostnad.

Slutsats

Den nya effektiva multiadapter-inferensfunktionen i SageMaker öppnar upp spännande möjligheter för kunder med finjusterande användningsfall. Genom att tillåta dynamisk laddning av finjusterade LoRA-adaptrar kan du snabbt och kostnadseffektivt anpassa AI-modeller till dina specifika behov. Denna flexibilitet låser upp nya möjligheter att distribuera kraftfull, anpassad AI över organisationer inom branscher som marknadsföring, hälsovård och finans. Möjligheten att hantera dessa adaptrar i stor skala genom SageMaker inferenskomponenter gör det enkelt att bygga skräddarsydda generativa AI-lösningar.


Om författarna

Dmitrij Soldatkin är Senior Machine Learning Solutions Architect på AWS, som hjälper kunder att designa och bygga AI/ML-lösningar. Dmitrys arbete täcker ett brett spektrum av ML-användningsfall, med ett primärt intresse för generativ AI, djupinlärning och skalning av ML över hela företaget. Han har hjälpt företag inom många branscher, inklusive försäkringar, finansiella tjänster, allmännyttiga företag och telekommunikation. Han har en passion för kontinuerlig innovation och att använda data för att driva affärsresultat. Innan han började på AWS var Dmitry en arkitekt, utvecklare och teknikledare inom dataanalys och maskininlärning inom finansbranschen.

Giuseppe Zappia är en Principal AI/ML Specialist Solutions Architect på AWS, fokuserad på att hjälpa stora företag att designa och distribuera ML-lösningar på AWS. Han har över 20 års erfarenhet som full-stack mjukvaruingenjör och har tillbringat de senaste 5 åren på AWS fokuserat på maskininlärning.

Ram Vegiraju är en ML-arkitekt med Amazon SageMaker Service-teamet. Han fokuserar på att hjälpa kunder att bygga och optimera sina AI/ML-lösningar på Amazon SageMaker. På fritiden älskar han att resa och skriva.

Relaterade artiklar

plats_img

Senaste artiklar

plats_img