Zephyrnet-logo

Hydra-configuraties voor Deep Learning-experimenten

Datum:

Hydra-configuraties voor Deep Learning-experimenten
Afbeelding door redacteur

Hydra library biedt een flexibel en efficiënt configuratiebeheersysteem waarmee hiërarchische configuraties dynamisch kunnen worden gemaakt door samenstelling en overschrijven via configuratiebestanden en de opdrachtregel.

Deze krachtige tool biedt een eenvoudige en efficiënte manier om verschillende configuraties op één plek te beheren en te organiseren, waarbij complexe configuratiestructuren op meerdere niveaus zonder enige beperking worden gebouwd, wat essentieel kan zijn in machine learning-projecten.

Dit alles stelt u in staat om eenvoudig tussen alle parameters te schakelen en verschillende configuraties uit te proberen zonder de code handmatig bij te werken. Door de parameters op een flexibele en modulaire manier te definiëren, wordt het veel gemakkelijker om nieuwe ML-modellen te herhalen en verschillende benaderingen sneller te vergelijken, wat tijd en middelen kan besparen en bovendien het ontwikkelingsproces efficiënter kan maken.

Hydra kan dienen als de centrale component in deep learning-pijplijnen (u kunt een voorbeeld vinden van mijn trainingspijplijnsjabloon hier), die alle interne modules zou orkestreren.

een decorateur hydra.main wordt verondersteld te worden gebruikt om Hydra-configuratie te laden tijdens het starten van de pijplijn. Hier wordt een configuratie geparseerd door de Hydra-grammatica-parser, samengevoegd, samengesteld en doorgegeven aan de hoofdfunctie van de pijplijn.

Het kan ook worden bereikt door Hydra API samenstellengebruik initialize, initialize_config_module or initialize_config_dirgebruik je, in plaats van hydra.main decorateur:

Een object kan worden geïnstantieerd vanuit een configuratie als het een _target_ sleutel met bijvoorbeeld een klasse- of functienaam torchmetrics.Accuracy. De configuratie kan ook andere parameters bevatten die moeten worden doorgegeven aan objectinstantiëring. Hydra biedt hydra.utils.instantiate() functie (en zijn alias hydra.utils.call()) voor het instantiëren van objecten en het aanroepen van klasse of functie. Het heeft de voorkeur om te gebruiken instantiate voor het maken van objecten en call voor het aanroepen van functies.

Op basis van deze configuratie kunt u eenvoudig instantiëren:

  • verlies via loss = hydra.utils.instantiate(config.loss)
  • metrische via metric = hydra.utils.instantiate(config.metric)

Bovendien ondersteunt het meerdere strategieën voor het converteren van configuratieparameters: none, partial, object en all. De _convert_ attribuut is bedoeld om deze optie te beheren. U kunt meer details vinden hier.

Bovendien biedt het een gedeeltelijke concretisering, wat erg handig kan zijn, bijvoorbeeld voor het instantiëren van functies of het recursief instantiëren van objecten.

Hydra biedt de opdrachtregelbewerkingen voor configuratieparameters met voorrang:

  • Bestaande configuratiewaarde kan worden vervangen door een andere waarde door te geven.
  • Een nieuwe configuratiewaarde die niet bestaat in de configuratie kan worden toegevoegd met behulp van de + operator.
  • Als de configuratie al een waarde heeft, kan deze worden overschreven door de ++ exploitant. Als de waarde niet bestaat in de configuratie, wordt deze toegevoegd.

Het biedt ook ondersteuning voor verschillende opwindende functies, zoals:

  • Gestructureerde configuraties met een uitgebreide lijst van beschikbare primitieve typen, geneste structuur, containers met primitieven, standaardwaarden, overheersende bottom-up waarden en nog veel meer. Dit biedt een breed scala aan mogelijkheden voor het organiseren van configuraties in veel verschillende vormen.

Hydra biedt de mogelijkheid om de functionaliteit nog verder uit te breiden door aangepaste resolvers toe te voegen via OmegaConf bibliotheek. Het maakt het mogelijk aangepaste uitvoerbare uitdrukkingen toe te voegen aan de config. OmegaConf.register_new_resolver() functie wordt gebruikt om dergelijke resolvers te registreren.

OmegaConf ondersteunt standaard de volgende resolvers:

  • oc.env: retourneert de waarde van een omgevingsvariabele
  • oc.create: kan worden gebruikt voor het dynamisch genereren van configuratieknooppunten
  • oc.deprecated: het kan worden gebruikt om een ​​configuratieknooppunt als verouderd te markeren
  • oc.decode: decodeert een string met behulp van een gegeven codec
  • oc.select: biedt een standaardwaarde die kan worden gebruikt in het geval dat de primaire interpolatiesleutel niet wordt gevonden of selecteert sleutels die anders illegale interpolatiesleutels zijn of verwerkt ook ontbrekende waarden
  • oc.dict.{keys,value}: analoog aan de methoden dict.keys en dict.values ​​in gewone Python-woordenboeken

Bekijk meer details hier.

Daarom is het een krachtige tool die het mogelijk maakt om aangepaste resolvers toe te voegen. Het kan bijvoorbeeld vervelend en tijdrovend zijn om herhaaldelijk verlies- of metrische namen in de configuraties op meerdere plaatsen te schrijven, zoals early_stopping configuratie, model_checkpoint config, config met planningsparameters, of ergens anders. Het kan worden opgelost door een aangepaste resolver toe te voegen om te vervangen __loss__ en __metric__ namen door het daadwerkelijke verlies of de metrische naam, die wordt doorgegeven aan de configuratie en geïnstantieerd door Hydra.

Opmerking: u moet vooraf aangepaste resolvers registreren hydra.main or API samenstellen oproepen. Anders past Hydra config-parser het gewoon niet toe.

In mijn sjabloon voor snelle deep learning-experimenten, het is uitgevoerd als binnenhuisarchitect utils.register_custom_resolvers, waarmee alle aangepaste resolvers op één plek kunnen worden geregistreerd. Het ondersteunt de opdrachtregelvlaggen van de belangrijkste Hydra, die nodig zijn om het configuratiepad, de naam of de map te overschrijven. Standaard staat het u toe om te vervangen __loss__ naar loss.__class__.__name__ en __metric__ naar metric.__class__.__name__ via een dergelijke syntaxis: ${replace:"__metric__/valid"}. Gebruik aanhalingstekens voor het definiëren van interne waarde in ${replace:"..."} om grammaticale problemen met Hydra config parser te voorkomen.

Zie meer details over utils.register_custom_resolvers hier. U kunt het eenvoudig uitbreiden voor andere doeleinden.

Deze krachtige tool vereenvoudigt de ontwikkeling en configuratie van complexe pijplijnen aanzienlijk, bijvoorbeeld:

  • Creëer modules met elke aangepaste logica onder de motorkap, bijvoorbeeld:
    • Instantieer de hele module met alle interne submodules recursief door Hydra.
    • De hoofdmodule en sommige delen van de interne submodules kunnen door Hydra worden geïnitialiseerd en de rest handmatig.
    • Initialiseer de hoofdmodule en alle submodules handmatig.
  • Pakket dynamische structuren, zoals data-augmentaties tot configuratie, waar u deze eenvoudig kunt instellen transforms klassen, parameters of de juiste volgorde voor toepassing. Zie voorbeeld van mogelijke implementatie TransformsWrapper gebaseerd op albumentaties bibliotheek voor een dergelijk doel, die gemakkelijk kan worden herwerkt voor elk over-augmentatiepakket. Configuratievoorbeeld:

  • Creëer een complexe configuratiestructuur op meerdere niveaus. Here is een overzicht van hoe configuraties kunnen worden georganiseerd:

 

Hydra-configuraties voor Deep Learning-experimenten
 

  • En nog veel meer... Het heeft zeer weinig beperkingen, dus u kunt het gebruiken voor elke aangepaste logica die u in uw project wilt implementeren.

Hydra maakt de weg vrij voor een schaalbaar configuratiebeheersysteem dat u de mogelijkheid geeft om de efficiëntie van uw workflow uit te breiden en de flexibiliteit te behouden om indien nodig wijzigingen in uw configuraties aan te brengen. De mogelijkheid om eenvoudig tussen verschillende configuraties te schakelen, het eenvoudig opnieuw samen te stellen en verschillende benaderingen uit te proberen zonder de code handmatig bij te werken, is een belangrijk voordeel van het gebruik van een dergelijk systeem voor het oplossen van machine learning-problemen, vooral bij deep learning-gerelateerde taken, wanneer extra flexibiliteit zo cruciaal is .

 
 
Alexander Gorodnitsky is een machine learning engineer met een grondige kennis van ML, Computer Vision en Analytics. Ik heb meer dan 3 jaar ervaring in het maken en verbeteren van producten met behulp van machine learning.
 

spot_img

Laatste intelligentie

spot_img