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í SparkTrials není 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 Trials
Hyperopt .
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éhomax_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čí afmin()
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 SparkTrials
ovladač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řifmin()
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ředfmin()
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.