Delen via


Hyperopt-concepten

Notitie

De opensource-versie van Hyperopt wordt niet meer onderhouden.

Hyperopt wordt verwijderd in de volgende primaire DBR ML-versie. Azure Databricks raadt aan gebruik te maken van Optuna- voor optimalisatie van één knooppunt of RayTune- voor een vergelijkbare ervaring als de afgeschafte hyperparameter-afstemmingsfunctionaliteit van Hyperopt. Meer informatie over het gebruik van RayTune- in Azure Databricks.

In dit artikel worden enkele van de concepten beschreven die u moet kennen om gedistribueerde Hyperopt te gebruiken.

In deze sectie:

Zie Hyperopt voor voorbeelden van het gebruik van Hyperopt in Azure Databricks.

fmin()

U gebruikt fmin() om een Hyperopt-uitvoering uit te voeren. De argumenten voor fmin() worden weergegeven in de tabel. Zie de Hyperopt-documentatie voor meer informatie. Zie de voorbeeldnotitieblokken voor voorbeelden van het gebruik van elk argument.

Argumentnaam Beschrijving
fn Doelfunctie Hyperopt roept deze functie aan met waarden die zijn gegenereerd op basis van de hyperparameterruimte die is opgegeven in het argument ruimte. Deze functie kan het verlies retourneren als een scalaire waarde of in een woordenlijst (zie Hyperopt-documenten voor meer informatie). Deze functie bevat doorgaans code voor modeltraining en verliesberekening.
space Definieert de hyperparameterruimte die moet worden gezocht. Hyperopt biedt een grote flexibiliteit in de wijze waarop deze ruimte wordt gedefinieerd. U kunt een categorische optie kiezen, zoals algoritme of probabilistische verdeling voor numerieke waarden, zoals uniform en logboek.
algo Hyperopt-zoekalgoritmen om te gebruiken om hyperparameterruimte te doorzoeken. De meestgebruikte zijn hyperopt.rand.suggest voor Random Search en hyperopt.tpe.suggest voor TPE.
max_evals Het aantal hyperparameterinstellingen dat moet worden geprobeerd (het aantal modellen dat past).
max_queue_len Het aantal hyperparameterinstellingen dat Hyperopt vooraf moet genereren. Omdat het algoritme voor het genereren van Hyperopt TPE enige tijd kan duren, kan het handig zijn om dit te verhogen boven de standaardwaarde van 1, maar meestal niet groter dan de SparkTrials instelling parallelism.
trials Een Trials of SparkTrials object. Gebruik SparkTrials deze methode wanneer u algoritmen met één machine aanroept, zoals scikit-learn-methoden in de objectieve functie. Gebruik Trials deze functie wanneer u gedistribueerde trainingsalgoritmen zoals MLlib-methoden of Horovod aanroept in de objectieve functie.
early_stop_fn Een optionele functie voor vroegtijdig stoppen om te bepalen of fmin moet stoppen voordat max_evals wordt bereikt. Standaard is None. De invoerhandtekening van de functie is Trials, *args en de uitvoerhandtekening is bool, *args. De booleaanse uitvoer geeft aan of er moet worden gestopt of niet. *args is elke toestand, waarbij de uitvoer van een aanroep aan early_stop_fn fungeert als invoer voor de volgende aanroep. Trials kan een SparkTrials object zijn. Wanneer u SparkTrials gebruikt, wordt de functie voor vroegtijdig stoppen niet gegarandeerd na elke poging uitgevoerd, maar in plaats daarvan periodiek gecontroleerd. Voorbeeld van een vroege stopfunctie

De SparkTrials klasse

SparkTrials is een API die is ontwikkeld door Databricks waarmee u een Hyperopt-uitvoering kunt distribueren zonder andere wijzigingen aan te brengen in uw Hyperopt-code. SparkTrials versnelt het tunen van een enkele machine door proeven naar Spark-workers te distribueren.

Notitie

SparkTrials is ontworpen om berekeningen voor ML-modellen met één machine, zoals scikit-learn, te parallelliseren. Gebruik niet SparkTrialsvoor modellen die zijn gemaakt met gedistribueerde ML-algoritmen zoals MLlib of Horovod. In dit geval wordt het modelbouwproces automatisch geparallelliseerd op het cluster en moet u de standaard Hyperopt-klasse Trialsgebruiken.

In deze sectie wordt beschreven hoe u de argumenten configureert die u doorgeeft SparkTrials aan en implementatieaspecten van SparkTrials.

Argumenten

SparkTrials neemt twee optionele argumenten:

  • parallelism: Maximum aantal experimenten dat gelijktijdig moet worden geëvalueerd. Met een hoger getal kunt u het testen van meer hyperparameters uitschalen. Omdat Hyperopt nieuwe experimenten voorstelt op basis van eerdere resultaten, is er een afweging tussen parallelle uitvoering en adaptiviteit. Voor een vaste max_evals, grotere parallelle uitvoering versnelt berekeningen, maar lagere parallelle uitvoering kan leiden tot betere resultaten omdat elke iteratie toegang heeft tot meer eerdere resultaten.

    Standaard: het aantal Spark-uitvoerders dat beschikbaar is. Maximum: 128. Als de waarde groter is dan het aantal gelijktijdige taken dat is toegestaan door de clusterconfiguratie, vermindert SparkTrials het parallelisme tot deze waarde.

  • timeout: Maximum aantal seconden dat een fmin() oproep kan duren. Wanneer dit aantal wordt overschreden, worden alle runs gestopt en fmin() afgesloten. Informatie over voltooide uitvoeringen wordt opgeslagen.

Implementatie

Wanneer u de doelfunctie fn definieert die is doorgegeven aan fmin()en bij het selecteren van een clusterinstallatie, is het handig om te begrijpen hoe SparkTrials afstemmingstaken worden verdeeld.

In Hyperopt komt een proefversie over het algemeen overeen met het passend maken van één model op één instelling van hyperparameters. Hyperopt genereert iteratief experimenten, evalueert ze en herhaalt deze.

Met SparkTrials genereert het besturingsknooppunt van uw cluster nieuwe experimenten, en werkknooppunten evalueren deze experimenten. Elke proefversie wordt gegenereerd met een Spark-taak met één taak en wordt geëvalueerd in de taak op een werkmachine. Als uw cluster is ingesteld om meerdere taken per werkrol uit te voeren, kunnen er meerdere proefversies tegelijk op die werkrol worden geëvalueerd.

SparkTrials en MLflow

Databricks Runtime ML biedt ondersteuning voor het registreren van logboeken in MLflow vanuit werkers. U kunt aangepaste logboekregistratiecode toevoegen in de doelfunctie die u doorgeeft aan Hyperopt.

SparkTrials registreert de afstemresultaten als geneste MLflow-runs, als volgt:

  • Hoofd- of ouderuitvoering: De aanroep naar fmin() wordt geregistreerd als de hoofd uitvoering. Als er een actieve uitvoering is, registreert SparkTrials zich bij deze actieve uitvoering en wordt de uitvoering niet beëindigd wanneer fmin() terugkeert. Als er geen actieve uitvoering is, wordt er een nieuwe uitvoering aangemaakt, wordt deze geregistreerd en beëindigd voordat fmin() terugkeert.
  • Deeluitvoeringen: Elke geteste hyperparameterinstelling (een 'proef') wordt geregistreerd als een deeluitvoering onder de hoofduitvoering. MLflow-logboekrecords van werkers worden ook opgeslagen onder de bijbehorende deeluitvoeringen.

Wanneer u aanroept fmin(), raadt Databricks actief beheer van MLflow-uitvoeringen aan. Dat wil zeggen dat de aanroep naar fmin() binnen een with mlflow.start_run(): instructie wordt verpakt. Dit zorgt ervoor dat elke fmin() aanroep wordt geregistreerd bij een afzonderlijke hoofduitvoering van MLflow en dat het eenvoudiger is om extra tags, parameters of metrische gegevens voor die uitvoering te registreren.

Notitie

Wanneer u meerdere keren binnen dezelfde actieve MLflow-uitvoering aanroept fmin() , registreert MLflow deze aanroepen naar dezelfde hoofduitvoering. Om naamconflicten voor vastgelegde parameters en tags op te lossen, voegt MLflow een UUID toe aan namen met conflicten.

Wanneer u logt vanuit werknemers, hoeft u de runs niet expliciet te beheren in de doelfunctie. Roep mlflow.log_param("param_from_worker", x) in de doelfunctie aan om een parameter vast te leggen bij de kinduitvoering. U kunt parameters, metrische gegevens, tags en artefacten vastleggen in de doelfunctie.