Zaženite sklepanje računalniškega vida na velikih videoposnetkih z asinhronimi končnimi točkami Amazon SageMaker

Izvorno vozlišče: 1139696

Stranke AWS vedno pogosteje uporabljajo modele računalniškega vida (CV) na velikih vhodnih obremenitvah, ki lahko vzamejo nekaj minut časa obdelave. Podjetja za vesoljsko tehnologijo na primer delajo s tokom satelitskih posnetkov visoke ločljivosti, da zaznajo določene zanimive predmete. Podobno zdravstvena podjetja obdelujejo biomedicinske slike ali videoposnetke visoke ločljivosti, kot so ehokardiogrami, da odkrijejo anomalije. Poleg tega medijska podjetja skenirajo slike in videoposnetke, ki so jih naložile njihove stranke, da zagotovijo, da so skladni in ne kršijo avtorskih pravic. Te aplikacije prejmejo izbruhe dohodnega prometa ob različnih urah dneva in zahtevajo obdelavo v skoraj realnem času z obvestili o dokončanju po nizki ceni.

Modele CV lahko sestavite z več ogrodji globokega učenja, kot so TensorFlow, PyTorch in Apache MXNet. Ti modeli imajo običajno veliko koristnih obremenitev, kot so slike ali videoposnetki. Napredni modeli globokega učenja za primere uporabe, kot je zaznavanje objektov, vrnejo velike odzivne obremenitve v velikosti od deset MB do sto MB. Poleg tega videoposnetki visoke ločljivosti zahtevajo računalniško intenzivno predprocesiranje pred sklepanjem modela. Časi obdelave se lahko gibljejo v zaporedju minut, s čimer se odpravi možnost izvajanja sklepanja v realnem času s posredovanjem uporabnih obremenitev prek API-ja HTTP. Namesto tega je treba asinhrono obdelati vhodne obremenitve iz shrambe objektov, kot je Preprosta storitev shranjevanja Amazon (Amazon S3) s samodejnim postavljanjem v čakalno vrsto in vnaprej določenim pragom sočasnosti. Sistem bi moral biti sposoben prejemati obvestila o stanju in odpraviti nepotrebne stroške s čiščenjem virov, ko so naloge končane.

Amazon SageMaker pomaga podatkovnim znanstvenikom in razvijalcem hitro pripraviti, zgraditi, usposobiti in razmestiti visokokakovostne modele strojnega učenja (ML), tako da združi širok nabor zmogljivosti, namensko izdelanih za ML. SageMaker ponuja najsodobnejše odprtokodne modele, ki strežejo vsebnike za XGBoost (posoda, SDK), Scikit-Learn (posoda, SDK), PyTorch (posoda, SDK), TensorFlow (posoda, SDK) in Apache MXNet (posoda, SDK). SageMaker nudi tri možnosti za uvajanje usposobljenih modelov ML za ustvarjanje sklepov na novih podatkih:

  • Sklepanje v realnem času končne točke so primerne za delovne obremenitve, ki jih je treba obdelati z zahtevami po nizki zakasnitvi.
  • Paketno preoblikovanje je idealen za napovedi brez povezave za velike serije podatkov, ki se zbirajo v določenem časovnem obdobju.
  • Asinhrono sklepanje končne točke postavljajo dohodne zahteve v čakalno vrsto in so idealne za delovne obremenitve, kjer so zahteve velike (do 1 GB) in so časi obdelave sklepanja v minutah (do 15 minut). Asinhrono sklepanje vam omogoča prihranek pri stroških s samodejnim skaliranjem števila primerkov na 0, ko ni nobenih zahtev za obdelavo.

V tej objavi vam pokažemo, kako postreči model CV PyTorch z asinhronim sklepanjem SageMaker za obdelavo hitrega prometa videoposnetkov velike vhodne obremenitve, naloženih v Amazon S3. Predstavljamo nove zmožnosti notranje čakalne vrste z uporabniško določeno sočasnostjo in obvestili o dokončanju. Samodejno skaliranje primerkov konfiguriramo tako, da se zmanjša na 0, ko se promet umiri, in se ponovno poveča, ko se čakalna vrsta zahtev zapolni. Uporabljamo primerek g4dn z GPU Nvidia T4 in SageMaker vnaprej zgrajena posoda TorchServe s skriptom sklepanja po meri za predhodno obdelavo videoposnetkov pred priklicem modela in amazoncloudwatch metrike za spremljanje velikosti čakalne vrste, skupnega časa obdelave, obdelanih klicev in več.

Koda za ta primer je na voljo na GitHub.

Pregled rešitev

Naslednji diagram ponazarja našo arhitekturo rešitev.

Naš model najprej gostuje na končni točki skaliranja. Nato uporabnik ali drug mehanizem naloži video datoteko v vhodno vedro S3. Uporabnik prikliče končno točko in takoj mu je vrnjena izhodna lokacija Amazon S3, kjer je zapisan sklep. Ko je sklepanje končano, se rezultat shrani v izhodno vedro S3 in an Amazon Simple notification Service (Amazon SNS) se uporabniku pošlje obvestilo o dokončanem uspehu ali neuspehu.

Model primera uporabe

Za ta primer zaznavanja predmetov uporabljamo TorchVision Maska-RCNN model, predhodno usposobljen za 91 razredov, za prikaz sklepanja na zloženem 4D video tenzorju. Ker zaznavamo objekte v veliki vhodni obremenitvi, ki zahteva predhodno obdelavo, je lahko skupna zakasnitev znatna. Čeprav to ni idealno za končno točko v realnem času, jo zlahka obvladajo asinhrone končne točke, ki obdelajo čakalno vrsto in shranijo rezultate na izhodno lokacijo Amazon S3.

Za gostovanje tega modela uporabljamo vnaprej zgrajen SageMaker Vsebnik sklepanja PyTorch ki uporablja TorchServe model za serviranje. Vsebniki SageMaker vam omogočajo, da zagotovite lasten sklepni skript, ki vam daje prilagodljivost pri obdelavi predhodne in naknadne obdelave ter narekuje, kako vaš model deluje s podatki.

Vhodna in izhodna koristna obremenitev

V tem primeru uporabljamo vhodni video velikosti 71 MB iz tukaj. Upravljalnik sklepanja asinhrone končne točke pričakuje video mp4, ki je razdeljen na tenzorje 1024x1024x3 za vsako sekundo videa. Za definiranje tega upravljalnika zagotovimo končno točko s po meri inference.py scenarij. Skript ponuja funkcije za nalaganje modela, serializacijo in deserializacijo podatkov, predprocesiranje in napovedovanje. Znotraj vodnika, naš input_fn pokliče pomožno funkcijo, znano kot video2frames:

video_frames = []
cap = cv2.VideoCapture(tfile.name)
frame_index, frame_count = 0, 0 if cap.isOpened(): success = True else: success = False while success: success, frame = cap.read() if frame_index % interval == 0: print("---> Reading the %d frame:" % frame_index, success) resize_frame = cv2.resize( frame, (frame_width, frame_height), interpolation=cv2.INTER_AREA ) video_frames.append(resize_frame) frame_count += 1 frame_index += 1 cap.release()
return video_frames

Te zložene tenzorje obdeluje naš model Mask-RCNN, ki shrani rezultat JSON, ki vsebuje omejevalne okvirje, oznake in ocene za zaznane predmete. V tem primeru je izhodna obremenitev 54 MB. V naslednji animaciji prikazujemo hitro vizualizacijo rezultatov.

Ustvarite asinhrono končno točko

Ustvarjamo asinhrona končna točka podobno kot končna točka, ki gostuje v realnem času. Koraki vključujejo ustvarjanje a Model SageMaker, čemur sledi konfiguracija končne točke in uvedba končne točke. Razlika med obema vrstama končnih točk je v tem, da konfiguracija asinhrone končne točke vsebuje razdelek AsyncInferenceConfig. V tem razdelku določimo izhodno pot Amazon S3 za rezultate priklica končne točke in po želji vključimo teme SNS za obvestila o uspehu in neuspehu. Določimo tudi največje število sočasnih klicev na primerek, kot ga določi stranka. Oglejte si naslednjo kodo:

AsyncInferenceConfig={ "OutputConfig": { "S3OutputPath": f"s3://{bucket}/{bucket_prefix}/output", # Optionally specify Amazon SNS topics for notifications "NotificationConfig": { "SuccessTopic": success_topic, "ErrorTopic": error_topic, } }, "ClientConfig": { "MaxConcurrentInvocationsPerInstance": 2 #increase this value upto throughput peak for best performance } }

Za podrobnosti o API-ju za ustvarjanje konfiguracije končne točke za asinhrono sklepanje Ustvari končno točko asinhronega sklepanja.

Prikličite asinhrono končno točko

Vhodni tovor v naslednji kodi je video datoteka .mp4, naložena v Amazon S3:

sm_session.upload_data( input_location, bucket=sm_session.default_bucket(), key_prefix=prefix, extra_args={"ContentType": "video/mp4"})

Uporabimo Amazon S3 URI za vhodno koristno datoteko za priklic končne točke. Odzivni objekt vsebuje izhodno lokacijo v Amazon S3 za pridobitev rezultatov po zaključku:

response = sm_runtime.invoke_endpoint_async(EndpointName=endpoint_name, InputLocation=input_1_s3_location)
output_location = response['OutputLocation'])

Za podrobnosti o API-ju za priklic asinhrone končne točke glejte Prikličite asinhrono končno točko.

Zahteve za priklic postavite v čakalno vrsto s sočasnostjo, ki jo določi uporabnik

Asinhrona končna točka samodejno postavi zahteve za priklic v čakalno vrsto. Uporablja MaxConcurrentInvocationsPerInstance parameter v prejšnji konfiguraciji končne točke za obdelavo novih zahtev iz čakalne vrste, potem ko so prejšnje zahteve dokončane. To je v celoti upravljana čakalna vrsta z različnimi metrikami spremljanja in ne zahteva dodatne konfiguracije.

Samodejno skaliranje primerkov znotraj asinhrone končne točke

Politiko samodejnega skaliranja smo nastavili z najmanjšo zmogljivostjo 0 in največjo zmogljivostjo petih primerkov. Za razliko od končnih točk, gostujočih v realnem času, asinhrone končne točke podpirajo skaliranje števila primerkov na 0 z nastavitvijo minimalne zmogljivosti na 0. S to funkcijo lahko zmanjšamo število primerkov na 0, ko ni prometa, in plačamo samo, ko prispe tovor.

Uporabljamo metriko ApproximateBacklogSizePerInstance za konfiguracijo pravilnika skaliranja s ciljnim zaostankom v čakalni vrsti pet na primerek za nadaljnje skaliranje. Čas ohlajanja za ScaleInCooldown smo nastavili na 120 sekund in za ScaleOutCooldown na 120 sekund. Oglejte si naslednjo kodo:

client = boto3.client('application-autoscaling') # Common class representing Application Auto Scaling for SageMaker amongst other services resource_id='endpoint/' + endpoint_name + '/variant/' + 'variant1' # This is the format in which application autoscaling references the endpoint response = client.register_scalable_target( ServiceNamespace='sagemaker', # ResourceId=resource_id, ScalableDimension='sagemaker:variant:DesiredInstanceCount', MinCapacity=0, MaxCapacity=5
) 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. 'CustomizedMetricSpecification': { 'MetricName': 'ApproximateBacklogSizePerInstance', 'Namespace': 'AWS/SageMaker', 'Dimensions': [{'Name': 'EndpointName', 'Value': endpoint_name }], 'Statistic': 'Average', }, 'ScaleInCooldown': 120, # ScaleInCooldown - The amount of time, in seconds, after a scale in activity completes before another scale in activity can start. 'ScaleOutCooldown': 120 # 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.
}
)

Za podrobnosti o API-ju za samodejno prilagajanje asinhrone končne točke glejte Samodejno skaliranje asinhrone končne točke.

Obvestila iz asinhrone končne točke

Ustvarimo dve ločeni temi SNS za obvestila o uspehu in napakah za vsak rezultat priklica končne točke:

sns_client = boto3.client('sns')
response = sns_client.create_topic(Name="Async-Demo-ErrorTopic2")
error_topic = response['TopicArn']
response = sns_client.create_topic(Name="Async-Demo-SuccessTopic2")
success_topic = response['TopicArn']

Druge možnosti za obvestila vključujejo redno preverjanje izhoda vedra S3 ali uporabo obvestil vedra S3 za sprožitev AWS Lambda funkcijo pri nalaganju datoteke. Obvestila SNS so vključena v razdelek o konfiguraciji končne točke, kot je opisano prej.

Za podrobnosti o tem, kako nastaviti obvestila iz asinhrone končne točke, glejte Preverite rezultate napovedi.

Spremljajte asinhrono končno točko

Asinhrono končno točko spremljamo z vgrajene dodatne metrike CloudWatch specifično za asinhrono sklepanje. Na primer, spremljamo dolžino čakalne vrste v vsakem primeru z ApproximateBacklogSizePerInstance in skupno dolžino čakalne vrste s ApproximateBacklogSize. Razmislite brisanje teme SNS da se izognete obvestilom o preplavljanju med naslednjimi klici. V naslednjem grafikonu lahko vidimo začetno velikost zaostanka zaradi nenadnega izbruha prometa za 1,000 zahtev, velikost zaostanka na instanco pa se hitro zmanjša, ko se končna točka poveča od ene do pet instanc.

Podobno spremljamo skupno število uspešnih klicev z InvocationsProcessed in skupno število neuspelih klicev z InvocationFailures. V naslednjem grafikonu lahko vidimo povprečno število obdelanih video klicev na minuto po samodejnem skaliranju pri približno 18.

Spremljamo tudi čas zakasnitve modela, ki vključuje čas predprocesiranja videa in sklepanje modela za paket video slik pri 1 FPS. V naslednjem grafikonu lahko vidimo, da je zakasnitev modela za dva sočasna klica približno 30 sekund.

Prav tako spremljamo skupni čas obdelave od vnosa v Amazon S3 do izhoda nazaj v Amazon S3 s TotalProcessingTime in čas, porabljen v zaostanku z metriko TimeInBacklog. V naslednjem grafikonu lahko vidimo, da se povprečni čas v zaostanku in skupni čas obdelave sčasoma povečujeta. Zahteve, ki so dodane med izbruhom prometa na začetku čakalne vrste, imajo čas v zaostanku, ki je podoben modelni zakasnitvi 30 sekund. Zahteve na koncu čakalne vrste imajo največji čas v zaostanku, približno 3,500 sekund.

Spremljamo tudi, kako se končna točka zmanjša nazaj na 0 po obdelavi celotne čakalne vrste. Nastavitve izvajalnega časa končne točke prikazujejo trenutno velikost števila primerkov pri 0.

Naslednja tabela povzema primer video sklepanja z rafalnim prometom 1,000 video klicev.

Lastnost vrednost
Število klicev (skupna velikost niza) 1000
Raven sočasnosti 2
Vrsta primerka ml.g4dn.xlarge
Velikost vhodne obremenitve (na poziv). 71 MB
Hitrost vzorčenja video sličic (FPS) 1 FPS
Velikost izhodne obremenitve (na poziv). 54 MB
Zakasnitev modela 30 sekund
Največje število primerkov samodejnega skaliranja 5
Prepustnost (zahtevke na minuto) 18
Velikost modela 165 MB

Konfiguracijo končne točke lahko optimiziramo, da dobimo najbolj stroškovno učinkovit primerek z visoko zmogljivostjo. V tem primeru uporabljamo primerek g4dn.xlarge z GPE Nvidia T4. Postopoma lahko povečamo raven sočasnosti do najvišje prepustnosti, medtem ko prilagajamo druge parametre modelnega strežnika in vsebnika.

Za celoten seznam meritev glejte Spremljanje asinhronih končnih točk.

Čiščenje

Ko izpolnimo vse zahteve, lahko izbrišemo končno točko, podobno kot brišemo gostujoče končne točke v realnem času. Upoštevajte, da če minimalno zmogljivost asinhronih končnih točk nastavimo na 0, po zmanjšanju na 0 ne nastanejo stroški instance.

Če ste za vašo končno točko omogočili samodejno skaliranje, pred brisanjem končne točke odjavite registracijo končne točke kot razširljivega cilja. Če želite to narediti, zaženite naslednje:

response = client.deregister_scalable_target( ServiceNamespace='sagemaker', ResourceId='resource_id', ScalableDimension='sagemaker:variant:DesiredInstanceCount' )

Končne točke je treba izbrisati, ko niso več v uporabi, ker (po Stran s cenami SageMaker) zaračunajo se glede na čas namestitve. Če želite to narediti, zaženite naslednje:

sm_client.delete_endpoint(EndpointName=endpoint_name)

zaključek

V tej objavi smo pokazali, kako uporabiti novo zmožnost asinhronega sklepanja iz SageMakerja za obdelavo velike vhodne količine videoposnetkov. Za sklepanje smo uporabili sklepni skript po meri za predhodno obdelavo videoposnetkov z vnaprej določeno hitrostjo vzorčenja sličic in sprožitev dobro znanega modela CV PyTorch za ustvarjanje seznama rezultatov za vsak video. Z upravljanimi čakalnimi vrstami, vnaprej določenimi omejitvami sočasnosti, odzivnimi obvestili in zmožnostmi zmanjšanja na nič smo se spopadli z izzivi hitrega prometa, dolgih časov obdelave modela in velikih obremenitev. Če želite začeti z asinhronim sklepanjem SageMaker, glejte Asinhrono sklepanje in se obrnite na vzorčna koda za vaše primere uporabe.


O avtorjih

Hasan Poonawala je arhitekt za strojne rešitve za strojno učenje pri AWS s sedežem v Londonu v Veliki Britaniji. Hasan pomaga strankam pri oblikovanju in uvajanju aplikacij za strojno učenje v proizvodnji na AWS. Navdušen je nad uporabo strojnega učenja za reševanje poslovnih problemov v različnih panogah. V prostem času Hasan rad raziskuje naravo na prostem in preživlja čas s prijatelji in družino.

Raghu Ramesha je inženir za razvoj programske opreme (AI/ML) pri ekipi Amazon SageMaker Services SA. Osredotoča se na pomoč strankam pri preselitvi proizvodnih delovnih obremenitev ML na SageMaker v velikem obsegu. Specializiran je za področje strojnega učenja, umetne inteligence in računalniškega vida ter ima magisterij iz računalništva na UT Dallas. V prostem času rada potuje in fotografira.

Sean MorganSean Morgan je arhitekt rešitev AI/ML pri AWS. Ima izkušnje na področju polprevodnikov in akademskih raziskav ter svoje izkušnje uporablja za pomoč strankam pri doseganju njihovih ciljev na AWS. V prostem času Sean aktivno prispeva in vzdržuje odprto kodo ter je vodja posebne interesne skupine za dodatke TensorFlow.

Vir: https://aws.amazon.com/blogs/machine-learning/run-computer-vision-inference-on-large-videos-with-amazon-sagemaker-asynchronous-endpoints/

Časovni žig:

Več od Blog za strojno učenje AWS