Skip to content

Commit

Permalink
HydraConfig support (#1022)
Browse files Browse the repository at this point in the history
* 1. tests/_tests_cv_classification_hydra: 'catalyst-dl run --hydra' MNIST classification test pipeline was added
2. catalyst/experiments/hydra_config.py: HydraConfigExperiment was added
3. catalyst/runners/hydra_supervised.py: HydraSupervisedExperiment was added
4. catalyst/dl/script/hydra_run.py: @hydra.main() was added as entry point for hydra configuration experiment
5. catalyst/dl/script/run.py: optional argument '--hydra' was added to change entrypoint to hydra config experiment one
6. catalyst/settings.py: optional 'hydra' package import was added
7. catalyst/utils/hydra_config.py: hydra config utils was added
8. catalyst/utils/hydra_scripts.py: hydra scripts utils was added
9. catalyst/utils/hydra_sys.py: hydra sys utils was added
10. requirements/requirements-hydra.txt: optional 'hydra-core' package was added

* Update hydra_supervised.py, __init__.py, and transforms.py

* Update hydra_run.py, run.py, and 3 more files...

* Update check_dl_cv.sh
Hydra cv classification test was fixed

* Update config.py, functional.py, and hydra_config.py
All dublicated code was replaced to catalyst/experiments/functional.py

* Update hydra_supervised.py
Hydra cv classification test was fixed

* Removed catalyst/utils/hydra_scripts.py, catalyst/utils/hydra_sys.py and changed catalyst/utils/sys.py:
Functions 'catalyst/utils/scripts.py:distributed_cmd_run()' and 'catalyst/utils/sys.py:dump_environment()' are used for both HydraConfigExperiment and ConfigExperiment

* Renamed catalyst/runners/hydra_supervised.py to catalyst/runners/multi_supervised.py
MultiSupervisedRunner was added for multiple model support

* Update config_infer.yaml and config_train.yaml due to MultiSupervisedRunner

* Updated Dockerfile-dev and Dockerfile-dev-fp16 with installing requirements/requirements-hydra.txt

* Update check_dl_cv.sh and run.py for hydra-tests fix

* Update config.py and hydra_config.py

* catalyst/utils/hydra_config.py: prepare_config() -> prepare_hydra_config()

Co-authored-by: Sergey Kolesnikov <[email protected]>
  • Loading branch information
otherman16 and Scitator authored Dec 20, 2020
1 parent 51428d7 commit 6d453a2
Show file tree
Hide file tree
Showing 21 changed files with 1,452 additions and 176 deletions.
60 changes: 60 additions & 0 deletions bin/tests/check_dl_cv.sh
Original file line number Diff line number Diff line change
Expand Up @@ -603,5 +603,65 @@ fi
rm -rf ./tests/logs/_tests_cv_segmentation


################################ pipeline 23 ################################
echo 'pipeline 23'
python3 -m pip install hydra-core

EXPDIR=./tests/_tests_cv_classification_hydra
LOGDIR=./tests/logs/_tests_cv_classification_hydra
LOGFILE=${LOGDIR}/checkpoints/_metrics.json

PYTHONPATH=./examples:.:${PYTHONPATH} \
python catalyst/dl/scripts/run.py \
--hydra \
--config-dir ${EXPDIR} \
--config-name conf/config_train.yaml \
args.expdir=${EXPDIR} \
args.logdir=${LOGDIR} \
args.check=1

if [[ ! (-f "$LOGFILE" && -r "$LOGFILE") ]]; then
echo "File $LOGFILE does not exist"
exit 1
fi

cat $LOGFILE
echo 'pipeline 23'
python -c """
from catalyst import utils
metrics = utils.load_config('$LOGFILE')
# assert metrics['train.2']['loss'] < metrics['train.1']['loss']
assert metrics['train.1']['loss'] < 2.0
assert metrics['train.2']['loss'] < 3.3
"""

if [[ "$USE_DDP" != "1" ]]; then
PYTHONPATH=./examples:.:${PYTHONPATH} \
python catalyst/dl/scripts/run.py \
--hydra \
--config-dir ${EXPDIR} \
--config-name conf/config_infer.yaml \
args.expdir=${EXPDIR} \
args.logdir=${LOGDIR} \
args.resume=${LOGDIR}/checkpoints/best.pth \
vals.out_dir="." \
vals.out_prefix="predictions/"

cat $LOGFILE
echo 'pipeline 23 - infer'
python -c """
import numpy as np
data = np.load('${LOGDIR}/predictions/infer.logits.npy')
print(data.shape)
assert data.shape == (10000, 10)
"""

fi

rm -rf ${LOGDIR}

python3 -m pip uninstall -y hydra-core


################################ pipeline 99 ################################
rm -rf ./tests/logs
51 changes: 51 additions & 0 deletions catalyst/dl/scripts/hydra_run.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import logging

import hydra
from omegaconf import DictConfig

from catalyst.utils.distributed import get_rank
from catalyst.utils.hydra_config import prepare_hydra_config
from catalyst.utils.misc import set_global_seed
from catalyst.utils.scripts import (
distributed_cmd_run,
dump_code,
import_module,
)
from catalyst.utils.sys import dump_environment
from catalyst.utils.torch import prepare_cudnn

logger = logging.getLogger(__name__)


def main_worker(cfg: DictConfig):
set_global_seed(cfg.args.seed)
prepare_cudnn(cfg.args.deterministic, cfg.args.benchmark)

import_module(hydra.utils.to_absolute_path(cfg.args.expdir))

experiment = hydra.utils.instantiate(cfg.experiment, cfg=cfg)
runner = hydra.utils.instantiate(cfg.runner)

if experiment.logdir is not None and get_rank() <= 0:
dump_environment(cfg, experiment.logdir)
dump_code(
hydra.utils.to_absolute_path(cfg.args.expdir), experiment.logdir
)

runner.run_experiment(experiment)


@hydra.main()
def main(cfg: DictConfig):
"""
Hydra config catalyst-dl run entry point
Args:
cfg: (DictConfig) configuration
"""
cfg = prepare_hydra_config(cfg)
distributed_cmd_run(main_worker, cfg.args.distributed, cfg)


__all__ = ["main"]
15 changes: 13 additions & 2 deletions catalyst/dl/scripts/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
from argparse import ArgumentParser
import os
from pathlib import Path
import sys

from catalyst.settings import IS_HYDRA_AVAILABLE
from catalyst.utils.distributed import get_rank
from catalyst.utils.misc import boolean_flag, set_global_seed
from catalyst.utils.parser import parse_args_uargs
Expand All @@ -16,6 +18,9 @@
from catalyst.utils.sys import dump_environment
from catalyst.utils.torch import prepare_cudnn

if IS_HYDRA_AVAILABLE:
from catalyst.dl.scripts.hydra_run import main as hydra_main


def build_args(parser: ArgumentParser):
"""Constructs the command-line arguments for ``catalyst-dl run``."""
Expand All @@ -27,7 +32,7 @@ def build_args(parser: ArgumentParser):
help="path to config/configs",
metavar="CONFIG_PATH",
dest="configs",
required=True,
required=False,
)
parser.add_argument("--expdir", type=str, default=None)
parser.add_argument("--logdir", type=str, default=None)
Expand Down Expand Up @@ -94,6 +99,8 @@ def build_args(parser: ArgumentParser):
help="Deterministic mode if running in CuDNN backend",
)
boolean_flag(parser, "benchmark", default=None, help="Use CuDNN benchmark")
if IS_HYDRA_AVAILABLE:
boolean_flag(parser, "hydra", default=None, help="Use Hydra")

return parser

Expand Down Expand Up @@ -133,4 +140,8 @@ def main(args, unknown_args):

if __name__ == "__main__":
args, unknown_args = parse_args()
main(args, unknown_args)
if IS_HYDRA_AVAILABLE and args.hydra:
sys.argv.remove("--hydra")
hydra_main()
else:
main(args, unknown_args)
13 changes: 12 additions & 1 deletion catalyst/experiments/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,16 @@
from catalyst.experiments.auto import AutoCallbackExperiment
from catalyst.experiments.config import ConfigExperiment

from catalyst.settings import IS_HYDRA_AVAILABLE

__all__ = ["ConfigExperiment", "Experiment", "AutoCallbackExperiment"]
if IS_HYDRA_AVAILABLE:
from catalyst.experiments.hydra_config import HydraConfigExperiment

__all__ = [
"ConfigExperiment",
"Experiment",
"AutoCallbackExperiment",
"HydraConfigExperiment",
]
else:
__all__ = ["ConfigExperiment", "Experiment", "AutoCallbackExperiment"]
Loading

0 comments on commit 6d453a2

Please sign in to comment.