Vert for flere TensorFlow datamaskinsynmodeller ved hjelp av Amazon SageMaker multimodell-endepunkter

Kilde node: 1853804

Amazon SageMaker hjelper dataforskere og utviklere med å forberede, bygge, trene og distribuere maskinlæringsmodeller av høy kvalitet (ML) raskt ved å samle et bredt sett med funksjoner som er spesialbygd for ML. SageMaker akselererer innovasjon i organisasjonen din ved å tilby spesialbygde verktøy for hvert trinn i ML-utvikling, inkludert merking, dataklargjøring, funksjonsteknikk, deteksjon av statistisk skjevhet, AutoML, opplæring, innstilling, hosting, forklarbarhet, overvåking og automatisering av arbeidsflyt.

Bedrifter trener i økende grad ML-modeller basert på individuelle brukerdata. For eksempel, en bildedelingstjeneste designet for å muliggjøre oppdagelse av informasjon på internett, trener tilpassede modeller basert på hver brukers opplastede bilder og nettleserlogg for å tilpasse anbefalinger for den brukeren. Selskapet kan også trene tilpassede modeller basert på søkeemner for å anbefale bilder per emne. Å bygge spesialtilpassede ML-modeller for hvert brukstilfelle fører til høyere inferensnøyaktighet, men øker kostnadene ved å distribuere og administrere modeller. Disse utfordringene blir mer uttalt når ikke alle modeller er tilgjengelige i samme hastighet, men fortsatt trenger å være tilgjengelige til enhver tid.

SageMaker flermodell-endepunkter gi en skalerbar og kostnadseffektiv måte å distribuere et stort antall ML-modeller i skyen. SageMaker-endepunkter med flere modeller lar deg distribuere flere ML-modeller bak et enkelt endepunkt og betjene dem ved hjelp av en enkelt serveringsbeholder. Søknaden din trenger bare å inkludere en API-samtale med målmodellen til dette endepunktet for å oppnå inferens med lav latens og høy gjennomstrømning. I stedet for å betale for et eget endepunkt for hver enkelt modell, kan du være vert for mange modeller til prisen for et enkelt endepunkt. For mer informasjon om SageMaker-endepunkter for flere modeller, se Spar på inferenskostnader ved å bruke Amazon SageMaker-endepunkter for flere modeller.

I dette innlegget demonstrerer vi hvordan du bruker SageMaker-endepunkter for flere modeller for å være vert for to datamaskinsynmodeller med forskjellige modellarkitekturer og datasett for bildeklassifisering. I praksis kan du distribuere titusenvis av modeller på endepunkter med flere modeller.

Oversikt over løsning

SageMaker flermodell-endepunkter fungerer med flere rammer, for eksempel TensorFlow, PyTorch, MXNet og sklearn, og du kan bygge din egen container med en multimodell server. Multimodellendepunkter støttes også naturlig i følgende populære SageMaker innebygde algoritmer: Xgboost, Lineær lærer, Tilfeldig kuttet skog (RCF), og K-nærmeste naboer (KNN). Du kan bruke de SageMaker-leverte containerne direkte mens du bruker disse algoritmene uten å måtte lage din egen tilpassede container.

Følgende diagram er en forenklet illustrasjon av hvordan du kan være vert for flere (for dette innlegget, seks) modeller ved hjelp av SageMaker-endepunkter for flere modeller. I praksis kan multimodellendepunkter romme hundrevis til titusenvis av ML-modeller bak et endepunkt. I vår arkitektur, hvis vi er vert for flere modeller ved hjelp av modellartefakter lagret i Amazon enkel lagringstjeneste (Amazon S3), multimodellendepunkter laster dynamisk ut noen av de minst brukte modellene for å imøtekomme nyere modeller.

I dette innlegget viser vi hvordan du kan være vert for to datamaskinsynmodeller som er trent med TensorFlow-rammeverket bak et enkelt SageMaker multimodell-endepunkt. Vi bruker TensorFlow Servering container aktivert for sluttmodeller for flere modeller for å være vert for disse modellene. For vår første modell trener vi en mindre versjon av AlexNet CNN for å klassifisere bilder fra CIFAR-10 datasett. For den andre modellen bruker vi a VGG16 CNN-modellen forhåndsøvd på IMAGEnet datasett og finjustert på Datasett for tegnspråk sifre for å klassifisere håndsymbolbilder. Vi tilbyr også en fullt funksjonell bærbare for å demonstrere alle trinnene.

Modell 1: CIFAR-10 bildeklassifisering

CIFAR-10 er et referansedatasett for bildeklassifisering i datasyn og ML. CIFAR-bilder er farget (tre kanaler) med dramatisk variasjon i hvordan gjenstandene ser ut. Den består av 32 × 32 fargebilder i 10 klasser, med 6,000 bilder per klasse. Den inneholder 50,000 10,000 treningsbilder og XNUMX XNUMX testbilder. Følgende bilde viser et utvalg av bildene gruppert etter etikettene.

For å bygge bildeklassifisereren bruker vi en forenklet versjon av den klassiske AlexNet CNN. Nettverket består av fem lag med sammenvikling og pooling og tre fullt tilkoblede lag. Vår forenklede arkitektur stabler tre konvolusjonslag og to fullt sammenkoblede (tette) lag.

Det første trinnet er å laste inn datasettet i tog- og testobjekter. TensorFlow-rammeverket gir CIFAR-datasettet som vi kan laste inn ved hjelp av load_data () -metoden. Deretter skalerer vi inngangsbildene ved å dele pikselverdiene med 255: [0,255] ⇒ [0,1]. Vi må også forberede etikettene ved hjelp av en-hot-koding. En varm koding er en prosess der de kategoriske variablene konverteres til en numerisk form. Følgende kodebit viser disse trinnene i aksjon:

from tensorflow.keras.datasets import cifar10 # load dataset
(X_train, y_train), (X_test, y_test) = cifar10.load_data() # rescale input images
X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255 # one hot encode target labels
num_classes = len(np.unique(y_train))
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

Etter at datasettet er klargjort og klart for trening, lagres det på Amazon S3 for bruk av SageMaker. Modellarkitekturen og opplæringskoden for bildeklassifisereren er samlet i et treningsskript (cifar_train.py). For å generere grupper med tensorbildedata for opplæringsprosessen bruker vi ImageDataGenerator. Dette gjør det mulig for oss å bruke transformasjoner av dataøkning som rotasjon, bredde og høydeskift på treningsdataene våre.

I neste trinn bruker vi treningsskriptet til å lage en TensorFlow-estimator ved hjelp av SageMaker SDK (se følgende kode). Vi bruker estimatoren for å passe CNN-modellen på CIFAR-10-innganger. Når opplæringen er fullført, lagres modellen på Amazon S3.

from sagemaker.tensorflow import TensorFlow model_name = 'cifar-10' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'cifar_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'model_dir': f'/opt/ml/model', 'role': role, 'hyperparameters': hyperparameters, 'output_path': f's3://{BUCKET}/{PREFIX}/cifar_10/out', 'base_job_name': f'mme-cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_1 = TensorFlow(**estimator_parameters) estimator_1.fit(inputs)

Senere demonstrerer vi hvordan vi kan være vert for denne modellen ved hjelp av SageMaker-endepunkt for flere modeller ved siden av den andre modellen vår (tegnspråk-sifret klassifisering).

Modell 2: Klassifisering av tegnspråk sifre

For den andre modellen bruker vi datasettet for tegnspråk sifre. Dette datasettet skiller tegnspråkssifrene fra 0–9. Følgende bilde viser et utvalg av datasettet.

Datasettet inneholder 100 x 100 bilder i RGB-farge og har 10 klasser (sifre 0–9). Treningssettet inneholder 1,712 bilder, valideringssett 300 og testsett 50.

Dette datasettet er veldig lite. Å trene et nettverk fra bunnen av på dette lille datasettet oppnår ikke gode resultater. For å oppnå høyere nøyaktighet bruker vi overføre læring. Overføringslæring er vanligvis en god tilnærming når du starter et klassifiseringsprosjekt, spesielt når du ikke har mye treningsdata. Det migrerer kunnskapen som er lært fra kildedatasettet til måldatasettet, for å spare opplæringstid og beregningskostnader.

For å trene denne modellen bruker vi en forhåndsutdannet VGG16 CNN-modell trent på ImageNet-datasettet og finjusterer den til å fungere på datasettet vårt for tegnspråk. En forhåndsøvd modell er et nettverk som tidligere har blitt trent i et stort datasett, vanligvis på en storskala bildeklassifiseringsoppgave. VGG16-modellarkitekturen vi bruker, har totalt 13 konvolusjonslag. For tegnspråksdatasettet, fordi dets domene er forskjellig fra kildedomenet til ImageNet-datasettet, finjusterer vi bare de siste få lagene. Finjustering refererer her til frysing av noen av nettverkslagene som brukes til ekstraksjon av funksjoner, og sammen trener både de ikke-frosne lagene og de nylig tilføyde klassifiseringslagene til den forhåndstrente modellen.

Treningsskriptet (sign_language_train.py) innkapsler modellarkitekturen og opplæringslogikken for klassifikatoren for tegnspråk. Først laster vi inn de forhåndsøvde vektene fra VGG16-nettverket som er trent på ImageNet-datasettet. Deretter fryser vi en del av funksjonen extractor delen, etterfulgt av å legge til de nye klassifiseringslagene. Til slutt kompilerer vi nettverket og kjører opplæringsprosessen for å optimalisere modellen for det mindre datasettet.

Deretter bruker vi dette treningsskriptet til å lage en TensorFlow-estimator ved hjelp av SageMaker SDK. Denne estimatoren brukes til å plassere tegnspråksifret klassifiseringen på de medfølgende inngangene. Når opplæringen er fullført, lagres modellen på Amazon S3 for å være vert for SageMaker-endepunkter for flere modeller. Se følgende kode:

model_name = 'sign-language' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'sign_language_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'hyperparameters': hyperparameters, 'model_dir': f'/opt/ml/model', 'role': role, 'output_path': f's3://{BUCKET}/{PREFIX}/sign_language/out', 'base_job_name': f'cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_2 = TensorFlow(**estimator_parameters) estimator_2.fit({'train': train_input, 'val': val_input})

Distribuere et endepunkt for flere modeller

SageMaker-endepunkter med flere modeller gir en skalerbar og kostnadseffektiv løsning for å distribuere et stort antall modeller. Den bruker en delt serveringsbeholder som er aktivert for å være vert for flere modeller. Dette reduserer hostingkostnadene ved å forbedre endepunktsutnyttelsen sammenlignet med å bruke endepunkter for enmodell. Det reduserer også distribusjonsomkostninger fordi SageMaker administrerer lasting av modeller i minnet og skalerer dem basert på trafikkmønstrene til dem.

For å opprette multimodellendepunktet må vi først kopiere de trente modellene for de enkelte estimatorene (1 og 2) fra de lagrede S3-stedene til et felles S3-prefiks som kan brukes av multimodellendepunktet:

tf_model_1 = estimator_1.model_data
output_1 = f's3://{BUCKET}/{PREFIX}/mme/cifar.tar.gz' tf_model_2 = estimator_2.model_data
output_2 = f's3://{BUCKET}/{PREFIX}/mme/sign-language.tar.gz' !aws s3 cp {tf_model_1} {output_1}
!aws s3 cp {tf_model_2} {output_2}

Etter at modellene er kopiert til den vanlige plasseringen som er angitt av S3-prefikset, oppretter vi en serveringsmodell ved bruk av TensorFlowModel-klassen fra SageMaker SDK. Serveringsmodellen er opprettet for en av modellene som skal være vert under multimodellendepunktet. I dette tilfellet bruker vi den første modellen (bildeklassifisereren CIFAR-10). Deretter bruker vi MultiDataModel-klassen fra SageMaker SDK til å lage en datamodell med flere modeller ved hjelp av serveringsmodellen for modell-1, som vi opprettet i forrige trinn:

from sagemaker.tensorflow.serving import TensorFlowModel
from sagemaker.multidatamodel import MultiDataModel model_1 = TensorFlowModel(model_data=output_1, role=role, image_uri=IMAGE_URI) mme = MultiDataModel(name=f'mme-tensorflow-{current_time}', model_data_prefix=model_data_prefix, model=model_1, sagemaker_session=sagemaker_session)

Til slutt distribuerer vi MultiDataModel ved å ringe deploy () -metoden, og gir attributtene som trengs for å lage hostinginfrastrukturen som kreves for å støtte multimodellendepunktet:

predictor = mme.deploy(initial_instance_count=2, instance_type='ml.m5.2xlarge', endpoint_name=f'mme-tensorflow-{current_time}')

Distribusjonssamtalen returnerer en prediktorforekomst, som vi kan bruke til å ringe slutninger. Vi ser dette i neste avsnitt.

Test endepunktet for flere modeller for sanntidsavledning

Multimodellendepunkter muliggjør deling av minnesressurser på tvers av modellene dine. Hvis modellen som det skal henvises til allerede er hurtigbufret, kjører multimodellendepunkter inferens umiddelbart. På den annen side, hvis den bestemte forespurte modellen ikke er hurtigbufret, må SageMaker laste ned modellen, noe som øker ventetiden for den første forespørselen. Dette tar imidlertid bare en brøkdel av tiden det tar å lansere en helt ny infrastruktur (forekomster) for å være vert for modellen individuelt på SageMaker. Etter at en modell er bufret i flermodellens endepunkt, initieres etterfølgende forespørsler i sanntid (med mindre modellen er fjernet). Som et resultat kan du kjøre mange modeller fra en enkelt forekomst, og dermed frakoble antall modeller fra våre distribusjonskostnader. Dette gjør det enkelt å administrere ML-distribusjoner i stor skala og senker distribusjonskostnadene for modellen gjennom økt bruk av endepunktet og dets underliggende beregningsforekomster. For mer informasjon og en demonstrasjon av kostnadsbesparelser på over 90% for et eksempel på 1,000 modeller, se Spar på inferenskostnader ved hjelp av Amazon SageMaker-endepunkter for flere modeller.

Multimodellendepunkter laster også ut ubrukte modeller fra beholderen når forekomster som støtter endepunktet når minnekapasitet, og flere modeller må lastes inn i beholderen. SageMaker sletter ubrukte modellgjenstander fra forekomstlagringsvolumet når volumet når kapasitet og nye modeller må lastes ned. Den første påkallingen til en nylig lagt til modell tar lengre tid fordi endepunktet tar tid å laste ned modellen fra Amazon S3 til beholderens minne om forekomsten som støtter multimodellendepunktet. Modeller som blir lastet, forblir på forekomstens lagringsvolum og kan lastes inn i beholderens minne senere uten å lastes ned igjen fra S3-skuffen.

La oss se hvordan vi kan gjøre en slutning fra CIFAR-10-bildeklassifisereren (modell-1) som er vert under multimodellendepunktet. Først laster vi inn et eksempelbilde fra en av klassene - fly - og forbereder det til å bli sendt til multimodellendepunktet ved hjelp av prediktoren vi opprettet i forrige trinn.

Med denne prediktoren kan vi ringe predict () -metoden sammen med parameteren initial_args, som spesifiserer navnet på målmodellen som skal påberopes. I dette tilfellet er målmodellen cifar.tar.gz. Følgende utdrag demonstrerer denne prosessen i detalj:

img = load_img('./data/cifar_10/raw_images/airplane.png', target_size=(32, 32))
data = img_to_array(img)
data = data.astype('float32')
data = data / 255.0
data = data.reshape(1, 32, 32, 3)
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'cifar.tar.gz'})
predicted_label = CIFAR10_LABELS[np.argmax(y_pred)]
print(f'Predicted Label: [{predicted_label}]')

Å kjøre den forrige koden returnerer prediksjonsutgangen som etikettflyet, som tolkes riktig av vår servert modell:

Predicted Label: [airplane]

Deretter, la oss se hvordan du dynamisk laster tegnspråk sifferklassifisereren (modell-2) til et multimodellendepunkt ved å påkalle sluttpunktet med tegnspråk.tar.gz som målmodell.

Vi bruker følgende eksempelbilde av håndtegnsifret 0.

Følgende kodebit viser hvordan du påberoper multimodellendepunktet med eksempelbildet for å få tilbake riktig svar:

test_path = './data/sign_language/test'
img = mpimg.imread(f'{test_path}/0/IMG_4159.JPG') def path_to_tensor(img_path): # loads RGB image as PIL.Image.Image type img = image.load_img(img_path, target_size=(224, 224)) # convert PIL.Image.Image type to 3D tensor with shape (224, 224, 3) x = image.img_to_array(img) # convert 3D tensor to 4D tensor with shape (1, 224, 224, 3) and return 4D tensor return np.expand_dims(x, axis=0) data = path_to_tensor(f'{test_path}/0/IMG_4159.JPG')
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'sign-language.tar.gz'})predicted_label = np.argmax(y_pred)
print(f'Predicted Label: [{predicted_label}]')

Følgende kode er vårt svar, med merkelappen 0:

Predicted Label: [0]

konklusjonen

I dette innlegget demonstrerte vi SageMaker-funksjonen flermodell-endepunkter for å optimalisere inferenskostnader. Multimodellendepunkter er nyttige når du har å gjøre med hundrevis til titusenvis av modeller, og der du ikke trenger å distribuere hver modell som et individuelt endepunkt. Modeller lastes inn og losses dynamisk, i henhold til bruk og hvor mye minne som er tilgjengelig på endepunktet.

Dette innlegget diskuterte hvordan du kan være vert for flere datamaskinsynsmodeller som er trent med TensorFlow-rammeverket under ett SageMaker-flermodell-endepunkt. Bildeklassifiseringsmodellene var av forskjellige modellarkitekturer og trent på forskjellige datasett. De bærbare inkludert i innlegget gir detaljerte instruksjoner om opplæring og hosting av modellene.

Gi SageMaker endepunkter for flere modeller et forsøk på brukssaken din, og legg igjen tilbakemeldingene dine i kommentarene.


Om forfatterne

Arunprasath Shankar er en kunstig intelligens og maskinlæring (AI / ML) spesialistløsningsarkitekt med AWS, som hjelper globale kunder å skalere sine AI-løsninger effektivt og effektivt i skyen. På fritiden liker Arun å se sci-fi-filmer og lytte til klassisk musikk.

Mark Roy er en hoved maskinlæringsarkitekt for AWS, som hjelper AWS-kunder med å designe og bygge AI / ML-løsninger. Marks arbeid dekker et bredt spekter av ML-brukstilfeller, med hovedinteresse i datasyn, dyp læring og skalering av ML over hele virksomheten. Han har hjulpet selskaper i mange bransjer, inkludert forsikring, finansielle tjenester, media og underholdning, helsevesen, verktøy og produksjon. Mark har seks AWS-sertifiseringer, inkludert ML-spesialitetssertifisering. Før han begynte i AWS, var Mark arkitekt, utvikler og teknologileder i over 25 år, inkludert 19 år innen finansielle tjenester.

Kilde: https://aws.amazon.com/blogs/machine-learning/host-multiple-tensorflow-computer-vision-models-using-amazon-sagemaker-multi-model-endpoints/

Tidstempel:

Mer fra AWS maskinlæringsblogg