Hyperopt-fogalmak

Ez a cikk az elosztott Hyperopt használatához szükséges néhány fogalmat ismerteti.

Ebben a szakaszban:

A Hyperopt Azure Databricksben való használatát bemutató példákért lásd: Hiperparaméter-finomhangolás a Hyperopttal.

fmin()

Hyperopt-futtatás végrehajtására használható fmin() . A argumentumok fmin() a táblázatban láthatók. További információt a Hyperopt dokumentációjában talál. Az egyes argumentumok használatára vonatkozó példákért tekintse meg a példajegyzetfüzeteket.

Argumentum neve Leírás
fn Objektív függvény. A Hyperopt meghívja ezt a függvényt a szóköz argumentumban megadott hiperparaméter-térből generált értékekkel. Ez a függvény skaláris értékként vagy szótárban is visszaadhatja a veszteséget (részletekért lásd: Hyperopt-dokumentumok ). Ez a függvény általában a modell betanítási és veszteségszámítási kódját tartalmazza.
space Meghatározza a keresendő hiperparaméter-területet. A Hyperopt nagy rugalmasságot biztosít a tér definiálásához. Választhat kategorikus lehetőségeket, például algoritmust vagy valószínűségi eloszlást numerikus értékekhez, például egységes és naplókhoz.
algo Hiperopt keresési algoritmus a hiperparaméter-terület kereséséhez. Leggyakrabban a hyperopt.rand.suggest véletlenszerű kereséshez és hyperopt.tpe.suggest a TPE-hez használják.
max_evals A kipróbálandó hiperparaméter-beállítások száma (az illesztendő modellek száma).
max_queue_len A hiperparaméter-beállítások számának a Hyperoptnak előre létre kell hoznia. Mivel a Hyperopt TPE-generáció algoritmusa eltarthat egy ideig, hasznos lehet ezt növelni az alapértelmezett 1 értéknél, de általában nem nagyobb a SparkTrials beállításnál parallelism.
trials A Trials vagy SparkTrials objektum. Akkor használja SparkTrials , ha egygépes algoritmusokat hív meg, például scikit-learn metódusokat az objektív függvényben. Akkor használja Trials , ha elosztott betanítási algoritmusokat hív meg, például MLlib metódusokat vagy Horovodot az objektív függvényben.
early_stop_fn Egy nem kötelező korai leállítási függvény annak meghatározásához, hogy le kell-e fmin állnia, mielőtt max_evals elérnék. Az alapértelmezett szint a None. A függvény bemeneti aláírása, Trials, *args a kimeneti aláírás pedig .bool, *args A kimeneti logikai érték azt jelzi, hogy le kell-e állítani. *args bármely olyan állapot, amelyben a hívás early_stop_fn kimenete a következő hívás bemeneteként szolgál. Trials objektum lehet SparkTrials . A használata SparkTrialsesetén a korai leállítási függvény nem garantáltan minden próba után fut, hanem lekérdezi. Példa egy korai leállítási függvényre

Az SparkTrials osztály

SparkTrials a Databricks által fejlesztett API, amely lehetővé teszi a Hyperopt-futtatások terjesztését anélkül, hogy más módosításokat végez a Hyperopt-kódon. SparkTrials felgyorsítja az egygépes finomhangolást a próbaverziók Spark-feldolgozóknak való terjesztésével.

Megjegyzés

SparkTrials az egygépes gépi tanulási modellek, például a scikit-learn számításainak párhuzamosítására lett kialakítva. Elosztott ML-algoritmusokkal (például MLlib vagy Horovod) létrehozott modellekhez ne használja a következőt SparkTrials: . Ebben az esetben a modellépítési folyamat automatikusan párhuzamos lesz a fürtön, és az alapértelmezett Hyperopt osztályt Trialskell használnia.

Ez a szakasz bemutatja, hogyan konfigurálhatja a neki átadott SparkTrials argumentumokat és a megvalósítás szempontjait SparkTrials.

Argumentumok

SparkTrials két választható argumentumot vesz fel:

  • parallelism: Az egyidejűleg kiértékelendő kísérletek maximális száma. A magasabb szám lehetővé teszi a több hiperparaméter-beállítás tesztelésének vertikális felskálázását. Mivel a Hyperopt új kísérleteket javasol a múltbeli eredmények alapján, kompromisszum van a párhuzamosság és az adaptívság között. A rögzített max_evals, nagyobb párhuzamosság felgyorsítja a számításokat, de az alacsonyabb párhuzamosság jobb eredményhez vezethet, mivel minden iteráció több korábbi eredményhez fér hozzá.

    Alapértelmezett: Elérhető Spark-végrehajtók száma. Maximum: 128. Ha az érték nagyobb, mint a fürtkonfiguráció által engedélyezett egyidejű tevékenységek száma, SparkTrials csökkenti a párhuzamosságot ezzel az értékkel.

  • timeout: A hívások maximális száma másodpercig fmin() tarthat. Ha túllépi ezt a számot, az összes futtatás leáll, és fmin() kilép. A rendszer menti a befejezett futtatásokra vonatkozó információkat.

Megvalósítás

A célfüggvény fnfmin()definiálásakor és a fürtbeállítás kiválasztásakor hasznos megérteni, hogyan SparkTrials osztja el a hangolási feladatokat.

A Hyperoptban a próbaverzió általában megfelel egy modellnek a hiperparaméterek egy beállítására való illesztésének. A Hyperopt iteratív módon hoz létre próbaverziókat, kiértékeli és ismétli őket.

A használatával SparkTrialsa fürt illesztőprogram-csomópontja új próbaverziókat hoz létre, és a feldolgozó csomópontok kiértékelik ezeket a próbaverziókat. Minden próbaverzió egy Spark-feladattal jön létre, amely egy tevékenységgel rendelkezik, és a munkavégző gépen lévő feladatban lesz kiértékelve. Ha a fürt több feladat futtatására van beállítva feldolgozónként, akkor egyszerre több próba is kiértékelhető a feldolgozón.

SparkTrials és MLflow

A Databricks Runtime ML támogatja a feldolgozók MLflow-ba való naplózását. Egyéni naplózási kódot adhat hozzá a Hyperoptnak átadott objektív függvényhez.

SparkTrials naplózza a hangolási eredményeket beágyazott MLflow-futtatásként az alábbiak szerint:

  • Fő vagy szülőfuttatás: A rendszer főfuttatásként naplózza a hívását fmin() . Ha aktív futtatás van, naplózza ezt az aktív futtatásba, SparkTrials és a visszatéréskor fmin() nem fejezi be a futtatás befejezését. Ha nincs aktív futtatás, SparkTrials létrehoz egy új futtatásokat, naplózza azt, és a visszatérés előtt fmin() befejezi a futtatásokat.
  • Gyermekfuttatások: A rendszer minden tesztelt hiperparaméter-beállítást (próbaverziót) gyermekfuttatásként naplóz a főfuttatás alatt. A feldolgozók MLflow-naplórekordjait a rendszer a megfelelő gyermekfuttatások alatt is tárolja.

fmin()Híváskor a Databricks aktív MLflow-futtatási felügyeletet javasol, azaz a hívást fmin() egy with mlflow.start_run(): utasításba csomagolja. Ez biztosítja, hogy minden fmin() hívás külön MLflow főfuttatásba legyen naplózva, és egyszerűbbé teszi a további címkék, paraméterek vagy metrikák naplózását a futtatáshoz.

Megjegyzés

Ha ugyanazon az aktív MLflow-futtatáson belül többször is hív fmin() , az MLflow naplózza ezeket a hívásokat ugyanarra a fő futtatásra. A naplózott paraméterek és címkék névütközéseinek feloldásához az MLflow hozzáfűz egy UUID-t az ütköző nevekhez.

A feldolgozóktól való naplózáskor nem kell explicit módon kezelnie a futtatásokat az objektív függvényben. Hívja meg mlflow.log_param("param_from_worker", x) az objektív függvényt, hogy naplózza a paramétert a gyermekfuttatásban. Az objektív függvényben naplózhatja a paramétereket, a metrikákat, a címkéket és az összetevőket.