De mogelijkheid om machine learning (ML) -modellen snel te herhalen en te trainen is de sleutel tot het verkrijgen van bedrijfswaarde uit ML-workloads. Omdat ML-modellen vaak veel instelbare parameters hebben (bekend als hyperparameters) die van invloed kunnen zijn op het vermogen van het model om effectief te leren, gebruiken datawetenschappers vaak een techniek die bekend staat als hyperparameteroptimalisatie (HPO) om het best presterende model te bereiken tegen een bepaalde vooraf gedefinieerde metriek. Afhankelijk van het aantal hyperparameters en de grootte van de zoekruimte, kan het vinden van het beste model duizenden of zelfs tienduizenden trainingsruns vereisen. Real-world problemen die vaak uitgebreide HPO vereisen, zijn onder meer beeldsegmentatie voor het modelleren van voertuigverkeer voor autonoom rijden, het ontwikkelen van algoritmische handelsstrategieën op basis van historische financiële gegevens of het bouwen van fraudedetectiemodellen op basis van transactiegegevens. Amazon Sage Maker biedt een ingebouwde HPO-algoritme dat verwijdert het ongedifferentieerde zware werk dat nodig is om uw eigen HPO-algoritme te bouwen. Dit bericht laat zien hoe u uw HPO-taken kunt batchen om het aantal taken dat u parallel kunt uitvoeren te maximaliseren, waardoor de totale tijd die nodig is om de gewenste parameterruimte effectief te dekken en de best presterende modellen te verkrijgen, wordt verminderd.
Laten we, voordat we ingaan op de batchaanpak op Amazon SageMaker, kort de state-of-the-art bekijken [1]. Er is een groot aantal HPO-algoritmen, variërend van random of grid search, Bayesian search en handmatige afstemming, waarbij onderzoekers hun domeinkennis gebruiken om parameters af te stemmen tot populatiegebaseerde training die is geïnspireerd op genetische algoritmen. Voor deep learning-modellen kan zelfs het trainen van een enkele trainingsrun tijdrovend zijn. In dat geval wordt het belangrijk om een agressieve strategie voor vroegtijdig stoppen te hebben, waardoor proeven worden beëindigd in zoekruimten die waarschijnlijk geen goede resultaten zullen opleveren. Verschillende strategieën, zoals opeenvolgende halvering of asynchrone opeenvolgende halvering, gebruiken meerarmige bandieten om een afweging te maken tussen verkenning (het uitproberen van verschillende parametercombinaties) en exploitatie (waardoor een trainingsrun convergeert). Tot slot, om ontwikkelaars te helpen deze benaderingen snel te herhalen, zijn er een aantal tools, zoals SageMaker HPO, Ray, HyperOpt en meer. In dit bericht zie je ook hoe je een van de meest populaire HPO-tools, Ray Tune, naar SageMaker kunt brengen.
Gebruiksvoorbeeld: het voorspellen van wanbetalingen op kredietkaarten
Om dit aan de hand van een concreet voorbeeld aan te tonen, stelt u zich voor dat u een ML-ingenieur bent die voor een bank werkt en dat u de waarschijnlijkheid wilt voorspellen dat een klant in gebreke blijft met zijn creditcardbetalingen. Om een model te trainen, gebruikt u historische gegevens die beschikbaar zijn in de UCI-opslagplaats. Alle code die in dit bericht is ontwikkeld, is beschikbaar op GitHub. De notebook behandelt de gegevensvoorverwerking die nodig is om de onbewerkte gegevens voor te bereiden op training. Omdat het aantal defaults vrij klein is (zoals weergegeven in de volgende grafiek), splitsen we de dataset op in train en test, en upsamplen we de trainingsdata naar 50/50 default versus niet-defaultleningen.
Vervolgens uploaden we de datasets naar Amazon eenvoudige opslagservice (Amazon S3). Zie de volgende code:
Hoewel SageMaker veel ingebouwde algoritmen biedt, zoals XGBoost, laten we in dit bericht zien hoe HPO kan worden toegepast op een aangepast PyTorch-model met behulp van de SageMaker PyTorch-trainingscontainer met behulp van de scriptmodus. U kunt dit vervolgens aanpassen aan uw eigen aangepaste deep learning-code. Bovendien zullen we demonstreren hoe u aangepaste metrics naar SageMaker HPO kunt brengen.
Wanneer u te maken heeft met tabelgegevens, is het handig om uw gegevensset in kleinere bestanden te splitsen om lange laadtijden van gegevens te voorkomen, waardoor uw rekenbronnen kunnen uithongeren en dit kan leiden tot inefficiënt CPU / GPU-gebruik. We maken een aangepaste Dataset-klasse om onze gegevens op te halen en verpakken deze in de DataLoader-klasse om de dataset te herhalen. We zetten de batchgrootte op 1, omdat elke batch uit 10,000 rijen bestaat, en deze laden met Panda's.
Ons model is een eenvoudig feed-forward neuraal netwerk, zoals weergegeven in het volgende codefragment:
Zoals te zien is in de bovenstaande afbeelding, is de dataset zeer onevenwichtig en als zodanig is modelnauwkeurigheid niet de meest bruikbare evaluatiestatistiek, omdat een basismodel dat voorspelt dat alle klanten hun betalingen niet in gebreke zullen stellen, een hoge nauwkeurigheid zal hebben. Een meer bruikbare statistiek is de AUC, het gebied onder de ROC-curve (Receiver Operator Characteristic) dat tot doel heeft het aantal valse positieven te minimaliseren en het aantal echte positieven te maximaliseren. Een vals positief (model dat onjuist voorspelt dat een goede klant in gebreke blijft) kan ertoe leiden dat de bank inkomsten misloopt door creditcards aan klanten te weigeren. Om ervoor te zorgen dat uw HPO-algoritme kan optimaliseren op een aangepaste metriek zoals de AUC of F1-score, moet u die metrische gegevens in STDOUT loggen, zoals weergegeven in de volgende code:
Nu zijn we klaar om onze SageMaker-schatter te definiëren en de parameters voor de HPO-taak te definiëren:
We passeren de paden naar de training- en testgegevens in Amazon S3.
Nu de installatie is voltooid, gaan we nu over op het uitvoeren van meerdere HPO-taken.
Parallelle HPO-banen
Om meerdere afstemmingsopdrachten voor hyperparameters parallel uit te voeren, moeten we eerst de afstemmingsstrategie bepalen. SageMaker biedt momenteel een willekeurige en Bayesiaanse optimalisatiestrategie. Voor een willekeurige strategie zijn verschillende HPO-banen volledig onafhankelijk van elkaar, terwijl Bayesiaanse optimalisatie het HPO-probleem behandelt als een regressieprobleem en intelligente inschattingen maakt over de volgende set parameters die moeten worden gekozen op basis van de eerdere reeks proeven.
Laten we eerst wat terminologie bekijken:
- Trials - Een proef komt overeen met een enkele trainingstaak met een reeks vaste waarden voor de hyperparameters
- max_banen - Het totale aantal trainingsproeven dat voor die bepaalde HPO-baan moet worden uitgevoerd
- max_parallel_jobs - Het maximum aantal gelijktijdige lopende proeven per HPO-taak
Stel dat u in totaal 10,000 tests wilt uitvoeren. Om de totale HPO-tijd te minimaliseren, wilt u zoveel mogelijk tests parallel uitvoeren. Dit wordt beperkt door de beschikbaarheid van een bepaald Amazon Elastic Compute-cloud (Amazon EC2) -instantie type in uw regio en account. Neem contact op met uw AWS-accountvertegenwoordigers als u deze limieten wilt wijzigen of verhogen.
Stel voor dit voorbeeld dat u 20 ml.m5.xlarge-exemplaren beschikbaar heeft. Dit betekent dat u tegelijkertijd 20 proefversies van elk één exemplaar kunt uitvoeren. Momenteel, zonder enige limiet te verhogen, limieten van SageMaker max_jobs
naar 500 en max_parallel_jobs
tot 10. Dit betekent dat u in totaal 10,000 / 500 = 20 HPO-taken moet uitvoeren. Omdat u 20 proefversies kunt uitvoeren en max_parallel_jobs 10 is, kunt u het aantal gelijktijdige HPO-taken maximaliseren door 20/10 = 2 HPO-taken parallel uit te voeren. Dus een benadering om uw code in batches te plaatsen, is om altijd twee taken uit te voeren, totdat u uw totale vereiste taken van 20 bereikt.
In het volgende codefragment laten we twee manieren zien waarop u het aantal actieve taken kunt opvragen om dit te bereiken. De eerste benadering maakt gebruik van boto3, wat de AWS SDK is voor Python om actieve HPO-taken te ondervragen, en kan in uw notebook worden uitgevoerd en wordt geïllustreerd in het volgende diagram. Deze benadering kan voornamelijk worden gebruikt door datawetenschappers. Telkens wanneer het aantal lopende HPO-taken onder een vast aantal komt, aangegeven door de blauwe pijlen in het gestippelde vak aan de linkerkant, zal de polling-code nieuwe taken starten (weergegeven in oranje pijlen). De tweede benadering gebruikt Amazon Simple Queue-service (Amazon SQS) en AWS Lambda om SageMaker HPO-taken in de wachtrij te plaatsen en te ondervragen, zodat u een operationele pijplijn kunt bouwen voor herhaalbaarheid.
Klinkt ingewikkeld? Geen probleem, met het volgende codefragment kunt u de optimale strategie bepalen om uw totale HPO-tijd te minimaliseren door zoveel mogelijk HPO-taken parallel uit te voeren als is toegestaan. Nadat u het type exemplaar dat u wilt gebruiken en uw respectieve accountlimieten voor dat exemplaar hebt bepaald, vervangt u max_parallel_across_jobs
met uw waarde.
Overweeg de volgende code voor het starten van een bepaalde reeks taken nadat u hebt bepaald hoe u uw taken moet uitvoeren. De helperfunctie _parallel_hpo_no_polling
voert de groep parallelle HPO-taken uit die in de voorgaande afbeelding wordt aangegeven door het gestippelde vak. Het is belangrijk om de wait
parameter False
bij het aanroepen van de tuner, omdat hierdoor de API-aanroep wordt vrijgegeven om de lus te laten draaien. De orkestratiecode poll_and_run
peilt naar het aantal taken dat op een bepaald moment wordt uitgevoerd. Als het aantal taken onder het door de gebruiker gespecificeerde maximale aantal proefversies komt dat ze parallel willen uitvoeren (max_parallel_across_jobs
), start de functie automatisch nieuwe opdrachten. Nu denk je misschien: "Maar het kan dagen duren voordat deze taken zijn uitgevoerd, wat als ik mijn laptop wil uitschakelen of als ik mijn sessie verlies?" Geen probleem, de code gaat verder waar hij was gebleven en voert het resterende aantal jobs uit door te tellen hoeveel HPO-jobs er nog over zijn, voorafgegaan door het job_name_prefix dat u opgeeft.
Ten slotte get_best_job
functie aggregeert de outputs in een Pandas DataFrame in oplopende volgorde van de objectieve metriek voor visualisatie.
Nu kunnen we dit testen door in totaal 260 proeven uit te voeren, en vragen dat de code te allen tijde 20 proeven parallel uitvoert:
Nadat de taken zijn voltooid, kunnen we alle outputs bekijken (zie de volgende schermafbeelding).
Met de bovenstaande code kunt u HPO-taken parallel uitvoeren tot de toegestane limiet van 100 gelijktijdige HPO-taken.
Parallel HPO-banen met warme start
Stel nu dat u een warme startopdracht wilt uitvoeren, waarbij het resultaat van een eerdere opdracht wordt gebruikt als invoer voor de volgende opdracht. Warme start is vooral handig als u al een set hyperparameters hebt bepaald die een goed model opleveren, maar nu over nieuwe gegevens beschikken. Een andere use case voor warme start is wanneer een enkele HPO-taak lang kan duren, met name voor deep learning-workloads. In dat geval wilt u misschien de uitgangen van de vorige taak gebruiken om de volgende te starten. In ons geval kan dat gebeuren wanneer u een batch nieuwe maandelijkse of driemaandelijkse standaardgegevens ontvangt. Zie voor meer informatie over SageMaker HPO met warme start Voer een Warm Start Hyperparameter Tuning Job uit.
Het cruciale verschil tussen warme en koude start is de van nature opeenvolgende aard van warme start. Nogmaals, stel dat we 10,000 banen met een warme start willen lanceren. Deze keer starten we slechts één HPO-taak met de maximaal toegestane max_jobs
parameter, wacht tot deze is voltooid en start de volgende taak met deze taak als ouder. We herhalen het proces totdat het totale gewenste aantal banen is bereikt. We kunnen dit bereiken met de volgende code:
Nadat de taken zijn uitgevoerd, gebruikt u opnieuw de get_best_job
functie om de bevindingen samen te voegen.
Andere HPO-tools gebruiken met SageMaker
SageMaker biedt de flexibiliteit om andere HPO-tools, zoals degene die eerder zijn besproken, te gebruiken om uw HPO-taken uit te voeren door het ongedifferentieerde zware werk van het beheer van de onderliggende infrastructuur weg te nemen. Een populaire open-source HPO-tool is bijvoorbeeld Ray Tune [2], een Python-bibliotheek voor grootschalige HPO die de meeste populaire frameworks ondersteunt, zoals XGBoost, MXNet, PyTorch en TensorFlow. Ray integreert met populaire zoekalgoritmen zoals Bayesian, HyperOpt en SigOpt, gecombineerd met geavanceerde planners zoals Hyperband of ASHA.
Om Ray met PyTorch te gebruiken, moet je eerst ray [tune] opnemen en naar je requirements.txt-bestand in je codemap met je trainingsscript opnemen. Geef de codemap als volgt op in de SageMaker PyTorch-schatter:
Uw trainingsscript moet worden aangepast om uw aangepaste statistieken uit te voeren naar de Ray-rapportgenerator, zoals weergegeven in de volgende code. Hierdoor kan uw trainingstaak communiceren met Ray. Hier gebruiken we de ASHA-planner om vroegtijdig stoppen te implementeren:
U moet uw model ook regelmatig controleren:
Ten slotte moet u het trainingsscript in een aangepaste hoofdfunctie verpakken die de hyperparameters instelt, zoals de leersnelheid, de grootte van de eerste en tweede verborgen lagen en eventuele aanvullende hyperparameters die u wilt herhalen. U moet ook een planner gebruiken, zoals de ASHA-planner die we hier gebruiken, voor GPU-training met één en meerdere knooppunten. We gebruiken het standaard afstemmingsalgoritme Variant generatie, die zowel random (getoond in de volgende code) als grid search ondersteunt, afhankelijk van de gebruikte configuratieparameter.
De uitvoer van de taak ziet eruit als de volgende schermafbeelding.
Ray Tune beëindigt automatisch slecht presterende taken, terwijl de beter presterende taken langer doorgaan, waardoor uw totale HPO-tijden worden geoptimaliseerd. In dit geval liep de best presterende taak alle 7 volledige tijdperken, terwijl andere hyperparameterkeuzes vroegtijdig werden gestopt. Zie voor meer informatie over hoe vroeg stoppen werkt met SageMaker HPO hier.
HPO-banen in de wachtrij plaatsen met Amazon SQS
Wanneer meerdere datawetenschappers tegelijkertijd HPO-jobs creëren in hetzelfde account, kan de limiet van 100 gelijktijdige HPO-jobs per account worden bereikt. In dit geval kunnen we gebruiken Amazon SQS om een HPO-takenwachtrij te maken. Elk HPO-taakverzoek wordt weergegeven als een bericht en verzonden naar een SQS-wachtrij. Elk bericht bevat hyperparameters en instelbare hyperparameterbereiken in de berichttekst. Er wordt ook een Lambda-functie gemaakt. De functie controleert eerst het aantal HPO-opdrachten in uitvoering. Als de limiet van 100 gelijktijdige HPO-taken niet wordt bereikt, haalt het berichten op uit de SQS-wachtrij en worden HPO-taken gemaakt zoals bepaald in het bericht. De functie wordt geactiveerd door Amazon EventBridge gebeurtenissen met regelmatige tussenpozen (bijvoorbeeld elke 10 minuten). De eenvoudige architectuur wordt als volgt weergegeven.
Om deze architectuur te bouwen, maken we eerst een SQS-wachtrij en noteren we de URL. In de Lambda-functie gebruiken we de volgende code om het aantal HPO-taken in uitvoering te retourneren:
Als het aantal HPO-taken in uitvoering groter is dan of gelijk is aan de limiet van 100 gelijktijdige HPO-taken (zie voor huidige limieten Amazon SageMaker-eindpunten en quota), retourneert de Lambda-functie 200 status en wordt afgesloten. Als de limiet niet wordt bereikt, berekent de functie het aantal HPO-jobs dat beschikbaar is om te maken en haalt hetzelfde aantal berichten op uit de SQS-wachtrij. Vervolgens extraheert de Lambda-functie hyperparameterbereiken en andere gegevensvelden voor het maken van HPO-taken. Als de HPO-taak met succes is gemaakt, wordt het bijbehorende bericht verwijderd uit de SQS-wachtrij. Zie de volgende code:
Nadat uw Lambda-functie is gemaakt, kunt u triggers toevoegen met de volgende stappen:
- Kies uw functie op de Lambda-console.
- Op de Configuratie pagina, kies Trigger toevoegen.
- kies EventBridge (CloudWatch-evenementen).
- Kies Maak een nieuwe regel.
- Voer een naam in voor uw regel.
- kies Plan expressie.
- Stel het tarief in op 10 minuten.
- Kies Toevoegen.
Deze regel activeert onze Lambda-functie elke 10 minuten.
Wanneer dit is voltooid, kunt u het testen door berichten naar de SQS-wachtrij te sturen met uw HPO-taakconfiguratie in de berichttekst. De code en het notitieblok voor deze architectuur staan op onze GitHub repo. Zie de volgende code:
Conclusies
ML-ingenieurs moeten vaak door een grote hyperparameterruimte zoeken om het best presterende model voor hun toepassing te vinden. Voor complexe deep learning-modellen, waar individuele trainingstaken behoorlijk tijdrovend kunnen zijn, kan dit een omslachtig proces zijn dat vaak weken of maanden aan ontwikkelaarstijd in beslag kan nemen.
In dit bericht hebben we besproken hoe u het aantal afstemmingsopdrachten dat u parallel met SageMaker kunt starten, kunt maximaliseren, waardoor de totale tijd die nodig is om HPO uit te voeren met door de gebruiker gespecificeerde objectieve maatstaven op maat, wordt verminderd. We hebben eerst een op Jupyter-notebook gebaseerde benadering besproken die door individuele datawetenschappers kan worden gebruikt voor onderzoeks- en experimenteerworkflows. We hebben ook laten zien hoe je een SQS-wachtrij kunt gebruiken om teams van datawetenschappers in staat te stellen meer opdrachten in te dienen. SageMaker is een zeer flexibel platform waarmee u uw eigen HPO-tool kunt meenemen, die we hebben geïllustreerd met behulp van de populaire open-source tool Ray Tune.
Zie voor meer informatie over het brengen van andere algoritmen, zoals genetische algoritmen naar SageMaker HPO Breng uw eigen algoritme voor hyperparameteroptimalisatie op Amazon SageMaker.
Referenties
[1] Hyperparameteroptimalisatie: een overzicht van algoritmen en toepassingen, Yu, T. en Zhu, H., https://arxiv.org/pdf/2003.05689.pdf.
[2] Tune: een onderzoeksplatform voor gedistribueerde modelselectie en training, https://arxiv.org/abs/1807.05118.
Over de auteurs
Iaroslav Sjtsjerbatyi is Machine Learning Engineer bij Amazon Web Services. Zijn werk is gericht op verbeteringen aan het Amazon SageMaker-platform en het helpen van klanten om de functies optimaal te gebruiken. In zijn vrije tijd houdt hij ervan om recent onderzoek in ML in te halen en buitensporten te beoefenen zoals schaatsen of wandelen.
Enrico Sartorello is Sr. Software Development Engineer bij Amazon Web Services. Hij helpt klanten bij het adopteren van machine learning-oplossingen die passen bij hun behoeften door nieuwe functionaliteiten voor Amazon SageMaker te ontwikkelen. In zijn vrije tijd volgt hij met passie zijn voetbalteam en werkt hij graag aan zijn kookkunsten.
Toeshar Saxena is Principal Product Manager bij Amazon, met de missie om de bestandsopslagactiviteiten van AWS te laten groeien. Voordat hij bij Amazon kwam, leidde hij business units voor telecominfrastructuur bij twee bedrijven en speelde hij een centrale rol bij de lancering van de glasvezelbreedbandservice van Verizon. Hij begon zijn carrière als onderzoeker bij GE R&D en BBN, waar hij werkte in computervisie, internetnetwerken en videostreaming.
Stefan Natu is Senior Machine Learning Specialist bij Amazon Web Services. Hij richt zich op het helpen van financiële dienstverleners bij het bouwen van end-to-end machine learning-oplossingen op AWS. In zijn vrije tijd leest hij graag blogs over machine learning, speelt hij gitaar en verkent hij de eetcultuur in New York City.
Qingwei Li is Machine Learning Specialist bij Amazon Web Services. Hij promoveerde in Operations Research nadat hij de onderzoeksbeursrekening van zijn adviseur had verbroken en de beloofde Nobelprijs niet kon leveren. Momenteel helpt hij klanten in de financiële dienstverlening en de verzekeringssector bij het bouwen van machine learning-oplossingen op AWS. In zijn vrije tijd houdt hij van lezen en lesgeven.