Kör ensemble ML-modeller på Amazon SageMaker PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Kör ensemble ML-modeller på Amazon SageMaker

Modellinstallation inom maskininlärning (ML) blir allt mer komplex. Du vill distribuera inte bara en ML-modell utan stora grupper av ML-modeller representerade som ensemble-arbetsflöden. Dessa arbetsflöden består av flera ML-modeller. Att producera dessa ML-modeller är utmanande eftersom du måste följa olika prestanda- och latenskrav.

Amazon SageMaker stöder eninstansensembler med Triton Inference Server. Denna funktion låter dig köra modellensembler som passar på en enda instans. Bakom kulisserna använder SageMaker Triton Inference Server för att hantera ensemblen på varje instans bakom slutpunkten för att maximera genomströmning och hårdvaruanvändning med ultralåg (ensiffriga millisekunder) slutledningslatens. Med Triton kan du också välja från ett brett utbud av ML-ramverk som stöds (inklusive TensorFlow, PyTorch, ONNX, XGBoost och NVIDIA TensorRT) och infrastrukturbackends, inklusive GPU:er, CPU:er och AWS slutledning.

Med den här kapaciteten på SageMaker kan du optimera dina arbetsbelastningar genom att undvika kostsamma nätverkslatens och skörda fördelarna med beräknings- och datalokalitet för ensemble-inferenspipelines. I det här inlägget diskuterar vi fördelarna med att använda Triton Inference Server tillsammans med överväganden om detta är rätt alternativ för din arbetsbelastning.

Lösningsöversikt

Triton Inference Server är designad för att göra det möjligt för team att distribuera, köra och skala utbildade AI-modeller från vilket ramverk som helst på vilken GPU- eller CPU-baserad infrastruktur som helst. Dessutom har den optimerats för att erbjuda högpresterande slutledning i skala med funktioner som dynamisk batchning, samtidiga körningar, optimal modellkonfiguration, modellensemblefunktioner och stöd för streaming-ingångar.

Arbetsbelastningar bör ta hänsyn till de möjligheter som Triton tillhandahåller för att säkerställa att deras modeller kan användas. Triton stöder ett antal populära ramverk direkt, inklusive TensorFlow, PyTorch, ONNX, XGBoost och NVIDIA TensorRT. Triton stöder även olika backends som krävs för att algoritmer ska fungera korrekt. Du bör se till att dina modeller stöds av dessa backends och i händelse av att en backend inte gör det låter Triton dig implementera din egen och integrera den. Du bör också verifiera att din algoritmversion stöds samt se till att modellartefakterna är acceptabla av motsvarande backend. För att kontrollera om just din algoritm stöds, se Triton Inference Server Backend för en lista över inbyggt stödda backends som underhålls av NVIDIA.

Det kan finnas vissa scenarier där dina modeller eller modellensembler inte fungerar på Triton utan att kräva mer ansträngning, till exempel om en inbyggt stödd backend inte finns för din algoritm. Det finns några andra överväganden att ta hänsyn till, som att nyttolastformatet kanske inte är idealiskt, särskilt när din nyttolaststorlek kan vara stor för din begäran. Som alltid bör du validera din prestation efter att ha distribuerat dessa arbetsbelastningar för att säkerställa att dina förväntningar uppfylls.

Låt oss ta en modell för bildklassificering av neurala nätverk och se hur vi kan påskynda våra arbetsbelastningar. I det här exemplet använder vi NVIDIA DALI-backend för att påskynda vår förbearbetning inom ramen för vår ensemble.

Skapa Triton-modellensembler

Triton Inference Server förenklar distributionen av AI-modeller i stor skala. Triton Inference Server kommer med en bekväm lösning som förenklar byggandet av förbearbetnings- och efterbearbetningspipelines. Triton Inference Server-plattformen tillhandahåller ensembleplaneraren, som du kan använda för att bygga pipelining-ensemblemodeller som deltar i slutledningsprocessen samtidigt som du säkerställer effektivitet och optimerar genomströmningen.

Triton Inference Server betjänar modeller från modellförråd. Låt oss titta på modellförrådets layout för ensemblemodellen som innehåller DALI-förbearbetningsmodellen, TensorFlow inception V3-modellen och modellensemblekonfigurationen. Varje underkatalog innehåller förvarsinformationen för motsvarande modeller. De config.pbtxt fil beskriver modellkonfigurationen för modellerna. Varje katalog måste ha en numerisk undermapp för varje version av modellen och den drivs av en specifik backend som Triton stöder.

NVIDIA Triton Model Repository

NVIDIA DALI

För det här inlägget använder vi NVIDIA Data Loading Library (DALI) som förbearbetningsmodell i vår modellensemble. NVIDIA DALI är ett bibliotek för dataladdning och förbearbetning för att accelerera applikationer för djupinlärning. Den tillhandahåller en samling optimerade byggstenar för att ladda och bearbeta bild-, video- och ljuddata. Du kan använda den som en bärbar drop-in-ersättning för inbyggda dataladdare och datateratorer i populära ramverk för djupinlärning.

NVIDIA Dali

Följande kod visar modellkonfigurationen för en DALI-backend:

name: "dali"
backend: "dali"
max_batch_size: 256
input [
  {
    name: "DALI_INPUT_0"
    data_type: TYPE_UINT8
    dims: [ -1 ]
  }
]
output [
  {
    name: "DALI_OUTPUT_0"
    data_type: TYPE_FP32
    dims: [ 299, 299, 3 ]
  }
]
parameters: [
  {
    key: "num_threads"
    value: { string_value: "12" }
  }
]

Inception V3-modell

För det här inlägget visar vi hur DALI används i en modellensemble med Inception V3. Inception V3 TensorFlow förtränade modellen sparas i GraphDef-format som en enda fil med namnet model.graphdef. De config.pbtxt filen har information om modellnamn, plattform, max_batch_sizesamt in- och utkontrakt. Vi rekommenderar att ställa in max_batch_size konfiguration till mindre än den initiala V3-modellens batchstorlek. Etikettfilen har klassetiketter för 1,000 XNUMX olika klasser. Vi kopierar modelletiketterna för inledande klassificering till inception_graphdef katalogen i modellförrådet. Etikettfilen innehåller 1,000 XNUMX klassetiketter av IMAGEnet klassificeringsdatauppsättning.

name: "inception_graphdef"
platform: "tensorflow_graphdef"
max_batch_size: 256
input [
  {
    name: "input"
    data_type: TYPE_FP32
    format: FORMAT_NHWC
    dims: [ 299, 299, 3 ]
  }
]
output [
  {
    name: "InceptionV3/Predictions/Softmax"
    data_type: TYPE_FP32
    dims: [ 1001 ]
    label_filename: "inception_labels.txt"
  }
]

Triton ensemble

Följande kod visar en modellkonfiguration av en ensemblemodell för DALI-förbearbetning och bildklassificering:

name: "ensemble_dali_inception"
platform: "ensemble"
max_batch_size: 256
input [
  {
    name: "INPUT"
    data_type: TYPE_UINT8
    dims: [ -1 ]
  }
]
output [
  {
    name: "OUTPUT"
    data_type: TYPE_FP32
    dims: [ 1001 ]
  }
]
ensemble_scheduling {
  step [
    {
      model_name: "dali"
      model_version: -1
      input_map {
        key: "DALI_INPUT_0"
        value: "INPUT"
      }
      output_map {
        key: "DALI_OUTPUT_0"
        value: "preprocessed_image"
      }
    },
    {
      model_name: "inception_graphdef"
      model_version: -1
      input_map {
        key: "input"
        value: "preprocessed_image"
      }
      output_map {
        key: "InceptionV3/Predictions/Softmax"
        value: "OUTPUT"
      }
    }
  ]
}

Skapa en SageMaker-slutpunkt

SageMaker slutpunkter möjliggör realtidshosting där millisekunders svarstid krävs. SageMaker tar på sig de odifferentierade tunga lyften av modellvärdhantering och har förmågan att automatiskt skala. Dessutom tillhandahålls ett antal funktioner, inklusive värd för flera varianter av din modell, A/B-testning av dina modeller, integration med amazoncloudwatch för att få observerbarhet av modellprestanda och övervakning av modelldrift.

Låt oss skapa en SageMaker-modell från modellartefakterna vi laddade upp till Amazon enkel lagringstjänst (Amazon S3).

Därefter tillhandahåller vi också en ytterligare miljövariabel: SAGEMAKER_TRITON_DEFAULT_MODEL_NAME, som anger namnet på modellen som ska laddas av Triton. Värdet på denna nyckel bör matcha mappnamnet i modellpaketet som laddats upp till Amazon S3. Denna variabel är valfri i de fall du använder en enda modell. När det gäller ensemblemodeller måste denna nyckel anges för att Triton ska starta i SageMaker.

Dessutom kan du ställa in SAGEMAKER_TRITON_BUFFER_MANAGER_THREAD_COUNT och SAGEMAKER_TRITON_THREAD_COUNT för att optimera antalet trådar.

container = {
    "Image": triton_image_uri,
    "ModelDataUrl": model_uri,
    "Environment": {"SAGEMAKER_TRITON_DEFAULT_MODEL_NAME": "ensemble_dali_inception"},
}
create_model_response = sm_client.create_model(
    ModelName=sm_model_name, ExecutionRoleArn=role, PrimaryContainer=container
)

Med den föregående modellen skapar vi en slutpunktskonfiguration där vi kan specificera vilken typ och antal instanser vi vill ha i slutpunkten:

create_endpoint_config_response = sm_client.create_endpoint_config(
    EndpointConfigName=endpoint_config_name,
    ProductionVariants=[
        {
            "InstanceType": instance_type,
            "InitialVariantWeight": 1,
            "InitialInstanceCount": 1,
            "ModelName": sm_model_name,
            "VariantName": "AllTraffic",
        }
    ],
)
endpoint_config_arn = create_endpoint_config_response["EndpointConfigArn"]

Vi använder denna slutpunktskonfiguration för att skapa en ny SageMaker-slutpunkt och väntar på att distributionen ska slutföras. Statusen ändras till InService när distributionen lyckas.

create_endpoint_response = sm_client.create_endpoint(
    EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name
)
endpoint_arn = create_endpoint_response["EndpointArn"]

Slutsats nyttolast

Den ingående nyttolastbilden går genom förbearbetnings-DALI-pipelinen och används i ensembleplaneraren som tillhandahålls av Triton Inference Server. Vi konstruerar nyttolasten som ska skickas till slutpunktens slutpunkt:

payload = {
    "inputs": [
        {
            "name": "INPUT",
            "shape": rv2.shape,
            "datatype": "UINT8",
            "data": rv2.tolist(),
        }
    ]
}

Ensemble slutledning

När vi har slutpunkten igång kan vi använda exempelbilden för att utföra en slutledningsbegäran med JSON som nyttolastformat. För formatet för inferensbegäran använder Triton KFServing-gemenskapens standardinferensprotokoll.

response = runtime_sm_client.invoke_endpoint(
    EndpointName=endpoint_name, ContentType="application/octet-stream", Body=json.dumps(payload)
)
print(json.loads(response["Body"].read().decode("utf8")))

Med binary+json format måste vi ange längden på begärans metadata i rubriken för att Triton ska kunna analysera den binära nyttolasten korrekt. Detta görs med hjälp av en anpassad Content-Type-rubrik application/vnd.sagemaker-triton.binary+json;json-header-size={}.

Detta skiljer sig från att använda en Inference-Header-Content-Length header på en fristående Triton-server eftersom anpassade rubriker inte är tillåtna i SageMaker.

Tritonclient-paketet tillhandahåller verktygsmetoder för att generera nyttolasten utan att behöva känna till detaljerna i specifikationen. Vi använder följande metoder för att konvertera vår slutledningsbegäran till ett binärt format, vilket ger lägre latenser för slutledning. Se GitHub anteckningsbok för genomförandedetaljer.

response = runtime_sm_client.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType="application/vnd.sagemaker-triton.binary+json;json-header-size={}".format(
        header_length
    ),
    Body=request_body,
)

Slutsats

I det här inlägget visade vi upp hur du kan producera modellensembler som körs på en enda instans på SageMaker. Detta designmönster kan vara användbart för att kombinera alla förbearbetnings- och efterbearbetningslogik tillsammans med slutledningsförutsägelser. SageMaker använder Triton för att köra ensembleinferensen på en enda behållare på en instans som stöder alla större ramverk.

För fler prover på Triton-ensembler på SageMaker, se GitHub repo. Testa!


Om författarna

Kör ensemble ML-modeller på Amazon SageMaker PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.James Park är en lösningsarkitekt på Amazon Web Services. Han arbetar med Amazon.com för att designa, bygga och distribuera tekniklösningar på AWS och har ett särskilt intresse för AI och maskininlärning. På fritiden tycker han om att söka nya kulturer, nya upplevelser och att hålla sig uppdaterad med de senaste tekniktrenderna.

Kör ensemble ML-modeller på Amazon SageMaker PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Vikram Elango är Senior AI/ML Specialist Solutions Architect på Amazon Web Services, baserad i Virginia, USA. Vikram hjälper finans- och försäkringsbranschens kunder med design och tankeledarskap att bygga och distribuera maskininlärningsapplikationer i stor skala. Han är för närvarande fokuserad på naturlig språkbehandling, ansvarsfull AI, slutledningsoptimering och skalning av ML över hela företaget. På fritiden tycker han om att resa, vandra, laga mat och campa med sin familj.

Kör ensemble ML-modeller på Amazon SageMaker PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Saurabh Trikande är senior produktchef för Amazon SageMaker Inference. Han brinner för att arbeta med kunder och motiveras av målet att demokratisera maskininlärning. Han fokuserar på kärnutmaningar relaterade till att distribuera komplexa ML-applikationer, multi-tenant ML-modeller, kostnadsoptimeringar och att göra implementeringen av djupinlärningsmodeller mer tillgänglig. På sin fritid gillar Saurabh att vandra, lära sig om innovativ teknik, följa TechCrunch och umgås med sin familj.

Tidsstämpel:

Mer från AWS maskininlärning