Sdílet prostřednictvím


Koncepty Hyperoptu

Poznámka:

Opensourcová verze Hyperoptu se už neudržuje.

Hyperopt se odebere v další hlavní verzi DBR ML. Azure Databricks doporučuje používat Optuna pro optimalizaci na jediném uzlu nebo RayTune pro obdobný zážitek jako u zastaralé distribuované funkce ladění hyperparametrů Hyperopt. Přečtěte si další informace o používání RayTune v Azure Databricks.

Tento článek popisuje některé koncepty, které potřebujete vědět, abyste mohli používat distribuovanou technologii Hyperopt.

V této části:

Příklady ilustrující použití Hyperoptu v Azure Databricks najdete v tématu Hyperopt.

fmin()

Slouží fmin() ke spuštění Hyperoptu. Argumenty fmin() jsou uvedeny v table; Další informace najdete v dokumentaci k Hyperoptu. Příklady použití jednotlivých argumentů najdete v ukázkových poznámkových blocích.

Název argumentu Popis
fn Účelová funkce. Hyperopt volá tuto funkci s values vygenerovaným z prostoru hyperparametrů zadaného v argumentu space. Tato funkce může vrátit ztrátu jako skalární hodnotu nebo ve slovníku (podrobnosti najdete v dokumentaci k Hyperoptu ). Tato funkce obvykle obsahuje kód pro výpočet trénování a ztráty modelu.
space Definuje prostor hyperparametrů, který se má prohledávat. Hyperopt poskytuje velkou flexibilitu při definování tohoto prostoru. Můžete zvolit kategorickou možnost, jako je algoritmus, nebo pravděpodobnostní rozdělení pro číselné values, jako je rovnoměrné a logaritmické.
algo Vyhledávací algoritmus Hyperoptu, který se použije k vyhledávání prostoru hyperparametrů. Nejčastěji se hyperopt.rand.suggest používají pro náhodné vyhledávání a hyperopt.tpe.suggest pro TPE.
max_evals Počet nastavení hyperparametrů, které se mají vyzkoušet (počet modelů, které se mají přizpůsobit).
max_queue_len Počet nastavení hyperparametrů, které by měl Hyperopt dopředu generate. Vzhledem k tomu, že algoritmus generování TPE Technologie Hyperopt může nějakou dobu trvat, může být užitečné ho zvýšit nad výchozí hodnotu 1, ale obecně není větší než SparkTrials nastavení parallelism.
trials A Trials nebo SparkTrials objekt. Používá se SparkTrials při volání algoritmů s jedním počítačem, jako jsou metody scikit-learn v objektivní funkci. Používá se Trials při volání distribuovaných trénovacích algoritmů, jako jsou metody MLlib nebo Horovod v objektivní funkci.
early_stop_fn Volitelná počáteční zastavování funkce, která určuje, jestli fmin by se měla zastavit před max_evals dosažením. Výchozí hodnota je None. Vstupní podpis funkce je Trials, *args a výstupní podpis je bool, *args. Logická hodnota výstupu označuje, jestli se má zastavit nebo ne. *args je jakýkoli stav, where výstup volání early_stop_fn slouží jako vstup pro další volání. Trials může být SparkTrials objekt. Při použití SparkTrialsnení zaručeno, že se funkce předčasného zastavení spustí po každé zkušební verzi a místo toho se dotazuje. Příklad počáteční zastavování funkce

Třída SparkTrials

SparkTrials je rozhraní API vyvinuté službou Databricks, které umožňuje distribuovat spuštění Hyperoptu, aniž byste museli provádět další změny kódu Hyperoptu. SparkTrials zrychluje ladění na jednom počítači tím, že distribuuje zkušební verze pracovníkům Sparku.

Poznámka:

SparkTrials je navržený tak, aby paralelizoval výpočty pro modely STROJOVÉho učení s jedním počítačem, jako je scikit-learn. Pro modely vytvořené s distribuovanými algoritmy ML, jako je MLlib nebo Horovod, nepoužívejte SparkTrials. V tomto případě je proces sestavování modelu automaticky paralelizován v clusteru a měli byste použít výchozí třídu TrialsHyperopt .

Tato část popisuje, jak nakonfigurovat argumenty, které předáváte SparkTrials a implementujete aspekty SparkTrials.

Argumenty

SparkTrials přijímá dva volitelné argumenty:

  • parallelism: Maximální počet pokusů, které se mají vyhodnotit souběžně. Vyšší číslo umožňuje škálovat testování více nastavení hyperparametrů. Vzhledem k tomu, že Hyperopt navrhuje nové pokusy založené na minulých výsledcích, existuje kompromis mezi paralelismu a adaptivitou. U pevného max_evals, větší paralelismus urychluje výpočty, ale nižší paralelismus může vést k lepším výsledkům, protože každá iterace má přístup k více minulým výsledkům.

    Výchozí hodnota: Počet dostupných exekutorů Sparku Maximum: 128. Pokud je hodnota větší než počet souběžných úloh povolených konfigurací clusteru, SparkTrials snižuje paralelismus na tuto hodnotu.

  • timeout: Maximální počet sekund volání fmin() může trvat. Při překročení tohoto čísla se všechna spuštění ukončí a fmin() ukončí. Uloží se informace o dokončených spuštěních.

Implementace

Při definování účelové funkce fn předané fmin()a při výběru nastavení clusteru je užitečné pochopit, jak SparkTrials distribuuje úlohy ladění.

V Hyperoptu obvykle zkušební verze odpovídá přizpůsobení jednoho modelu na jedno nastavení hyperparametrů. Hyperopt iterativním způsobem generuje pokusy, vyhodnocuje je a opakuje.

Uzel SparkTrialsovladače vašeho clusteru vygeneruje nové zkušební verze a pracovní uzly tyto zkušební verze vyhodnocují. Každá zkušební verze se vygeneruje s úlohou Sparku, která má jeden úkol, a vyhodnocuje se v úkolu na pracovním počítači. Pokud je váš cluster set nakonfigurován pro spuštění více úloh na jednoho pracovníka, pak může být na tomto pracovníkovi vyhodnoceno více zkušebních verzí najednou.

SparkTrials a MLflow

Databricks Runtime ML podporuje protokolování do MLflow z pracovních procesů. Do funkce cíle, kterou předáte Hyperopt, můžete přidat vlastní kód protokolování.

SparkTrials Protokoly ladění výsledků jako vnořené běhy MLflow následujícím způsobem:

  • Hlavní nebo nadřazené spuštění: Volání fmin() se zaprotokoluje jako hlavní spuštění. Pokud je aktivní spuštění, SparkTrials protokoly k tomuto aktivnímu spuštění a neskončí spuštění při fmin() vrácení. Pokud neexistuje aktivní spuštění, SparkTrials vytvoří se nové spuštění, zaprokoluje do něj a ukončí spuštění před fmin() vrácením.
  • Podřízená spuštění: Každé testované nastavení hyperparametrů (zkušební verze) se protokoluje jako podřízené spuštění v rámci hlavního spuštění. Záznamy protokolu MLflow od pracovních procesů se také ukládají v odpovídajících podřízených spuštěních.

Při volání fmin()databricks doporučuje aktivní správu spuštění MLflow. To znamená, že volání zabalíte do fmin()with mlflow.start_run(): příkazu. Tím se zajistí, že se každé volání fmin() zaprotokoluje do samostatného hlavního spuštění MLflow a usnadňuje protokolování dalších značek, parametersnebo metrik do tohoto spuštění.

Poznámka:

Když voláte fmin() vícekrát ve stejném aktivním spuštění MLflow, MLflow zaznamená tato volání do stejného hlavního spuštění. Pokud chcete vyřešit konflikty názvů pro protokolované parameters a značky, MLflow připojí UUID k názvům s konflikty.

Při protokolování od pracovních procesů není nutné spravovat spuštění explicitně v objektivní funkci. Voláním mlflow.log_param("param_from_worker", x) funkce cíle zapíšete parametr do podřízeného spuštění. Ve funkci cíle můžete zaznamenávat parameters, metriky, značky a artefakty.