Ladění hyperparametrů modelu (v2)
PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)
Automatizace efektivního ladění hyperparametrů pomocí sady Azure Machine Learning SDK v2 a CLI v2 prostřednictvím typu SweepJob
- Definování prostoru pro vyhledávání parametrů pro zkušební verzi
- Určení algoritmu vzorkování pro úlohu úklidu
- Určení cíle pro optimalizaci
- Určení zásad předčasného ukončení pro úlohy s nízkým výkonem
- Definování limitů pro úlohu úklidu
- Spuštění experimentu s definovanou konfigurací
- Vizualizace trénovacích úloh
- Výběr nejlepší konfigurace pro váš model
Co je ladění hyperparametrů?
Hyperparametry jsou nastavitelné parametry, které umožňují řídit proces trénování modelu. Například u neurálních sítí rozhodujete o počtu skrytých vrstev a počtu uzlů v každé vrstvě. Výkon modelu závisí silně na hyperparametrech.
Ladění hyperparametrů, označované také jako optimalizace hyperparametrů, je proces hledání konfigurace hyperparametrů, které mají za následek nejlepší výkon. Proces je obvykle výpočetně nákladný a ruční.
Azure Machine Learning umožňuje automatizovat ladění hyperparametrů a paralelně spouštět experimenty za účelem efektivní optimalizace hyperparametrů.
Definování vyhledávacího prostoru
Vylaďte hyperparametry prozkoumáním rozsahu hodnot definovaných pro každý hyperparametr.
Hyperparametry můžou být diskrétní nebo souvislé a mají distribuci hodnot popsaných výrazem parametru.
Diskrétní hyperparametry
Diskrétní hyperparametry se zadají mezi Choice
diskrétními hodnotami. Choice
může být:
- jedné nebo více hodnot oddělených čárkami
range
objektlist
libovolný objekt
from azure.ai.ml.sweep import Choice
command_job_for_sweep = command_job(
batch_size=Choice(values=[16, 32, 64, 128]),
number_of_hidden_layers=Choice(values=range(1,5)),
)
V tomto případě batch_size
jedna z hodnot [16, 32, 64, 128] a number_of_hidden_layers
vezme jednu z hodnot [1, 2, 3, 4].
Pomocí distribuce je možné zadat také následující pokročilé diskrétní hyperparametry:
QUniform(min_value, max_value, q)
- Vrátí hodnotu jako round(Uniform(min_value; max_value) / q) * q.QLogUniform(min_value, max_value, q)
- Vrátí hodnotu jako round(exp(Uniform(min_value; max_value)) / q) * q.QNormal(mu, sigma, q)
– Vrátí hodnotu jako round(Normal(mu, sigma) / q) * q.QLogNormal(mu, sigma, q)
– Vrátí hodnotu jako round(exp(normal(mu, sigma)) / q) * q.
Průběžné hyperparametry
Hyperparametry Continuous se zadají jako rozdělení v souvislém rozsahu hodnot:
Uniform(min_value, max_value)
– Vrátí hodnotu rovnoměrně rozdělenou mezi min_value a max_valueLogUniform(min_value, max_value)
- Vrátí hodnotu nakreslenou podle hodnoty exp(Uniform(min_value, max_value)), aby logaritmus návratové hodnoty byl rovnoměrně rozdělen.Normal(mu, sigma)
- Vrátí reálnou hodnotu, která je normálně distribuovaná střední mí a směrodatnou odchylkou sigma.LogNormal(mu, sigma)
- Vrátí hodnotu nakreslenou podle hodnoty exp(normal(mu, sigma)), aby logaritmus návratové hodnoty byl normálně distribuován.
Příklad definice prostoru parametru:
from azure.ai.ml.sweep import Normal, Uniform
command_job_for_sweep = command_job(
learning_rate=Normal(mu=10, sigma=3),
keep_probability=Uniform(min_value=0.05, max_value=0.1),
)
Tento kód definuje vyhledávací prostor se dvěma parametry – learning_rate
a keep_probability
. learning_rate
má normální rozdělení se střední hodnotou 10 a směrodatnou odchylkou 3. keep_probability
má jednotné rozdělení s minimální hodnotou 0,05 a maximální hodnotou 0,1.
Pro rozhraní příkazového řádku můžete pomocí schématu YAML úlohy uklidit definovat vyhledávací prostor v YAML:
search_space:
conv_size:
type: choice
values: [2, 5, 7]
dropout_rate:
type: uniform
min_value: 0.1
max_value: 0.2
Vzorkování prostoru hyperparametrů
Zadejte metodu vzorkování parametrů, která se má použít v prostoru hyperparametrů. Azure Machine Learning podporuje následující metody:
- Náhodné vybrání vzorků
- Vzorkování mřížky
- Bayesovské vzorkování
Náhodné vybrání vzorků
Náhodné vzorkování podporuje diskrétní a souvislé hyperparametry. Podporuje předčasné ukončení úloh s nízkým výkonem. Někteří uživatelé provede počáteční vyhledávání s náhodným vzorkováním a pak zpřesní prostor hledání, aby se zlepšily výsledky.
V náhodném vzorkování jsou hodnoty hyperparametrů náhodně vybrány z definovaného vyhledávacího prostoru. Po vytvoření úlohy příkazu můžete pomocí parametru uklidit definovat algoritmus vzorkování.
from azure.ai.ml.sweep import Normal, Uniform, RandomParameterSampling
command_job_for_sweep = command_job(
learning_rate=Normal(mu=10, sigma=3),
keep_probability=Uniform(min_value=0.05, max_value=0.1),
batch_size=Choice(values=[16, 32, 64, 128]),
)
sweep_job = command_job_for_sweep.sweep(
compute="cpu-cluster",
sampling_algorithm = "random",
...
)
Sobol
Sobol je typ náhodného vzorkování podporovaný typy úloh úklidu. Sobol můžete použít k reprodukování výsledků pomocí počátečního a rovnoměrnějšího pokrytí distribuce vyhledávacího prostoru.
Chcete-li použít sobol, použijte RandomParameterSampling třídy přidat seed a pravidlo, jak je znázorněno v příkladu níže.
from azure.ai.ml.sweep import RandomParameterSampling
sweep_job = command_job_for_sweep.sweep(
compute="cpu-cluster",
sampling_algorithm = RandomParameterSampling(seed=123, rule="sobol"),
...
)
Vzorkování mřížky
Vzorkování mřížky podporuje diskrétní hyperparametry. Vzorkování mřížky použijte, pokud můžete rozpočet použít k vyčerpávajícímu vyhledávání ve vyhledávacím prostoru. Podporuje předčasné ukončení úloh s nízkým výkonem.
Vzorkování mřížky provede jednoduché vyhledávání v mřížce nad všemi možnými hodnotami. Vzorkování mřížky lze použít pouze s choice
hyperparametry. Například následující prostor obsahuje šest ukázek:
from azure.ai.ml.sweep import Choice
command_job_for_sweep = command_job(
batch_size=Choice(values=[16, 32]),
number_of_hidden_layers=Choice(values=[1,2,3]),
)
sweep_job = command_job_for_sweep.sweep(
compute="cpu-cluster",
sampling_algorithm = "grid",
...
)
Bayesovské vzorkování
Bayesian vzorkování je založené na bayesovském optimalizačním algoritmu. Vybere vzorky na základě toho, jak se předchozí vzorky provedly, aby nové vzorky zlepšily primární metriku.
Bayesian vzorkování se doporučuje, pokud máte dostatečný rozpočet na prozkoumání prostoru hyperparametrů. Nejlepších výsledků dosáhnete, když doporučujeme maximální počet úloh větší než 20krát nebo rovnou 20násobku počtu vyladěných hyperparametrů.
Počet souběžných úloh má vliv na efektivitu procesu ladění. Menší počet souběžných úloh může vést k lepší konvergenci vzorkování, protože menší stupeň paralelismu zvyšuje počet úloh, které mají prospěch z dříve dokončených úloh.
Bayesian vzorkování podporuje choice
pouze , uniform
a quniform
rozdělení přes vyhledávací prostor.
from azure.ai.ml.sweep import Uniform, Choice
command_job_for_sweep = command_job(
learning_rate=Uniform(min_value=0.05, max_value=0.1),
batch_size=Choice(values=[16, 32, 64, 128]),
)
sweep_job = command_job_for_sweep.sweep(
compute="cpu-cluster",
sampling_algorithm = "bayesian",
...
)
Určení cíle úklidu
Definujte cíl úlohy úklidu zadáním primární metriky a cíle, které chcete optimalizovat laděním hyperparametrů. Každá trénovací úloha se vyhodnocuje pro primární metriku. Zásady předčasného ukončení používají primární metriku k identifikaci úloh s nízkým výkonem.
primary_metric
: Název primární metriky musí přesně odpovídat názvu metriky zaprotokolované trénovacím skriptem.goal
: Může to být buďMaximize
neboMinimize
a určuje, jestli se primární metrika při vyhodnocování úloh maximalizuje nebo minimalizuje.
from azure.ai.ml.sweep import Uniform, Choice
command_job_for_sweep = command_job(
learning_rate=Uniform(min_value=0.05, max_value=0.1),
batch_size=Choice(values=[16, 32, 64, 128]),
)
sweep_job = command_job_for_sweep.sweep(
compute="cpu-cluster",
sampling_algorithm = "bayesian",
primary_metric="accuracy",
goal="Maximize",
)
Tato ukázka maximalizuje "přesnost".
Metriky protokolů pro ladění hyperparametrů
Trénovací skript pro váš model musí během trénování modelu protokolovat primární metriku pomocí stejného odpovídajícího názvu metriky, aby k němu mohl získat přístup pro ladění hyperparametrů.
Pomocí následujícího ukázkového fragmentu kódu zapište do trénovacího skriptu primární metriku:
import mlflow
mlflow.log_metric("accuracy", float(val_accuracy))
Trénovací skript vypočítá a zaprokoluje val_accuracy
ho jako primární metriku "přesnost". Pokaždé, když se metrika zaprotokoluje, přijímá ji služba ladění hyperparametrů. Záleží na vás, abyste určili četnost generování sestav.
Další informace o protokolování hodnot pro trénovací úlohy najdete v tématu Povolení protokolování v trénovacích úlohách služby Azure Machine Learning.
Určení zásad předčasného ukončení
Automaticky ukončit špatně výkonné úlohy pomocí zásad předčasného ukončení. Předčasné ukončení zlepšuje výpočetní efektivitu.
Můžete nakonfigurovat následující parametry, které řídí, kdy se zásady použijí:
evaluation_interval
: četnost použití zásady. Pokaždé, když trénovací skript zaznamená do protokolu primární metriku, počítá se jako jeden interval. Zásada seevaluation_interval
použije vždy, když trénovací skript hlásí primární metriku. Zásada seevaluation_interval
použije vždy při každém druhém použití. Pokud nezadáte,evaluation_interval
nastaví se ve výchozím nastavení na hodnotu 0.delay_evaluation
: zpožďuje první vyhodnocení zásad pro zadaný počet intervalů. Jedná se o volitelný parametr, který zabraňuje předčasnému ukončení trénovacích úloh tím, že umožňuje spuštění všech konfigurací po minimální počet intervalů. Pokud je zadáno, zásada použije každý násobek evaluation_interval, který je větší nebo roven delay_evaluation. Pokud nezadáte,delay_evaluation
nastaví se ve výchozím nastavení na hodnotu 0.
Azure Machine Learning podporuje následující zásady předčasného ukončení:
Zásady bandit
Zásady bandit jsou založené na množství a intervalu vyhodnocení slack factor/slack. Zásady bandit ukončí úlohu, pokud primární metrika není v zadaném rozsahu slacku nebo časovou rezervou u nejúspěšnější úlohy.
Zadejte následující parametry konfigurace:
slack_factor
neboslack_amount
: časová rezerva povolena s ohledem na nejlepší výkonnou trénovací úlohu.slack_factor
určuje povolenou časovou rezervu jako poměr.slack_amount
určuje povolenou časovou rezervu jako absolutní částku místo poměru.Představte si například zásadu Bandit použitou v intervalu 10. Předpokládejme, že úloha s nejlepším výkonem v intervalu 10 hlášená primární metrikou je 0,8 s cílem maximalizovat primární metriku. Pokud zásada určuje
slack_factor
hodnotu 0,2, všechny trénovací úlohy, jejichž nejlepší metrika v intervalu 10 je menší než 0,66 (0,8/(1+slack_factor
)), se ukončí.evaluation_interval
: (volitelné) četnost použití zásadydelay_evaluation
: (volitelné) zpožďuje první vyhodnocení zásad pro zadaný počet intervalů.
from azure.ai.ml.sweep import BanditPolicy
sweep_job.early_termination = BanditPolicy(slack_factor = 0.1, delay_evaluation = 5, evaluation_interval = 1)
V tomto příkladu se zásady předčasného ukončení použijí při každém intervalu, kdy se hlásí metriky počínaje intervalem vyhodnocení 5. Všechny úlohy, jejichž nejlepší metrika je menší než (1/(1+0,1) nebo 91 % nejlepších úloh, budou ukončeny.
Zásady zastavení mediánu
Zastavení mediánu je zásada předčasného ukončení založená na průměrech primárních metrik hlášených úlohami. Tato zásada vypočítá průměry ve všech trénovacích úlohách a zastaví úlohy, jejichž primární hodnota metriky je horší než medián průměrů.
Tato zásada přebírá následující parametry konfigurace:
evaluation_interval
: frekvence použití zásady (volitelný parametr).delay_evaluation
: zpožďuje první vyhodnocení zásad pro zadaný počet intervalů (volitelný parametr).
from azure.ai.ml.sweep import MedianStoppingPolicy
sweep_job.early_termination = MedianStoppingPolicy(delay_evaluation = 5, evaluation_interval = 1)
V tomto příkladu se zásady předčasného ukončení použijí v každém intervalu počínaje intervalem vyhodnocení 5. Úloha se zastaví v intervalu 5, pokud je její nejlepší primární metrika horší než medián průběžných průměrů v intervalech 1:5 napříč všemi trénovacími úlohami.
Zásady výběru zkrácení
Výběr zkrácení zruší procento nejnižších úloh při každém intervalu vyhodnocení. Úlohy se porovnávají pomocí primární metriky.
Tato zásada přebírá následující parametry konfigurace:
truncation_percentage
: procento nejnižšího výkonu úloh, které se mají ukončit v každém intervalu hodnocení. Celočíselná hodnota mezi 1 a 99.evaluation_interval
: (volitelné) četnost použití zásadydelay_evaluation
: (volitelné) zpožďuje první vyhodnocení zásad pro zadaný počet intervalů.exclude_finished_jobs
: Určuje, jestli se mají při použití zásady vyloučit dokončené úlohy.
from azure.ai.ml.sweep import TruncationSelectionPolicy
sweep_job.early_termination = TruncationSelectionPolicy(evaluation_interval=1, truncation_percentage=20, delay_evaluation=5, exclude_finished_jobs=true)
V tomto příkladu se zásady předčasného ukončení použijí v každém intervalu počínaje intervalem vyhodnocení 5. Úloha se ukončí v intervalu 5, pokud je jeho výkon v intervalu 5 v nejnižším 20 % výkonu všech úloh v intervalu 5 a při použití zásad vyloučí dokončené úlohy.
Žádné zásady ukončení (výchozí)
Pokud není zadána žádná zásada, služba ladění hyperparametrů umožňuje dokončení všech trénovacích úloh.
sweep_job.early_termination = None
Výběr zásad předčasného ukončení
- Pro konzervativní politiku, která poskytuje úspory bez ukončení slibných pracovních míst, zvažte medián zastavení zásad s
evaluation_interval
1 adelay_evaluation
5. Jedná se o konzervativní nastavení, která můžou poskytnout přibližně 25%-35% úspory bez ztráty na primární metrice (na základě našich dat vyhodnocení). - Pokud chcete agresivnější úspory, použijte zásadu bandit s menší povolenou časovou rezervou nebo zásadou výběru zkrácení s větším procentem zkrácení.
Nastavení limitů pro úlohu úklidu
Rozpočet zdrojů můžete řídit nastavením limitů pro vaši úlohu úklidu.
max_total_trials
: Maximální počet zkušebních úloh. Musí být celé číslo od 1 do 1000.max_concurrent_trials
: (volitelné) Maximální počet zkušebních úloh, které se dají spustit souběžně. Pokud není zadaný, max_total_trials počet spuštěných úloh paralelně. Pokud je zadáno, musí být celé číslo od 1 do 1000.timeout
: Maximální doba v sekundách, po kterou může běžet celá úloha úklidu. Po dosažení tohoto limitu systém zruší úlohu úklidu včetně všech zkušebních verzí.trial_timeout
: Maximální doba v sekundách, po kterou může každá zkušební úloha běžet. Po dosažení tohoto limitu systém zkušební verzi zruší.
Poznámka:
Pokud jsou zadány max_total_trials i vypršení časového limitu, experiment ladění hyperparametrů se ukončí při dosažení první z těchto dvou prahových hodnot.
Poznámka:
Počet souběžných zkušebních úloh se hradí u prostředků dostupných v zadaném cílovém výpočetním objektu. Ujistěte se, že cílový výpočetní objekt má dostupné prostředky pro požadovanou souběžnost.
sweep_job.set_limits(max_total_trials=20, max_concurrent_trials=4, timeout=1200)
Tento kód konfiguruje experiment ladění hyperparametrů tak, aby používal maximálně 20 celkových zkušebních úloh a spustil čtyři zkušební úlohy najednou s časovým limitem 1 200 sekund pro celou úlohu úklidu.
Konfigurace experimentu ladění hyperparametrů
Pokud chcete nakonfigurovat experiment ladění hyperparametrů, zadejte následující:
- Definovaný vyhledávací prostor hyperparametrů
- Váš algoritmus vzorkování
- Vaše zásady předčasného ukončení
- Váš cíl
- Omezení prostředků
- CommandJob nebo CommandComponent
- SweepJob
SweepJob může spustit úklid hyperparametrů na komponentě Command nebo Command.
Poznámka:
Cílový výpočetní objekt použitý v sweep_job
musí mít dostatek prostředků, aby splňoval vaši úroveň souběžnosti. Další informace o cílových výpočetních objektech najdete v tématu Cílové výpočetní objekty.
Nakonfigurujte experiment ladění hyperparametrů:
from azure.ai.ml import MLClient
from azure.ai.ml import command, Input
from azure.ai.ml.sweep import Choice, Uniform, MedianStoppingPolicy
from azure.identity import DefaultAzureCredential
# Create your base command job
command_job = command(
code="./src",
command="python main.py --iris-csv ${{inputs.iris_csv}} --learning-rate ${{inputs.learning_rate}} --boosting ${{inputs.boosting}}",
environment="AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest",
inputs={
"iris_csv": Input(
type="uri_file",
path="https://azuremlexamples.blob.core.windows.net/datasets/iris.csv",
),
"learning_rate": 0.9,
"boosting": "gbdt",
},
compute="cpu-cluster",
)
# Override your inputs with parameter expressions
command_job_for_sweep = command_job(
learning_rate=Uniform(min_value=0.01, max_value=0.9),
boosting=Choice(values=["gbdt", "dart"]),
)
# Call sweep() on your command job to sweep over your parameter expressions
sweep_job = command_job_for_sweep.sweep(
compute="cpu-cluster",
sampling_algorithm="random",
primary_metric="test-multi_logloss",
goal="Minimize",
)
# Specify your experiment details
sweep_job.display_name = "lightgbm-iris-sweep-example"
sweep_job.experiment_name = "lightgbm-iris-sweep-example"
sweep_job.description = "Run a hyperparameter sweep job for LightGBM on Iris dataset."
# Define the limits for this sweep
sweep_job.set_limits(max_total_trials=20, max_concurrent_trials=10, timeout=7200)
# Set early stopping on this one
sweep_job.early_termination = MedianStoppingPolicy(
delay_evaluation=5, evaluation_interval=2
)
Volá command_job
se jako funkce, abychom mohli použít výrazy parametrů na vstupy uklidit. Funkce sweep
se pak nakonfiguruje pomocí trial
funkce , , objective
sampling-algorithm
, limits
a compute
. Výše uvedený fragment kódu se přebírá z ukázkového poznámkového bloku Spuštění úklidu hyperparametrů u příkazu nebo commandComponentu. V této ukázce learning_rate
boosting
jsou parametry vyladěny. Počáteční zastavení úloh je určeno funkcí MedianStoppingPolicy
, která zastaví úlohu, jejíž primární hodnota metriky je horší než medián průměrů napříč všemi trénovacími úlohami.( viz Odkaz na třídu MedianStoppingPolicy).
Pokud chcete zjistit, jak se hodnoty parametrů přijímají, parsují a předávají trénovacímu skriptu, který se má ladit, projděte si tento ukázkový kód.
Důležité
Každá úloha úklidu hyperparametrů restartuje trénování úplně od začátku, včetně opětovného sestavení modelu a všech zavaděčů dat. Tyto náklady můžete minimalizovat pomocí kanálu služby Azure Machine Learning nebo ručního procesu, abyste před trénovacími úlohami udělali co nejvíce přípravy dat.
Odeslání experimentu ladění hyperparametrů
Po definování konfigurace ladění hyperparametrů odešlete úlohu:
# submit the sweep
returned_sweep_job = ml_client.create_or_update(sweep_job)
# get a URL for the status of the job
returned_sweep_job.services["Studio"].endpoint
Vizualizace úloh ladění hyperparametrů
Všechny úlohy ladění hyperparametrů můžete vizualizovat v studio Azure Machine Learning. Další informace o zobrazení experimentu na portálu najdete v tématu Zobrazení záznamů úloh v sadě Studio.
Graf metrik: Tato vizualizace sleduje metriky protokolované pro každou podřízenou úlohu hyperdrivu po dobu trvání ladění hyperparametrů. Každý řádek představuje podřízenou úlohu a každý bod měří primární hodnotu metriky v dané iteraci modulu runtime.
Graf paralelních souřadnic: Tato vizualizace ukazuje korelaci mezi výkonem primární metriky a hodnotami jednotlivých hyperparametrů. Graf je interaktivní pohybem os (výběr a přetažení popiskem osy) a zvýrazněním hodnot přes jednu osu (výběr a přetažením svisle podél jedné osy zvýrazníte rozsah požadovaných hodnot). Graf paralelních souřadnic obsahuje osu v pravé části grafu, která vykreslí nejlepší hodnotu metriky odpovídající hyperparametrům nastaveným pro danou instanci úlohy. Tato osa je k dispozici, aby bylo možné promítnout legendu přechodu grafu na data čitelnějším způsobem.
Dvourozměrný bodový graf: Tato vizualizace zobrazuje korelaci mezi dvěma jednotlivými hyperparametry spolu s přidruženou primární hodnotou metriky.
Prostorový bodový graf: Tato vizualizace je stejná jako 2D, ale umožňuje tři dimenze hyperparametrů korelace s primární hodnotou metriky. Můžete také vybrat a přetáhnout graf tak, aby se zobrazily různé korelace v 3D prostoru.
Vyhledání nejlepší zkušební úlohy
Po dokončení všech úloh ladění hyperparametrů načtěte nejlepší zkušební výstupy:
# Download best trial model output
ml_client.jobs.download(returned_sweep_job.name, output_name="model")
Pomocí rozhraní příkazového řádku můžete stáhnout všechny výchozí a pojmenované výstupy nejlepší zkušební úlohy a protokolů úlohy uklidit.
az ml job download --name <sweep-job> --all
Volitelně můžete stáhnout pouze nejlepší zkušební výstup.
az ml job download --name <sweep-job> --output-name model