Zephyrnet-logo

Los problemen met gedistribueerde trainingsconvergentie effectief op met Amazon SageMaker Hyperband Automatic Model Tuning | Amazon-webservices

Datum:

De afgelopen jaren hebben we een verbazingwekkende groei laten zien in deep learning neurale netwerken (DNN's). Deze groei is te zien in nauwkeurigere modellen en opent zelfs nieuwe mogelijkheden met generatieve AI: grote taalmodellen (LLM's) die natuurlijke taal synthetiseren, tekst-naar-beeld-generatoren en meer. Deze toegenomen mogelijkheden van DNN's brengen de kosten met zich mee van het hebben van enorme modellen die aanzienlijke rekenbronnen vereisen om te worden getraind. Gedistribueerde training pakt dit probleem aan met twee technieken: gegevensparallellisme en modelparallellisme. Gegevensparallelisme wordt gebruikt om het trainingsproces te schalen over meerdere knooppunten en werkers, en modelparallellisme splitst een model op en past ze over de aangewezen infrastructuur. Amazon Sage Maker gedistribueerde training Met Jobs kunt u met één klik (of één API-aanroep) een gedistribueerd rekencluster opzetten, een model trainen, het resultaat opslaan in Amazon eenvoudige opslagservice (Amazon S3) en sluit het cluster af als het klaar is. Bovendien heeft SageMaker continu geïnnoveerd in de gedistribueerde trainingsruimte door functies zoals heterogene clusters en gedistribueerde trainingsbibliotheken voor gegevensparallellisme en model parallellisme.

Efficiënte training op een gedistribueerde omgeving vereist het aanpassen van hyperparameters. Een veelvoorkomend voorbeeld van een goede praktijk bij het trainen op meerdere GPU's is om de batch- (of mini-batch) grootte te vermenigvuldigen met het GPU-nummer om dezelfde batchgrootte per GPU te behouden. Het aanpassen van hyperparameters heeft echter vaak invloed op modelconvergentie. Daarom moet gedistribueerde training drie factoren in balans houden: distributie, hyperparameters en modelnauwkeurigheid.

In dit bericht onderzoeken we het effect van gedistribueerde training op convergentie en hoe te gebruiken Amazon SageMaker automatische modelafstemming modelhyperparameters verfijnen voor gedistribueerde training met behulp van gegevensparallellisme.

De broncode die in dit bericht wordt genoemd, is te vinden op de GitHub-repository (een instantie m5.xlarge wordt aanbevolen).

Schaal de training uit van een enkele naar een gedistribueerde omgeving

Gegevensparallellisme is een manier om het trainingsproces te schalen naar meerdere rekenresources en een snellere trainingstijd te realiseren. Met gegevensparallellisme worden gegevens verdeeld over de rekenknooppunten, en elk knooppunt berekent de gradiënten op basis van hun partitie en werkt het model bij. Deze updates kunnen worden uitgevoerd met behulp van een of meerdere parameterservers op een asynchrone, een-op-veel- of alles-op-alle-manier. Een andere manier kan zijn om een ​​AllReduce-algoritme te gebruiken. In het ring-allreduce-algoritme communiceert bijvoorbeeld elk knooppunt met slechts twee van zijn naburige knooppunten, waardoor de algehele gegevensoverdracht wordt verminderd. Zie voor meer informatie over parameterservers en ring-allreduce Eenvoudig TensorFlow gedistribueerde training starten met Horovod of Parameter Servers in Amazon SageMaker. Met betrekking tot gegevenspartitionering, als die er zijn n rekenknooppunten, dan zou elk knooppunt een subset van de gegevens moeten krijgen, ongeveer 1/n in grootte.

Om het effect van het uitschalen van training op modelconvergentie te demonstreren, voeren we twee eenvoudige experimenten uit:

Elke modeltraining liep twee keer: op één instantie en verdeeld over meerdere instanties. Voor de gedistribueerde DNN-training hebben we, om de gedistribueerde processors volledig te benutten, de mini-batchgrootte vermenigvuldigd met het aantal instanties (vier). De volgende tabel geeft een overzicht van de instellingen en resultaten.

Type probleem Afbeeldingsclassificatie Binaire classificatie
Model DNN XGBoost
Aanleg ml.c4.xgroot ml.m5.2xgroot
Gegevensset

MNIST

(Gelabelde afbeeldingen)

direct Marketing
(tabelvormige, numerieke en gevectoriseerde categorieën)
Validatie statistiek Nauwkeurigheid AUC
Tijdperken/rondes 20 150
Aantal instanties 1 4 1 3
Soort distributie NB Parameterserver NB AllesVerminderen
Trainingstijd (minuten) 8 3 3 1
Definitieve validatiescore 0.97 0.11 0.78 0.63

Voor beide modellen werd de trainingstijd bijna lineair verminderd met de distributiefactor. De modelconvergentie liep echter aanzienlijk terug. Dit gedrag is consistent voor de twee verschillende modellen, de verschillende rekeninstanties, de verschillende distributiemethoden en verschillende gegevenstypen. Dus, waarom had het verspreiden van het trainingsproces invloed op de modelnauwkeurigheid?

Er zijn een aantal theorieën die dit effect proberen te verklaren:

  • Wanneer tensorupdates groot zijn, kan het verkeer tussen werkrollen en de parameterserver overbelast raken. Daarom zullen asynchrone parameterservers aanzienlijk slechter convergeren als gevolg van vertragingen in gewichtsupdates [1].
  • Toenemende batchgrootte kan leiden tot overfitting en slechte generalisatie, waardoor de validatienauwkeurigheid afneemt [2].
  • Wanneer modelparameters asynchroon worden bijgewerkt, gebruiken sommige DNN's mogelijk niet de meest recent bijgewerkte modelgewichten; daarom zullen ze hellingen berekenen op basis van gewichten die een paar iteraties achterlopen. Dit leidt tot gewichtsveroudering [3] en kan verschillende oorzaken hebben.
  • Sommige hyperparameters zijn model- of optimizerspecifiek. De officiële documentatie van XGBoost zegt bijvoorbeeld dat de exact waarde voor de tree_mode hyperparameter ondersteunt geen gedistribueerde training omdat XGBoost gebruikmaakt van rijsplitsende gegevensdistributie, terwijl de exact tree methode werkt op een gesorteerd kolomformaat.
  • Sommige onderzoekers stelden voor dat het configureren van een grotere minibatch kan leiden tot gradiënten met minder stochasticiteit. Dit kan gebeuren wanneer de verliesfunctie lokale minima en zadelpunten bevat en er geen wijziging wordt aangebracht in de stapgrootte, waardoor optimalisatie vast komt te zitten in dergelijke lokale minima of zadelpunt [4].

Optimaliseer voor gedistribueerde training

Hyperparameteroptimalisatie (HPO) is het proces van zoeken en selecteren van een set hyperparameters die optimaal zijn voor een lerend algoritme. SageMaker Automatic Model Tuning (AMT) biedt HPO als een beheerde service door meerdere trainingstaken uit te voeren op de geleverde dataset. SageMaker AMT doorzoekt de bereiken van hyperparameters die u opgeeft en retourneert de beste waarden, zoals gemeten door een metriek die u kiest. U kunt SageMaker AMT gebruiken met de ingebouwde algoritmen of uw aangepaste algoritmen en containers gebruiken.

Optimalisatie voor gedistribueerde training verschilt echter van gewone HPO, omdat in plaats van één instantie per trainingstaak te starten, elke taak in feite een cluster van instanties lanceert. Dit betekent een grotere impact op de kosten (vooral als u kijkt naar dure GPU-versnelde instanties, die typisch zijn voor DNN). In aanvulling op AMT-limieten, zou je kunnen raken SageMaker-accountlimieten voor een gelijktijdig aantal trainingsinstanties. Ten slotte kan het lanceren van clusters operationele overhead met zich meebrengen vanwege een langere starttijd. SageMaker AMT heeft specifieke functies om deze problemen aan te pakken. Hyperband met vroegtijdig stoppen zorgt ervoor dat goed presterende hyperparameters-configuraties worden verfijnd en dat degenen die ondermaats presteren automatisch worden gestopt. Dit maakt een efficiënt gebruik van de opleidingstijd mogelijk en vermindert onnodige kosten. SageMaker AMT ondersteunt ook volledig het gebruik van Amazon EC2 Spot Instances, die de opleidingskosten tot 90% over on-demand instanties. Met betrekking tot lange starttijden, hergebruikt SageMaker AMT automatisch trainingsinstanties binnen elke afstemmingstaak, waardoor de gemiddelde opstarttijd van elke taak wordt verkort trainingsbaan met 20 keer. Bovendien moet u volgen AMT-best practices, zoals het kiezen van de relevante hyperparameters, hun geschikte bereiken en schalen, en het beste aantal gelijktijdige trainingstaken, en het instellen van een willekeurige seed om resultaten te reproduceren.

In de volgende sectie zien we deze functies in actie terwijl we een AMT-taak configureren, uitvoeren en analyseren met behulp van het XGBoost-voorbeeld dat we eerder hebben besproken.

Een afstemmingstaak configureren, uitvoeren en analyseren

Zoals eerder vermeld, is de broncode te vinden op de GitHub repo. In stap 1–5 downloaden en bereiden we de gegevens voor, maken we de xgb3 schatter (de gedistribueerde XGBoost-schatter is ingesteld om drie instanties te gebruiken), voer de trainingstaken uit en observeer de resultaten. In dit gedeelte beschrijven we hoe u de afstemmingstaak voor die schatter instelt, ervan uitgaande dat u stap 1-5 al hebt doorlopen.

Een afstemmingstaak berekent optimale hyperparameters voor de trainingstaken die worden gestart door een metriek te gebruiken om de prestaties te evalueren. Jij kan configureer uw eigen metriek, die SageMaker zal parseren op basis van regex die u configureert en waarnaar u uitzendt stdout, of gebruik de statistieken van SageMaker ingebouwde algoritmen. In dit voorbeeld gebruiken we de ingebouwde XGBoost objectieve metriek, dus we hoeven geen regex te configureren. Om te optimaliseren voor modelconvergentie, optimaliseren we op basis van de validatie-AUC-metriek:

objective_metric_name="validation:auc"

We tunen zeven hyperparameters:

  • aantal_ronde - Aantal rondes voor boosting tijdens de training.
  • eta - Stapgrootte-inkrimping gebruikt in updates om overfitting te voorkomen.
  • alpha – L1 regularisatietermijn op gewichten.
  • min_kind_gewicht - Minimale hoeveelheid instantiegewicht (jute) die nodig is bij een kind. Als de boompartitiestap resulteert in een bladknooppunt met de som van het instantiegewicht kleiner dan min_child_weight, geeft het bouwproces verdere opdeling op.
  • maximale diepte – Maximale diepte van een boom.
  • colsample_bylevel - Subsampleverhouding van kolommen voor elke splitsing, op elk niveau. Deze subsampling vindt één keer plaats voor elk nieuw diepteniveau dat in een boom wordt bereikt.
  • colsample_bytree – Subsampleverhouding van kolommen bij het construeren van elke boom. Voor elke geconstrueerde boom vindt de subsampling één keer plaats.

Zie voor meer informatie over XGBoost-hyperparameters XGBoost-hyperparameters. De volgende code toont de zeven hyperparameters en hun bereiken:

hyperparameter_ranges = { "num_round": IntegerParameter(100, 200), "eta": ContinuousParameter(0, 1), "min_child_weight": ContinuousParameter(1, 10), "alpha": ContinuousParameter(0, 2), "max_depth": IntegerParameter(1, 10), "colsample_bylevel": ContinuousParameter(0, 1), "colsample_bytree": ContinuousParameter(0, 1),
}

Vervolgens geven we de configuratie voor de Hyperband-strategie en de configuratie van het tunerobject met behulp van de SageMaker SDK. HyperbandStrategyConfig kan twee parameters gebruiken: max_resource (optioneel) voor het maximale aantal iteraties dat moet worden gebruikt voor een trainingstaak om het doel te bereiken, en min_resource – het minimale aantal iteraties dat door een trainingstaak moet worden gebruikt voordat de training wordt gestopt. We gebruiken HyperbandStrategyConfig configureren StrategyConfig, die later wordt gebruikt door de definitie van de afstemmingstaak. Zie de volgende code:

hsc = HyperbandStrategyConfig(max_resource=30, min_resource=1)
sc = StrategyConfig(hyperband_strategy_config=hsc)

Nu maken we een HyperparameterTuner object, waaraan we de volgende informatie doorgeven:

  • De XGBoost-schatter, ingesteld om met drie exemplaren te worden uitgevoerd
  • De naam en definitie van de doelstellingsmetriek
  • Onze hyperparameterbereiken
  • Resourceconfiguraties afstemmen, zoals het aantal trainingstaken dat in totaal moet worden uitgevoerd en hoeveel trainingstaken parallel kunnen worden uitgevoerd
  • Hyperband-instellingen (de strategie en configuratie die we in de laatste stap hebben geconfigureerd)
  • Vroeg stoppen (early_stopping_type) ingesteld op Off

Waarom zetten we vroeg stoppen op Uit? Trainings taken kunnen vroegtijdig worden gestopt wanneer het onwaarschijnlijk is dat ze de objectieve metriek van de hyperparameter afstemmings taak zullen verbeteren. Dit kan helpen de rekentijd te verkorten en te voorkomen dat uw model te veel wordt aangepast. Hyperband gebruikt echter een geavanceerd ingebouwd mechanisme om vroegtijdig stoppen toe te passen. Daarom de parameters early_stopping_type moet zijn ingesteld op Off bij gebruik van de interne vroegtijdige stopfunctie van Hyperband. Zie de volgende code:

tuner = HyperparameterTuner( xgb3, objective_metric_name, hyperparameter_ranges, max_jobs=30, max_parallel_jobs=4, strategy="Hyperband", early_stopping_type="Off", strategy_config=sc
)

Ten slotte starten we de automatische modelafstellingstaak door de geschikt methode. Als u de taak op een asynchrone manier wilt starten, stelt u in wait naar False. Zie de volgende code:

tuner.fit(
{"train": s3_input_train, "validation": s3_input_validation},
include_cls_metadata=False,
wait=True,
)

U kunt de voortgang en samenvatting van de taak volgen op de SageMaker-console. In het navigatievenster, onder Trainingen, kiezen Taken voor het afstemmen van hyperparameters, kies vervolgens de relevante afstemmingstaak. De volgende schermafbeelding toont de afstemmingstaak met details over de status en prestaties van de trainingstaken.

Wanneer de afstemmingstaak is voltooid, kunnen we de resultaten bekijken. In het notebookvoorbeeld laten we zien hoe u resultaten kunt extraheren met behulp van de SageMaker SDK. Eerst onderzoeken we hoe de afstemmingstaak de modelconvergentie verhoogde. U kunt de HyperparameterTuner object met de taaknaam en bel de beschrijven methode. De methode retourneert een woordenboek met de metagegevens en resultaten van de afstemmingstaak.

In de volgende code halen we de waarde op van de best presterende trainingstaak, gemeten aan de hand van onze objectieve maatstaf (validatie-AUC):

tuner = HyperparameterTuner.attach(tuning_job_name=tuning_job_name)
tuner.describe()["BestTrainingJob"]["FinalHyperParameterTuningJobObjectiveMetric"]["Value"]

Het resultaat is 0.78 in AUC op de validatieset. Dat is een aanzienlijke verbetering ten opzichte van de aanvankelijke 0.63!

Laten we vervolgens eens kijken hoe snel onze trainingstaak liep. Daarvoor gebruiken we de HyperparameterTuningJobAnalytics methode in de SDK om resultaten over de afstemmingstaak op te halen en in te lezen in een Pandas-dataframe voor analyse en visualisatie:

tuner_analytics = sagemaker.HyperparameterTuningJobAnalytics(tuning_job_name)
full_df = tuner_analytics.dataframe()
full_df.sort_values(by=["FinalObjectiveValue"], ascending=False).head()

Laten we eens kijken hoeveel tijd een trainingstaak gemiddeld kostte met de Hyperband-strategie:

full_df["TrainingElapsedTimeSeconds"].mean()

De gemiddelde tijd duurde ongeveer 1 minuut. Dit komt overeen met het Hyperband-strategiemechanisme dat slecht presterende trainingstaken vroegtijdig stopt. Wat de kosten betreft, heeft de afstemmingsopdracht ons in totaal 30 minuten trainingstijd in rekening gebracht. Zonder vroegtijdig stoppen met Hyperband zou de totale factureerbare trainingsduur naar verwachting 90 minuten bedragen (30 banen * 1 minuut per baan * 3 instanties per baan). Dat is drie keer beter in kostenbesparing! Ten slotte zien we dat de afstemmingstaak 30 trainingstaken heeft uitgevoerd en in totaal 12 minuten heeft geduurd. Dat is bijna 50% minder van de verwachte tijd (30 jobs/4 jobs parallel * 3 minuten per job).

Conclusie

In dit bericht hebben we enkele waargenomen convergentieproblemen beschreven bij het trainen van modellen met gedistribueerde omgevingen. We zagen dat SageMaker AMT met behulp van Hyperband de belangrijkste zorgen wegnam die het optimaliseren van gegevensparallel gedistribueerde training met zich meebracht: convergentie (die met meer dan 10% verbeterde), operationele efficiëntie (de afstemmingstaak nam 50% minder tijd in beslag dan een sequentiële, niet-geoptimaliseerde taak zou doen hebben genomen) en kostenefficiëntie (30 vs. de 90 factureerbare minuten aan trainingstijd). De volgende tabel vat onze resultaten samen:

Verbeteringsstatistiek Geen Tuning/Naïeve Model Tuning Implementatie SageMaker Hyperband Automatische modelafstemming Gemeten verbetering
Modelkwaliteit
(gemeten door validatie AUC)
0.63 0.78 15%
Kosten
(gemeten aan de hand van factureerbare trainingsminuten)
90 30 66%
Operationele efficiëntie
(Gemeten door totale looptijd)
24 12 50%

Om nauwkeurig af te stemmen met betrekking tot schaling (clustergrootte), kunt u de afstemmingstaak herhalen met meerdere clusterconfiguraties en de resultaten vergelijken om de optimale hyperparameters te vinden die voldoen aan snelheid en modelnauwkeurigheid.

We hebben de stappen om dit te bereiken opgenomen in het laatste deel van de notitieboekje.

Referenties

[1] Lian, Xiangru, et al. "Asynchrone gedecentraliseerde parallelle stochastische gradiëntafdaling." Internationale conferentie over machine learning. PMLR, 2018.

[2] Keskar, Nitish Shirish, et al. "Over grootschalige training voor diep leren: generalisatiekloof en scherpe minima." arXiv voordruk arXiv: 1609.04836 (2016).

[3] Dai, Wei, et al. "Op weg naar het begrijpen van de impact van verouderdheid in gedistribueerde machine learning." arXiv voordruk arXiv: 1810.03264 (2018).

[4] Dauphin, Yann N., et al. "Het zadelpuntprobleem in hoogdimensionale niet-convexe optimalisatie identificeren en aanpakken." Vooruitgang in neurale informatieverwerkingssystemen 27 (2014).


Over de auteur

Uri Rosenberg is de AI & ML Specialist Technical Manager voor Europa, het Midden-Oosten en Afrika. Uri is gevestigd in Israël en stelt zakelijke klanten in staat om ML-workloads op schaal te ontwerpen, bouwen en gebruiken. In zijn vrije tijd houdt hij van fietsen, wandelen en klagen over gegevensvoorbereiding.

spot_img

Laatste intelligentie

spot_img