[PYTHON] Portage d'Argparse à Hydra

Ceci est un rappel de ce que j'ai recherché lors de la conversion des paramètres argparse de Python en hydra. Enfin, j'écris une fonction pratique qui est unique à hydra.

introduction

Lors de l'écriture d'un script d'expérience d'apprentissage automatique en python, j'ai utilisé argparse comme méthode de définition des hyper paramètres. Cependant, comme l'expérience devenait plus compliquée, il y avait un désir d'avoir un nombre considérable de lignes et de structurer les paramètres uniquement avec le fichier qui décrit les paramètres argparse. .. .. Alors, lisez la recommandation de ymym sur la gestion des hautes para-Gérons les hyper paramètres avec Hydra + MLflow- " et lisez" Ceci C'était! », J'ai donc décidé de l'utiliser. Ensuite, j'ai étudié diverses choses lors de la migration des paramètres expérimentaux écrits en argparse vers l'hydre, donc je les ai résumés.

Qu'est-ce que l'hydre?

image.png

"A framework for elegantly configuring complex applications" Il semble être "un cadre pour gérer avec élégance les paramètres d'applications complexes". Le développement est centré sur la recherche facebook.

Github/OfficialDocument

Comment utiliser Hydra

Pour les paramètres détaillés, veuillez consulter l'article ci-dessus de ymym et Official Tutorial. La première caractéristique est que si vous souhaitez décrire structurellement les paramètres dans le fichier yaml et écraser le contenu, vous pouvez les écraser sur la ligne de commande au moment de l'exécution.

Différents styles d'écriture

Définition des options et chargement

--hydra décrit les paramètres du fichier yaml et le donne comme décorateur à la fonction qui l'exécute.

argparse

# main.py
def main():
    parser = parser.ArgumentParser(...)
    parser.add_argument('--hoge', type=int, default=1)
    cfg = parser.parse_args()
    print(cfg.hoge) # 1

hydra

# config.yaml
hoge: 1

# main.py
@hydra.main(config_path='config.yaml')
def main(cfg):
    print(cfg.hoge) # 1

Remplacer par défaut

--Spécifiez avec =

argparse

# shell
python main.py --hoge 2

hydra

# shell
python main.py hoge=1

nargs

argparse

# main.py
parser.add_argument('--hoge', type=int, nargs=3, default=[1, 2, 3])

# shell
python main.py --hoge 4 5 6

hydra

# config.yaml
hoge:
  - 1
  - 2
  - 3

# shell
python main.py hoge=[1,2,3]

required=True --Spécifiez ??? pour la valeur --Si vous ne le spécifiez pas, vous obtiendrez l'erreur ʻomegaconf.errors.MissingMandatoryValuede OmegaConf. --Cependant, cela n'est pas évalué au moment de l'exécution, mais est évalué lors de l'accès à la clé et une erreur se produit. Par conséquent, même si vous l'exécutez sans le spécifier, le code jusqu'à la ligne qui accède à la clé en le spécifiant avec???` sera exécuté. (Veuillez me faire savoir s'il existe un moyen d'évaluer au moment de l'exécution avec les paramètres du côté hydra)

argparse

# main.py
parser.add_argument('--hoge', type=int, required=True)

hydra

# config.yaml
hoge: ???

choices

argparse

# main.py
parser.add_argument('--hoge', type=int, default=1, choices=[1, 2])
print(cfg.hoge)

# shell
python main.py --hoge 2
# 2

hydra

├── config
|   ├── config.yaml
│   └── choice
│       ├── a.yaml
│       └── b.yaml
└── main.py

# config.yaml
choice: a

# choice/a.yaml
hoge: 1

# choice/b.yaml
hoge: 2

# main.py
print(cfg.hoge)

# shell
python main.py choice=b
# 2

--help

argparse

# shell
python main.py --help

hydra

# shell
python main.py --cfg job

Fonction pratique uniquement dans hydra

Comme ce sera presque une introduction au didacticiel, intégrez un lien vers le didacticiel cible dans le nom de la section. Veuillez vous y référer pour plus de détails.

Multi-run Essayez d'exécuter en même temps avec plusieurs paramètres avec la configuration définie dans les choix ci-dessus.

# shell
python main.py hoge=a,b

Achèvement de l'onglet

Si vous exécutez la commande suivante une fois avant d'exécuter le script, vous pouvez utiliser la complétion par tabulation lorsque vous spécifiez des options à partir de la ligne de commande.

eval "$(python main.py -sc install=bash)"

Créer un répertoire de journaux

hydra crée automatiquement un répertoire de journal structuré basé sur la date et l'heure sans aucun paramètre, et l'utilise comme répertoire de travail lors de l'exécution, ainsi que les fichiers générés à l'exécution et enregistrés. Enregistrer les fichiers, etc.

import os

@hydra.main()
def main(_cfg):
    print("Working directory : {}".format(os.getcwd()))

$ python main.py
Working directory : /home/omry/dev/hydra/outputs/2019-09-25/15-16-17

$ python main.py
Working directory : /home/omry/dev/hydra/outputs/2019-09-25/15-16-19

Cependant, ne spécifiez pas le répertoire de travail sans autorisation! Je pense qu'il y a des gens qui disent ça (moi-même), alors faisons spécifiez le répertoire pour hydra vous-même.

Résumé

Je viens de commencer à l'utiliser moi-même, donc si quelqu'un sait quelque chose qui ne va pas avec l'article ou une meilleure façon, j'apprécierais que vous puissiez m'apprendre. Si vous utilisez hydra, le code sera actualisé, alors essayez-le! (Surtout pour le gros code)

Enfin, si vous souhaitez en savoir plus sur son utilisation, veuillez contacter Official document et ymym's blog Veuillez vous référer au / 09 034644).

Recommended Posts

Portage d'Argparse à Hydra
Somme de 1 à 10
Portage et modification du solveur de doublets de python2 vers python3.
Changements de Python 2 à Python 3.0
Transition de WSL1 à WSL2
Compléter argparse de docstrings
De l'édition à l'exécution
Flirter de PHP à Python
Transition de Chainer v1 à Chainer v2
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Migré de Flask-RESTPlus vers Flask-RESTX
Comment utiliser Python Argparse
Mettre à jour python-social-auth de 0.1.x à 0.2.x
Migrer de requirements.txt vers pipenv
Passer de python2.7 à python3.6 (centos7)
Connectez-vous à sqlite depuis python
Appelez Matlab depuis Python pour optimiser
De l'installation d'Elasticsearch à la saisie des données
Résumé de vtkXMLUnstructuredGridReader (mis à jour de temps en temps)
Résumé de vtkOpenFOAMReader (mis à jour de temps en temps)
Comment utiliser SWIG de WAF
Impossible de migrer de direct_to_template vers TemplateView
Livre de mots de l'ingénieur (mis à jour de temps en temps)
Conversion de pdf en txt 1 [pdfminer]
Programmation tirée des livres le 10 mai
Publication de Python sur la chronologie Facebook
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Sortie du Raspberry Pi vers la ligne
[Introduction] De l'installation de kibana au démarrage
Conversion de pdf en txt 2 [pyocr]
Connectez-vous à la base de données utf8mb4 à partir de python
Installation d'OpenMPI Du téléchargement au passage
Mémo Tensorflow [mis à jour de temps à autre]
Python (de la première fois à l'exécution)
Publier une image de Python sur Tumblr
Envoyer des commandes d'Atom à Maya
Comment lancer Explorer à partir de WSL
Programmation tirée des livres le 7 mai
De Ubuntu 20.04 introduction à la construction d'environnement
Inclure "%" dans l'aide argparse pour mourir
Connexion SSH de Windows à GCP
Comment accéder à wikipedia depuis python
Python pour passer d'une autre langue
Comment convertir .mgz en .nii.gz
Migrer de VS Code vers PyCharm
pynq-z1 De l'achat au contrôle de fonctionnement
N'a pas changé de Python 2 à 3
Mettre à jour Mac Python de 2 à 3