The world's cleanest AutoML library ✨ - Do hyperparameter tuning with the right pipeline abstractions to write clean deep learning production pipelines. Let your pipeline steps have hyperparameter spaces. Design steps in your pipeline like components. Compatible with Scikit-Learn, TensorFlow, and most other libraries, frameworks and MLOps environments.
The RecursiveDict suffered from a case of being poorly written. This lead to massive loss of time on flattening calls which were numerous and mostly superfluous in base.py (see #432). I re-wrote and simplified the whole data structure, add removed nearly all flatening calls. A few classes needed to be adapted to these modifications.
Introducing ExecutionPhase
We've had a case in one of our projects where we couldn't differentiate at run time between the computation of post-epoch training metric and production setup. The addition of ExecutionPhase aims at providing a simple way to define different phase-dependent behavior. ExecutionPhase is an enum with the following case : UNSPECIFIED, PRETRAIN, TRAIN , VALIDATION, TEST, PROD. By default, a context has an UNSPECIFIED ExecutionPhase.
We've added ExecutionPhaseSwitch and IfExecutionPhaseIsThenDo (should maybe renamed?) to handle simple case of phase-dependent behavior. (NOTE : IfExecutionPhaseIsThenDo is to be rewritten when we'll introduce the more abstract ExecuteIf class. Probably when I'll go through PR #319.)
To notice :
By its nature, ForceHandleMixin introduce a context with UNSPECIFIED ExecutionPhase.
ExecutionPhase can be used instead of the is_train attribute, which we could eventually remove along the self.apply("set_train") calls.
Introducing ForceHandleIdentity
There seems to be quite a few time we need a class which inherit from both ForceHandleMixin and Identity. We have now the ForceHandleIdentity class which does so and is ready to use.
Other modifications
I've put warn=False by default in every mutate function. I find it really annoying since the mutate make uses of apply, thus is called recursively on every step of the pipeline and it prints a warning for every step which don't have matching mutate keys with the call (which, let's face it, is most of the pipeline in all use cases we have).
I've added conditions in TrialMetricsPlottingObserver to ignore every metric that isn't a float or an int. Also added todo relative to issue #439.
Removed calls to .save_trial() in MetricCallback and added one at the end of each epoch instead.
Added a set_batch_size function to MinibatchSequentialPipeline
Complete rewriting of RecursiveDict
The RecursiveDict suffered from a case of being poorly written. This lead to massive loss of time on flattening calls which were numerous and mostly superfluous in base.py (see #432). I re-wrote and simplified the whole data structure, add removed nearly all flatening calls. A few classes needed to be adapted to these modifications.
Introducing ExecutionPhase
We've had a case in one of our projects where we couldn't differentiate at run time between the computation of post-epoch training metric and production setup. The addition of ExecutionPhase aims at providing a simple way to define different phase-dependent behavior. ExecutionPhase is an enum with the following case : UNSPECIFIED, PRETRAIN, TRAIN , VALIDATION, TEST, PROD. By default, a context has an UNSPECIFIED ExecutionPhase.
We've added ExecutionPhaseSwitch and IfExecutionPhaseIsThenDo (should maybe renamed?) to handle simple case of phase-dependent behavior. (NOTE : IfExecutionPhaseIsThenDo is to be rewritten when we'll introduce the more abstract ExecuteIf class. Probably when I'll go through PR #319.)
To notice :
Introducing ForceHandleIdentity
There seems to be quite a few time we need a class which inherit from both ForceHandleMixin and Identity. We have now the ForceHandleIdentity class which does so and is ready to use.
Other modifications