New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add optional experiment_id parameter to mlflow.set_experiment
#5012
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -65,6 +65,8 @@ def set_experiment(experiment_name: str = None, experiment_id: str = None) -> No | |
created. | ||
:param experiment_id: ID of the experiment to be activated. If an experiment with this ID | ||
does not exist, an exception is thrown. | ||
:return: An instance of :py:class:`mlflow.entities.Experiment` representing the new active | ||
experiment. | ||
|
||
.. code-block:: python | ||
:caption: Example | ||
|
@@ -97,24 +99,10 @@ def set_experiment(experiment_name: str = None, experiment_id: str = None) -> No | |
error_code=INVALID_PARAMETER_VALUE, | ||
) | ||
|
||
def verify_experiment_active(experiment): | ||
if experiment.lifecycle_stage != LifecycleStage.ACTIVE: | ||
raise MlflowException( | ||
message=( | ||
"Cannot set a deleted experiment '%s' as the active experiment." | ||
" You can restore the experiment, or permanently delete the " | ||
" experiment to create a new one." % experiment.name | ||
), | ||
error_code=INVALID_PARAMETER_VALUE, | ||
) | ||
|
||
client = MlflowClient() | ||
if experiment_id is None: | ||
experiment = client.get_experiment_by_name(experiment_name) | ||
if experiment: | ||
verify_experiment_active(experiment) | ||
experiment_id = experiment.experiment_id | ||
else: | ||
if not experiment: | ||
_logger.info( | ||
"Experiment with name '%s' does not exist. Creating a new experiment.", | ||
experiment_name, | ||
|
@@ -123,17 +111,28 @@ def verify_experiment_active(experiment): | |
# simultaneously, a race condition may be encountered here wherein experiment creation | ||
# fails | ||
experiment_id = client.create_experiment(experiment_name) | ||
experiment = client.get_experiment(experiment_id) | ||
else: | ||
experiment = client.get_experiment(experiment_id) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does this function throw if experiment_id doesn't exist? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 404 in REST and throws in file_store and sqlalchemy_store There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks @BenWilson2 ! Yes, while this throws for MLflow-native stores, it may not always throw for alternative stores. I don't think the |
||
if experiment is None: | ||
raise MlflowException( | ||
message=f"Experiment with ID '{experiment_id}' does not exist.", | ||
error_code=RESOURCE_DOES_NOT_EXIST, | ||
) | ||
verify_experiment_active(experiment) | ||
|
||
if experiment.lifecycle_stage != LifecycleStage.ACTIVE: | ||
raise MlflowException( | ||
message=( | ||
"Cannot set a deleted experiment '%s' as the active experiment." | ||
" You can restore the experiment, or permanently delete the " | ||
" experiment to create a new one." % experiment.name | ||
), | ||
error_code=INVALID_PARAMETER_VALUE, | ||
) | ||
|
||
global _active_experiment_id | ||
_active_experiment_id = experiment_id | ||
_active_experiment_id = experiment.experiment_id | ||
return experiment | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This actually simplifies some MLOps pipeline flows! A bonus feature is always a great thing |
||
|
||
|
||
class ActiveRun(Run): # pylint: disable=W0223 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a potential race condition here between client.get_experiment_by_name() and client.create_experiment(experiment_name). It could cause issues in distributed logging situation. I don't think you need to fix it here, but might be good to annotate the code to make future life easier.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a good call-out. It's worth noting that the MLflow fluent API in general is not meant to be safe across threads or processes. I've added a note here nonetheless.