From 1de2dd454cecf3efda525146144501cc3751b734 Mon Sep 17 00:00:00 2001 From: Turtle24 Date: Sat, 11 Sep 2021 08:37:25 +0200 Subject: [PATCH 1/4] workflow for mlflow added --- .github/workflows/ci-tests.yml | 8 ++++++-- dev-requirements.txt | 1 + sklearn_genetic/tests/mlflow/Dockerfile | 7 +++++++ sklearn_genetic/tests/mlflow/__init__.py | 0 sklearn_genetic/tests/mlflow/conftest.py | 20 +++++++++++++++++++ .../tests/mlflow/docker-compose.yml | 19 ++++++++++++++++++ .../tests/{ => mlflow}/test_mlflow.py | 18 ++++------------- sklearn_genetic/tests/unit/__init__.py | 0 .../tests/{ => unit}/test_genetic_search.py | 6 +++--- .../tests/{ => unit}/test_plots.py | 10 +++++++--- 10 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 sklearn_genetic/tests/mlflow/Dockerfile create mode 100644 sklearn_genetic/tests/mlflow/__init__.py create mode 100644 sklearn_genetic/tests/mlflow/conftest.py create mode 100644 sklearn_genetic/tests/mlflow/docker-compose.yml rename sklearn_genetic/tests/{ => mlflow}/test_mlflow.py (91%) create mode 100644 sklearn_genetic/tests/unit/__init__.py rename sklearn_genetic/tests/{ => unit}/test_genetic_search.py (99%) rename sklearn_genetic/tests/{ => unit}/test_plots.py (87%) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index ca46ace..2e14559 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -34,9 +34,13 @@ jobs: run: | python -m pip install --upgrade pip pip install --upgrade --upgrade-strategy eager -r dev-requirements.txt -e . - - name: Test with pytest + - name: Unit test with pytest run: | - pytest sklearn_genetic/ --verbose --color=yes --assert=plain --cov-fail-under=95 --cov-config=.coveragerc --cov=./ -p no:warnings + pytest sklearn_genetic/tests/unit --verbose --color=yes --assert=plain --cov-fail-under=89 --cov-config=.coveragerc --cov=./ -p no:warnings + - name: MLflow test with pytest + if: matrix.os == 'ubuntu-latest' + run: | + pytest sklearn_genetic/tests/mlflow --verbose --color=yes --assert=plain --cov-fail-under=6 --cov-config=.coveragerc --cov=./ -p no:warnings - name: "Upload coverage to Codecov" uses: codecov/codecov-action@v1 with: diff --git a/dev-requirements.txt b/dev-requirements.txt index 9e7825e..13254e4 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -16,3 +16,4 @@ numpydoc nbsphinx tensorflow>=2.0.0 tqdm>=4.61.1 +testcontainers diff --git a/sklearn_genetic/tests/mlflow/Dockerfile b/sklearn_genetic/tests/mlflow/Dockerfile new file mode 100644 index 0000000..13893ce --- /dev/null +++ b/sklearn_genetic/tests/mlflow/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.9-slim-bullseye + +RUN pip install --no-cache mlflow psycopg2-binary + +EXPOSE 5000 + +CMD ["mlflow", "ui", "--host", "0.0.0.0", "--backend-store-uri", "postgresql+psycopg2://postgres@postgres:5432/mlflow", "--default-artifact-root", "./mlruns"] \ No newline at end of file diff --git a/sklearn_genetic/tests/mlflow/__init__.py b/sklearn_genetic/tests/mlflow/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sklearn_genetic/tests/mlflow/conftest.py b/sklearn_genetic/tests/mlflow/conftest.py new file mode 100644 index 0000000..578e05e --- /dev/null +++ b/sklearn_genetic/tests/mlflow/conftest.py @@ -0,0 +1,20 @@ +import os +import pytest +import mlflow +import logging +from testcontainers.compose import DockerCompose + + +@pytest.fixture(scope="module", autouse=True) +def setup_mlflow(): + path = os.path.abspath(os.path.dirname(__file__)) + with DockerCompose( + path, compose_file_name=["docker-compose.yml"], pull=True + ) as compose: + host = compose.get_service_host("mlflow", 5000) + if host == "0.0.0.0": + host = "localhost" + port = compose.get_service_port("mlflow", 5000) + logging.info(f"MLflow started @http://{host}:{port}") + mlflow.set_tracking_uri(f"http://{host}:{port}") + yield diff --git a/sklearn_genetic/tests/mlflow/docker-compose.yml b/sklearn_genetic/tests/mlflow/docker-compose.yml new file mode 100644 index 0000000..bb7ea3e --- /dev/null +++ b/sklearn_genetic/tests/mlflow/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' + +services: + mlflow: + build: + context: "" + dockerfile: Dockerfile + ports: + - "5000" + depends_on: + - postgres + + postgres: + image: postgres:13.1-alpine + environment: + POSTGRES_DB: mlflow + POSTGRES_HOST_AUTH_METHOD: trust + ports: + - 5432 \ No newline at end of file diff --git a/sklearn_genetic/tests/test_mlflow.py b/sklearn_genetic/tests/mlflow/test_mlflow.py similarity index 91% rename from sklearn_genetic/tests/test_mlflow.py rename to sklearn_genetic/tests/mlflow/test_mlflow.py index 63ecbfd..12842dc 100644 --- a/sklearn_genetic/tests/test_mlflow.py +++ b/sklearn_genetic/tests/mlflow/test_mlflow.py @@ -1,6 +1,5 @@ import pytest -import shutil -import os +import requests import mlflow from mlflow.tracking import MlflowClient @@ -8,12 +7,11 @@ from sklearn.datasets import load_digits from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score from sklearn.model_selection import StratifiedKFold -from ..genetic_search import GASearchCV -from ..mlflow import MLflowConfig -from ..space import Integer, Categorical, Continuous +from sklearn_genetic.genetic_search import GASearchCV +from sklearn_genetic.mlflow import MLflowConfig +from sklearn_genetic.space import Integer, Categorical, Continuous @pytest.fixture @@ -141,11 +139,3 @@ def test_mlflow_after_run(mlflow_resources, mlflow_run): assert 2 <= int(params["max_depth"]) <= 20 assert 2 <= int(params["max_leaf_nodes"]) <= 30 assert client.get_metric_history(run_id, "score")[0].key == "score" - - -def test_cleanup(): - """ - Ensure resources are cleaned up. - """ - shutil.rmtree("mlruns") - assert "mlruns" not in os.listdir(os.getcwd()) diff --git a/sklearn_genetic/tests/unit/__init__.py b/sklearn_genetic/tests/unit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sklearn_genetic/tests/test_genetic_search.py b/sklearn_genetic/tests/unit/test_genetic_search.py similarity index 99% rename from sklearn_genetic/tests/test_genetic_search.py rename to sklearn_genetic/tests/unit/test_genetic_search.py index 3f1a3da..69be07d 100644 --- a/sklearn_genetic/tests/test_genetic_search.py +++ b/sklearn_genetic/tests/unit/test_genetic_search.py @@ -10,9 +10,9 @@ from sklearn.metrics import accuracy_score import numpy as np -from .. import GASearchCV -from ..space import Integer, Categorical, Continuous -from ..callbacks import ( +from sklearn_genetic import GASearchCV +from sklearn_genetic.space import Integer, Categorical, Continuous +from sklearn_genetic.callbacks import ( ThresholdStopping, DeltaThreshold, ConsecutiveStopping, diff --git a/sklearn_genetic/tests/test_plots.py b/sklearn_genetic/tests/unit/test_plots.py similarity index 87% rename from sklearn_genetic/tests/test_plots.py rename to sklearn_genetic/tests/unit/test_plots.py index 1399c1c..e1b51d9 100644 --- a/sklearn_genetic/tests/test_plots.py +++ b/sklearn_genetic/tests/unit/test_plots.py @@ -3,9 +3,13 @@ from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeRegressor -from .. import GASearchCV -from ..plots import plot_fitness_evolution, plot_search_space, plot_parallel_coordinates -from ..space import Integer, Categorical, Continuous +from sklearn_genetic import GASearchCV +from sklearn_genetic.plots import ( + plot_fitness_evolution, + plot_search_space, + plot_parallel_coordinates, +) +from sklearn_genetic.space import Integer, Categorical, Continuous data = load_boston() From b9130128fd74451eaa9850784c1ea137d8dfb5ac Mon Sep 17 00:00:00 2001 From: Rodrigo Arenas <31422766+rodrigo-arenas@users.noreply.github.com> Date: Wed, 8 Dec 2021 09:30:39 -0500 Subject: [PATCH 2/4] Relative imports relative imports to avoid mix with installed package --- sklearn_genetic/tests/mlflow/test_mlflow.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sklearn_genetic/tests/mlflow/test_mlflow.py b/sklearn_genetic/tests/mlflow/test_mlflow.py index 12842dc..219e29b 100644 --- a/sklearn_genetic/tests/mlflow/test_mlflow.py +++ b/sklearn_genetic/tests/mlflow/test_mlflow.py @@ -9,9 +9,9 @@ from sklearn.model_selection import train_test_split from sklearn.model_selection import StratifiedKFold -from sklearn_genetic.genetic_search import GASearchCV -from sklearn_genetic.mlflow import MLflowConfig -from sklearn_genetic.space import Integer, Categorical, Continuous +from ..genetic_search import GASearchCV +from ..mlflow import MLflowConfig +from ..space import Integer, Categorical, Continuous @pytest.fixture From 7098324eddbbd95f642224fd4a1b345a02b52f4f Mon Sep 17 00:00:00 2001 From: Rodrigo Arenas <31422766+rodrigo-arenas@users.noreply.github.com> Date: Wed, 8 Dec 2021 09:32:01 -0500 Subject: [PATCH 3/4] Relative imports --- sklearn_genetic/tests/unit/test_genetic_search.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sklearn_genetic/tests/unit/test_genetic_search.py b/sklearn_genetic/tests/unit/test_genetic_search.py index 69be07d..3f1a3da 100644 --- a/sklearn_genetic/tests/unit/test_genetic_search.py +++ b/sklearn_genetic/tests/unit/test_genetic_search.py @@ -10,9 +10,9 @@ from sklearn.metrics import accuracy_score import numpy as np -from sklearn_genetic import GASearchCV -from sklearn_genetic.space import Integer, Categorical, Continuous -from sklearn_genetic.callbacks import ( +from .. import GASearchCV +from ..space import Integer, Categorical, Continuous +from ..callbacks import ( ThresholdStopping, DeltaThreshold, ConsecutiveStopping, From 525ad4f47d174ca708f5d8afdde44fb51552bc7d Mon Sep 17 00:00:00 2001 From: Rodrigo Arenas <31422766+rodrigo-arenas@users.noreply.github.com> Date: Wed, 8 Dec 2021 09:33:17 -0500 Subject: [PATCH 4/4] relative imports --- sklearn_genetic/tests/unit/test_plots.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sklearn_genetic/tests/unit/test_plots.py b/sklearn_genetic/tests/unit/test_plots.py index e1b51d9..2e061b3 100644 --- a/sklearn_genetic/tests/unit/test_plots.py +++ b/sklearn_genetic/tests/unit/test_plots.py @@ -3,13 +3,13 @@ from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeRegressor -from sklearn_genetic import GASearchCV -from sklearn_genetic.plots import ( +from .. import GASearchCV +from ..plots import ( plot_fitness_evolution, plot_search_space, plot_parallel_coordinates, ) -from sklearn_genetic.space import Integer, Categorical, Continuous +from ..space import Integer, Categorical, Continuous data = load_boston()