Files
2026-07-13 13:22:34 +08:00

197 lines
9.3 KiB
Markdown

# Cross version testing
## What is cross version testing?
Cross version testing is a testing strategy to ensure ML integrations in MLflow such as
`mlflow.sklearn` work properly with their associated packages across various versions.
## Key files
| File (relative path from the root) | Role |
| :---------------------------------------------- | :---------------------------------------------------------------------- |
| [`mlflow/ml-package-versions.yml`][] | Define which versions to test for each ML package. |
| [`flavors matrix`][flavors-cli] | Generate a test matrix from `ml-package-versions.yml` (`dev/flavors/`). |
| [`flavors update`][flavors-cli] | Update `ml-package-versions.yml` when releasing a new version. |
| [`.github/workflows/cross-version-tests.yml`][] | Define a Github Actions workflow for cross version testing. |
[`mlflow/ml-package-versions.yml`]: ../../mlflow/ml-package-versions.yml
[flavors-cli]: ../../dev/flavors/
[`.github/workflows/cross-version-tests.yml`]: ./cross-version-tests.yml
## Configuration keys in `ml-package-versions.yml`
```yml
# Note this is just an example and not the actual sklearn configuration.
# The top-level key specifies the integration name.
sklearn:
package_info:
# [Required] `pip_release` specifies the package this integration depends on.
pip_release: "scikit-learn"
# [Optional] `install_dev` specifies a set of commands to install the dev version of the package.
# For example, the command below builds a wheel from the latest main branch of
# the scikit-learn repository and installs it.
#
# The aim of testing the dev version is to spot issues as early as possible before they get
# piled up, and fix them incrementally rather than fixing them at once when the package
# releases a new version.
install_dev: |
pip install git+https://github.com/scikit-learn/scikit-learn.git
# [At least one of `models` and `autologging` must be specified]
# `models` specifies the configuration for model serialization and serving tests.
# `autologging` specifies the configuration for autologging tests.
models or autologging:
# [Optional] `requirements` specifies additional pip requirements required for running tests.
# For example, '">= 0.24.0": ["xgboost"]' is interpreted as 'if the version of scikit-learn
# to install is newer than or equal to 0.24.0, install xgboost'.
requirements:
">= 0.24.0": ["xgboost"]
# [Required] `minimum` specifies the minimum supported version for the latest release of MLflow.
minimum: "0.20.3"
# [Required] `maximum` specifies the maximum supported version for the latest release of MLflow.
maximum: "1.0"
# [Optional] `unsupported` specifies a list of versions that should NOT be supported due to
# unacceptable issues or bugs.
unsupported: ["0.21.3"]
# [Required] `run` specifies a set of commands to run tests.
run: |
pytest tests/sklearn/test_sklearn_model_export.py
```
## How do we determine which versions to test?
We determine which versions to test based on the following rules:
1. Only test [final][] (e.g. `1.0.0`) and [post][] (`1.0.0.post0`) releases.
2. Only test the latest micro version in each minor version.
For example, if `1.0.0`, `1.0.1`, and `1.0.2` are available, we only test `1.0.2`.
3. The `maximum` version defines the maximum **major** version to test.
For example, if the value of `maximum` is `1.0.0`, we test `1.1.0` (if available) but not `2.0.0`.
4. Always test the `minimum` version.
[final]: https://www.python.org/dev/peps/pep-0440/#final-releases
[post]: https://www.python.org/dev/peps/pep-0440/#post-releases
The table below describes which `scikit-learn` versions to test for the example configuration in
the previous section:
| Version | Tested | Comment |
| :------------ | :----- | -------------------------------------------------- |
| 0.20.3 | ✅ | The value of `minimum` |
| 0.20.4 | ✅ | The latest micro version of `0.20` |
| 0.21rc2 | | |
| 0.21.0 | | |
| 0.21.1 | | |
| 0.21.2 | ✅ | The latest micro version of `0.21` without`0.21.3` |
| 0.21.3 | | Excluded by `unsupported` |
| 0.22rc2.post1 | | |
| 0.22rc3 | | |
| 0.22 | | |
| 0.22.1 | | |
| 0.22.2 | | |
| 0.22.2.post1 | ✅ | The latest micro version of `0.22` |
| 0.23.0rc1 | | |
| 0.23.0 | | |
| 0.23.1 | | |
| 0.23.2 | ✅ | The latest micro version of `0.23` |
| 0.24.dev0 | | |
| 0.24.0rc1 | | |
| 0.24.0 | | |
| 0.24.1 | | |
| 0.24.2 | ✅ | The latest micro version of `0.24` |
| 1.0rc1 | | |
| 1.0rc2 | | |
| 1.0 | | The value of `maximum` |
| 1.0.1 | ✅ | The latest micro version of `1.0` |
| 1.1.dev | ✅ | The version installed by `install_dev` |
## Why do we run tests against development versions?
In cross-version testing, we run daily tests against both publicly available and pre-release
development versions for all dependent libraries that are used by MLflow.
This section explains why.
### Without dev version test
First, let's take a look at what would happen **without** dev version test.
```
|
├─ XGBoost merges a change on the master branch that breaks MLflow's XGBoost integration.
|
├─ MLflow 1.20.0 release date
|
├─ XGBoost 1.5.0 release date
├─ ❌ We notice the change here and might need to make a patch release if it's critical.
|
v
time
```
- We didn't notice the change until after XGBoost 1.5.0 was released.
- MLflow 1.20.0 doesn't work with XGBoost 1.5.0.
### With dev version test
Then, let's take a look at what would happen **with** dev version test.
```
|
├─ XGBoost merges a change on the master branch that breaks MLflow's XGBoost integration.
├─ ✅ Tests for the XGBoost integration fail -> We can notice the change and apply a fix for it.
|
├─ MLflow 1.20.0 release date
|
├─ XGBoost 1.5.0 release date
|
v
time
```
- We can notice the change **before XGBoost 1.5.0 is released** and apply a fix for it **before releasing MLflow 1.20.0**.
- MLflow 1.20.0 works with XGBoost 1.5.0.
## When do we run cross version tests?
1. Daily at 7:00 UTC using a cron scheduler.
[README on the repository root](../../README.md) has a badge ([![badge-img][]][badge-target]) that indicates the status of the most recent cron run.
2. When a PR that affects the ML integrations is created. Note we only run tests relevant to
the affected ML integrations. For example, a PR that affects files in `mlflow/sklearn` triggers
cross version tests for `sklearn`.
[badge-img]: https://github.com/mlflow/mlflow/workflows/Cross%20version%20tests/badge.svg?event=schedule
[badge-target]: https://github.com/mlflow/mlflow/actions?query=workflow%3ACross%2Bversion%2Btests+event%3Aschedule
## How to run cross version test for dev versions on a pull request
By default, cross version tests for dev versions are disabled on a pull request.
To enable them, the following steps are required.
1. Click `Labels` in the right sidebar.
2. Click the `enable-dev-tests` label and make sure it's applied on the pull request.
3. Push a new commit or re-run the `cross-version-tests` workflow.
See also:
- [GitHub Docs - Applying a label](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels#applying-a-label)
- [GitHub Docs - Re-running workflows and jobs](https://docs.github.com/en/actions/managing-workflow-runs/re-running-workflows-and-jobs)
## How to run cross version tests manually
The `cross-version-tests.yml` workflow can be run manually without creating a pull request.
1. Open https://github.com/mlflow/mlflow/actions/workflows/cross-version-tests.yml.
2. Click `Run workflow`.
3. Fill in the input parameters.
4. Click `Run workflow` at the bottom of the parameter input form.
See also:
- [GitHub Docs - Manually running a workflow](https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow)