Repository: mlflow/mlflow
Pull request: adding MlflowClient to top level mlflow package
Signed-off-by: subramaniam02 <subramaniam02@gmail.com>

## Related Issues/PRs

Close #6080 

## What changes are proposed in this pull request?
- added MlflowClient at top level mlflow package
- changed all references of `from mlflow.tracking import MlflowClient`

## How is this patch tested?

- [ ] I have written tests (not required for typo or doc fix) and confirmed the proposed feature/bug-fix/change works.

<!--
Please describe how you confirmed the proposed feature/bug-fix/change works here. For example, if you fixed an MLflow client API, you could attach the code that didn't work prior to the fix but works now, or if you added a new feature on MLflow UI, you could attach a video that demonstrates the feature.
-->

## Does this PR change the documentation?

- [ ] No. You can skip the rest of this section.
- [x] Yes. Make sure the changed pages / sections render correctly by following the steps below.

1. Check the status of the `ci/circleci: build_doc` check. If it's successful, proceed to the
   next step, otherwise fix it.
2. Click `Details` on the right to open the job page of CircleCI.
3. Click the `Artifacts` tab.
4. Click `docs/build/html/index.html`.
5. Find the changed pages / sections and make sure they render correctly.

## Release Notes

### Is this a user-facing change?

- [ ] No. You can skip the rest of this section.
- [x] Yes. Give a description of this change to be included in the release notes for MLflow users.


### What component(s), interfaces, languages, and integrations does this PR affect?
Components
- [ ] `area/artifacts`: Artifact stores and artifact logging
- [ ] `area/build`: Build and test infrastructure for MLflow
- [ ] `area/docs`: MLflow documentation pages
- [x] `area/examples`: Example code
- [ ] `area/model-registry`: Model Registry service, APIs, and the fluent client calls for Model Registry
- [ ] `area/models`: MLmodel format, model serialization/deserialization, flavors
- [ ] `area/projects`: MLproject format, project running backends
- [ ] `area/scoring`: MLflow Model server, model deployment tools, Spark UDFs
- [ ] `area/server-infra`: MLflow Tracking server backend
- [x] `area/tracking`: Tracking Service, tracking client APIs, autologging

Interface
- [ ] `area/uiux`: Front-end, user experience, plotting, JavaScript, JavaScript dev server
- [ ] `area/docker`: Docker use across MLflow's components, such as MLflow Projects and MLflow Models
- [ ] `area/sqlalchemy`: Use of SQLAlchemy in the Tracking Service or Model Registry
- [ ] `area/windows`: Windows support

Language
- [ ] `language/r`: R APIs and clients
- [ ] `language/java`: Java APIs and clients
- [ ] `language/new`: Proposals for new client languages

Integrations
- [ ] `integrations/azure`: Azure and Azure ML integrations
- [ ] `integrations/sagemaker`: SageMaker integrations
- [ ] `integrations/databricks`: Databricks integrations


<a name="release-note-category"></a>
### How should the PR be classified in the release notes? Choose one:

- [ ] `rn/breaking-change` - The PR will be mentioned in the "Breaking Changes" section
- [ ] `rn/none` - No description will be included. The PR will be mentioned only by the PR number in the "Small Bugfixes and Documentation Updates" section
- [x] `rn/feature` - A new user-facing feature worth mentioning in the release notes
- [ ] `rn/bug-fix` - A user-facing bug fix worth mentioning in the release notes
- [x] `rn/documentation` - A user-facing documentation change worth mentioning in the release notes


Problem statement:
[FR] [Roadmap] Alias client at top-level
## MLflow Roadmap Item

This is an MLflow Roadmap item that has been prioritized by the MLflow maintainers. We’ve identified this feature as a highly requested addition to the MLflow package based on community feedback. 
We're seeking a community contribution for the implementation of this feature and will enthusiastically support the development and review of a submitted PR for this.

## Contribution Note

As with other roadmap items, there may be a desire for multiple contributors to work on an issue. While we don’t discourage collaboration, we strongly encourage that a primary contributor is assigned to roadmap issues to simplify the merging process. 
The items on the roadmap are of a high priority. Due to the wide-spread demand of roadmap features, we encourage potential contributors to only agree to take on the work of creating a PR, making changes, and ensuring that test coverage is adequately created for the feature if they are willing and able to see the implementation through to a merged state. 

## Feature scope

This roadmap feature’s complexity is classified as:

- [X] `good-first-issue`: This feature is limited in complexity and effort required to implement.
- [ ] `simple`: This feature does not require a large amount of effort to implement and / or is clear enough to not need a design discussion with maintainers.
- [ ] `involved`: This feature will require a substantial amount of development effort but does not require an agreed-upon design from the maintainers. The feedback given during the PR phase may be involved and necessitate multiple iterations before approval. (Please bear with us as we collaborate with you to make a great contribution)
- [ ] `design-recommended`: This is a substantial feature that should have a design document approved prior to working on an implementation (to save your time, not ours). After agreeing to work on this feature, a maintainer will be assigned to support you throughout the development process.

## Proposal Summary

Create an alias at the top package level for `mlflow.tracking.MlflowClient()` to more accurately reflect its common usage and to simplify import and caller statements. 
The client constructor should be referable from: `mlflow.MlflowClient()`.

Note: this is simply adding an alias, not changing the package classpath to move the client constructor.

## Motivation
> #### What is the use case for this feature? 
  Simplify the user experience.
> #### Why is this use case valuable to support for MLflow users in general? 
  Everyone (*citation needed) appreciates typing less.
> #### Why is it currently difficult to achieve this use case? 
  N/A

### What component(s), interfaces, languages, and integrations does this feature affect?
Components 
- [ ] `area/artifacts`: Artifact stores and artifact logging
- [ ] `area/build`: Build and test infrastructure for MLflow
- [ ] `area/docs`: MLflow documentation pages
- [ ] `area/examples`: Example code
- [ ] `area/model-registry`: Model Registry service, APIs, and the fluent client calls for Model Registry
- [ ] `area/models`: MLmodel format, model serialization/deserialization, flavors
- [ ] `area/projects`: MLproject format, project running backends
- [ ] `area/scoring`: MLflow Model server, model deployment tools, Spark UDFs
- [ ] `area/server-infra`: MLflow Tracking server backend
- [X] `area/tracking`: Tracking Service, tracking client APIs, autologging

Interfaces
- [ ] `area/uiux`: Front-end, user experience, plotting, JavaScript, JavaScript dev server
- [ ] `area/docker`: Docker use across MLflow's components, such as MLflow Projects and MLflow Models
- [ ] `area/sqlalchemy`: Use of SQLAlchemy in the Tracking Service or Model Registry
- [ ] `area/windows`: Windows support

Languages 
- [ ] `language/r`: R APIs and clients
- [ ] `language/java`: Java APIs and clients
- [ ] `language/new`: Proposals for new client languages

Integrations
- [ ] `integrations/azure`: Azure and Azure ML integrations
- [ ] `integrations/sagemaker`: SageMaker integrations
- [ ] `integrations/databricks`: Databricks integrations

Hints from issue discussion:
@BenWilson2 I am willing to contribute.
@subramaniam02 awesome! Thanks for taking this! 
Please perform a search within MLflow after creating the alias and replace all in-code references to the alias (including tests) and let me know if you have any questions while working on the PR!
@BenWilson2 I am thinking of creating 2 PRs. One for code changes (tests, mlflow package), other for examples and docs. What do you think ? I am yet to run tests and verify. In next 1-2 days PR will be ready for review. Thanks
Sounds great! Let me know if you get stuck with the docs portion. Sphinx can be a little finicky to interpret from the local cli command.

Commit message: Autoformat: https://github.com/mlflow/mlflow/actions/runs/2543969877

Signed-off-by: mlflow-automation <mlflow-automation@users.noreply.github.com>

Patch to review:
diff --git a/docs/source/model-registry.rst b/docs/source/model-registry.rst
index 3262e64ab71f0..d81425624e9c1 100644
--- a/docs/source/model-registry.rst
+++ b/docs/source/model-registry.rst
@@ -135,12 +135,12 @@ For this method, you will need the ``run_id`` as part of the ``runs:URI`` argume
 If a registered model with the name doesn’t exist, the method registers a new model, creates Version 1, and returns a ModelVersion MLflow object.
 If a registered model with the name exists, the method creates a new model version and returns the version object.
 
-And finally, you can use the :meth:`~mlflow.tracking.MlflowClient.create_registered_model` to create a new registered model. If the model name exists,
+And finally, you can use the :meth:`~mlflow.MlflowClient.create_registered_model` to create a new registered model. If the model name exists,
 this method will throw an :class:`~mlflow.exceptions.MlflowException` because creating a new registered model requires a unique name.
 
 .. code-block:: py
 
-   from mlflow.tracking import MlflowClient
+   from mlflow import MlflowClient
 
    client = MlflowClient()
    client.create_registered_model("sk-learn-random-forest-reg-model")
@@ -213,7 +213,7 @@ After you have registered an MLflow model, you can serve the model as a service
 Adding or Updating an MLflow Model Descriptions
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-At any point in a model’s lifecycle development, you can update a model version's description using :meth:`~mlflow.tracking.MlflowClient.update_model_version`.
+At any point in a model’s lifecycle development, you can update a model version's description using :meth:`~mlflow.MlflowClient.update_model_version`.
 
 .. code-block:: py
 
@@ -227,7 +227,7 @@ At any point in a model’s lifecycle development, you can update a model versio
 Renaming an MLflow Model
 ^^^^^^^^^^^^^^^^^^^^^^^^
 
-As well as adding or updating a description of a specific version of the model, you can rename an existing registered model using :meth:`~mlflow.tracking.MlflowClient.rename_registered_model`.
+As well as adding or updating a description of a specific version of the model, you can rename an existing registered model using :meth:`~mlflow.MlflowClient.rename_registered_model`.
 
 .. code-block:: py
 
@@ -277,7 +277,7 @@ This outputs:
         'name': 'sk-learn-random-forest-reg-model'}
 
 With hundreds of models, it can be cumbersome to peruse the results returned from this call. A more efficient approach would be to search for a specific model name and list its version
-details using :meth:`~mlflow.tracking.MlflowClient.search_model_versions` method
+details using :meth:`~mlflow.MlflowClient.search_model_versions` method
 and provide a filter string such as ``"name='sk-learn-random-forest-reg-model'"``
 
 .. code-block:: py
diff --git a/docs/source/search-syntax.rst b/docs/source/search-syntax.rst
index 3e29780c1cc90..cff6661473328 100644
--- a/docs/source/search-syntax.rst
+++ b/docs/source/search-syntax.rst
@@ -142,7 +142,7 @@ multiple experiments, use one of the client APIs.
 Python
 ^^^^^^
 
-Use the :py:func:`mlflow.tracking.MlflowClient.search_runs` or :py:func:`mlflow.search_runs` API to
+Use the :py:func:`mlflow.MlflowClient.search_runs` or :py:func:`mlflow.search_runs` API to
 search programmatically. You can specify the list of columns to order by
 (for example, "metrics.rmse") in the ``order_by`` column. The column can contain an
 optional ``DESC`` or ``ASC`` value; the default is ``ASC``. The default ordering is to sort by
diff --git a/docs/source/tracking.rst b/docs/source/tracking.rst
index 1907ec7acd334..6cc03d03226bd 100644
--- a/docs/source/tracking.rst
+++ b/docs/source/tracking.rst
@@ -305,11 +305,11 @@ with no active run automatically starts a new one.
 currently active run, if any.
 **Note**: You cannot access currently-active run attributes
 (parameters, metrics, etc.) through the run returned by ``mlflow.active_run``. In order to access
-such attributes, use the :py:class:`mlflow.tracking.MlflowClient` as follows:
+such attributes, use the :py:class:`mlflow.MlflowClient` as follows:
 
 .. code-block:: py
 
-    client = mlflow.tracking.MlflowClient()
+    client = mlflow.MlflowClient()
     data = client.get_run(mlflow.active_run().info.run_id).data
 
 :py:func:`mlflow.last_active_run` retuns a :py:class:`mlflow.entities.Run` object corresponding to the
@@ -738,7 +738,7 @@ add tags to a run, and more.
 Adding Tags to Runs
 ~~~~~~~~~~~~~~~~~~~
 
-The :py:func:`mlflow.tracking.MlflowClient.set_tag` function lets you add custom tags to runs. A tag can only have a single unique value mapped to it at a time. For example:
+The :py:func:`mlflow.MlflowClient.set_tag` function lets you add custom tags to runs. A tag can only have a single unique value mapped to it at a time. For example:
 
 .. code-block:: py
 
diff --git a/examples/hyperparam/search_hyperopt.py b/examples/hyperparam/search_hyperopt.py
index 10e028bf149f1..9fc107703ba14 100644
--- a/examples/hyperparam/search_hyperopt.py
+++ b/examples/hyperparam/search_hyperopt.py
@@ -17,7 +17,7 @@
 from hyperopt import fmin, hp, tpe, rand
 
 import mlflow.projects
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 
 _inf = np.finfo(np.float64).max
 
@@ -36,7 +36,7 @@ def train(training_data, max_runs, epochs, metric, algo, seed):
     Run hyperparameter optimization.
     """
     # create random file to store run ids of the training tasks
-    tracking_client = mlflow.tracking.MlflowClient()
+    tracking_client = MlflowClient()
 
     def new_eval(
         nepochs, experiment_id, null_train_loss, null_valid_loss, null_test_loss, return_all=False
diff --git a/examples/hyperparam/search_random.py b/examples/hyperparam/search_random.py
index 55d034f721833..68b9d49c3c84b 100644
--- a/examples/hyperparam/search_random.py
+++ b/examples/hyperparam/search_random.py
@@ -19,7 +19,7 @@
 import mlflow.sklearn
 import mlflow.tracking
 import mlflow.projects
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 
 _inf = np.finfo(np.float64).max
 
@@ -36,7 +36,7 @@ def run(training_data, max_runs, max_p, epochs, metric, seed):
     val_metric = "val_{}".format(metric)
     test_metric = "test_{}".format(metric)
     np.random.seed(seed)
-    tracking_client = mlflow.tracking.MlflowClient()
+    tracking_client = MlflowClient()
 
     def new_eval(
         nepochs, experiment_id, null_train_loss=_inf, null_val_loss=_inf, null_test_loss=_inf
diff --git a/examples/lightgbm/lightgbm_sklearn/utils.py b/examples/lightgbm/lightgbm_sklearn/utils.py
index 00270bb395935..60e08ebbf539e 100644
--- a/examples/lightgbm/lightgbm_sklearn/utils.py
+++ b/examples/lightgbm/lightgbm_sklearn/utils.py
@@ -1,9 +1,9 @@
-import mlflow
+from mlflow import MlflowClient
 
 
 def yield_artifacts(run_id, path=None):
     """Yield all artifacts in the specified run"""
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for item in client.list_artifacts(run_id, path):
         if item.is_dir:
             yield from yield_artifacts(run_id, item.path)
@@ -13,7 +13,7 @@ def yield_artifacts(run_id, path=None):
 
 def fetch_logged_data(run_id):
     """Fetch params, metrics, tags, and artifacts in the specified run"""
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     # Exclude system tags: https://www.mlflow.org/docs/latest/tracking.html#system-tags
     tags = {k: v for k, v in data.tags.items() if not k.startswith("mlflow.")}
diff --git a/examples/mlflow_artifacts/example.py b/examples/mlflow_artifacts/example.py
index c01a62350b8da..addf9f3ad4fe0 100644
--- a/examples/mlflow_artifacts/example.py
+++ b/examples/mlflow_artifacts/example.py
@@ -3,6 +3,7 @@
 from pprint import pprint
 
 import mlflow
+from mlflow import MlflowClient
 
 
 def save_text(path, text):
@@ -34,10 +35,11 @@ def main():
     # Log artifacts
     run_id1 = log_artifacts()
     # Download artifacts
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     print("Downloading artifacts")
     pprint(os.listdir(client.download_artifacts(run_id1, "")))
     pprint(os.listdir(client.download_artifacts(run_id1, "dir")))
+
     # List artifacts
     print("Listing artifacts")
     pprint(client.list_artifacts(run_id1))
diff --git a/examples/multistep_workflow/main.py b/examples/multistep_workflow/main.py
index d24ffc4a5ba72..4f053744b4c4e 100644
--- a/examples/multistep_workflow/main.py
+++ b/examples/multistep_workflow/main.py
@@ -10,6 +10,7 @@
 
 
 import mlflow
+from mlflow import MlflowClient
 from mlflow.utils import mlflow_tags
 from mlflow.entities import RunStatus
 from mlflow.utils.logging_utils import eprint
@@ -23,7 +24,7 @@ def _already_ran(entry_point_name, parameters, git_commit, experiment_id=None):
     successfully and have at least the parameters provided.
     """
     experiment_id = experiment_id if experiment_id is not None else _get_experiment_id()
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     all_run_infos = reversed(client.list_run_infos(experiment_id))
     for run_info in all_run_infos:
         full_run = client.get_run(run_info.run_id)
@@ -71,7 +72,7 @@ def _get_or_run(entrypoint, parameters, git_commit, use_cache=True):
         return existing_run
     print("Launching new run for entrypoint=%s and parameters=%s" % (entrypoint, parameters))
     submitted_run = mlflow.run(".", entrypoint, parameters=parameters)
-    return mlflow.tracking.MlflowClient().get_run(submitted_run.run_id)
+    return MlflowClient().get_run(submitted_run.run_id)
 
 
 @click.command()
diff --git a/examples/pip_requirements/pip_requirements.py b/examples/pip_requirements/pip_requirements.py
index 87622217224cd..dbcb23f528b64 100644
--- a/examples/pip_requirements/pip_requirements.py
+++ b/examples/pip_requirements/pip_requirements.py
@@ -9,6 +9,7 @@
 from sklearn.datasets import load_iris
 import xgboost as xgb
 import mlflow
+from mlflow import MlflowClient
 
 
 def read_lines(path):
@@ -17,7 +18,7 @@ def read_lines(path):
 
 
 def get_pip_requirements(run_id, artifact_path, return_constraints=False):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     req_path = client.download_artifacts(run_id, f"{artifact_path}/requirements.txt")
     reqs = read_lines(req_path)
 
diff --git a/examples/remote_store/remote_server.py b/examples/remote_store/remote_server.py
index 3f780e7ff3f76..00103d71594ca 100644
--- a/examples/remote_store/remote_server.py
+++ b/examples/remote_store/remote_server.py
@@ -13,6 +13,7 @@
     active_run,
     get_tracking_uri,
     log_artifact,
+    MlflowClient,
 )
 
 if __name__ == "__main__":
@@ -24,7 +25,7 @@
     log_metric("random_int", random.randint(0, 100))
     run_id = active_run().info.run_id
     # Get run metadata & data from the tracking server
-    service = mlflow.tracking.MlflowClient()
+    service = MlflowClient()
     run = service.get_run(run_id)
     print("Metadata & data for run with UUID %s: %s" % (run_id, run))
     local_dir = tempfile.mkdtemp()
diff --git a/examples/shap/binary_classification.py b/examples/shap/binary_classification.py
index e9afbf97f1aa8..fccf42b0772e5 100644
--- a/examples/shap/binary_classification.py
+++ b/examples/shap/binary_classification.py
@@ -6,6 +6,7 @@
 import shap
 
 import mlflow
+from mlflow import MlflowClient
 
 
 # prepare training data
@@ -22,7 +23,7 @@
     mlflow.shap.log_explanation(lambda X: model.predict_proba(X)[:, 1], X)
 
 # list artifacts
-client = mlflow.tracking.MlflowClient()
+client = MlflowClient()
 artifact_path = "model_explanations_shap"
 artifacts = [x.path for x in client.list_artifacts(run.info.run_id, artifact_path)]
 print("# artifacts:")
diff --git a/examples/shap/multiclass_classification.py b/examples/shap/multiclass_classification.py
index b4c5cb65698c0..a97e71e4255cd 100644
--- a/examples/shap/multiclass_classification.py
+++ b/examples/shap/multiclass_classification.py
@@ -6,6 +6,7 @@
 import shap
 
 import mlflow
+from mlflow import MlflowClient
 
 
 # prepare training data
@@ -21,7 +22,7 @@
     mlflow.shap.log_explanation(model.predict_proba, X)
 
 # list artifacts
-client = mlflow.tracking.MlflowClient()
+client = MlflowClient()
 artifact_path = "model_explanations_shap"
 artifacts = [x.path for x in client.list_artifacts(run.info.run_id, artifact_path)]
 print("# artifacts:")
diff --git a/examples/shap/regression.py b/examples/shap/regression.py
index faf6ff778901d..91b98b295552e 100644
--- a/examples/shap/regression.py
+++ b/examples/shap/regression.py
@@ -6,6 +6,7 @@
 import shap
 
 import mlflow
+from mlflow import MlflowClient
 
 
 # prepare training data
@@ -22,7 +23,7 @@
     mlflow.shap.log_explanation(model.predict, X)
 
 # list artifacts
-client = mlflow.tracking.MlflowClient()
+client = MlflowClient()
 artifact_path = "model_explanations_shap"
 artifacts = [x.path for x in client.list_artifacts(run.info.run_id, artifact_path)]
 print("# artifacts:")
diff --git a/examples/sklearn_autolog/utils.py b/examples/sklearn_autolog/utils.py
index 00270bb395935..72429c0a13847 100644
--- a/examples/sklearn_autolog/utils.py
+++ b/examples/sklearn_autolog/utils.py
@@ -1,9 +1,10 @@
 import mlflow
+from mlflow import MlflowClient
 
 
 def yield_artifacts(run_id, path=None):
     """Yield all artifacts in the specified run"""
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for item in client.list_artifacts(run_id, path):
         if item.is_dir:
             yield from yield_artifacts(run_id, item.path)
@@ -13,7 +14,7 @@ def yield_artifacts(run_id, path=None):
 
 def fetch_logged_data(run_id):
     """Fetch params, metrics, tags, and artifacts in the specified run"""
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     # Exclude system tags: https://www.mlflow.org/docs/latest/tracking.html#system-tags
     tags = {k: v for k, v in data.tags.items() if not k.startswith("mlflow.")}
diff --git a/examples/xgboost/xgboost_sklearn/utils.py b/examples/xgboost/xgboost_sklearn/utils.py
index 00270bb395935..72429c0a13847 100644
--- a/examples/xgboost/xgboost_sklearn/utils.py
+++ b/examples/xgboost/xgboost_sklearn/utils.py
@@ -1,9 +1,10 @@
 import mlflow
+from mlflow import MlflowClient
 
 
 def yield_artifacts(run_id, path=None):
     """Yield all artifacts in the specified run"""
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for item in client.list_artifacts(run_id, path):
         if item.is_dir:
             yield from yield_artifacts(run_id, item.path)
@@ -13,7 +14,7 @@ def yield_artifacts(run_id, path=None):
 
 def fetch_logged_data(run_id):
     """Fetch params, metrics, tags, and artifacts in the specified run"""
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     # Exclude system tags: https://www.mlflow.org/docs/latest/tracking.html#system-tags
     tags = {k: v for k, v in data.tags.items() if not k.startswith("mlflow.")}
diff --git a/mlflow/__init__.py b/mlflow/__init__.py
index 4d85ae45a9ad4..24ce2d923fd08 100644
--- a/mlflow/__init__.py
+++ b/mlflow/__init__.py
@@ -159,6 +159,7 @@
 autolog = mlflow.tracking.fluent.autolog
 evaluate = mlflow.models.evaluate
 last_active_run = mlflow.tracking.fluent.last_active_run
+MlflowClient = tracking.MlflowClient
 
 run = projects.run
 
@@ -200,4 +201,5 @@
     "autolog",
     "evaluate",
     "last_active_run",
+    "MlflowClient",
 ] + _model_flavors_supported
diff --git a/mlflow/_spark_autologging.py b/mlflow/_spark_autologging.py
index a133753157243..30905477e3506 100644
--- a/mlflow/_spark_autologging.py
+++ b/mlflow/_spark_autologging.py
@@ -7,8 +7,8 @@
 from py4j.java_gateway import CallbackServerParameters
 
 import mlflow
+from mlflow import MlflowClient
 from mlflow.exceptions import MlflowException
-from mlflow.tracking.client import MlflowClient
 from mlflow.tracking.context.abstract_context import RunContextProvider
 from mlflow.utils import _truncate_and_ellipsize
 from mlflow.utils.autologging_utils import (
diff --git a/mlflow/fastai/__init__.py b/mlflow/fastai/__init__.py
index dd0570c2a1f6b..566ca0d44ff8b 100644
--- a/mlflow/fastai/__init__.py
+++ b/mlflow/fastai/__init__.py
@@ -281,7 +281,7 @@ def log_model(
 
         import fastai.vision as vis
         import mlflow.fastai
-        from mlflow.tracking import MlflowClient
+        from mlflow import MlflowClient
 
         def main(epochs=5, learning_rate=0.01):
             # Download and untar the MNIST data set
@@ -442,7 +442,7 @@ def autolog(
 
         import fastai.vision as vis
         import mlflow.fastai
-        from mlflow.tracking import MlflowClient
+        from mlflow import MlflowClient
 
         def print_auto_logged_info(r):
             tags = {k: v for k, v in r.data.tags.items() if not k.startswith("mlflow.")}
diff --git a/mlflow/models/evaluation/base.py b/mlflow/models/evaluation/base.py
index d4f558da518e6..7825f6abe2189 100644
--- a/mlflow/models/evaluation/base.py
+++ b/mlflow/models/evaluation/base.py
@@ -3,6 +3,7 @@
 import hashlib
 import json
 import os
+from mlflow.tracking.client import MlflowClient
 from contextlib import contextmanager
 from mlflow.exceptions import MlflowException
 from mlflow.utils.file_utils import TempDir
@@ -617,7 +618,7 @@ def _evaluate(
     global _last_failed_evaluator
     _last_failed_evaluator = None
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     model_uuid = model.metadata.model_uuid
     dataset._log_dataset_tag(client, run_id, model_uuid)
 
diff --git a/mlflow/models/evaluation/default_evaluator.py b/mlflow/models/evaluation/default_evaluator.py
index 4acaf569deca5..866b89baea720 100644
--- a/mlflow/models/evaluation/default_evaluator.py
+++ b/mlflow/models/evaluation/default_evaluator.py
@@ -1,4 +1,5 @@
 import mlflow
+from mlflow import MlflowClient
 from mlflow.exceptions import MlflowException
 from mlflow.models.evaluation.base import (
     ModelEvaluator,
@@ -1007,7 +1008,7 @@ def evaluate(
         import matplotlib
 
         with TempDir() as temp_dir, matplotlib.rc_context(_matplotlib_config):
-            self.client = mlflow.tracking.MlflowClient()
+            self.client = MlflowClient()
 
             self.temp_dir = temp_dir
             self.model = model
diff --git a/mlflow/paddle/__init__.py b/mlflow/paddle/__init__.py
index 13678a70d2c0b..9d42411c3c0c3 100644
--- a/mlflow/paddle/__init__.py
+++ b/mlflow/paddle/__init__.py
@@ -510,13 +510,14 @@ def autolog(
 
         import paddle
         import mlflow
+        from mlflow import MlflowClient
 
 
         def show_run_data(run_id):
             run = mlflow.get_run(run_id)
             print("params: {}".format(run.data.params))
             print("metrics: {}".format(run.data.metrics))
-            client = mlflow.tracking.MlflowClient()
+            client = MlflowClient()
             artifacts = [f.path for f in client.list_artifacts(run.info.run_id, "model")]
             print("artifacts: {}".format(artifacts))
 
diff --git a/mlflow/pyspark/ml/__init__.py b/mlflow/pyspark/ml/__init__.py
index 8c8e567947956..3dd50c1a55682 100644
--- a/mlflow/pyspark/ml/__init__.py
+++ b/mlflow/pyspark/ml/__init__.py
@@ -6,8 +6,8 @@
 import weakref
 
 import mlflow
-from mlflow.entities import Metric, Param
 from mlflow.tracking.client import MlflowClient
+from mlflow.entities import Metric, Param
 from mlflow.utils import (
     _chunk_dict,
     _truncate_dict,
@@ -690,7 +690,7 @@ def log_post_training_metric(self, run_id, key, value):
         """
         # Note: if the case log the same metric key multiple times,
         #  newer value will overwrite old value
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         client.log_metric(run_id=run_id, key=key, value=value)
         if self._metric_info_artifact_need_update[run_id]:
             evaluator_call_list = []
diff --git a/mlflow/pytorch/__init__.py b/mlflow/pytorch/__init__.py
index defc873f7af8e..0436ff6f5a769 100644
--- a/mlflow/pytorch/__init__.py
+++ b/mlflow/pytorch/__init__.py
@@ -948,7 +948,7 @@ def autolog(
             from pytorch_lightning.metrics.functional import accuracy
 
         import mlflow.pytorch
-        from mlflow.tracking import MlflowClient
+        from mlflow import MlflowClient
 
         # For brevity, here is the simplest most minimal example with just a training
         # loop step, (no validation, no testing). It illustrates how you can use MLflow
diff --git a/mlflow/shap.py b/mlflow/shap.py
index 98c497273e5d3..a1a7f78373108 100644
--- a/mlflow/shap.py
+++ b/mlflow/shap.py
@@ -216,6 +216,7 @@ def predict_function(X) -> pred:
         from sklearn.linear_model import LinearRegression
 
         import mlflow
+        from mlflow import MlflowClient
 
         # prepare training data
         X, y = dataset = load_diabetes(return_X_y=True, as_frame=True)
@@ -231,7 +232,7 @@ def predict_function(X) -> pred:
             mlflow.shap.log_explanation(model.predict, X)
 
         # list artifacts
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         artifact_path = "model_explanations_shap"
         artifacts = [x.path for x in client.list_artifacts(run.info.run_id, artifact_path)]
         print("# artifacts:")
diff --git a/mlflow/sklearn/__init__.py b/mlflow/sklearn/__init__.py
index 73b2d97c1ddc7..7269a26cc89ca 100644
--- a/mlflow/sklearn/__init__.py
+++ b/mlflow/sklearn/__init__.py
@@ -23,6 +23,7 @@
 
 import mlflow
 from mlflow import pyfunc
+from mlflow.tracking.client import MlflowClient
 from mlflow.exceptions import MlflowException
 from mlflow.models import Model
 from mlflow.models.model import MLMODEL_FILE_NAME
@@ -848,7 +849,7 @@ def log_post_training_metric(self, run_id, key, value):
         """
         # Note: if the case log the same metric key multiple times,
         #  newer value will overwrite old value
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         client.log_metric(run_id=run_id, key=key, value=value)
         if self._metric_info_artifact_need_update[run_id]:
             call_commands_list = []
@@ -1093,9 +1094,10 @@ def autolog(
         import numpy as np
         from sklearn.linear_model import LinearRegression
         import mlflow
+        from mlflow import MlflowClient
 
         def fetch_logged_data(run_id):
-            client = mlflow.tracking.MlflowClient()
+            client = MlflowClient()
             data = client.get_run(run_id).data
             tags = {k: v for k, v in data.tags.items() if not k.startswith("mlflow.")}
             artifacts = [f.path for f in client.list_artifacts(run_id, "model")]
diff --git a/mlflow/sklearn/utils.py b/mlflow/sklearn/utils.py
index 5023e65e9a872..888446a09462e 100644
--- a/mlflow/sklearn/utils.py
+++ b/mlflow/sklearn/utils.py
@@ -7,7 +7,7 @@
 import time
 import warnings
 
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.file_utils import TempDir
 from mlflow.utils.mlflow_tags import MLFLOW_PARENT_RUN_ID
 from mlflow.utils.arguments_utils import _get_arg_names
diff --git a/mlflow/store/artifact/databricks_models_artifact_repo.py b/mlflow/store/artifact/databricks_models_artifact_repo.py
index 21c73b7c14fa8..09ae193f9a9ae 100644
--- a/mlflow/store/artifact/databricks_models_artifact_repo.py
+++ b/mlflow/store/artifact/databricks_models_artifact_repo.py
@@ -45,12 +45,11 @@ def __init__(self, artifact_uri):
                 error_code=INVALID_PARAMETER_VALUE,
             )
         super().__init__(artifact_uri)
-        from mlflow.tracking import MlflowClient
 
         self.databricks_profile_uri = (
             get_databricks_profile_uri_from_artifact_uri(artifact_uri) or mlflow.get_registry_uri()
         )
-        client = MlflowClient(registry_uri=self.databricks_profile_uri)
+        client = mlflow.tracking.MlflowClient(registry_uri=self.databricks_profile_uri)
         self.model_name, self.model_version = get_model_name_and_version(client, artifact_uri)
 
     def _call_endpoint(self, json, endpoint):
diff --git a/mlflow/store/artifact/models_artifact_repo.py b/mlflow/store/artifact/models_artifact_repo.py
index 0b3329419ecd8..1eab025dc97b4 100644
--- a/mlflow/store/artifact/models_artifact_repo.py
+++ b/mlflow/store/artifact/models_artifact_repo.py
@@ -59,12 +59,11 @@ def split_models_uri(uri):
     def get_underlying_uri(uri):
         # Note: to support a registry URI that is different from the tracking URI here,
         # we'll need to add setting of registry URIs via environment variables.
-        from mlflow.tracking import MlflowClient
 
         databricks_profile_uri = (
             get_databricks_profile_uri_from_artifact_uri(uri) or mlflow.get_registry_uri()
         )
-        client = MlflowClient(registry_uri=databricks_profile_uri)
+        client = mlflow.MlflowClient(registry_uri=databricks_profile_uri)
         (name, version) = get_model_name_and_version(client, uri)
         download_uri = client.get_model_version_download_uri(name, version)
         return add_databricks_profile_info_to_artifact_uri(download_uri, databricks_profile_uri)
diff --git a/mlflow/tensorflow/__init__.py b/mlflow/tensorflow/__init__.py
index 603b0ae23d555..c3d1cefc04840 100644
--- a/mlflow/tensorflow/__init__.py
+++ b/mlflow/tensorflow/__init__.py
@@ -25,12 +25,12 @@
 import mlflow
 import mlflow.keras
 from mlflow import pyfunc
+from mlflow.tracking.client import MlflowClient
 from mlflow.exceptions import MlflowException
 from mlflow.models import Model
 from mlflow.models.model import MLMODEL_FILE_NAME, _LOG_MODEL_METADATA_WARNING_TEMPLATE
 from mlflow.models.signature import ModelSignature
 from mlflow.models.utils import ModelInputExample, _save_example
-from mlflow.tracking import MlflowClient
 from mlflow.tracking.artifact_utils import _download_artifact_from_uri, get_artifact_uri
 from mlflow.utils import is_iterator
 from mlflow.utils.annotations import keyword_only
@@ -573,7 +573,7 @@ def _flush_queue():
         # flush operation should proceed; all others are redundant and should be dropped
         acquired_lock = _metric_queue_lock.acquire(blocking=False)
         if acquired_lock:
-            client = mlflow.tracking.MlflowClient()
+            client = MlflowClient()
             # For thread safety and to avoid modifying a list while iterating over it, we record a
             # separate list of the items being flushed and remove each one from the metric queue,
             # rather than clearing the metric queue or reassigning it (clearing / reassigning is
diff --git a/mlflow/tracking/_model_registry/fluent.py b/mlflow/tracking/_model_registry/fluent.py
index 3f69c3281c442..961e046b6f34c 100644
--- a/mlflow/tracking/_model_registry/fluent.py
+++ b/mlflow/tracking/_model_registry/fluent.py
@@ -1,8 +1,8 @@
+from mlflow.tracking.client import MlflowClient
 from mlflow.exceptions import MlflowException
 from mlflow.entities.model_registry import ModelVersion
 from mlflow.protos.databricks_pb2 import RESOURCE_ALREADY_EXISTS, ErrorCode
 from mlflow.store.artifact.runs_artifact_repo import RunsArtifactRepository
-from mlflow.tracking import MlflowClient
 from mlflow.utils.logging_utils import eprint
 from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS
 
diff --git a/mlflow/tracking/client.py b/mlflow/tracking/client.py
index 25ee6f3339d6c..8f670527ec9c5 100644
--- a/mlflow/tracking/client.py
+++ b/mlflow/tracking/client.py
@@ -127,7 +127,7 @@ def get_run(self, run_id: str) -> Run:
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             with mlflow.start_run() as run:
                 mlflow.log_param("p", 0)
@@ -161,7 +161,7 @@ def get_metric_history(self, run_id: str, key: str) -> List[Metric]:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_metric_info(history):
                 for m in history:
@@ -238,7 +238,7 @@ def create_run(
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             # Create a run with a tag under the default experiment (whose id is '0').
             tags = {"engineering": "ML Platform"}
@@ -291,7 +291,7 @@ def list_run_infos(
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from mlflow.entities import ViewType
 
             def print_run_infos(run_infos):
@@ -356,7 +356,7 @@ def list_experiments(
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from mlflow.entities import ViewType
 
             def print_experiment_info(experiments):
@@ -406,7 +406,7 @@ def get_experiment(self, experiment_id: str) -> Experiment:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             client = MlflowClient()
             exp_id = client.create_experiment("Experiment")
@@ -439,7 +439,7 @@ def get_experiment_by_name(self, name: str) -> Optional[Experiment]:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             # Case-sensitive name
             client = MlflowClient()
@@ -480,7 +480,7 @@ def create_experiment(
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             # Create an experiment with a name that is unique and case sensitive.
             client = MlflowClient()
@@ -515,7 +515,7 @@ def delete_experiment(self, experiment_id: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             # Create an experiment with a name that is unique and case sensitive
             client = MlflowClient()
@@ -546,7 +546,7 @@ def restore_experiment(self, experiment_id: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_experiment_info(experiment):
                 print("Name: {}".format(experiment.name))
@@ -590,7 +590,7 @@ def rename_experiment(self, experiment_id: str, new_name: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_experiment_info(experiment):
                 print("Name: {}".format(experiment.name))
@@ -652,7 +652,7 @@ def log_metric(
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_run_info(r):
                 print("run_id: {}".format(r.info.run_id))
@@ -705,7 +705,7 @@ def log_param(self, run_id: str, key: str, value: Any) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_run_info(r):
                 print("run_id: {}".format(r.info.run_id))
@@ -753,7 +753,7 @@ def set_experiment_tag(self, experiment_id: str, key: str, value: Any) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             # Create an experiment and set its tag
             client = MlflowClient()
@@ -789,7 +789,7 @@ def set_tag(self, run_id: str, key: str, value: Any) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_run_info(run):
                 print("run_id: {}".format(run.info.run_id))
@@ -828,7 +828,7 @@ def delete_tag(self, run_id: str, key: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_run_info(run):
                 print("run_id: {}".format(run.info.run_id))
@@ -881,7 +881,7 @@ def log_batch(
 
             import time
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from mlflow.entities import Metric, Param, RunTag
 
             def print_run_info(r):
@@ -927,7 +927,7 @@ def log_artifact(self, run_id, local_path, artifact_path=None) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             features = "rooms, zipcode, median_price, school_rating, transport"
             with open("features.txt", 'w') as f:
@@ -1031,7 +1031,7 @@ def log_text(self, run_id: str, text: str, artifact_file: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             client = MlflowClient()
             run = client.create_run(experiment_id="0")
@@ -1064,7 +1064,7 @@ def log_dict(self, run_id: str, dictionary: Any, artifact_file: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             client = MlflowClient()
             run = client.create_run(experiment_id="0")
@@ -1335,7 +1335,7 @@ def list_artifacts(self, run_id: str, path=None) -> List[FileInfo]:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
              def print_artifact_info(artifact):
                 print("artifact: {}".format(artifact.path))
@@ -1393,7 +1393,7 @@ def download_artifacts(self, run_id: str, path: str, dst_path: Optional[str] = N
 
             import os
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             features = "rooms, zipcode, median_price, school_rating, transport"
             with open("features.txt", 'w') as f:
@@ -1432,7 +1432,7 @@ def set_terminated(
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_run_info(r):
                 print("run_id: {}".format(r.info.run_id))
@@ -1473,7 +1473,7 @@ def delete_run(self, run_id: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             # Create a run under the default experiment (whose id is '0').
             client = MlflowClient()
@@ -1503,7 +1503,7 @@ def restore_run(self, run_id: str) -> None:
         .. code-block:: python
             :caption: Example
 
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             # Create a run under the default experiment (whose id is '0').
             client = MlflowClient()
@@ -1559,7 +1559,7 @@ def search_runs(
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from mlflow.entities import ViewType
 
             def print_run_info(runs):
@@ -1640,7 +1640,7 @@ def create_registered_model(
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_registered_model_info(rm):
                 print("name: {}".format(rm.name))
@@ -1678,7 +1678,7 @@ def rename_registered_model(self, name: str, new_name: str) -> RegisteredModel:
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_registered_model_info(rm):
                 print("name: {}".format(rm.name))
@@ -1777,7 +1777,7 @@ def delete_registered_model(self, name: str):
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_registered_models_info(r_models):
                 print("--")
@@ -1837,7 +1837,7 @@ def list_registered_models(
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_model_info(models):
                 for m in models:
@@ -1900,7 +1900,7 @@ def search_registered_models(
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             client = MlflowClient()
 
@@ -1959,7 +1959,7 @@ def get_registered_model(self, name: str) -> RegisteredModel:
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_model_info(rm):
                 print("--")
@@ -2002,7 +2002,7 @@ def get_latest_versions(self, name: str, stages: List[str] = None) -> List[Model
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             def print_models_info(mv):
@@ -2068,7 +2068,7 @@ def set_registered_model_tag(self, name, key, value) -> None:
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_model_info(rm):
                 print("--")
@@ -2114,7 +2114,7 @@ def delete_registered_model_tag(self, name: str, key: str) -> None:
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             def print_registered_models_info(r_models):
                 print("--")
@@ -2185,7 +2185,7 @@ def create_model_version(
 
             import mlflow.sklearn
             from mlflow.store.artifact.runs_artifact_repo import RunsArtifactRepository
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             mlflow.set_tracking_uri("sqlite:///mlruns.db")
@@ -2301,7 +2301,7 @@ def update_model_version(
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             def print_model_version_info(mv):
@@ -2371,7 +2371,7 @@ def transition_model_version_stage(
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             def print_model_version_info(mv):
@@ -2433,7 +2433,7 @@ def delete_model_version(self, name: str, version: str) -> None:
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             def print_models_info(mv):
@@ -2511,7 +2511,7 @@ def get_model_version(self, name: str, version: str) -> ModelVersion:
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             # Create two runs Log MLflow entities
@@ -2566,7 +2566,7 @@ def get_model_version_download_uri(self, name: str, version: str) -> str:
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             mlflow.set_tracking_uri("sqlite:///mlruns.db")
@@ -2609,7 +2609,7 @@ def search_model_versions(self, filter_string: str) -> PagedList[ModelVersion]:
             :caption: Example
 
             import mlflow
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
 
             client = MlflowClient()
 
@@ -2650,7 +2650,7 @@ def get_model_version_stages(
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             mlflow.set_tracking_uri("sqlite:///mlruns.db")
@@ -2695,7 +2695,7 @@ def set_model_version_tag(self, name: str, version: str, key: str, value: Any) -
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             def print_model_version_info(mv):
@@ -2753,7 +2753,7 @@ def delete_model_version_tag(self, name: str, version: str, key: str) -> None:
             :caption: Example
 
             import mlflow.sklearn
-            from mlflow.tracking import MlflowClient
+            from mlflow import MlflowClient
             from sklearn.ensemble import RandomForestRegressor
 
             def print_model_version_info(mv):
diff --git a/mlflow/tracking/default_experiment/databricks_job_experiment_provider.py b/mlflow/tracking/default_experiment/databricks_job_experiment_provider.py
index 730e533eb63a9..3c9c57d229b19 100644
--- a/mlflow/tracking/default_experiment/databricks_job_experiment_provider.py
+++ b/mlflow/tracking/default_experiment/databricks_job_experiment_provider.py
@@ -1,7 +1,7 @@
 import logging
+from mlflow.tracking.client import MlflowClient
 from mlflow.tracking.default_experiment.abstract_context import DefaultExperimentProvider
 from mlflow.utils import databricks_utils
-from mlflow.tracking.client import MlflowClient
 from mlflow.utils.mlflow_tags import (
     MLFLOW_DATABRICKS_JOB_TYPE_INFO,
     MLFLOW_EXPERIMENT_SOURCE_TYPE,
diff --git a/mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py b/mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py
index ce5aa899b71f5..a223736b04be7 100644
--- a/mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py
+++ b/mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py
@@ -1,6 +1,6 @@
+from mlflow.tracking.client import MlflowClient
 from mlflow.exceptions import MlflowException
 from mlflow.protos import databricks_pb2
-from mlflow.tracking import MlflowClient
 from mlflow.tracking.default_experiment.abstract_context import DefaultExperimentProvider
 from mlflow.utils import databricks_utils
 from mlflow.utils.mlflow_tags import (
diff --git a/mlflow/tracking/fluent.py b/mlflow/tracking/fluent.py
index 6c91dbb473c19..9e50393705e64 100644
--- a/mlflow/tracking/fluent.py
+++ b/mlflow/tracking/fluent.py
@@ -19,8 +19,7 @@
     INVALID_PARAMETER_VALUE,
     RESOURCE_DOES_NOT_EXIST,
 )
-from mlflow.tracking.client import MlflowClient
-from mlflow.tracking import artifact_utils, _get_store
+from mlflow.tracking import artifact_utils, _get_store, MlflowClient
 from mlflow.tracking.context import registry as context_registry
 from mlflow.tracking.default_experiment import registry as default_experiment_registry
 from mlflow.store.tracking import SEARCH_MAX_RESULTS_DEFAULT
@@ -368,7 +367,7 @@ def active_run() -> Optional[ActiveRun]:
 
     **Note**: You cannot access currently-active run attributes
     (parameters, metrics, etc.) through the run returned by ``mlflow.active_run``. In order
-    to access such attributes, use the :py:class:`mlflow.tracking.MlflowClient` as follows:
+    to access such attributes, use the :py:class:`mlflow.MlflowClient` as follows:
 
     .. code-block:: python
         :caption: Example
@@ -1529,7 +1528,7 @@ def autolog(
 
         import numpy as np
         import mlflow.sklearn
-        from mlflow.tracking import MlflowClient
+        from mlflow import MlflowClient
         from sklearn.linear_model import LinearRegression
 
         def print_auto_logged_info(r):
diff --git a/mlflow/utils/autologging_utils/__init__.py b/mlflow/utils/autologging_utils/__init__.py
index e1a102b7d6946..54e4bd2be29ce 100644
--- a/mlflow/utils/autologging_utils/__init__.py
+++ b/mlflow/utils/autologging_utils/__init__.py
@@ -6,8 +6,8 @@
 import contextlib
 
 import mlflow
-from mlflow.entities import Metric
 from mlflow.tracking.client import MlflowClient
+from mlflow.entities import Metric
 from mlflow.utils.validation import MAX_METRICS_PER_BATCH
 
 # Define the module-level logger for autologging utilities before importing utilities defined in
diff --git a/mlflow/utils/autologging_utils/client.py b/mlflow/utils/autologging_utils/client.py
index dcdb380e8a941..7cd9610d88bff 100644
--- a/mlflow/utils/autologging_utils/client.py
+++ b/mlflow/utils/autologging_utils/client.py
@@ -18,7 +18,6 @@
 
 from mlflow.entities import Param, RunTag, Metric
 from mlflow.exceptions import MlflowException
-from mlflow.tracking.client import MlflowClient
 from mlflow.utils import chunk_list, _truncate_dict
 from mlflow.utils.validation import (
     MAX_ENTITIES_PER_BATCH,
@@ -29,6 +28,7 @@
     MAX_METRICS_PER_BATCH,
 )
 
+from mlflow.tracking.client import MlflowClient
 
 _logger = logging.getLogger(__name__)
 
diff --git a/mlflow/utils/autologging_utils/safety.py b/mlflow/utils/autologging_utils/safety.py
index de3d08a7772be..184dee9984818 100644
--- a/mlflow/utils/autologging_utils/safety.py
+++ b/mlflow/utils/autologging_utils/safety.py
@@ -9,9 +9,9 @@
 import typing
 
 import mlflow
+from mlflow.tracking.client import MlflowClient
 import mlflow.utils.autologging_utils
 from mlflow.entities.run_status import RunStatus
-from mlflow.tracking.client import MlflowClient
 from mlflow.utils import gorilla
 from mlflow.utils import is_iterator
 from mlflow.utils.autologging_utils import _logger
diff --git a/tests/autologging/test_autologging_behaviors_integration.py b/tests/autologging/test_autologging_behaviors_integration.py
index 648dc977126f4..55dcce149893b 100644
--- a/tests/autologging/test_autologging_behaviors_integration.py
+++ b/tests/autologging/test_autologging_behaviors_integration.py
@@ -11,7 +11,7 @@
 from unittest import mock
 
 import mlflow
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils import gorilla
 from mlflow.utils.autologging_utils import (
     safe_patch,
diff --git a/tests/autologging/test_autologging_client.py b/tests/autologging/test_autologging_client.py
index c1cb11999bfb1..e93278d32f3e0 100644
--- a/tests/autologging/test_autologging_client.py
+++ b/tests/autologging/test_autologging_client.py
@@ -4,7 +4,7 @@
 
 import mlflow
 from mlflow.exceptions import MlflowException
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils import _truncate_dict
 from mlflow.utils.autologging_utils import MlflowAutologgingQueueingClient
 from mlflow.utils.validation import (
@@ -17,7 +17,7 @@
 
 
 def get_run_data(run_id):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     # Ignore tags mlflow logs by default (e.g. "mlflow.user")
     tags = {k: v for k, v in data.tags.items() if not k.startswith("mlflow.")}
diff --git a/tests/autologging/test_autologging_safety_unit.py b/tests/autologging/test_autologging_safety_unit.py
index c5dc8eb94af65..fed25d21ae3f3 100644
--- a/tests/autologging/test_autologging_safety_unit.py
+++ b/tests/autologging/test_autologging_safety_unit.py
@@ -12,7 +12,7 @@
 import mlflow
 import mlflow.utils.autologging_utils as autologging_utils
 from mlflow.entities import RunStatus
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.autologging_utils import (
     safe_patch,
     autologging_integration,
diff --git a/tests/autologging/test_autologging_utils.py b/tests/autologging/test_autologging_utils.py
index e03cbf1d865f0..613f29bc7badb 100644
--- a/tests/autologging/test_autologging_utils.py
+++ b/tests/autologging/test_autologging_utils.py
@@ -9,7 +9,7 @@
 
 import mlflow
 from mlflow.utils import gorilla
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.autologging_utils import (
     AUTOLOGGING_INTEGRATIONS,
     log_fn_args_as_params,
@@ -112,7 +112,7 @@ def dummy_fn(arg1, arg2="value2", arg3="value3"):  # pylint: disable=W0613
 @pytest.mark.parametrize("args,kwargs,expected", log_test_args)
 def test_log_fn_args_as_params(args, kwargs, expected, start_run):  # pylint: disable=W0613
     log_fn_args_as_params(dummy_fn, args, kwargs)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     params = client.get_run(mlflow.active_run().info.run_id).data.params
     for arg, value in zip(["arg1", "arg2", "arg3"], expected):
         assert arg in params
@@ -122,7 +122,7 @@ def test_log_fn_args_as_params(args, kwargs, expected, start_run):  # pylint: di
 def test_log_fn_args_as_params_ignores_unwanted_parameters(start_run):  # pylint: disable=W0613
     args, kwargs, unlogged = ("arg1", {"arg2": "value"}, ["arg1", "arg2", "arg3"])
     log_fn_args_as_params(dummy_fn, args, kwargs, unlogged)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     params = client.get_run(mlflow.active_run().info.run_id).data.params
     assert len(params.keys()) == 0
 
@@ -264,7 +264,7 @@ def test_batch_metrics_logger_logs_all_metrics(start_run):
         for i in range(100):
             metrics_logger.record_metrics({hex(i): i}, i)
 
-    metrics_on_run = mlflow.tracking.MlflowClient().get_run(run_id).data.metrics
+    metrics_on_run = MlflowClient().get_run(run_id).data.metrics
 
     for i in range(100):
         assert hex(i) in metrics_on_run
@@ -282,13 +282,13 @@ def test_batch_metrics_logger_flush_logs_to_mlflow(start_run):
         metrics_logger.record_metrics({"my_metric": 10}, 5)
 
         # Recorded metrics should not be logged to mlflow run before flushing BatchMetricsLogger
-        metrics_on_run = mlflow.tracking.MlflowClient().get_run(run_id).data.metrics
+        metrics_on_run = MlflowClient().get_run(run_id).data.metrics
         assert "my_metric" not in metrics_on_run
 
         metrics_logger.flush()
 
         # Recorded metric should be logged to mlflow run after flushing BatchMetricsLogger
-        metrics_on_run = mlflow.tracking.MlflowClient().get_run(run_id).data.metrics
+        metrics_on_run = MlflowClient().get_run(run_id).data.metrics
         assert "my_metric" in metrics_on_run
         assert metrics_on_run["my_metric"] == 10
 
diff --git a/tests/db/test_tracking_operations.py b/tests/db/test_tracking_operations.py
index 43f99a6ecfa53..6abcb6103bbd4 100644
--- a/tests/db/test_tracking_operations.py
+++ b/tests/db/test_tracking_operations.py
@@ -1,6 +1,7 @@
 import pytest
 
 import mlflow
+from mlflow import MlflowClient
 from mlflow.entities import ViewType
 
 
@@ -45,5 +46,5 @@ def test_set_run_status_to_killed():
     """
     with mlflow.start_run() as run:
         pass
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     client.set_terminated(run_id=run.info.run_id, status="KILLED")
diff --git a/tests/fastai/test_fastai_autolog.py b/tests/fastai/test_fastai_autolog.py
index aed67e8bceda5..f5bee39a33042 100644
--- a/tests/fastai/test_fastai_autolog.py
+++ b/tests/fastai/test_fastai_autolog.py
@@ -15,10 +15,10 @@
 
 import mlflow
 import mlflow.fastai
+from mlflow import MlflowClient
 from mlflow.fastai.callback import __MlflowFastaiCallback
 from mlflow.utils.autologging_utils import BatchMetricsLogger
 from tests.conftest import tracking_uri_mock  # pylint: disable=unused-import
-from mlflow.tracking.client import MlflowClient
 
 mpl.use("Agg")
 
@@ -117,7 +117,7 @@ def fastai_random_tabular_data_run(iris_data, fit_variant):
     else:
         model.fit(NUM_EPOCHS)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return model, client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
 
@@ -171,7 +171,7 @@ def test_fastai_autolog_logs_expected_data(fastai_random_tabular_data_run, fit_v
         assert "mom" in data.params
 
     # Testing model_summary.txt is saved
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run.info.run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "module_summary.txt" in artifacts
@@ -190,7 +190,7 @@ def test_fastai_autolog_opt_func_expected_data(iris_data, fit_variant):
     else:
         model.fit(NUM_EPOCHS)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id).data
 
     assert "opt_func" in data.params
@@ -208,7 +208,7 @@ def test_fastai_autolog_log_models_configuration(log_models, iris_data):
     model = fastai_tabular_model(iris_data)
     model.fit(NUM_EPOCHS)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_id = client.list_run_infos(experiment_id="0")[0].run_id
     artifacts = client.list_artifacts(run_id)
     artifacts = list(map(lambda x: x.path, artifacts))
@@ -218,7 +218,7 @@ def test_fastai_autolog_log_models_configuration(log_models, iris_data):
 @pytest.mark.parametrize("fit_variant", ["fit_one_cycle", "fine_tune"])
 def test_fastai_autolog_logs_default_params(fastai_random_tabular_data_run, fit_variant):
     # pylint: disable=unused-argument
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_id = client.list_run_infos(experiment_id="0")[0].run_id
     artifacts = client.list_artifacts(run_id)
     artifacts = list(map(lambda x: x.path, artifacts))
@@ -235,7 +235,7 @@ def test_fastai_autolog_logs_default_params(fastai_random_tabular_data_run, fit_
 @pytest.mark.parametrize("fit_variant", ["fit", "fit_one_cycle"])
 def test_fastai_autolog_model_can_load_from_artifact(fastai_random_tabular_data_run):
     run_id = fastai_random_tabular_data_run[1].info.run_id
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "model" in artifacts
@@ -265,7 +265,7 @@ def get_fastai_random_data_run_with_callback(iris_data, fit_variant, callback, p
     else:
         model.fit(NUM_EPOCHS)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return model, client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
 
@@ -282,7 +282,7 @@ def fastai_random_data_run_with_callback(iris_data, fit_variant, callback, patie
 def test_fastai_autolog_save_and_early_stop_logs(fastai_random_data_run_with_callback):
     model, run = fastai_random_data_run_with_callback
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "valid_loss")
     num_of_epochs = len(model.recorder.values)
 
@@ -317,7 +317,7 @@ def test_fastai_autolog_early_stop_logs(fastai_random_data_run_with_callback, pa
     assert "early_stop_min_delta" in params
     assert params["early_stop_min_delta"] == "-{}".format(MIN_DELTA)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "valid_loss")
     num_of_epochs = len(model.recorder.values)
 
@@ -341,7 +341,7 @@ def test_fastai_autolog_early_stop_no_stop_does_not_log(
     assert params["early_stop_min_delta"] == "-{}".format(MIN_DELTA)
 
     num_of_epochs = len(model.recorder.values)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "valid_loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == NUM_EPOCHS
@@ -362,7 +362,7 @@ def test_fastai_autolog_non_early_stop_callback_does_not_log(fastai_random_data_
     assert "restored_epoch" not in metrics
     assert "early_stop_min_delta" not in params
     num_of_epochs = len(model.recorder.values)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "valid_loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == NUM_EPOCHS
diff --git a/tests/generate_ui_test_data.py b/tests/generate_ui_test_data.py
index fd6925d8448d3..766dc162cbb84 100644
--- a/tests/generate_ui_test_data.py
+++ b/tests/generate_ui_test_data.py
@@ -7,10 +7,9 @@
 import itertools
 import random
 import string
+from mlflow import MlflowClient
 from random import random as rand
 
-from mlflow.tracking import MlflowClient
-
 
 def log_metrics(metrics):
     for k, values in metrics.items():
diff --git a/tests/gluon/test_gluon_autolog.py b/tests/gluon/test_gluon_autolog.py
index c83aa9cac37e0..b588ea30e4c3c 100644
--- a/tests/gluon/test_gluon_autolog.py
+++ b/tests/gluon/test_gluon_autolog.py
@@ -11,7 +11,7 @@
 
 import mlflow
 import mlflow.gluon
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.gluon._autolog import __MLflowGluonCallback
 from mlflow.utils.autologging_utils import BatchMetricsLogger
 from unittest.mock import patch
@@ -65,7 +65,7 @@ def get_gluon_random_data_run(log_models=True):
         est = get_estimator(model, trainer)
 
         est.fit(data, epochs=3, val_data=validation)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(run.info.run_id)
 
 
@@ -123,7 +123,7 @@ def record_metrics_side_effect(self, metrics, step=None):
 
 
 def test_gluon_autolog_model_can_load_from_artifact(gluon_random_data_run):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(gluon_random_data_run.info.run_id)
     artifacts = list(map(lambda x: x.path, artifacts))
     assert "model" in artifacts
@@ -135,7 +135,7 @@ def test_gluon_autolog_model_can_load_from_artifact(gluon_random_data_run):
 @pytest.mark.parametrize("log_models", [True, False])
 def test_gluon_autolog_log_models_configuration(log_models):
     random_data_run = get_gluon_random_data_run(log_models)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(random_data_run.info.run_id)
     artifacts = list(map(lambda x: x.path, artifacts))
     assert ("model" in artifacts) == log_models
diff --git a/tests/keras/test_keras_autolog.py b/tests/keras/test_keras_autolog.py
index bba8b2e68d830..b0fd27e4f2a80 100644
--- a/tests/keras/test_keras_autolog.py
+++ b/tests/keras/test_keras_autolog.py
@@ -5,7 +5,7 @@
 
 import mlflow
 import mlflow.keras
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.autologging_utils import BatchMetricsLogger
 from unittest.mock import patch
 
@@ -97,7 +97,7 @@ def keras_random_data_run(random_train_data, random_one_hot_labels, initial_epoc
         data, labels, epochs=initial_epoch + 10, steps_per_epoch=1, initial_epoch=initial_epoch
     )
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id), history
 
 
@@ -123,7 +123,7 @@ def test_keras_autolog_logs_expected_data(keras_random_data_run):
     assert data.params["optimizer_name"] == "Adam"
     assert "epsilon" in data.params
     assert data.params["epsilon"] == "1e-07"
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run.info.run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "model_summary.txt" in artifacts
@@ -133,7 +133,7 @@ def test_keras_autolog_logs_expected_data(keras_random_data_run):
 def test_keras_autolog_model_can_load_from_artifact(keras_random_data_run, random_train_data):
     run, _ = keras_random_data_run
     run_id = run.info.run_id
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "model" in artifacts
@@ -181,7 +181,7 @@ def on_train_end(self, logs=None):
         initial_epoch=initial_epoch,
     )
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id), history, callback
 
 
@@ -216,7 +216,7 @@ def test_keras_autolog_log_models_configuration(
     model = create_model()
     model.fit(data, labels, epochs=10, steps_per_epoch=1)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_id = client.list_run_infos(experiment_id="0")[0].run_id
     artifacts = [f.path for f in client.list_artifacts(run_id)]
     assert ("model" in artifacts) == log_models
@@ -248,7 +248,7 @@ def test_keras_autolog_early_stop_logs(keras_random_data_run_with_callback, init
     # never observes a loss improvement due to an extremely large `min_delta` value
     assert restored_epoch == initial_epoch
     assert "loss" in history.history
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check that MLflow has logged the metrics of the "best" model, in addition to per-epoch metrics
     loss = history.history["loss"]
@@ -320,7 +320,7 @@ def test_keras_autolog_early_stop_no_stop_does_not_log(keras_random_data_run_wit
     assert "restored_epoch" not in metrics
     assert "loss" in history.history
     num_of_epochs = len(history.history["loss"])
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == 10
@@ -345,7 +345,7 @@ def test_keras_autolog_early_stop_no_restore_does_not_log(keras_random_data_run_
     assert "restored_epoch" not in metrics
     assert "loss" in history.history
     num_of_epochs = len(history.history["loss"])
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == callback.patience + 1
@@ -368,7 +368,7 @@ def test_keras_autolog_non_early_stop_callback_does_not_log(keras_random_data_ru
     assert "restored_epoch" not in metrics
     assert "loss" in history.history
     num_of_epochs = len(history.history["loss"])
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == 10
@@ -386,7 +386,7 @@ def generator():
     with mlflow.start_run() as run:
         model.fit_generator(generator(), epochs=10, steps_per_epoch=1)
 
-    run = mlflow.tracking.MlflowClient().get_run(run.info.run_id)
+    run = MlflowClient().get_run(run.info.run_id)
     params = run.data.params
     metrics = run.data.metrics
     assert "epochs" in params
diff --git a/tests/lightgbm/test_lightgbm_autolog.py b/tests/lightgbm/test_lightgbm_autolog.py
index 3628bed1881a8..d291e37ae5f8c 100644
--- a/tests/lightgbm/test_lightgbm_autolog.py
+++ b/tests/lightgbm/test_lightgbm_autolog.py
@@ -16,7 +16,7 @@
 from mlflow.lightgbm import _autolog_callback
 from mlflow.models import Model
 from mlflow.models.utils import _read_example
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.autologging_utils import picklable_exception_safe_function, BatchMetricsLogger
 from unittest.mock import patch
 
@@ -24,7 +24,7 @@
 
 
 def get_latest_run():
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
 
@@ -166,7 +166,7 @@ def test_lgb_autolog_sklearn():
         model.fit(X, y)
         model_uri = mlflow.get_artifact_uri("model")
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(run.info.run_id)
     assert run.data.metrics.items() <= params.items()
     artifacts = set(x.path for x in client.list_artifacts(run.info.run_id))
@@ -205,7 +205,7 @@ def test_lgb_autolog_logs_metrics_with_validation_data(bst_params, train_set):
         )
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_key = "train-multi_logloss"
     metric_history = [x.value for x in client.get_metric_history(run.info.run_id, metric_key)]
     assert metric_key in data.metrics
@@ -240,7 +240,7 @@ def test_lgb_autolog_logs_metrics_with_multi_validation_data(bst_params, train_s
         )
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for valid_name in valid_names:
         metric_key = "{}-multi_logloss".format(valid_name)
         metric_history = [x.value for x in client.get_metric_history(run.info.run_id, metric_key)]
@@ -276,7 +276,7 @@ def test_lgb_autolog_logs_metrics_with_multi_metrics(bst_params, train_set):
         )
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for metric_name in params["metric"]:
         metric_key = "{}-{}".format(valid_names[0], metric_name)
         metric_history = [x.value for x in client.get_metric_history(run.info.run_id, metric_key)]
@@ -312,7 +312,7 @@ def test_lgb_autolog_logs_metrics_with_multi_validation_data_and_metrics(bst_par
         )
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for valid_name in valid_names:
         for metric_name in params["metric"]:
             metric_key = "{}-{}".format(valid_name, metric_name)
@@ -450,7 +450,7 @@ def test_lgb_autolog_logs_metrics_with_early_stopping(bst_params, train_set):
         )
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     assert "best_iteration" in data.metrics
     assert int(data.metrics["best_iteration"]) == model.best_iteration
     assert "stopped_iteration" in data.metrics
@@ -474,7 +474,7 @@ def test_lgb_autolog_logs_feature_importance(bst_params, train_set):
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id)]
 
     for imp_type in ["split", "gain"]:
@@ -550,7 +550,7 @@ def test_lgb_autolog_infers_model_signature_correctly(bst_params):
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id, "model")]
 
     ml_model_filename = "MLmodel"
@@ -600,7 +600,7 @@ def test_lgb_autolog_continues_logging_even_if_signature_inference_fails(tmpdir)
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id, "model")]
 
     ml_model_filename = "MLmodel"
@@ -646,7 +646,7 @@ def test_lgb_autolog_log_models_configuration(bst_params, log_models):
         lgb.train(bst_params, dataset)
 
     run_id = run.info.run_id
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [f.path for f in client.list_artifacts(run_id)]
     assert ("model" in artifacts) == log_models
 
diff --git a/tests/models/test_evaluation.py b/tests/models/test_evaluation.py
index 9726919d89e50..326ca86ad721d 100644
--- a/tests/models/test_evaluation.py
+++ b/tests/models/test_evaluation.py
@@ -1,4 +1,5 @@
 import mlflow
+from mlflow import MlflowClient
 from collections import namedtuple
 
 from mlflow.models.evaluation import (
@@ -77,7 +78,7 @@ def get_breast_cancer_dataset():
 
 
 def get_run_data(run_id):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     tags = {k: v for k, v in data.tags.items()}
     artifacts = [f.path for f in client.list_artifacts(run_id)]
@@ -85,7 +86,7 @@ def get_run_data(run_id):
 
 
 def get_raw_tag(run_id, tag_name):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     return data.tags[tag_name]
 
@@ -586,7 +587,7 @@ def test_dataset_from_spark_df(spark_session):
 def test_log_dataset_tag(iris_dataset, iris_pandas_df_dataset):
     model_uuid = uuid.uuid4().hex
     with mlflow.start_run() as run:
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         iris_dataset._log_dataset_tag(client, run.info.run_id, model_uuid=model_uuid)
         _, _, tags, _ = get_run_data(run.info.run_id)
 
diff --git a/tests/paddle/test_paddle_autolog.py b/tests/paddle/test_paddle_autolog.py
index d515d61845b6f..bf6fb1c55ddd9 100644
--- a/tests/paddle/test_paddle_autolog.py
+++ b/tests/paddle/test_paddle_autolog.py
@@ -1,7 +1,7 @@
 import pytest
 import paddle
 import mlflow
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 
 
 NUM_EPOCHS = 6
diff --git a/tests/projects/test_databricks.py b/tests/projects/test_databricks.py
index 9beadc68ccc52..e0a3501f34635 100644
--- a/tests/projects/test_databricks.py
+++ b/tests/projects/test_databricks.py
@@ -9,13 +9,12 @@
 import pytest
 
 import mlflow
-from mlflow import cli
+from mlflow import cli, MlflowClient
 from mlflow.exceptions import MlflowException
 from mlflow.projects.databricks import DatabricksJobRunner, _get_cluster_mlflow_run_cmd
 from mlflow.protos.databricks_pb2 import ErrorCode, INVALID_PARAMETER_VALUE
 from mlflow.entities import RunStatus
 from mlflow.projects import databricks, ExecutionException
-from mlflow.tracking import MlflowClient
 from mlflow.utils import file_utils
 from mlflow.store.tracking.file_store import FileStore
 from mlflow.utils.mlflow_tags import (
@@ -232,7 +231,7 @@ def test_run_databricks_validations(
             run_databricks_project(cluster_spec_mock, synchronous=True)
         assert db_api_req_mock.call_count == 0
         db_api_req_mock.reset_mock()
-        mlflow_service = mlflow.tracking.MlflowClient()
+        mlflow_service = MlflowClient()
         assert (
             len(mlflow_service.list_run_infos(experiment_id=FileStore.DEFAULT_EXPERIMENT_ID)) == 0
         )
diff --git a/tests/projects/test_docker_projects.py b/tests/projects/test_docker_projects.py
index 1376ff5e7d9e5..267e249747d86 100644
--- a/tests/projects/test_docker_projects.py
+++ b/tests/projects/test_docker_projects.py
@@ -6,6 +6,7 @@
 from databricks_cli.configure.provider import DatabricksConfig
 
 import mlflow
+from mlflow import MlflowClient
 from mlflow.entities import ViewType
 from mlflow.projects.docker import _get_docker_image_uri
 from mlflow.projects import ExecutionException
@@ -43,7 +44,7 @@ def test_docker_project_execution(
     )
     # Validate run contents in the FileStore
     run_id = submitted_run.run_id
-    mlflow_service = mlflow.tracking.MlflowClient()
+    mlflow_service = MlflowClient()
     run_infos = mlflow_service.list_run_infos(
         experiment_id=file_store.FileStore.DEFAULT_EXPERIMENT_ID, run_view_type=ViewType.ACTIVE_ONLY
     )
diff --git a/tests/projects/test_projects.py b/tests/projects/test_projects.py
index d558d76557cbf..962575e5eb921 100644
--- a/tests/projects/test_projects.py
+++ b/tests/projects/test_projects.py
@@ -12,7 +12,7 @@
 from databricks_cli.configure.provider import DatabricksConfig
 
 import mlflow
-
+from mlflow import MlflowClient
 from mlflow.entities import RunStatus, ViewType, SourceType
 from mlflow.exceptions import ExecutionException, MlflowException
 from mlflow.projects import _parse_kubernetes_config
@@ -99,7 +99,7 @@ def test_use_conda():
 
 
 def test_expected_tags_logged_when_using_conda():
-    with mock.patch.object(mlflow.tracking.MlflowClient, "set_tag") as tag_mock:
+    with mock.patch.object(MlflowClient, "set_tag") as tag_mock:
         try:
             mlflow.projects.run(TEST_PROJECT_DIR, use_conda=True)
         finally:
@@ -139,7 +139,7 @@ def test_run_local_git_repo(local_git_repo, local_git_repo_uri, use_start_run, v
     validate_exit_status(submitted_run.get_status(), RunStatus.FINISHED)
     # Validate run contents in the FileStore
     run_id = submitted_run.run_id
-    mlflow_service = mlflow.tracking.MlflowClient()
+    mlflow_service = MlflowClient()
     run_infos = mlflow_service.list_run_infos(
         experiment_id=FileStore.DEFAULT_EXPERIMENT_ID, run_view_type=ViewType.ACTIVE_ONLY
     )
@@ -200,7 +200,7 @@ def test_run(use_start_run):
     validate_exit_status(submitted_run.get_status(), RunStatus.FINISHED)
     # Validate run contents in the FileStore
     run_id = submitted_run.run_id
-    mlflow_service = mlflow.tracking.MlflowClient()
+    mlflow_service = MlflowClient()
 
     run_infos = mlflow_service.list_run_infos(
         experiment_id=FileStore.DEFAULT_EXPERIMENT_ID, run_view_type=ViewType.ACTIVE_ONLY
@@ -238,7 +238,7 @@ def test_run_with_parent(tmpdir):  # pylint: disable=unused-argument
     assert submitted_run.run_id is not None
     validate_exit_status(submitted_run.get_status(), RunStatus.FINISHED)
     run_id = submitted_run.run_id
-    run = mlflow.tracking.MlflowClient().get_run(run_id)
+    run = MlflowClient().get_run(run_id)
     assert run.data.tags[MLFLOW_PARENT_RUN_ID] == parent_run_id
 
 
diff --git a/tests/projects/test_projects_cli.py b/tests/projects/test_projects_cli.py
index b93e589bbddce..d8a8b8d6ba67a 100644
--- a/tests/projects/test_projects_cli.py
+++ b/tests/projects/test_projects_cli.py
@@ -8,8 +8,7 @@
 from click.testing import CliRunner
 import pytest
 
-from mlflow import cli
-from mlflow.tracking.client import MlflowClient
+from mlflow import cli, MlflowClient
 from mlflow.utils import process
 from tests.integration.utils import invoke_cli_runner
 from tests.projects.utils import docker_example_base_image  # pylint: disable=unused-import
diff --git a/tests/pytorch/test_pytorch_autolog.py b/tests/pytorch/test_pytorch_autolog.py
index 842ee9ef7661c..b1d1434fc9603 100644
--- a/tests/pytorch/test_pytorch_autolog.py
+++ b/tests/pytorch/test_pytorch_autolog.py
@@ -4,6 +4,7 @@
 import torch
 from iris import IrisClassification, IrisClassificationWithoutValidation
 import mlflow
+from mlflow import MlflowClient
 import mlflow.pytorch
 from pytorch_lightning.callbacks.early_stopping import EarlyStopping
 from pytorch_lightning.callbacks import ModelCheckpoint
@@ -11,7 +12,6 @@
 from iris_data_module import IrisDataModule, IrisDataModuleWithoutValidation
 from mlflow.exceptions import MlflowException
 from mlflow.pytorch._pytorch_autolog import _get_optimizer_name
-from mlflow.tracking.client import MlflowClient
 
 NUM_EPOCHS = 20
 
@@ -24,7 +24,7 @@ def pytorch_model():
     dm.setup(stage="fit")
     trainer = pl.Trainer(max_epochs=NUM_EPOCHS)
     trainer.fit(model, dm)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
     return trainer, run
 
@@ -37,7 +37,7 @@ def pytorch_model_without_validation():
     dm.setup(stage="fit")
     trainer = pl.Trainer(max_epochs=NUM_EPOCHS)
     trainer.fit(model, dm)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
     return trainer, run
 
@@ -51,7 +51,7 @@ def pytorch_model_with_steps_logged(request):
     dm.setup(stage="fit")
     trainer = pl.Trainer(max_epochs=NUM_EPOCHS)
     trainer.fit(model, dm)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
     return trainer, run, log_every_n_epoch, log_every_n_step
 
@@ -64,10 +64,10 @@ def test_pytorch_autolog_log_models_configuration(log_models):
     dm.setup(stage="fit")
     trainer = pl.Trainer(max_epochs=NUM_EPOCHS)
     trainer.fit(model, dm)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
     run_id = run.info.run_id
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [f.path for f in client.list_artifacts(run_id)]
     assert ("model" in artifacts) == log_models
 
@@ -89,7 +89,7 @@ def test_pytorch_autolog_logs_expected_data(pytorch_model):
     # Checking if metrics are logged.
     # When autolog is configured with the default configuration to not log on steps,
     # then all metrics are logged per epoch, including step based metrics.
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for metric_key in [
         "loss",
         "train_acc",
@@ -108,7 +108,7 @@ def test_pytorch_autolog_logs_expected_data(pytorch_model):
     assert data.params["optimizer_name"] == "Adam"
 
     # Testing model_summary.txt is saved
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run.info.run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "model_summary.txt" in artifacts
@@ -118,7 +118,7 @@ def test_pytorch_autolog_logs_expected_metrics_without_validation(pytorch_model_
     trainer, run = pytorch_model_without_validation
     assert not trainer.enable_validation
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for metric_key in ["loss", "train_acc"]:
         assert metric_key in run.data.metrics
         metric_history = client.get_metric_history(run.info.run_id, metric_key)
@@ -139,7 +139,7 @@ def test_pytorch_autolog_logging_forked_metrics_on_step_and_epoch(
     num_logged_steps = trainer.global_step // log_every_n_step
     num_logged_epochs = NUM_EPOCHS // log_every_n_epoch
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for (metric_key, expected_len) in [
         ("train_acc", num_logged_epochs),
         ("loss", num_logged_steps),
@@ -217,7 +217,7 @@ def pytorch_model_with_callback(patience):
         )
         trainer.fit(model, dm)
 
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
     return trainer, run
@@ -226,7 +226,7 @@ def pytorch_model_with_callback(patience):
 @pytest.mark.parametrize("patience", [3])
 def test_pytorch_early_stop_artifacts_logged(pytorch_model_with_callback):
     _, run = pytorch_model_with_callback
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run.info.run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "restored_model_checkpoint" in artifacts
@@ -236,7 +236,7 @@ def test_pytorch_early_stop_artifacts_logged(pytorch_model_with_callback):
 def test_pytorch_autolog_model_can_load_from_artifact(pytorch_model_with_callback):
     _, run = pytorch_model_with_callback
     run_id = run.info.run_id
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "model" in artifacts
@@ -270,10 +270,10 @@ def test_pytorch_with_early_stopping_autolog_log_models_configuration_with(log_m
         )
         trainer.fit(model, dm)
 
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
     run_id = run.info.run_id
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [f.path for f in client.list_artifacts(run_id)]
     assert ("restored_model_checkpoint" in artifacts) == log_models
 
@@ -292,7 +292,7 @@ def test_pytorch_early_stop_params_logged(pytorch_model_with_callback, patience)
 
 def test_pytorch_autolog_non_early_stop_callback_does_not_log(pytorch_model):
     trainer, run = pytorch_model
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     loss_metric_history = client.get_metric_history(run.info.run_id, "loss")
     val_loss_metric_history = client.get_metric_history(run.info.run_id, "val_loss")
     assert trainer.max_epochs == NUM_EPOCHS
@@ -310,7 +310,7 @@ def pytorch_model_tests():
     with mlflow.start_run() as run:
         trainer.fit(model, datamodule=dm)
         trainer.test(datamodule=dm)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(run.info.run_id)
     return trainer, run
 
@@ -350,11 +350,11 @@ def test_pytorch_autologging_supports_data_parallel_execution():
         trainer.fit(model, datamodule=dm)
         trainer.test(datamodule=dm)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(run.info.run_id)
 
     # Checking if metrics are logged
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for metric_key in ["loss", "train_acc", "val_loss", "val_acc"]:
         assert metric_key in run.data.metrics
 
@@ -367,7 +367,7 @@ def test_pytorch_autologging_supports_data_parallel_execution():
     assert data.params["optimizer_name"] == "Adam"
 
     # Testing model_summary.txt is saved
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run.info.run_id)
     artifacts = list(map(lambda x: x.path, artifacts))
     assert "model" in artifacts
diff --git a/tests/resources/mlflow-test-plugin/mlflow_test_plugin/dummy_evaluator.py b/tests/resources/mlflow-test-plugin/mlflow_test_plugin/dummy_evaluator.py
index c00d5f5e0066b..ee5b27e0d18c7 100644
--- a/tests/resources/mlflow-test-plugin/mlflow_test_plugin/dummy_evaluator.py
+++ b/tests/resources/mlflow-test-plugin/mlflow_test_plugin/dummy_evaluator.py
@@ -1,4 +1,4 @@
-import mlflow
+from mlflow import MlflowClient
 from mlflow.models.evaluation import (
     ModelEvaluator,
     EvaluationArtifact,
@@ -32,7 +32,7 @@ def _log_metrics(self, run_id, metrics, dataset_name):
         """
         Helper method to log metrics into specified run.
         """
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         timestamp = int(time.time() * 1000)
         client.log_batch(
             run_id,
@@ -46,7 +46,7 @@ def _log_metrics(self, run_id, metrics, dataset_name):
     def evaluate(
         self, *, model, model_type, dataset, run_id, evaluator_config, **kwargs
     ) -> EvaluationResult:
-        client = mlflow.tracking.MlflowClient()
+        client = MlflowClient()
         X = dataset.features_data
         y = dataset.labels_data
         y_pred = model.predict(X)
diff --git a/tests/shap/test_log.py b/tests/shap/test_log.py
index 10a360b8afccc..52ba1a262eaf8 100644
--- a/tests/shap/test_log.py
+++ b/tests/shap/test_log.py
@@ -9,7 +9,7 @@
 
 import mlflow.pyfunc.scoring_server as pyfunc_scoring_server
 from mlflow.utils import PYTHON_VERSION
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from mlflow.tracking.artifact_utils import _download_artifact_from_uri
 from mlflow.utils.model_utils import _get_flavor_configuration
 from tests.helper_functions import (
diff --git a/tests/shap/test_shap.py b/tests/shap/test_shap.py
index 80599a0632dd3..66c0f67a22d69 100644
--- a/tests/shap/test_shap.py
+++ b/tests/shap/test_shap.py
@@ -11,6 +11,7 @@
 import pytest
 
 import mlflow
+from mlflow import MlflowClient
 
 
 ModelWithExplanation = namedtuple(
@@ -22,7 +23,7 @@ def yield_artifacts(run_id, path=None):
     """
     Yields all artifacts in the specified run.
     """
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for item in client.list_artifacts(run_id, path):
         if item.is_dir:
             yield from yield_artifacts(run_id, item.path)
diff --git a/tests/sklearn/test_sklearn_autolog.py b/tests/sklearn/test_sklearn_autolog.py
index 69ef25bb3e257..afa4417350567 100644
--- a/tests/sklearn/test_sklearn_autolog.py
+++ b/tests/sklearn/test_sklearn_autolog.py
@@ -31,7 +31,6 @@
     _get_arg_names,
     _log_child_runs_info,
 )
-from mlflow.tracking.client import MlflowClient
 from mlflow.utils import _truncate_dict
 from mlflow.utils.mlflow_tags import MLFLOW_AUTOLOGGING
 from mlflow.utils.validation import (
@@ -40,6 +39,7 @@
     MAX_PARAM_VAL_LENGTH,
     MAX_ENTITY_KEY_LENGTH,
 )
+from mlflow import MlflowClient
 
 FIT_FUNC_NAMES = ["fit", "fit_transform", "fit_predict"]
 TRAINING_SCORE = "training_score"
@@ -72,11 +72,11 @@ def fit_model(model, X, y, fit_func_name):
 
 
 def get_run(run_id):
-    return mlflow.tracking.MlflowClient().get_run(run_id)
+    return MlflowClient().get_run(run_id)
 
 
 def get_run_data(run_id):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     # Ignore tags mlflow logs by default (e.g. "mlflow.user")
     tags = {k: v for k, v in data.tags.items() if not k.startswith("mlflow.")}
@@ -244,7 +244,7 @@ def test_classifier_binary():
     assert tags == get_expected_class_tags(model)
     assert MODEL_DIR in artifacts
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id)]
 
     plot_names = []
@@ -307,7 +307,7 @@ def test_classifier_multi_class():
     assert tags == get_expected_class_tags(model)
     assert MODEL_DIR in artifacts
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id)]
 
     plot_names = []
@@ -775,7 +775,7 @@ def train_cv_model():
     input_example = _read_example(best_estimator_conf, best_estimator_path)
     best_estimator.predict(input_example)  # Ensure that input example evaluation succeeds
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     child_runs = client.search_runs(
         run.info.experiment_id, "tags.`mlflow.parentRunId` = '{}'".format(run_id)
     )
@@ -847,7 +847,7 @@ def test_parameter_search_handles_large_volume_of_metric_outputs():
         cv_model.fit(*get_iris())
         run_id = run.info.run_id
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     child_runs = client.search_runs(
         run.info.experiment_id, "tags.`mlflow.parentRunId` = '{}'".format(run_id)
     )
@@ -1020,7 +1020,7 @@ def test_autolog_does_not_capture_runs_for_preprocessing_or_feature_manipulation
     # Create a run using the MLflow client, which will be resumed via the fluent API,
     # in order to avoid setting fluent-level tags (e.g., source and user). Suppressing these
     # tags simplifies test validation logic
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_id = client.create_run(experiment_id=0).info.run_id
 
     from sklearn.preprocessing import Normalizer, LabelEncoder, MinMaxScaler
diff --git a/tests/sklearn/test_sklearn_autolog_without_matplotlib.py b/tests/sklearn/test_sklearn_autolog_without_matplotlib.py
index 5a7fe9b48f1b8..668a838db4fa0 100644
--- a/tests/sklearn/test_sklearn_autolog_without_matplotlib.py
+++ b/tests/sklearn/test_sklearn_autolog_without_matplotlib.py
@@ -4,7 +4,7 @@
 from unittest import mock
 
 import mlflow
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from tests.helper_functions import AnyStringWith
 
 
diff --git a/tests/spark/autologging/ml/test_pyspark_ml_autologging.py b/tests/spark/autologging/ml/test_pyspark_ml_autologging.py
index 66b2203b0f874..dedd1fdc7f0e0 100644
--- a/tests/spark/autologging/ml/test_pyspark_ml_autologging.py
+++ b/tests/spark/autologging/ml/test_pyspark_ml_autologging.py
@@ -11,6 +11,7 @@
 import pathlib
 
 import mlflow
+from mlflow import MlflowClient
 from mlflow.entities import RunStatus
 from mlflow.utils.mlflow_tags import MLFLOW_PARENT_RUN_ID, MLFLOW_AUTOLOGGING
 from mlflow.utils import _truncate_dict
@@ -18,7 +19,6 @@
     MAX_PARAM_VAL_LENGTH,
     MAX_ENTITY_KEY_LENGTH,
 )
-from mlflow.tracking.client import MlflowClient
 
 import pyspark
 from pyspark.ml import Pipeline
@@ -136,7 +136,7 @@ def get_expected_class_tags(estimator):
 
 
 def get_run_data(run_id):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     data = client.get_run(run_id).data
     # Ignore tags mlflow logs by default (e.g. "mlflow.user")
     tags = {k: v for k, v in data.tags.items() if not k.startswith("mlflow.")}
@@ -541,7 +541,7 @@ def test_param_search_estimator(  # pylint: disable=unused-argument
         "search_results.csv",
     ]
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     child_runs = client.search_runs(
         run.info.experiment_id, "tags.`mlflow.parentRunId` = '{}'".format(run_id)
     )
@@ -926,7 +926,7 @@ def test_autolog_registering_model(spark_session, dataset_binomial):
 
 def _assert_autolog_infers_model_signature_correctly(run, input_sig_spec, output_sig_spec):
     artifacts_dir = pathlib.Path(run.info.artifact_uri.replace("file://", ""))
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run.info.run_id, "model")]
     ml_model_filename = "MLmodel"
     ml_model_path = artifacts_dir.joinpath("model", ml_model_filename).absolute()
diff --git a/tests/statsmodels/test_statsmodels_autolog.py b/tests/statsmodels/test_statsmodels_autolog.py
index dc2f7875370af..afb4b18640072 100644
--- a/tests/statsmodels/test_statsmodels_autolog.py
+++ b/tests/statsmodels/test_statsmodels_autolog.py
@@ -3,8 +3,8 @@
 import numpy as np
 from statsmodels.tsa.base.tsa_model import TimeSeriesModel
 import mlflow
+from mlflow import MlflowClient
 import mlflow.statsmodels
-from mlflow.tracking.client import MlflowClient
 from tests.statsmodels.model_fixtures import (
     arma_model,
     ols_model,
@@ -25,7 +25,7 @@
 
 
 def get_latest_run():
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
 
@@ -169,7 +169,7 @@ def test_statsmodels_autolog_respects_log_models_flag(log_models):
     mlflow.statsmodels.autolog(log_models=log_models)
     ols_model()
     run = get_latest_run()
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifact_paths = [artifact.path for artifact in client.list_artifacts(run.info.run_id)]
     assert ("model" in artifact_paths) == log_models
 
diff --git a/tests/store/artifact/test_databricks_models_artifact_repo.py b/tests/store/artifact/test_databricks_models_artifact_repo.py
index a5dff069f1b42..5c03c3195cb59 100644
--- a/tests/store/artifact/test_databricks_models_artifact_repo.py
+++ b/tests/store/artifact/test_databricks_models_artifact_repo.py
@@ -7,7 +7,7 @@
 from mlflow.entities.model_registry import ModelVersion
 from mlflow.exceptions import MlflowException
 from mlflow.store.artifact.databricks_models_artifact_repo import DatabricksModelsArtifactRepository
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 
 DATABRICKS_MODEL_ARTIFACT_REPOSITORY_PACKAGE = (
     "mlflow.store.artifact.databricks_models_artifact_repo"
diff --git a/tests/store/artifact/test_models_artifact_repo.py b/tests/store/artifact/test_models_artifact_repo.py
index 7375bc748daca..77b63922f6f6d 100644
--- a/tests/store/artifact/test_models_artifact_repo.py
+++ b/tests/store/artifact/test_models_artifact_repo.py
@@ -5,7 +5,7 @@
 from mlflow.entities.model_registry import ModelVersion
 from mlflow.store.artifact.databricks_models_artifact_repo import DatabricksModelsArtifactRepository
 from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 
 MODELS_ARTIFACT_REPOSITORY_PACKAGE = "mlflow.store.artifact.models_artifact_repo"
 MODELS_ARTIFACT_REPOSITORY = MODELS_ARTIFACT_REPOSITORY_PACKAGE + ".ModelsArtifactRepository"
diff --git a/tests/store/artifact/utils/test_model_utils.py b/tests/store/artifact/utils/test_model_utils.py
index 39173d8004790..3edbe1a426bbd 100644
--- a/tests/store/artifact/utils/test_model_utils.py
+++ b/tests/store/artifact/utils/test_model_utils.py
@@ -3,7 +3,7 @@
 
 from mlflow.exceptions import MlflowException
 from mlflow.store.artifact.utils.models import _parse_model_uri, get_model_name_and_version
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from mlflow.entities.model_registry import ModelVersion
 
 
diff --git a/tests/store/tracking/test_sqlalchemy_store.py b/tests/store/tracking/test_sqlalchemy_store.py
index 091ad0720e9f7..47c42a5500b82 100644
--- a/tests/store/tracking/test_sqlalchemy_store.py
+++ b/tests/store/tracking/test_sqlalchemy_store.py
@@ -1941,7 +1941,7 @@ def test_metrics_materialization_upgrade_succeeds_and_produces_expected_latest_m
 
           import json
           import mlflow
-          from mlflow.tracking.client import MlflowClient
+          from mlflow import MlflowClient
 
           mlflow.set_tracking_uri(
               "sqlite:///../../resources/db/db_version_7ac759974ad8_with_metrics.sql")
diff --git a/tests/tensorflow/test_tensorflow2_autolog.py b/tests/tensorflow/test_tensorflow2_autolog.py
index 68d3212a2a434..38069fe68cf49 100644
--- a/tests/tensorflow/test_tensorflow2_autolog.py
+++ b/tests/tensorflow/test_tensorflow2_autolog.py
@@ -17,12 +17,12 @@
 import yaml
 
 import mlflow
+from mlflow import MlflowClient
 import mlflow.keras
 import mlflow.tensorflow
 from mlflow.models import Model
 from mlflow.models.utils import _read_example
 from mlflow.tensorflow._autolog import _TensorBoard, __MLflowTfKeras2Callback
-from mlflow.tracking.client import MlflowClient
 from mlflow.utils.autologging_utils import (
     AUTOLOGGING_INTEGRATIONS,
     BatchMetricsLogger,
@@ -184,7 +184,7 @@ def test_tf_keras_autolog_log_models_configuration(
 
     model.fit(data, labels, epochs=10)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_id = client.list_run_infos(experiment_id="0")[0].run_id
     artifacts = client.list_artifacts(run_id)
     artifacts = map(lambda x: x.path, artifacts)
@@ -217,7 +217,7 @@ def tf_keras_random_data_run(random_train_data, random_one_hot_labels, initial_e
         data, labels, epochs=initial_epoch + 10, steps_per_epoch=1, initial_epoch=initial_epoch
     )
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id), history
 
 
@@ -248,7 +248,7 @@ def test_tf_keras_autolog_logs_expected_data(tf_keras_random_data_run):
     assert "opt_epsilon" in data.params
     assert "opt_amsgrad" in data.params
     assert data.params["opt_amsgrad"] == "False"
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     all_epoch_acc = client.get_metric_history(run.info.run_id, "accuracy")
     num_of_epochs = len(history.history["loss"])
     assert len(all_epoch_acc) == num_of_epochs == 10
@@ -404,7 +404,7 @@ def test_tf_keras_autolog_records_metrics_for_last_epoch(random_train_data, rand
             initial_epoch=0,
         )
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_metrics = client.get_run(run.info.run_id).data.metrics
     assert "accuracy" in run_metrics
     all_epoch_acc = client.get_metric_history(run.info.run_id, "accuracy")
@@ -427,7 +427,7 @@ def test_tf_keras_autolog_logs_metrics_for_single_epoch_training(
     with mlflow.start_run() as run:
         model.fit(random_train_data, random_one_hot_labels, epochs=1)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_metrics = client.get_run(run.info.run_id).data.metrics
     assert "accuracy" in run_metrics
     assert "loss" in run_metrics
@@ -448,7 +448,7 @@ def test_tf_keras_autolog_names_positional_parameters_correctly(
         model.fit(data, labels, 8, epochs=10, steps_per_epoch=1)
         run_id = mlflow.active_run().info.run_id
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_info = client.get_run(run_id)
     assert run_info.data.params.get("batch_size") == "8"
 
@@ -457,7 +457,7 @@ def test_tf_keras_autolog_names_positional_parameters_correctly(
 def test_tf_keras_autolog_model_can_load_from_artifact(tf_keras_random_data_run, random_train_data):
     run, _ = tf_keras_random_data_run
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(run.info.run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "model" in artifacts
@@ -502,7 +502,7 @@ def on_train_end(self, logs=None):
         data, labels, epochs=initial_epoch + 10, callbacks=[callback], initial_epoch=initial_epoch
     )
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id), history, callback
 
 
@@ -546,7 +546,7 @@ def test_tf_keras_autolog_early_stop_logs(tf_keras_random_data_run_with_callback
     # never observes a loss improvement due to an extremely large `min_delta` value
     assert restored_epoch == initial_epoch
     assert "loss" in history.history
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check that MLflow has logged the metrics of the "best" model, in addition to per-epoch metrics
     loss = history.history["loss"]
@@ -621,7 +621,7 @@ def test_tf_keras_autolog_early_stop_no_stop_does_not_log(tf_keras_random_data_r
     assert "restored_epoch" not in metrics
     assert "loss" in history.history
     num_of_epochs = len(history.history["loss"])
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == 10
@@ -646,7 +646,7 @@ def test_tf_keras_autolog_early_stop_no_restore_doesnt_log(tf_keras_random_data_
     assert "restored_epoch" not in metrics
     assert "loss" in history.history
     num_of_epochs = len(history.history["loss"])
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == callback.patience + 1
@@ -669,7 +669,7 @@ def test_tf_keras_autolog_non_early_stop_callback_no_log(tf_keras_random_data_ru
     assert "restored_epoch" not in metrics
     assert "loss" in history.history
     num_of_epochs = len(history.history["loss"])
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = client.get_metric_history(run.info.run_id, "loss")
     # Check the test epoch numbers are correct
     assert num_of_epochs == 10
@@ -1082,7 +1082,7 @@ def tf_estimator_random_data_run(tmpdir, export):
     directory = tmpdir.mkdir("test")
     mlflow.tensorflow.autolog()
     create_tf_estimator_model(str(directory), export)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
 
@@ -1098,7 +1098,7 @@ def test_tf_estimator_autolog_logs_metrics(tmpdir, export, use_v1_estimator):
         )
         run_id = mlflow.active_run().info.run_id
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(run_id)
 
     assert "loss" in run.data.metrics
@@ -1113,7 +1113,7 @@ def test_tf_estimator_v1_autolog_can_load_from_artifact(tmpdir, export):
     mlflow.tensorflow.autolog()
 
     create_tf_estimator_model(str(directory), export, use_v1_estimator=True)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     tf_estimator_v1_run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
     artifacts = client.list_artifacts(tf_estimator_v1_run.info.run_id)
     artifacts = map(lambda x: x.path, artifacts)
@@ -1123,7 +1123,7 @@ def test_tf_estimator_v1_autolog_can_load_from_artifact(tmpdir, export):
 
 @pytest.mark.parametrize("export", [True, False])
 def test_tf_estimator_autolog_logs_tensorboard_logs(tf_estimator_random_data_run):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(tf_estimator_random_data_run.info.run_id)
     assert any("tensorboard_logs" in a.path and a.is_dir for a in artifacts)
 
@@ -1132,7 +1132,7 @@ def test_tf_estimator_autolog_logs_metrics_in_exclusive_mode(tmpdir):
     mlflow.tensorflow.autolog(exclusive=True)
 
     create_tf_estimator_model(tmpdir, export=False)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     tf_estimator_run = client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
     assert "loss" in tf_estimator_run.data.metrics
@@ -1152,7 +1152,7 @@ def test_tf_estimator_autolog_logs_metics_for_single_epoch_training(tmpdir):
     mlflow.tensorflow.autolog()
     with mlflow.start_run() as run:
         create_tf_estimator_model(str(tmpdir), export=False, training_steps=1)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metrics = client.get_metric_history(run.info.run_id, "loss")
     assert len(metrics) == 1
     assert metrics[0].step == 1
@@ -1160,7 +1160,7 @@ def test_tf_estimator_autolog_logs_metics_for_single_epoch_training(tmpdir):
 
 @pytest.mark.parametrize("export", [True])
 def test_tf_estimator_autolog_model_can_load_from_artifact(tf_estimator_random_data_run):
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = client.list_artifacts(tf_estimator_random_data_run.info.run_id)
     artifacts = map(lambda x: x.path, artifacts)
     assert "model" in artifacts
@@ -1178,7 +1178,7 @@ def test_flush_queue_is_thread_safe():
     from mlflow.entities import Metric
     from mlflow.tensorflow import _flush_queue, _metric_queue_lock
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.create_run(experiment_id="0")
     metric_queue_item = (run.info.run_id, Metric("foo", 0.1, 100, 1))
     mlflow.tensorflow._metric_queue.append(metric_queue_item)
@@ -1277,7 +1277,7 @@ def generator():
     with mlflow.start_run() as run:
         model.fit_generator(generator(), epochs=10, steps_per_epoch=1)
 
-    run = mlflow.tracking.MlflowClient().get_run(run.info.run_id)
+    run = MlflowClient().get_run(run.info.run_id)
     params = run.data.params
     metrics = run.data.metrics
     assert "epochs" in params
@@ -1314,7 +1314,7 @@ def test_fluent_autolog_with_tf_keras_logs_expected_content(
     with mlflow.start_run() as run:
         model.fit(random_train_data, random_one_hot_labels, epochs=10)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run_data = client.get_run(run.info.run_id).data
     assert "accuracy" in run_data.metrics
     assert "epochs" in run_data.params
@@ -1346,7 +1346,7 @@ def test_tf_keras_autolog_distributed_training(random_train_data, random_one_hot
     fit_params = {"epochs": 10, "batch_size": 10}
     with mlflow.start_run() as run:
         model.fit(random_train_data, random_one_hot_labels, **fit_params)
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     assert client.get_run(run.info.run_id).data.params.keys() >= fit_params.keys()
 
 
@@ -1413,7 +1413,7 @@ def test_import_keras_with_fluent_autolog_enables_tensorflow_autologging():
 
 def _assert_autolog_infers_model_signature_correctly(run, input_sig_spec, output_sig_spec):
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run.info.run_id, "model")]
     ml_model_filename = "MLmodel"
     assert str(os.path.join("model", ml_model_filename)) in artifacts
diff --git a/tests/tracking/_model_registry/test_model_registry_fluent.py b/tests/tracking/_model_registry/test_model_registry_fluent.py
index 82322affed414..dc8ba61a12e25 100644
--- a/tests/tracking/_model_registry/test_model_registry_fluent.py
+++ b/tests/tracking/_model_registry/test_model_registry_fluent.py
@@ -10,7 +10,7 @@
     RESOURCE_ALREADY_EXISTS,
     FEATURE_DISABLED,
 )
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.file_utils import TempDir
 from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS
 
diff --git a/tests/tracking/default_experiment/test_databricks_job_experiment_provider.py b/tests/tracking/default_experiment/test_databricks_job_experiment_provider.py
index 712b688ea27f6..6d83af09a1a1a 100644
--- a/tests/tracking/default_experiment/test_databricks_job_experiment_provider.py
+++ b/tests/tracking/default_experiment/test_databricks_job_experiment_provider.py
@@ -10,7 +10,7 @@
     DatabricksJobExperimentProvider,
 )
 from tests.helper_functions import multi_context
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 
 
 def test_databricks_job_default_experiment_in_context():
diff --git a/tests/tracking/default_experiment/test_databricks_notebook_experiment_provider.py b/tests/tracking/default_experiment/test_databricks_notebook_experiment_provider.py
index 76b107c2aa48e..b3366e82c640e 100644
--- a/tests/tracking/default_experiment/test_databricks_notebook_experiment_provider.py
+++ b/tests/tracking/default_experiment/test_databricks_notebook_experiment_provider.py
@@ -2,7 +2,7 @@
 
 from mlflow.exceptions import MlflowException
 from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from mlflow.tracking.default_experiment.databricks_notebook_experiment_provider import (
     DatabricksNotebookExperimentProvider,
     DatabricksRepoNotebookExperimentProvider,
diff --git a/tests/tracking/fluent/test_fluent.py b/tests/tracking/fluent/test_fluent.py
index c69876bf05a37..bd2962439a088 100644
--- a/tests/tracking/fluent/test_fluent.py
+++ b/tests/tracking/fluent/test_fluent.py
@@ -12,6 +12,7 @@
 from unittest import mock
 
 import mlflow
+from mlflow import MlflowClient
 import mlflow.tracking.context.registry
 import mlflow.tracking.fluent
 from mlflow.entities import (
@@ -30,7 +31,6 @@
 from mlflow.store.entities.paged_list import PagedList
 from mlflow.store.tracking.dbmodels.models import SqlExperiment
 from mlflow.store.tracking.sqlalchemy_store import SqlAlchemyStore
-from mlflow.tracking.client import MlflowClient
 from mlflow.tracking.fluent import (
     _EXPERIMENT_ID_ENV_VAR,
     _EXPERIMENT_NAME_ENV_VAR,
@@ -326,7 +326,7 @@ def test_list_experiments(view_type, tmpdir):
 
     if view_type == ViewType.DELETED_ONLY:
         # Delete the default experiment
-        mlflow.tracking.MlflowClient(sqlite_uri).delete_experiment("0")
+        MlflowClient(sqlite_uri).delete_experiment("0")
 
     # This is a bit hacky but much faster than creating experiments one by one with
     # `mlflow.create_experiment`
diff --git a/tests/tracking/test_mlflow_artifacts.py b/tests/tracking/test_mlflow_artifacts.py
index a5626d87d86f9..cf24253470195 100644
--- a/tests/tracking/test_mlflow_artifacts.py
+++ b/tests/tracking/test_mlflow_artifacts.py
@@ -7,6 +7,7 @@
 import pytest
 
 import mlflow
+from mlflow import MlflowClient
 from tests.helper_functions import LOCALHOST, get_safe_port
 from tests.tracking.integration_test_utils import _await_server_up_or_die
 
@@ -163,7 +164,7 @@ def test_log_artifacts(artifacts_server, tmpdir):
     with mlflow.start_run() as run:
         mlflow.log_artifacts(tmpdir)
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [a.path for a in client.list_artifacts(run.info.run_id)]
     assert sorted(artifacts) == ["a.txt", "dir"]
     artifacts = [a.path for a in client.list_artifacts(run.info.run_id, "dir")]
@@ -189,7 +190,7 @@ def test_list_artifacts(artifacts_server, tmpdir):
     tmp_path_a.write("0")
     tmp_path_b = tmpdir.join("b.txt")
     tmp_path_b.write("1")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     with mlflow.start_run() as run:
         assert client.list_artifacts(run.info.run_id) == []
         mlflow.log_artifact(tmp_path_a)
@@ -213,7 +214,7 @@ def test_download_artifacts(artifacts_server, tmpdir):
         mlflow.log_artifact(tmp_path_a)
         mlflow.log_artifact(tmp_path_b, "dir")
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     dest_path = client.download_artifacts(run.info.run_id, "")
     assert sorted(os.listdir(dest_path)) == ["a.txt", "dir"]
     assert read_file(os.path.join(dest_path, "a.txt")) == "0"
diff --git a/tests/tracking/test_model_registry.py b/tests/tracking/test_model_registry.py
index 6e94f0d2f5443..e98374e4d925a 100644
--- a/tests/tracking/test_model_registry.py
+++ b/tests/tracking/test_model_registry.py
@@ -14,7 +14,7 @@
 
 from mlflow.entities.model_registry import RegisteredModel
 from mlflow.exceptions import MlflowException
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.file_utils import path_to_local_file_uri
 from tests.tracking.integration_test_utils import _await_server_down_or_die, _init_server
 
diff --git a/tests/tracking/test_rest_tracking.py b/tests/tracking/test_rest_tracking.py
index 7457b71612f23..44ca4a0c47d74 100644
--- a/tests/tracking/test_rest_tracking.py
+++ b/tests/tracking/test_rest_tracking.py
@@ -20,7 +20,7 @@
 from mlflow.models import Model
 
 import mlflow.pyfunc
-from mlflow.tracking import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.file_utils import TempDir
 from mlflow.utils.mlflow_tags import (
     MLFLOW_USER,
diff --git a/tests/tracking/test_tracking.py b/tests/tracking/test_tracking.py
index aacbb5b872183..9a830c6f6c11f 100644
--- a/tests/tracking/test_tracking.py
+++ b/tests/tracking/test_tracking.py
@@ -13,12 +13,11 @@
 from unittest import mock
 
 import mlflow
-from mlflow import tracking
+from mlflow import tracking, MlflowClient
 from mlflow.entities import RunStatus, LifecycleStage, Metric, Param, RunTag, ViewType
 from mlflow.exceptions import MlflowException
 from mlflow.store.tracking.file_store import FileStore
 from mlflow.protos.databricks_pb2 import ErrorCode, INVALID_PARAMETER_VALUE, RESOURCE_DOES_NOT_EXIST
-from mlflow.tracking.client import MlflowClient
 from mlflow.tracking.fluent import start_run
 from mlflow.utils.file_utils import local_file_uri_to_path
 from mlflow.utils.mlflow_tags import (
@@ -277,7 +276,7 @@ def test_metric_timestamp():
         mlflow.log_metric("name_1", 30)
         run_id = active_run.info.run_uuid
     # Check that metric timestamps are between run start and finish
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     history = client.get_metric_history(run_id, "name_1")
     finished_run = client.get_run(run_id)
     assert len(history) == 2
@@ -305,9 +304,7 @@ def test_log_batch():
 
     with start_run() as active_run:
         run_id = active_run.info.run_id
-        mlflow.tracking.MlflowClient().log_batch(
-            run_id=run_id, metrics=metrics, params=params, tags=tags
-        )
+        MlflowClient().log_batch(run_id=run_id, metrics=metrics, params=params, tags=tags)
     client = tracking.MlflowClient()
     finished_run = client.get_run(run_id)
     # Validate metrics
diff --git a/tests/utils/test_class_utils.py b/tests/utils/test_class_utils.py
index cf7773adc402b..cf6403b9c63e3 100644
--- a/tests/utils/test_class_utils.py
+++ b/tests/utils/test_class_utils.py
@@ -4,4 +4,4 @@
 
 
 def test_get_class_from_string():
-    assert _get_class_from_string("mlflow.tracking.MlflowClient") == mlflow.tracking.MlflowClient
+    assert _get_class_from_string("mlflow.MlflowClient") == mlflow.MlflowClient
diff --git a/tests/utils/test_validation.py b/tests/utils/test_validation.py
index 9c4143735dc1c..5d3549717e405 100644
--- a/tests/utils/test_validation.py
+++ b/tests/utils/test_validation.py
@@ -1,7 +1,6 @@
 import copy
 import pytest
-
-import mlflow
+from mlflow import MlflowClient
 from mlflow.exceptions import MlflowException
 from mlflow.entities import Metric, Param, RunTag
 from mlflow.protos.databricks_pb2 import ErrorCode, INVALID_PARAMETER_VALUE
@@ -198,7 +197,7 @@ def test_validate_experiment_name():
 
 
 def test_validate_list_experiments_max_results():
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     client.list_experiments(max_results=50)
     with pytest.raises(MlflowException, match="It must be at most 50000"):
         client.list_experiments(max_results=50001)
diff --git a/tests/xgboost/test_xgboost_autolog.py b/tests/xgboost/test_xgboost_autolog.py
index 875e756b78935..fb1e3ddea932e 100644
--- a/tests/xgboost/test_xgboost_autolog.py
+++ b/tests/xgboost/test_xgboost_autolog.py
@@ -17,14 +17,14 @@
 from mlflow.xgboost._autolog import IS_TRAINING_CALLBACK_SUPPORTED, autolog_callback
 from mlflow.models import Model
 from mlflow.models.utils import _read_example
-from mlflow.tracking.client import MlflowClient
+from mlflow import MlflowClient
 from mlflow.utils.autologging_utils import BatchMetricsLogger, picklable_exception_safe_function
 
 mpl.use("Agg")
 
 
 def get_latest_run():
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     return client.get_run(client.list_run_infos(experiment_id="0")[0].run_id)
 
 
@@ -185,7 +185,7 @@ def test_xgb_autolog_sklearn():
         model.fit(X, y)
         model_uri = mlflow.get_artifact_uri("model")
 
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     run = client.get_run(run.info.run_id)
     assert run.data.metrics.items() <= params.items()
     artifacts = set(x.path for x in client.list_artifacts(run.info.run_id))
@@ -203,7 +203,7 @@ def test_xgb_autolog_logs_metrics_with_validation_data(bst_params, dtrain):
     run = get_latest_run()
     data = run.data
     metric_key = "train-mlogloss"
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     metric_history = [x.value for x in client.get_metric_history(run.info.run_id, metric_key)]
     assert metric_key in data.metrics
     assert len(metric_history) == 20
@@ -217,7 +217,7 @@ def test_xgb_autolog_logs_metrics_with_multi_validation_data(bst_params, dtrain)
     xgb.train(bst_params, dtrain, num_boost_round=20, evals=evals, evals_result=evals_result)
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for eval_name in [e[1] for e in evals]:
         metric_key = "{}-mlogloss".format(eval_name)
         metric_history = [x.value for x in client.get_metric_history(run.info.run_id, metric_key)]
@@ -235,7 +235,7 @@ def test_xgb_autolog_logs_metrics_with_multi_metrics(bst_params, dtrain):
     )
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for metric_name in params["eval_metric"]:
         metric_key = "train-{}".format(metric_name)
         metric_history = [x.value for x in client.get_metric_history(run.info.run_id, metric_key)]
@@ -252,7 +252,7 @@ def test_xgb_autolog_logs_metrics_with_multi_validation_data_and_metrics(bst_par
     xgb.train(params, dtrain, num_boost_round=20, evals=evals, evals_result=evals_result)
     run = get_latest_run()
     data = run.data
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     for eval_name in [e[1] for e in evals]:
         for metric_name in params["eval_metric"]:
             metric_key = "{}-{}".format(eval_name, metric_name)
@@ -284,7 +284,7 @@ def test_xgb_autolog_logs_metrics_with_early_stopping(bst_params, dtrain):
     assert int(data.metrics["best_iteration"]) == model.best_iteration
     assert "stopped_iteration" in data.metrics
     assert int(data.metrics["stopped_iteration"]) == len(evals_result["train"]["merror"]) - 1
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
 
     for eval_name in [e[1] for e in evals]:
         for metric_name in params["eval_metric"]:
@@ -305,7 +305,7 @@ def test_xgb_autolog_logs_feature_importance(bst_params, dtrain):
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id)]
 
     importance_type = "weight"
@@ -329,7 +329,7 @@ def test_xgb_autolog_logs_specified_feature_importance(bst_params, dtrain):
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id)]
 
     for imp_type in importance_types:
@@ -362,7 +362,7 @@ def test_xgb_autolog_logs_feature_importance_for_linear_boosters(dtrain):
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id)]
 
     importance_type = "weight"
@@ -457,7 +457,7 @@ def test_xgb_autolog_infers_model_signature_correctly(bst_params):
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id, "model")]
 
     ml_model_filename = "MLmodel"
@@ -518,7 +518,7 @@ def test_xgb_autolog_continues_logging_even_if_signature_inference_fails(bst_par
     run = get_latest_run()
     run_id = run.info.run_id
     artifacts_dir = run.info.artifact_uri.replace("file://", "")
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [x.path for x in client.list_artifacts(run_id, "model")]
 
     ml_model_filename = "MLmodel"
@@ -580,7 +580,7 @@ def test_xgb_autolog_log_models_configuration(bst_params, log_models):
         xgb.train(bst_params, dataset)
 
     run_id = run.info.run_id
-    client = mlflow.tracking.MlflowClient()
+    client = MlflowClient()
     artifacts = [f.path for f in client.list_artifacts(run_id)]
     assert ("model" in artifacts) == log_models
 


Code review comments:
diff_hunk: @@ -45,12 +45,11 @@ def __init__(self, artifact_uri):
                 error_code=INVALID_PARAMETER_VALUE,
             )
         super().__init__(artifact_uri)
-        from mlflow.tracking import MlflowClient
 
         self.databricks_profile_uri = (
             get_databricks_profile_uri_from_artifact_uri(artifact_uri) or mlflow.get_registry_uri()
         )
-        client = MlflowClient(registry_uri=self.databricks_profile_uri)
+        client = mlflow.tracking.MlflowClient(registry_uri=self.databricks_profile_uri)
path: mlflow/store/artifact/databricks_models_artifact_repo.py
text: @user1:
Let's leave this one alone. Please revert the changes in this file. We'll have to handle this module on our side.

diff_hunk: @@ -29,6 +28,7 @@
     MAX_METRICS_PER_BATCH,
 )
 
+from mlflow.tracking.client import MlflowClient
path: mlflow/utils/autologging_utils/client.py
text: @user1:
The locations where the import statement is simply moved, can we revert those?

diff_hunk: @@ -59,12 +59,11 @@ def split_models_uri(uri):
     def get_underlying_uri(uri):
         # Note: to support a registry URI that is different from the tracking URI here,
         # we'll need to add setting of registry URIs via environment variables.
-        from mlflow.tracking import MlflowClient
 
         databricks_profile_uri = (
             get_databricks_profile_uri_from_artifact_uri(uri) or mlflow.get_registry_uri()
         )
-        client = MlflowClient(registry_uri=databricks_profile_uri)
+        client = mlflow.MlflowClient(registry_uri=databricks_profile_uri)
path: mlflow/store/artifact/models_artifact_repo.py
text: @user1:
change to refer to the local import statement