From c0951c8a19065d3fb45bc4f7c3b5e0ba6f500add Mon Sep 17 00:00:00 2001 From: Jerry Liang <66143562+jerrylian-db@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:57:15 -0800 Subject: [PATCH] Deprecate model registry stages in docs (#10480) Signed-off-by: Jerry Liang Signed-off-by: Jerry Liang <66143562+jerrylian-db@users.noreply.github.com> Co-authored-by: WeichenXu Co-authored-by: Siddharth Murching --- README_SKINNY.rst | 2 +- .../mlflow_registry_transitions.png | Bin 107645 -> 0 bytes docs/source/getting-started/index.rst | 2 +- .../getting-started/quickstart-2/index.rst | 13 +- docs/source/introduction/index.rst | 4 +- docs/source/model-registry.rst | 137 ++++++++++++++---- docs/source/rest-api.rst | 2 + mlflow/tracking/client.py | 3 +- 8 files changed, 122 insertions(+), 41 deletions(-) delete mode 100644 docs/source/_static/images/quickstart_mlops/mlflow_registry_transitions.png diff --git a/README_SKINNY.rst b/README_SKINNY.rst index 6f0bc73598d25..c554c89c44752 100644 --- a/README_SKINNY.rst +++ b/README_SKINNY.rst @@ -6,7 +6,7 @@ MLflow Skinny is a lightweight MLflow package without SQL storage, server, UI, o MLflow Skinny supports: * Tracking operations (logging / loading / searching params, metrics, tags + logging / loading artifacts) -* Model registration, search, artifact loading, and transitions +* Model registration, search, artifact loading, and deployment * Execution of GitHub projects within notebook & against a remote target. Additional dependencies can be installed to leverage the full feature set of MLflow. For example: diff --git a/docs/source/_static/images/quickstart_mlops/mlflow_registry_transitions.png b/docs/source/_static/images/quickstart_mlops/mlflow_registry_transitions.png deleted file mode 100644 index 9c92f6e1b8bb17e7d4a8028b318b412512d3e6d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107645 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%0DeN;3)Rg?+k*-G2%pav(% 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

Wi=9 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 diff --git a/docs/source/getting-started/index.rst b/docs/source/getting-started/index.rst index 03e741e09fceb..dc6e73935c566 100644 --- a/docs/source/getting-started/index.rst +++ b/docs/source/getting-started/index.rst @@ -13,7 +13,7 @@ In this brief introductory quickstart on MLflow Tracking, you will learn how to * **Log** training statistics (loss, accuracy, etc.) and hyperparameters for a model * **Log** (save) a model for later retrieval -* **Register** a model to enable state transitions for deployment +* **Register** a model to enable deployment * **Load** the model and use it for inference In the process of learning these key concepts, you will be exposed to the MLflow fluent API, the MLflow Tracking UI, and learn how to add metadata associated with diff --git a/docs/source/getting-started/quickstart-2/index.rst b/docs/source/getting-started/quickstart-2/index.rst index 8b419ce91848f..7bfab41936021 100644 --- a/docs/source/getting-started/quickstart-2/index.rst +++ b/docs/source/getting-started/quickstart-2/index.rst @@ -208,14 +208,7 @@ Choose the best run and register it as a model. In the **Table view**, choose th Now, your model is available for deployment. You can see it in the **Models** page of the MLflow UI. Open the page for the model you just registered. -You can add a description for the model, add tags, and easily navigate back to the source run that generated this model. You can also transition the model to different stages. For example, you can transition the model to **Staging** to indicate that it is ready for testing. You can transition it to **Production** to indicate that it is ready for deployment. - -Transition the model to **Staging** by choosing the **Stage** dropdown: - -.. image:: ../../_static/images/quickstart_mlops/mlflow_registry_transitions.png - :width: 800px - :align: center - :alt: Screenshot of MLflow tracking UI models page showing the registered model +You can add a description for the model, add tags, and easily navigate back to the source run that generated this model. You can also apply aliases and tags to the model for easier organization and deployment. For more information, see :ref:`registry`. Serve the model locally ---------------------------- @@ -224,7 +217,7 @@ MLflow allows you to easily serve models produced by any run or model version. Y .. code-block:: bash - mlflow models serve -m "models:/wine-quality/Staging" --port 5002 + mlflow models serve -m "models:/wine-quality/1" --port 5002 (Note that specifying the port as above will be necessary if you are running the tracking server on the same machine at the default port of **5000**.) @@ -256,7 +249,7 @@ Most routes toward deployment will use a container to package your model, its de mlflow models build-docker --model-uri "models:/wine-quality/1" --name "qs_mlops" -This command builds a Docker image named ``qs_mlops`` that contains your model and its dependencies. The ``model-uri`` in this case specifies a version number (``/1``) rather than a lifecycle stage (``/staging``), but you can use whichever integrates best with your workflow. It will take several minutes to build the image. Once it completes, you can run the image to provide real-time inferencing locally, on-prem, on a bespoke Internet server, or cloud platform. You can run it locally with: +This command builds a Docker image named ``qs_mlops`` that contains your model and its dependencies. It will take several minutes to build the image. Once it completes, you can run the image to provide real-time inferencing locally, on-prem, on a bespoke Internet server, or cloud platform. You can run it locally with: .. code-block:: bash diff --git a/docs/source/introduction/index.rst b/docs/source/introduction/index.rst index 665db459e3d92..a65861af35637 100644 --- a/docs/source/introduction/index.rst +++ b/docs/source/introduction/index.rst @@ -25,7 +25,7 @@ foundational components: * :ref:`Tracking `: MLflow Tracking provides both an API and UI dedicated to the logging of parameters, code versions, metrics, and artifacts during the ML process. This centralized repository captures details such as parameters, metrics, artifacts, data, and environment configurations, giving teams insight into their models' evolution over time. Whether working in standalone scripts, notebooks, or other environments, Tracking facilitates the logging of results either to local files or a server, making it easier to compare multiple runs across different users. -* :ref:`Model Registry `: A systematic approach to model management, the Model Registry assists in handling different versions of models, discerning their current state, and ensuring a smooth transition from development to production. It offers a centralized model store, APIs, and UI to collaboratively manage an MLflow Model's full lifecycle, including model lineage, versioning, stage transitions, and annotations. +* :ref:`Model Registry `: A systematic approach to model management, the Model Registry assists in handling different versions of models, discerning their current state, and ensuring smooth productionization. It offers a centralized model store, APIs, and UI to collaboratively manage an MLflow Model's full lifecycle, including model lineage, versioning, aliasing, tagging, and annotations. * :ref:`AI Gateway `: This server, equipped with a set of standardized APIs, streamlines access to both SaaS and OSS LLM models. It serves as a unified interface, bolstering security through authenticated access, and offers a common set of APIs for prominent LLMs. @@ -51,7 +51,7 @@ Ensuring productivity and efficiency throughout this lifecycle poses several cha - **Deployment Consistency**: With the plethora of ML libraries available, there's often no standardized way to package and deploy models. Custom solutions can lead to inconsistencies, and the crucial link between a model and the code and parameters that produced it might be lost. -- **Model Management**: As data science teams produce numerous models, managing these models, their versions, and stage transitions becomes a significant hurdle. Without a centralized platform, managing model lifecycles, from development to staging to production, becomes unwieldy. +- **Model Management**: As data science teams produce numerous models, managing, testing, and continuously deploying these models becomes a significant hurdle. Without a centralized platform, managing model lifecycles becomes unwieldy. - **Library Agnosticism**: While individual ML libraries might offer solutions to some of the challenges, achieving the best results often involves experimenting across multiple libraries. A platform that offers compatibility with various libraries while ensuring models are usable as reproducible "black boxes" is essential. diff --git a/docs/source/model-registry.rst b/docs/source/model-registry.rst index c091f8d04f1c1..6a00c412b700e 100644 --- a/docs/source/model-registry.rst +++ b/docs/source/model-registry.rst @@ -22,10 +22,10 @@ Model An MLflow Model is created from an experiment or run that is logged with one of the model flavor’s ``mlflow..log_model()`` methods. Once logged, this model can then be registered with the Model Registry. Registered Model - An MLflow Model can be registered with the Model Registry. A registered model has a unique name, contains versions, associated transitional stages, model lineage, and other metadata. + An MLflow Model can be registered with the Model Registry. A registered model has a unique name, contains versions, aliases, tags, and other metadata. Model Version - Each registered model can have one or many versions. When a new model is added to the Model Registry, it is added as version 1. Each new model registered to the same model name increments the version number. + Each registered model can have one or many versions. When a new model is added to the Model Registry, it is added as version 1. Each new model registered to the same model name increments the version number. Model versions have tags, which can be useful for tracking attributes of the model version (e.g. `pre_deploy_checks: "PASSED"`) .. _using-registered-model-aliases: @@ -40,9 +40,6 @@ Tags Annotations and Descriptions You can annotate the top-level model and each version individually using Markdown, including description and any relevant information useful for the team such as algorithm descriptions, dataset employed or methodology. -Model Stage - Each distinct model version can be assigned one stage at any given time. MLflow provides predefined stages for common use-cases such as *Staging*, *Production* or *Archived*. You can transition a model version from one stage to another stage. - Model Registry Workflows ======================== If running your own MLflow server, you must use a database-backed backend store in order to access @@ -277,21 +274,6 @@ To fetch a model version by alias, specify the model alias in the model URI, and Note that model alias assignments can be updated independently of your production code. If the ``champion`` alias in the snippet above is reassigned to a new model version in the Model Registry, the next execution of this snippet will automatically pick up the new model version. This allows you to decouple model deployments from your inference workloads. -**Fetch the latest model version in a specific stage** - -To fetch a model version by stage, simply provide the model stage as part of the model URI, and it will fetch the most recent version of the model in that stage. - -.. code-block:: python - - import mlflow.pyfunc - - model_name = "sk-learn-random-forest-reg-model" - stage = "Staging" - - model = mlflow.pyfunc.load_model(model_uri=f"models:/{model_name}/{stage}") - - model.predict(data) - Serving an MLflow Model from Model Registry ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -519,7 +501,7 @@ This code snippet creates a sklearn model, which we assume that you had created Coefficient of determination: 0.47 -Once saved in pickled format, we can load the sklearn model into memory using pickle API and +Once saved in pickled format, you can load the sklearn model into memory using pickle API and register the loaded model with the Model Registry. .. code-block:: python @@ -557,7 +539,7 @@ register the loaded model with the Model Registry. Model name: SklearnLinearRegression, version 1 Created version '1' of model 'SklearnLinearRegression'. -Now, using MLflow fluent APIs, we reload the model from the Model Registry and score. +Now, using MLflow fluent APIs, you reload the model from the Model Registry and score. .. code-block:: python @@ -705,8 +687,15 @@ save, log, register, and load from the Model Registry and score. -- {'neg': 0.0, 'neu': 0.446, 'pos': 0.554, 'compound': 0.816} -- {'neg': 0.357, 'neu': 0.643, 'pos': 0.0, 'compound': -0.8034} -Transitioning an MLflow Model’s Stage -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Deprecated: Using Model Stages +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. warning:: Model Stages are deprecated and will be removed in a future major release. To learn more about this deprecation, see our :ref:`migration guide` below. + +See the sections below on using Model Stages in the MLflow Model Registry. + +**Transitioning an MLflow Model’s Stage** + Over the course of the model’s lifecycle, a model evolves—from development to staging to production. You can transition a registered model to one of the stages: **Staging**, **Production** or **Archived**. @@ -719,8 +708,23 @@ You can transition a registered model to one of the stages: **Staging**, **Produ The accepted values for are: Staging|Archived|Production|None. -Archiving an MLflow Model -^^^^^^^^^^^^^^^^^^^^^^^^^ +**Fetch the latest model version in a specific stage** + +To fetch a model version by stage, simply provide the model stage as part of the model URI, and it will fetch the most recent version of the model in that stage. + +.. code-block:: python + + import mlflow.pyfunc + + model_name = "sk-learn-random-forest-reg-model" + stage = "Staging" + + model = mlflow.pyfunc.load_model(model_uri=f"models:/{model_name}/{stage}") + + model.predict(data) + +**Archiving an MLflow Model** + You can move models versions out of a **Production** stage into an **Archived** stage. At a later point, if that archived model is not needed, you can delete it. @@ -732,3 +736,84 @@ At a later point, if that archived model is not needed, you can delete it. name="sk-learn-random-forest-reg-model", version=3, stage="Archived" ) +.. _migrating-from-stages: + +Migrating from Stages +===================== + +As of MLflow 2.9.0, Model Stages have been deprecated and will be removed in a future major release. This is the culmination of extensive feedback on the inflexibility of model stages for expressing MLOps workflows, from which we developed and introduced of new tools for managing and deploying models in the MLflow Model Registry. Learn more below. + +New model deployment tools +-------------------------- + +Model stages were used to express the lifecycle of MLflow Models for productionization and deployment. Users transitioned model versions through four fixed stages (from **none**, to **staging**, to **production**, and then to **archived**) as they proposed, validated, deployed, and deprecated models for their ML use-cases. In doing so, model registry stages provided labeling and aliasing functionality for the model versions, by denoting the status of a model version in the UI and providing named references to model versions in the code (e.g. ``/Staging`` in the model URI). Model registry stages were also used to denote the environment that the model is in, though it was not possible to set up access controls for them. + +To replace and improve upon stages, we elevated **model version tags** in the UI and introduced **model version aliases** to provide flexible and powerful ways to label and alias MLflow models in the Model Registry. We also made it possible to **set up separate environments** for your models and configure access controls for each environment. + +**Model version tags** + +Model version tags can be used to annotate model versions with their status. For example, you could apply a tag of key ``validation_status`` and value ``pending`` to a model version while it is being validated and then update the tag value to ``passed`` when it has passed smoke tests and performance tests. + +**Model version aliases** + +Model version aliases provide a flexible way to create named references for particular model versions, and are useful for identifying which model version(s) are deployed within an environment. For example, setting a **champion** alias on a model version enables you to fetch the model version by that alias via the :meth:`~mlflow.client.MlflowClient.get_model_version_by_alias` client API or the model URI ``models:/@champion``. Aliases can be reassigned to new model versions via the UI and client API. Unlike model registry stages, more than one alias can be applied to any given model version, allowing for easier A/B testing and model rollout. + +**Set up separate environments for models** + +In mature DevOps and MLOps workflows, organizations use separate environments (typically, dev, staging, and prod) with access controls to enable quick development without compromising stability in production. With :ref:`MLflow Authentication `, you can use registered models to express access-controlled environments for your MLflow models. For example, you can create registered models corresponding to each combination of environment and business problem (e.g. `prod.ml_team.revenue_forecasting`, `dev.ml_team.revenue_forecasting`) and configure permissions accordingly. Automate model retraining against your production registered models, or for simple model deployment use cases, use :meth:`~mlflow.client.MlflowClient.copy_model_version` to promote model versions across registered models. + +Migrating models away from stages +--------------------------------- + +See the information below to learn how to use the new tools for your legacy Model Stage use-cases. + +**Model environments** + +To set up separate environments and permissions for your model versions, create separate registered models: + +* Given a base name for your model’s use-case, e.g. ``revenue_forecasting``, set up various registered models corresponding to your environments with different prefixes. +* For example, if you want three separate dev, staging, and production environments, you can set up ``dev.ml_team.revenue_forecasting``, ``staging.ml_team.revenue_forecasting``, and ``prod.ml_team.revenue_forecasting`` registered models. +* Use :ref:`MLflow Authentication ` to grant appropriate permissions on these models. + +**Transition models across environments** + +Once you have registered models set up for each environment, you can build your MLOps workflows on top of them. + +* For simple model promotion use cases, you can first register your MLflow models under the dev registered model and then promote models across environments using the :meth:`~mlflow.client.MlflowClient.copy_model_version` client API. +* For more mature production-grade setups, we recommend promoting your ML code (including model training code, inference code, and ML infrastructure as code) across environments. This eliminates the need to transition models across environments. Dev ML code is experimental and in a dev environment, hence targeting the dev registered model. Before merging developed ML code into your source code repository, your CI stages the code in a staging environment for integration testing (targeting the staging registered model). Post-merge, the ML code is deployed to production for automated retraining (targeting the prod registered model). Such setups enable safe and robust CI/CD of ML systems - including not just model training, but also feature engineering, model monitoring, and automated retraining. + +**Model aliasing** + +To specify (via named references) which model version to deploy to serve traffic within an environment (e.g. production), use **model aliases**: + +1. Decide on an equivalent model alias for each model registry stage (e.g., **champion** for the **Production** stage, to specify the model intended to serve the majority of traffic) +2. Assign the chosen alias to the latest model version under each stage. You can use the helper function below for this. +3. Update ML workflows to target the alias rather than the stage. For example, the model URI ``models:/regression_model/Production`` will be replaced by the model URI ``models:/prod.ml_team.regression_model@champion`` in the production code. + +.. code-block:: python + + from mlflow import MlflowClient + + # Initialize an MLflow Client + client = MlflowClient() + + + def assign_alias_to_stage(model_name, stage, alias): + """ + Assign an alias to the latest version of a registered model within a specified stage. + + :param model_name: The name of the registered model. + :param stage: The stage of the model version for which the alias is to be assigned. Can be + "Production", "Staging", "Archived", or "None". + :param alias: The alias to assign to the model version. + :return: None + """ + latest_mv = client.get_latest_versions(model_name, stages=[stage])[0] + client.set_registered_model_alias(model_name, alias, latest_mv.version) + +**Model status** + +To represent and communicate the status of your model versions, use model version tags: + +* Set tags on model versions to indicate the status of the model. +* For example, to indicate the review status of a model version, you can set a tag with key ``validation_status`` and value ``pending`` or ``passed``. \ No newline at end of file diff --git a/docs/source/rest-api.rst b/docs/source/rest-api.rst index 4a7c93e1e7172..bbf97c4acef81 100755 --- a/docs/source/rest-api.rst +++ b/docs/source/rest-api.rst @@ -1588,6 +1588,7 @@ Request Structure Get Latest ModelVersions ======================== +.. warning:: Model Stages are deprecated and will be removed in a future major release. To learn more about this deprecation, see our :ref:`migration guide`. +------------------------------------------------------+-------------+ | Endpoint | HTTP Method | @@ -2003,6 +2004,7 @@ Response Structure Transition ModelVersion Stage ============================= +.. warning:: Model Stages are deprecated and will be removed in a future major release. To learn more about this deprecation, see our :ref:`migration guide`. +------------------------------------------------+-------------+ | Endpoint | HTTP Method | diff --git a/mlflow/tracking/client.py b/mlflow/tracking/client.py index 3d3498f70691c..1c612380e386f 100644 --- a/mlflow/tracking/client.py +++ b/mlflow/tracking/client.py @@ -65,7 +65,8 @@ _STAGES_DEPRECATION_WARNING = ( "Model registry stages will be removed in a future major release. To learn more about the " - "deprecation of model registry stages, see https://github.com/mlflow/mlflow/issues/10336" + "deprecation of model registry stages, see our migration guide here: https://mlflow.org/docs/" + f"{mlflow.__version__.replace('.dev0', '')}/model-registry.html#migrating-from-stages" )