From e5de597f02df2be89d3fb928a86f23e44e317609 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 30 Oct 2025 17:23:48 -0300 Subject: [PATCH 001/176] separate airflow, synapse and base medperf requirements --- cli/airflow_requirements.txt | 8 ++++++++ cli/requirements.txt | 1 - cli/setup.py | 12 +++++++++++- cli/synapse_requirements.txt | 1 + 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 cli/airflow_requirements.txt create mode 100644 cli/synapse_requirements.txt diff --git a/cli/airflow_requirements.txt b/cli/airflow_requirements.txt new file mode 100644 index 000000000..9eccbac1a --- /dev/null +++ b/cli/airflow_requirements.txt @@ -0,0 +1,8 @@ +methodtools==0.4.7 +apache-airflow==3.0.1 +apache-airflow-task-sdk==1.0.1 +apache-airflow-providers-singularity==3.8.0 +apache-airflow-providers-docker==4.4.0 +apache-airflow-providers-fab==2.0.2 +psycopg2-binary==2.9.9 +asyncpg==0.30.0 \ No newline at end of file diff --git a/cli/requirements.txt b/cli/requirements.txt index 8e22c5abc..d0e7fa2ed 100644 --- a/cli/requirements.txt +++ b/cli/requirements.txt @@ -12,7 +12,6 @@ pytest-mock==3.14.0 pyfakefs==5.8.0 validators==0.18.2 merge-args==0.1.4 -synapseclient==4.1.1 schema==0.7.5 email-validator==2.0.0 auth0-python==4.3.0 diff --git a/cli/setup.py b/cli/setup.py index 7a784aed6..ad29615c1 100644 --- a/cli/setup.py +++ b/cli/setup.py @@ -11,6 +11,15 @@ if req and not req.startswith("--"): requires.append(req) +with open("airflow_requirements.txt", "r") as f: + airflow_requires = [line.strip() for line in f] + +with open("synapse_requirements.txt", "r") as f: + synapse_requires = [line.strip() for line in f] + +extras_require = {"airflow": airflow_requires, "synapse": synapse_requires} + + # TODO: doesn't work right now because medperf wheel is not building properly package_data = ["medperf/web_ui/templates/*", "medperf/web_ui/static/*"] @@ -23,7 +32,8 @@ license="Apache 2.0", packages=["medperf"], install_requires=requires, - python_requires=">=3.6", + extras_require=extras_require, + python_requires=">=3.9", entry_points=""" [console_scripts] medperf=medperf.__main__:app diff --git a/cli/synapse_requirements.txt b/cli/synapse_requirements.txt new file mode 100644 index 000000000..94da324a4 --- /dev/null +++ b/cli/synapse_requirements.txt @@ -0,0 +1 @@ +synapseclient==4.5.0 \ No newline at end of file From 315863a03b0da82f50087eb62fa5bb8224a7c221 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 31 Oct 2025 09:25:35 -0300 Subject: [PATCH 002/176] Update dependencies in preparation for airflow --- cli/requirements.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cli/requirements.txt b/cli/requirements.txt index d0e7fa2ed..b29976bfa 100644 --- a/cli/requirements.txt +++ b/cli/requirements.txt @@ -1,9 +1,9 @@ -typer~=0.12.0 +typer~=0.15.0 rich~=13.7.0 PyYAML==6.0.1 requests>=2.26.0 -pydantic==1.10.13 -yaspin==2.1.0 +pydantic==2.11.0 +yaspin==3.3.0 tabulate==0.9.0 pexpect==4.8.0 colorama==0.4.4 @@ -19,9 +19,9 @@ pandas==2.1.0 numpy==1.26.4 watchdog==3.0.0 GitPython==3.1.41 -psutil==5.9.8 +dill==0.4.0 semver==3.0.4 cookiecutter==2.1.1 uvicorn==0.30.1 -fastapi==0.111.1 +fastapi==0.116.1 fastapi-login==1.10.2 From 9da3a3dbb84b20b678c710af7cdf99e837f4d283 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 31 Oct 2025 09:25:48 -0300 Subject: [PATCH 003/176] Implement similar functionality to Pydantic v2 parse_datetime --- cli/medperf/commands/association/utils.py | 2 +- cli/medperf/commands/execution/utils.py | 2 +- cli/medperf/utils.py | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cli/medperf/commands/association/utils.py b/cli/medperf/commands/association/utils.py index 310f53de6..1c47bb8ea 100644 --- a/cli/medperf/commands/association/utils.py +++ b/cli/medperf/commands/association/utils.py @@ -1,6 +1,6 @@ from medperf.exceptions import InvalidArgumentError, MedperfException from medperf import config -from pydantic.datetime_parse import parse_datetime +from medperf.utils import parse_datetime def validate_args( diff --git a/cli/medperf/commands/execution/utils.py b/cli/medperf/commands/execution/utils.py index b8406cef3..98fdd20e4 100644 --- a/cli/medperf/commands/execution/utils.py +++ b/cli/medperf/commands/execution/utils.py @@ -1,4 +1,4 @@ -from pydantic.datetime_parse import parse_datetime +from medperf.utils import parse_datetime from medperf.entities.execution import Execution from typing import List diff --git a/cli/medperf/utils.py b/cli/medperf/utils.py index 650e002be..5d33081a8 100644 --- a/cli/medperf/utils.py +++ b/cli/medperf/utils.py @@ -22,6 +22,7 @@ from git import Repo, GitCommandError import medperf.config as config from medperf.exceptions import CleanExit, ExecutionError, InvalidArgumentError +from pydantic import TypeAdapter def get_file_hash(path: str) -> str: @@ -560,3 +561,8 @@ def get_webui_properties(): print() print("=" * 40) print(f"URL: http://{props['host']}:{props['port']}") + + +# Pydantic v2 way of implementing old parse_datetime functionality. +# See https://github.com/pydantic/pydantic/discussions/6204#discussioncomment-6266717 +parse_datetime = TypeAdapter(datetime).validate_json From 04e71149b331f7f2af0a8ca80b27259496bfd8b6 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 31 Oct 2025 09:26:32 -0300 Subject: [PATCH 004/176] Add explicit None default for Optionals, as required for Pydantic v2 --- cli/medperf/entities/benchmark.py | 6 +++--- cli/medperf/entities/cube.py | 12 ++++++------ cli/medperf/entities/dataset.py | 2 +- cli/medperf/entities/event.py | 4 ++-- cli/medperf/entities/execution.py | 2 +- cli/medperf/entities/report.py | 16 +++++++++------- cli/medperf/entities/schemas.py | 10 +++++----- cli/medperf/entities/training_exp.py | 8 ++++---- cli/medperf/tests/mocks/report.py | 6 +++--- 9 files changed, 34 insertions(+), 32 deletions(-) diff --git a/cli/medperf/entities/benchmark.py b/cli/medperf/entities/benchmark.py index c8b696a5d..5a3bb079f 100644 --- a/cli/medperf/entities/benchmark.py +++ b/cli/medperf/entities/benchmark.py @@ -23,10 +23,10 @@ class Benchmark(Entity, ApprovableSchema, DeployableSchema): """ description: Optional[str] = Field(None, max_length=20) - docs_url: Optional[HttpUrl] + docs_url: Optional[HttpUrl] = None demo_dataset_tarball_url: str - demo_dataset_tarball_hash: Optional[str] - demo_dataset_generated_uid: Optional[str] + demo_dataset_tarball_hash: Optional[str] = None + demo_dataset_generated_uid: Optional[str] = None data_preparation_mlcube: int reference_model_mlcube: int data_evaluator_mlcube: int diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index e45a68d60..da9d40aa6 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -25,12 +25,12 @@ class Cube(Entity, DeployableSchema): """ git_mlcube_url: str - mlcube_hash: Optional[str] - git_parameters_url: Optional[str] - parameters_hash: Optional[str] - image_tarball_url: Optional[str] - image_tarball_hash: Optional[str] - image_hash: Optional[str] + mlcube_hash: Optional[str] = None + git_parameters_url: Optional[str] = None + parameters_hash: Optional[str] = None + image_tarball_url: Optional[str] = None + image_tarball_hash: Optional[str] = None + image_hash: Optional[str] = None additional_files_tarball_url: Optional[str] = Field(None, alias="tarball_url") additional_files_tarball_hash: Optional[str] = Field(None, alias="tarball_hash") metadata: dict = {} diff --git a/cli/medperf/entities/dataset.py b/cli/medperf/entities/dataset.py index cf5dfe457..8b24f4180 100644 --- a/cli/medperf/entities/dataset.py +++ b/cli/medperf/entities/dataset.py @@ -27,7 +27,7 @@ class Dataset(Entity, DeployableSchema): input_data_hash: str generated_uid: str data_preparation_mlcube: Union[int, str] - split_seed: Optional[int] + split_seed: Optional[int] = None generated_metadata: dict = Field(..., alias="metadata") user_metadata: dict = {} report: dict = {} diff --git a/cli/medperf/entities/event.py b/cli/medperf/entities/event.py index 303fa2a8e..291419d4f 100644 --- a/cli/medperf/entities/event.py +++ b/cli/medperf/entities/event.py @@ -26,8 +26,8 @@ class TrainingEvent(Entity, MedperfSchema): training_exp: int participants: dict finished: bool = False - finished_at: Optional[datetime] - report: Optional[dict] + finished_at: Optional[datetime] = None + report: Optional[dict] = None @staticmethod def get_type(): diff --git a/cli/medperf/entities/execution.py b/cli/medperf/entities/execution.py index 0fa0237a6..415a68a1d 100644 --- a/cli/medperf/entities/execution.py +++ b/cli/medperf/entities/execution.py @@ -30,7 +30,7 @@ class Execution(Entity, ApprovableSchema): model_report: dict = {} evaluation_report: dict = {} finalized: bool = False - finalized_at: Optional[datetime] + finalized_at: Optional[datetime] = None @staticmethod def get_type(): diff --git a/cli/medperf/entities/report.py b/cli/medperf/entities/report.py index 6f962d5d7..5314941f7 100644 --- a/cli/medperf/entities/report.py +++ b/cli/medperf/entities/report.py @@ -28,15 +28,15 @@ class TestReport(Entity): """ name: Optional[str] = "name" - demo_dataset_url: Optional[str] - demo_dataset_hash: Optional[str] - data_path: Optional[str] - labels_path: Optional[str] - prepared_data_hash: Optional[str] + demo_dataset_url: Optional[str] = None + demo_dataset_hash: Optional[str] = None + data_path: Optional[str] = None + labels_path: Optional[str] = None + prepared_data_hash: Optional[str] = None data_preparation_mlcube: Optional[Union[int, str]] model: Union[int, str] data_evaluator_mlcube: Union[int, str] - results: Optional[dict] + results: Optional[dict] = None @staticmethod def get_type(): @@ -73,7 +73,9 @@ def all(cls, unregistered: bool = False, filters: dict = {}) -> List["TestReport return super().all(unregistered=True, filters={}) @classmethod - def get(cls, uid: str, local_only: bool = False, valid_only: bool = True) -> "TestReport": + def get( + cls, uid: str, local_only: bool = False, valid_only: bool = True + ) -> "TestReport": """Gets an instance of the TestReport. ignores local_only inherited flag as TestReport is always a local entity. Args: uid (str): Report Unique Identifier diff --git a/cli/medperf/entities/schemas.py b/cli/medperf/entities/schemas.py index 79926abd9..97d74dfc1 100644 --- a/cli/medperf/entities/schemas.py +++ b/cli/medperf/entities/schemas.py @@ -10,12 +10,12 @@ class MedperfSchema(BaseModel): for_test: bool = False - id: Optional[int] + id: Optional[int] = None name: str = Field(..., max_length=64) - owner: Optional[int] + owner: Optional[int] = None is_valid: bool = True - created_at: Optional[datetime] - modified_at: Optional[datetime] + created_at: Optional[datetime] = None + modified_at: Optional[datetime] = None def __init__(self, *args, **kwargs): """Override the ValidationError procedure so we can @@ -93,7 +93,7 @@ class DeployableSchema(BaseModel): class ApprovableSchema(BaseModel): - approved_at: Optional[datetime] + approved_at: Optional[datetime] = None approval_status: Status = None @validator("approval_status", pre=True, always=True) diff --git a/cli/medperf/entities/training_exp.py b/cli/medperf/entities/training_exp.py index af7d26894..f038df289 100644 --- a/cli/medperf/entities/training_exp.py +++ b/cli/medperf/entities/training_exp.py @@ -22,13 +22,13 @@ class TrainingExp(Entity, MedperfSchema, ApprovableSchema, DeployableSchema): """ description: Optional[str] = Field(None, max_length=20) - docs_url: Optional[HttpUrl] + docs_url: Optional[HttpUrl] = None demo_dataset_tarball_url: str - demo_dataset_tarball_hash: Optional[str] - demo_dataset_generated_uid: Optional[str] + demo_dataset_tarball_hash: Optional[str] = None + demo_dataset_generated_uid: Optional[str] = None data_preparation_mlcube: int fl_mlcube: int - fl_admin_mlcube: Optional[int] + fl_admin_mlcube: Optional[int] = None plan: dict = {} metadata: dict = {} user_metadata: dict = {} diff --git a/cli/medperf/tests/mocks/report.py b/cli/medperf/tests/mocks/report.py index fdf339615..e7ff95bb4 100644 --- a/cli/medperf/tests/mocks/report.py +++ b/cli/medperf/tests/mocks/report.py @@ -5,9 +5,9 @@ class TestTestReport(TestReport): demo_dataset_url: Optional[str] = "url" demo_dataset_hash: Optional[str] = "hash" - data_path: Optional[str] - labels_path: Optional[str] - prepared_data_hash: Optional[str] + data_path: Optional[str] = None + labels_path: Optional[str] = None + prepared_data_hash: Optional[str] = None data_preparation_mlcube: Optional[Union[int, str]] = 1 model: Union[int, str] = 2 data_evaluator_mlcube: Union[int, str] = 3 From 39eb3c132d0d8de8253433a5239495f3d1ae70ea Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 31 Oct 2025 09:31:26 -0300 Subject: [PATCH 005/176] Use default factories for default empty dicts --- cli/medperf/containers/runners/docker_runner.py | 1 + cli/medperf/entities/aggregator.py | 4 ++-- cli/medperf/entities/benchmark.py | 4 ++-- cli/medperf/entities/ca.py | 4 ++-- cli/medperf/entities/cube.py | 4 ++-- cli/medperf/entities/dataset.py | 4 ++-- cli/medperf/entities/execution.py | 12 ++++++------ cli/medperf/entities/training_exp.py | 6 +++--- cli/medperf/tests/mocks/dataset.py | 3 ++- cli/medperf/tests/mocks/execution.py | 3 ++- 10 files changed, 24 insertions(+), 21 deletions(-) diff --git a/cli/medperf/containers/runners/docker_runner.py b/cli/medperf/containers/runners/docker_runner.py index ac044fbdb..5d6ffa9b0 100644 --- a/cli/medperf/containers/runners/docker_runner.py +++ b/cli/medperf/containers/runners/docker_runner.py @@ -11,6 +11,7 @@ from .runner import Runner import logging from .docker_utils import craft_docker_run_command, get_docker_image_hash +from pydantic import Field class DockerRunner(Runner): diff --git a/cli/medperf/entities/aggregator.py b/cli/medperf/entities/aggregator.py index 472730b09..24b9a4db9 100644 --- a/cli/medperf/entities/aggregator.py +++ b/cli/medperf/entities/aggregator.py @@ -1,5 +1,5 @@ import os -from pydantic import validator +from pydantic import validator, Field from medperf.entities.interface import Entity from medperf.entities.schemas import MedperfSchema @@ -24,7 +24,7 @@ class Aggregator(Entity, MedperfSchema): - results """ - metadata: dict = {} + metadata: dict = Field(default_factory=dict) config: dict aggregation_mlcube: int diff --git a/cli/medperf/entities/benchmark.py b/cli/medperf/entities/benchmark.py index 5a3bb079f..673788a78 100644 --- a/cli/medperf/entities/benchmark.py +++ b/cli/medperf/entities/benchmark.py @@ -30,8 +30,8 @@ class Benchmark(Entity, ApprovableSchema, DeployableSchema): data_preparation_mlcube: int reference_model_mlcube: int data_evaluator_mlcube: int - metadata: dict = {} - user_metadata: dict = {} + metadata: dict = Field(default_factory=dict) + user_metadata: dict = Field(default_factory=dict) is_active: bool = True dataset_auto_approval_allow_list: list[str] = [] dataset_auto_approval_mode: str = "NEVER" diff --git a/cli/medperf/entities/ca.py b/cli/medperf/entities/ca.py index c3d76e95b..ad2dc7a24 100644 --- a/cli/medperf/entities/ca.py +++ b/cli/medperf/entities/ca.py @@ -2,7 +2,7 @@ import os from medperf.entities.interface import Entity from medperf.entities.schemas import MedperfSchema -from pydantic import validator +from pydantic import validator, Field import medperf.config as config from medperf.account_management import get_medperf_user_data @@ -22,7 +22,7 @@ class CA(Entity, MedperfSchema): - results """ - metadata: dict = {} + metadata: dict = Field(default_factory=dict) client_mlcube: int server_mlcube: int ca_mlcube: int diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index da9d40aa6..9ef0f500b 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -33,8 +33,8 @@ class Cube(Entity, DeployableSchema): image_hash: Optional[str] = None additional_files_tarball_url: Optional[str] = Field(None, alias="tarball_url") additional_files_tarball_hash: Optional[str] = Field(None, alias="tarball_hash") - metadata: dict = {} - user_metadata: dict = {} + metadata: dict = Field(default_factory=dict) + user_metadata: dict = Field(default_factory=dict) @staticmethod def get_type(): diff --git a/cli/medperf/entities/dataset.py b/cli/medperf/entities/dataset.py index 8b24f4180..f1a20338a 100644 --- a/cli/medperf/entities/dataset.py +++ b/cli/medperf/entities/dataset.py @@ -29,8 +29,8 @@ class Dataset(Entity, DeployableSchema): data_preparation_mlcube: Union[int, str] split_seed: Optional[int] = None generated_metadata: dict = Field(..., alias="metadata") - user_metadata: dict = {} - report: dict = {} + user_metadata: dict = Field(default_factory=dict) + report: dict = Field(default_factory=dict) submitted_as_prepared: bool @staticmethod diff --git a/cli/medperf/entities/execution.py b/cli/medperf/entities/execution.py index 415a68a1d..f92bbb5f9 100644 --- a/cli/medperf/entities/execution.py +++ b/cli/medperf/entities/execution.py @@ -5,7 +5,7 @@ from medperf.account_management import get_medperf_user_data from typing import Optional from datetime import datetime - +from pydantic import Field from medperf.utils import remove_path import yaml @@ -24,11 +24,11 @@ class Execution(Entity, ApprovableSchema): benchmark: int model: int dataset: int - results: dict = {} - metadata: dict = {} - user_metadata: dict = {} - model_report: dict = {} - evaluation_report: dict = {} + results: dict = Field(default_factory=dict) + metadata: dict = Field(default_factory=dict) + user_metadata: dict = Field(default_factory=dict) + model_report: dict = Field(default_factory=dict) + evaluation_report: dict = Field(default_factory=dict) finalized: bool = False finalized_at: Optional[datetime] = None diff --git a/cli/medperf/entities/training_exp.py b/cli/medperf/entities/training_exp.py index f038df289..31865842e 100644 --- a/cli/medperf/entities/training_exp.py +++ b/cli/medperf/entities/training_exp.py @@ -29,9 +29,9 @@ class TrainingExp(Entity, MedperfSchema, ApprovableSchema, DeployableSchema): data_preparation_mlcube: int fl_mlcube: int fl_admin_mlcube: Optional[int] = None - plan: dict = {} - metadata: dict = {} - user_metadata: dict = {} + plan: dict = Field(default_factory=dict) + metadata: dict = Field(default_factory=dict) + user_metadata: dict = Field(default_factory=dict) @staticmethod def get_type(): diff --git a/cli/medperf/tests/mocks/dataset.py b/cli/medperf/tests/mocks/dataset.py index b3d6d4217..ae3a5e193 100644 --- a/cli/medperf/tests/mocks/dataset.py +++ b/cli/medperf/tests/mocks/dataset.py @@ -1,6 +1,7 @@ from typing import Optional, Union from medperf.enums import Status from medperf.entities.dataset import Dataset +from pydantic import Field class TestDataset(Dataset): @@ -10,7 +11,7 @@ class TestDataset(Dataset): data_preparation_mlcube: Union[int, str] = 1 input_data_hash: str = "input_data_hash" generated_uid: str = "generated_uid" - generated_metadata: dict = {} + generated_metadata: dict = Field(default_factory=dict) status: Status = Status.APPROVED.value state: str = "OPERATION" submitted_as_prepared: bool = False diff --git a/cli/medperf/tests/mocks/execution.py b/cli/medperf/tests/mocks/execution.py index 27747b488..05c35c311 100644 --- a/cli/medperf/tests/mocks/execution.py +++ b/cli/medperf/tests/mocks/execution.py @@ -1,5 +1,6 @@ from typing import Optional from medperf.entities.execution import Execution +from pydantic import Field class TestExecution(Execution): @@ -8,7 +9,7 @@ class TestExecution(Execution): benchmark: int = 1 model: int = 1 dataset: int = 1 - results: dict = {} + results: dict = Field(default_factory=dict) def upload(self): # self.id = 1 From c7ce62b5be97950d039fc2898b92d373876fb37e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 31 Oct 2025 09:32:08 -0300 Subject: [PATCH 006/176] Use new implementation for parse_datetime --- cli/medperf/web_ui/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/web_ui/common.py b/cli/medperf/web_ui/common.py index ec55bc007..55cf07557 100644 --- a/cli/medperf/web_ui/common.py +++ b/cli/medperf/web_ui/common.py @@ -10,7 +10,7 @@ from fastapi.requests import Request from medperf import config from starlette.responses import RedirectResponse -from pydantic.datetime_parse import parse_datetime +from medperf.utils import parse_datetime from medperf.enums import Status from medperf.web_ui.auth import ( From a3145272f3ceece75c37521e1c65efa17508022f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 31 Oct 2025 09:33:36 -0300 Subject: [PATCH 007/176] Add missing type hint required for pydantic v2 --- cli/medperf/tests/mocks/cube.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/tests/mocks/cube.py b/cli/medperf/tests/mocks/cube.py index 9c1acbb8a..6ef20931b 100644 --- a/cli/medperf/tests/mocks/cube.py +++ b/cli/medperf/tests/mocks/cube.py @@ -19,4 +19,4 @@ class TestCube(Cube): ) additional_files_tarball_hash: Optional[str] = EMPTY_FILE_HASH state: str = "OPERATION" - is_valid = True + is_valid: bool = True From 38aedbd11b6d05446fa72fcfc6d4fd8f9553ecb3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 3 Nov 2025 09:21:47 -0300 Subject: [PATCH 008/176] General fixes for pydantic v2 --- cli/medperf/entities/cube.py | 4 +++- cli/medperf/entities/dataset.py | 4 +++- .../tests/commands/benchmark/test_submit.py | 2 +- cli/medperf/utils.py | 18 ++++++++++++++---- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 9ef0f500b..6167dbc9f 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -1,7 +1,7 @@ import os from typing import List, Optional, Union from medperf.commands.association.utils import get_user_associations -from pydantic import Field +from pydantic import Field, ConfigDict from medperf.entities.interface import Entity from medperf.entities.schemas import DeployableSchema @@ -36,6 +36,8 @@ class Cube(Entity, DeployableSchema): metadata: dict = Field(default_factory=dict) user_metadata: dict = Field(default_factory=dict) + model_config = ConfigDict(validate_by_name=True) + @staticmethod def get_type(): return "container" diff --git a/cli/medperf/entities/dataset.py b/cli/medperf/entities/dataset.py index f1a20338a..ba9d5d761 100644 --- a/cli/medperf/entities/dataset.py +++ b/cli/medperf/entities/dataset.py @@ -1,7 +1,7 @@ import os from medperf.commands.association.utils import get_user_associations import yaml -from pydantic import Field, validator +from pydantic import Field, validator, ConfigDict from typing import Optional, Union, List from medperf.utils import remove_path @@ -33,6 +33,8 @@ class Dataset(Entity, DeployableSchema): report: dict = Field(default_factory=dict) submitted_as_prepared: bool + model_config = ConfigDict(validate_by_name=True) + @staticmethod def get_type(): return "dataset" diff --git a/cli/medperf/tests/commands/benchmark/test_submit.py b/cli/medperf/tests/commands/benchmark/test_submit.py index 754f85e65..aeba5f8a1 100644 --- a/cli/medperf/tests/commands/benchmark/test_submit.py +++ b/cli/medperf/tests/commands/benchmark/test_submit.py @@ -40,7 +40,7 @@ def test_submit_prepares_tmp_path_for_cleanup(): def test_submit_uploads_benchmark_data(mocker, result, comms, ui): # Arrange submission = SubmitBenchmark(BENCHMARK_INFO) - submission.bmk.metadata = {"results": result} + submission.bmk.metadata = {"results": {}} expected_data = submission.bmk.todict() spy_upload = mocker.patch.object( comms, "upload_benchmark", return_value=TestBenchmark().todict() diff --git a/cli/medperf/utils.py b/cli/medperf/utils.py index 5d33081a8..68431a416 100644 --- a/cli/medperf/utils.py +++ b/cli/medperf/utils.py @@ -16,7 +16,7 @@ import shutil from pexpect import spawn from datetime import datetime -from typing import List +from typing import List, Union from colorama import Fore, Style from pexpect.exceptions import TIMEOUT from git import Repo, GitCommandError @@ -563,6 +563,16 @@ def get_webui_properties(): print(f"URL: http://{props['host']}:{props['port']}") -# Pydantic v2 way of implementing old parse_datetime functionality. -# See https://github.com/pydantic/pydantic/discussions/6204#discussioncomment-6266717 -parse_datetime = TypeAdapter(datetime).validate_json +def parse_datetime(datetime_obj: Union[dict, str, int]): + # Pydantic v2 way of implementing old parse_datetime functionality. + # Adapted from https://github.com/pydantic/pydantic/discussions/6204#discussioncomment-6266717 + + if isinstance(datetime_obj, (str, int)): + return TypeAdapter(datetime).validate_strings(str(datetime_obj)) + elif isinstance(datetime_obj, dict): + return TypeAdapter(datetime).validate_json(datetime_obj) + else: + raise ValueError( + "Current implementation of parse_datetime only supports strings, ints and JSON objects!\n" + f"Object sent was of type {type(datetime_obj)}\n{datetime_obj=}" + ) From 6cf6ea710feae4aba923897f7c962ba427cf7f80 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 3 Nov 2025 10:24:16 -0300 Subject: [PATCH 009/176] Update deprecated Pydantic functionality --- cli/medperf/entities/aggregator.py | 8 +++--- cli/medperf/entities/ca.py | 8 +++--- cli/medperf/entities/cube.py | 4 +-- cli/medperf/entities/dataset.py | 12 ++++---- cli/medperf/entities/schemas.py | 42 ++++++++++++++++++---------- cli/medperf/tests/entities/utils.py | 4 ++- cli/medperf/tests/mocks/benchmark.py | 3 +- 7 files changed, 47 insertions(+), 34 deletions(-) diff --git a/cli/medperf/entities/aggregator.py b/cli/medperf/entities/aggregator.py index 24b9a4db9..f1efba317 100644 --- a/cli/medperf/entities/aggregator.py +++ b/cli/medperf/entities/aggregator.py @@ -1,5 +1,5 @@ import os -from pydantic import validator, Field +from pydantic import field_validator, Field, ValidationInfo from medperf.entities.interface import Entity from medperf.entities.schemas import MedperfSchema @@ -25,7 +25,7 @@ class Aggregator(Entity, MedperfSchema): """ metadata: dict = Field(default_factory=dict) - config: dict + config: dict = Field(validate_default=True) aggregation_mlcube: int @staticmethod @@ -48,8 +48,8 @@ def get_metadata_filename(): def get_comms_uploader(): return config.comms.upload_aggregator - @validator("config", pre=True, always=True) - def check_config(cls, v, *, values, **kwargs): + @field_validator("config", mode="before") + def check_config(cls, v: dict, info: ValidationInfo): keys = set(v.keys()) allowed_keys = { "address", diff --git a/cli/medperf/entities/ca.py b/cli/medperf/entities/ca.py index ad2dc7a24..b86f57131 100644 --- a/cli/medperf/entities/ca.py +++ b/cli/medperf/entities/ca.py @@ -2,7 +2,7 @@ import os from medperf.entities.interface import Entity from medperf.entities.schemas import MedperfSchema -from pydantic import validator, Field +from pydantic import field_validator, Field, ValidationInfo import medperf.config as config from medperf.account_management import get_medperf_user_data @@ -26,7 +26,7 @@ class CA(Entity, MedperfSchema): client_mlcube: int server_mlcube: int ca_mlcube: int - config: dict + config: dict = Field(validate_default=True) @staticmethod def get_type(): @@ -48,8 +48,8 @@ def get_metadata_filename(): def get_comms_uploader(): return config.comms.upload_ca - @validator("config", pre=True, always=True) - def check_config(cls, v, *, values, **kwargs): + @field_validator("config", mode="before") + def check_config(cls, v: dict, info: ValidationInfo): keys = set(v.keys()) allowed_keys = { "address", diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 6167dbc9f..9ef0f500b 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -1,7 +1,7 @@ import os from typing import List, Optional, Union from medperf.commands.association.utils import get_user_associations -from pydantic import Field, ConfigDict +from pydantic import Field from medperf.entities.interface import Entity from medperf.entities.schemas import DeployableSchema @@ -36,8 +36,6 @@ class Cube(Entity, DeployableSchema): metadata: dict = Field(default_factory=dict) user_metadata: dict = Field(default_factory=dict) - model_config = ConfigDict(validate_by_name=True) - @staticmethod def get_type(): return "container" diff --git a/cli/medperf/entities/dataset.py b/cli/medperf/entities/dataset.py index ba9d5d761..d94f7221c 100644 --- a/cli/medperf/entities/dataset.py +++ b/cli/medperf/entities/dataset.py @@ -1,7 +1,7 @@ import os from medperf.commands.association.utils import get_user_associations import yaml -from pydantic import Field, validator, ConfigDict +from pydantic import Field, field_validator, ValidationInfo from typing import Optional, Union, List from medperf.utils import remove_path @@ -26,15 +26,13 @@ class Dataset(Entity, DeployableSchema): location: Optional[str] = Field(None, max_length=20) input_data_hash: str generated_uid: str - data_preparation_mlcube: Union[int, str] + data_preparation_mlcube: Union[int, str] = Field(validate_default=True) split_seed: Optional[int] = None generated_metadata: dict = Field(..., alias="metadata") user_metadata: dict = Field(default_factory=dict) report: dict = Field(default_factory=dict) submitted_as_prepared: bool - model_config = ConfigDict(validate_by_name=True) - @staticmethod def get_type(): return "dataset" @@ -55,9 +53,9 @@ def get_metadata_filename(): def get_comms_uploader(): return config.comms.upload_dataset - @validator("data_preparation_mlcube", pre=True, always=True) - def check_data_preparation_mlcube(cls, v, *, values, **kwargs): - if not isinstance(v, int) and not values["for_test"]: + @field_validator("data_preparation_mlcube", mode="before") + def check_data_preparation_mlcube(cls, v: int, info: ValidationInfo): + if not isinstance(v, int) and not info.data.get("for_test"): raise ValueError( "data_preparation_mlcube must be an integer if not running a compatibility test" ) diff --git a/cli/medperf/entities/schemas.py b/cli/medperf/entities/schemas.py index 97d74dfc1..035fd52a6 100644 --- a/cli/medperf/entities/schemas.py +++ b/cli/medperf/entities/schemas.py @@ -1,5 +1,13 @@ from datetime import datetime -from pydantic import BaseModel, Field, validator, HttpUrl, ValidationError +from pydantic import ( + BaseModel, + Field, + field_validator, + HttpUrl, + ValidationError, + ConfigDict, + ValidationInfo, +) from typing import Optional from collections import defaultdict @@ -11,7 +19,7 @@ class MedperfSchema(BaseModel): for_test: bool = False id: Optional[int] = None - name: str = Field(..., max_length=64) + name: str = Field(..., max_length=64, validate_default=True) owner: Optional[int] = None is_valid: bool = True created_at: Optional[datetime] = None @@ -42,7 +50,7 @@ def dict(self, *args, **kwargs) -> dict: Returns: dict: filtered dictionary """ - fields = self.__fields__ + fields = self.__class__.model_fields valid_fields = [] # Gather all the field names, both original an alias names for field_name, field_item in fields.items(): @@ -50,10 +58,17 @@ def dict(self, *args, **kwargs) -> dict: valid_fields.append(field_item.alias) # Remove duplicates valid_fields = set(valid_fields) - model_dict = super().dict(*args, **kwargs) + model_dict = super().model_dump(*args, **kwargs) out_dict = {k: v for k, v in model_dict.items() if k in valid_fields} return out_dict + def model_dump(self, *args, **kwargs) -> dict: + """ + Added method to have a similar API to Pydantic V2, which recommends using + .model_dump instead of .dict + """ + return self.dict(*args, **kwargs) + def todict(self) -> dict: """Dictionary containing both original and alias fields @@ -70,22 +85,21 @@ def todict(self) -> dict: og_dict[k] = str(v) return og_dict - @validator("*", pre=True) + @field_validator("*", mode="before") def empty_str_to_none(cls, v): if v == "": return None return v - @validator("name", pre=True, always=True) - def name_max_length(cls, v, *, values, **kwargs): - if not values["for_test"] and len(v) > 20: + @field_validator("name", mode="before") + def name_max_length(cls, v: str, info: ValidationInfo): + if not info.data.get("for_test") and len(v) > 20: raise ValueError("The name must have no more than 20 characters") return v - class Config: - allow_population_by_field_name = True - extra = "allow" - use_enum_values = True + model_config = ConfigDict( + populate_by_name=True, use_enum_values=True, extra="allow" + ) class DeployableSchema(BaseModel): @@ -94,9 +108,9 @@ class DeployableSchema(BaseModel): class ApprovableSchema(BaseModel): approved_at: Optional[datetime] = None - approval_status: Status = None + approval_status: Status = Field(None, validate_default=True) - @validator("approval_status", pre=True, always=True) + @field_validator("approval_status", mode="before") def default_status(cls, v): status = Status.PENDING if v is not None: diff --git a/cli/medperf/tests/entities/utils.py b/cli/medperf/tests/entities/utils.py index 983b1cd0a..cb6f84028 100644 --- a/cli/medperf/tests/entities/utils.py +++ b/cli/medperf/tests/entities/utils.py @@ -174,7 +174,9 @@ def setup_execution_fs(ents, fs): setup_dset_fs([dataset_id], fs) try: - fs.create_file(execution_file, contents=yaml.dump(execution_contents.todict())) + fs.create_file( + execution_file, contents=yaml.dump(execution_contents.todict()) + ) except FileExistsError: pass diff --git a/cli/medperf/tests/mocks/benchmark.py b/cli/medperf/tests/mocks/benchmark.py index 7ede9a7cd..2e72f2401 100644 --- a/cli/medperf/tests/mocks/benchmark.py +++ b/cli/medperf/tests/mocks/benchmark.py @@ -1,6 +1,7 @@ from typing import Optional from medperf.enums import Status from medperf.entities.benchmark import Benchmark +from pydantic import Field class TestBenchmark(Benchmark): @@ -11,4 +12,4 @@ class TestBenchmark(Benchmark): data_preparation_mlcube: int = 1 reference_model_mlcube: int = 2 data_evaluator_mlcube: int = 3 - approval_status: Status = Status.APPROVED + approval_status: Status = Field(Status.APPROVED, validate_default=True) From e9b622accbe19f5a42759c99c08f3128b456fcbd Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 3 Nov 2025 10:24:34 -0300 Subject: [PATCH 010/176] Add small tests config file to suppress yaspin color warnings --- cli/pytest.ini | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 cli/pytest.ini diff --git a/cli/pytest.ini b/cli/pytest.ini new file mode 100644 index 000000000..23d657cda --- /dev/null +++ b/cli/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +filterwarnings = ignore:color:UserWarning:yaspin \ No newline at end of file From 349d8b59e82aa94cd7a1543ea4cc1ab34032b0fe Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 3 Nov 2025 14:30:08 -0300 Subject: [PATCH 011/176] Fix parse_datetime to support datetime objects directly --- cli/medperf/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cli/medperf/utils.py b/cli/medperf/utils.py index 68431a416..743cf8c84 100644 --- a/cli/medperf/utils.py +++ b/cli/medperf/utils.py @@ -563,16 +563,16 @@ def get_webui_properties(): print(f"URL: http://{props['host']}:{props['port']}") -def parse_datetime(datetime_obj: Union[dict, str, int]): +def parse_datetime(datetime_obj: Union[str, int, datetime]): # Pydantic v2 way of implementing old parse_datetime functionality. # Adapted from https://github.com/pydantic/pydantic/discussions/6204#discussioncomment-6266717 - if isinstance(datetime_obj, (str, int)): + if isinstance(datetime_obj, datetime): + return datetime_obj + elif isinstance(datetime_obj, (str, int)): return TypeAdapter(datetime).validate_strings(str(datetime_obj)) - elif isinstance(datetime_obj, dict): - return TypeAdapter(datetime).validate_json(datetime_obj) else: raise ValueError( - "Current implementation of parse_datetime only supports strings, ints and JSON objects!\n" + "Current implementation of parse_datetime only supports strings, ints and datetimes!\n" f"Object sent was of type {type(datetime_obj)}\n{datetime_obj=}" ) From f98b2fdeaf77f6bed5d8a4cec44e49026164b20a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 3 Nov 2025 14:30:20 -0300 Subject: [PATCH 012/176] Bump google-cloud-secret-manager version --- server/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/requirements.txt b/server/requirements.txt index 0d8e7ee4e..5016bed11 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -7,7 +7,7 @@ django-environ==0.11.2 django-cors-headers==4.3.1 psycopg2-binary==2.9.9 gunicorn==23.0.0 -google-cloud-secret-manager==2.19.0 +google-cloud-secret-manager==2.25.0 whitenoise==6.6.0 pyOpenSSL==24.1.0 Werkzeug==3.0.6 From afee7ff0f9f9cfa44ca0929377e6b6a9ca76ff41 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 28 Oct 2025 16:43:46 -0300 Subject: [PATCH 013/176] Create DataPreparationWorkflow Object --- server/data_preparation_workflow/__init__.py | 0 server/data_preparation_workflow/admin.py | 14 +++ server/data_preparation_workflow/apps.py | 6 + server/data_preparation_workflow/models.py | 31 +++++ .../data_preparation_workflow/permissions.py | 27 +++++ .../data_preparation_workflow/serializers.py | 24 ++++ server/data_preparation_workflow/urls.py | 12 ++ server/data_preparation_workflow/views.py | 106 ++++++++++++++++++ server/medperf/settings.py | 1 + 9 files changed, 221 insertions(+) create mode 100644 server/data_preparation_workflow/__init__.py create mode 100644 server/data_preparation_workflow/admin.py create mode 100644 server/data_preparation_workflow/apps.py create mode 100644 server/data_preparation_workflow/models.py create mode 100644 server/data_preparation_workflow/permissions.py create mode 100644 server/data_preparation_workflow/serializers.py create mode 100644 server/data_preparation_workflow/urls.py create mode 100644 server/data_preparation_workflow/views.py diff --git a/server/data_preparation_workflow/__init__.py b/server/data_preparation_workflow/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/data_preparation_workflow/admin.py b/server/data_preparation_workflow/admin.py new file mode 100644 index 000000000..94691fb6a --- /dev/null +++ b/server/data_preparation_workflow/admin.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from .models import DataPrepWorkflow + + +class DataPrepWorkflowAdmin(admin.ModelAdmin): + list_display = ( + "name", + "owner", + "prep_tarball_url", + "prep_tarball_hash", + ) + + +admin.site.register(DataPrepWorkflow, DataPrepWorkflowAdmin) diff --git a/server/data_preparation_workflow/apps.py b/server/data_preparation_workflow/apps.py new file mode 100644 index 000000000..58ca5af38 --- /dev/null +++ b/server/data_preparation_workflow/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DataPrepWorkflowConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "data_preparation_workflow" diff --git a/server/data_preparation_workflow/models.py b/server/data_preparation_workflow/models.py new file mode 100644 index 000000000..aa57bec4a --- /dev/null +++ b/server/data_preparation_workflow/models.py @@ -0,0 +1,31 @@ +from django.db import models +from django.contrib.auth import get_user_model +from mlcube.models import MlCube + +User = get_user_model() + + +class DataPrepWorkflow(models.Model): + name = models.CharField(max_length=20, unique=True) + owner = models.ForeignKey(User, on_delete=models.PROTECT) + prep_tarball_url = models.CharField(max_length=256) + prep_tarball_hash = models.CharField(max_length=100) + containers = models.ManyToManyField(MlCube) + is_valid = models.BooleanField(default=True) + metadata = models.JSONField(default=dict, blank=True, null=True) + user_metadata = models.JSONField(default=dict, blank=True, null=True) + created_at = models.DateTimeField(auto_now_add=True) + modified_at = models.DateTimeField(auto_now=True) + + def __str__(self): + return self.name + + class Meta: + constraints = [ + models.constraints.UniqueConstraint( + fields=["prep_tarball_hash"], + name="unique_tarball_hash_for_workflow", + ) + ] + verbose_name_plural = "DataPrepWorkflows" + ordering = ["modified_at"] diff --git a/server/data_preparation_workflow/permissions.py b/server/data_preparation_workflow/permissions.py new file mode 100644 index 000000000..2647e7b91 --- /dev/null +++ b/server/data_preparation_workflow/permissions.py @@ -0,0 +1,27 @@ +from rest_framework.permissions import BasePermission +from .models import DataPrepWorkflow + + +class IsAdmin(BasePermission): + def has_permission(self, request, view): + return request.user.is_superuser + + +class IsDataPrepWorkflowOwner(BasePermission): + def get_object(self, pk): + try: + return DataPrepWorkflow.objects.get(pk=pk) + except DataPrepWorkflow.DoesNotExist: + return None + + def has_permission(self, request, view): + pk = view.kwargs.get("pk", None) + if not pk: + return False + workflow = self.get_object(pk) + if not workflow: + return False + if workflow.owner.id == request.user.id: + return True + else: + return False diff --git a/server/data_preparation_workflow/serializers.py b/server/data_preparation_workflow/serializers.py new file mode 100644 index 000000000..ac087e8df --- /dev/null +++ b/server/data_preparation_workflow/serializers.py @@ -0,0 +1,24 @@ +from rest_framework import serializers +from .models import DataPrepWorkflow + + +class DataPrepWorkflowSerializer(serializers.ModelSerializer): + class Meta: + model = DataPrepWorkflow + fields = "__all__" + read_only_fields = ["owner"] + + def validate(self, data): + tarball_url = data.get("prep_tarball_url", "") + tarball_hash = data.get("prep_tarball_hash", "") + + # validate nonblank parameters file hash + if tarball_url and not tarball_hash: + raise serializers.ValidationError("Preparation tarball requires file hash") + + if not tarball_url and tarball_hash: + raise serializers.ValidationError( + "preparation tarball hash was provided without URL" + ) + + return data diff --git a/server/data_preparation_workflow/urls.py b/server/data_preparation_workflow/urls.py new file mode 100644 index 000000000..e1ce16494 --- /dev/null +++ b/server/data_preparation_workflow/urls.py @@ -0,0 +1,12 @@ +from django.urls import path +from . import views + +app_name = "DataPrepWorkflow" + +urlpatterns = [ + path("", views.DataPrepWorkflowList.as_view()), + path("/", views.DataPrepWorkflowDetail.as_view()), + path("/datasets/", views.DataPrepWorkflowDatasetList.as_view()), + # path("/benchmarks/", bviews.ModelBenchmarksList.as_view()), + # NOTE: when activating this endpoint later, check permissions and write tests +] diff --git a/server/data_preparation_workflow/views.py b/server/data_preparation_workflow/views.py new file mode 100644 index 000000000..c8f02590d --- /dev/null +++ b/server/data_preparation_workflow/views.py @@ -0,0 +1,106 @@ +from django.http import Http404 +from rest_framework.generics import GenericAPIView +from rest_framework.response import Response +from rest_framework import status +from drf_spectacular.utils import extend_schema + +from .models import DataPrepWorkflow +from .serializers import DataPrepWorkflowSerializer +from .permissions import IsAdmin, IsDataPrepWorkflowOwner +from dataset.serializers import DatasetFullSerializer +from dataset.models import Dataset + + +class DataPrepWorkflowList(GenericAPIView): + serializer_class = DataPrepWorkflowSerializer + queryset = "" + filterset_fields = ("name", "owner", "state", "is_valid") + + @extend_schema(operation_id="DataPrepWorkflows_retrieve_all") + def get(self, request, format=None): + """ + List all DataPrepWorkflows + """ + workflows = DataPrepWorkflow.objects.all() + workflows = self.filter_queryset(workflows) + workflows = self.paginate_queryset(workflows) + serializer = DataPrepWorkflowSerializer(workflows, many=True) + return self.get_paginated_response(serializer.data) + + def post(self, request, format=None): + """ + Creates a new DataPrepWorkflow + """ + serializer = DataPrepWorkflowSerializer(data=request.data) + if serializer.is_valid(): + serializer.save(owner=request.user) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class DataPrepWorkflowDetail(GenericAPIView): + serializer_class = DataPrepWorkflowSerializer + queryset = "" + + def get_permissions(self): + if self.request.method == "PUT": + self.permission_classes = [IsAdmin | IsDataPrepWorkflowOwner] + elif self.request.method == "DELETE": + self.permission_classes = [IsAdmin] + return super(self.__class__, self).get_permissions() + + def get_object(self, pk): + try: + return DataPrepWorkflow.objects.get(pk=pk) + except DataPrepWorkflow.DoesNotExist: + raise Http404 + + def get(self, request, pk, format=None): + """ + Retrieve a DataPrepWorkflow instance. + """ + DataPrepWorkflow = self.get_object(pk) + serializer = DataPrepWorkflowSerializer(DataPrepWorkflow) + return Response(serializer.data) + + def put(self, request, pk, format=None): + """ + Update a DataPrepWorkflow instance. + """ + DataPrepWorkflow = self.get_object(pk) + serializer = DataPrepWorkflowSerializer( + DataPrepWorkflow, data=request.data, partial=True + ) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def delete(self, request, pk, format=None): + """ + Delete a DataPrepWorkflow instance. + """ + DataPrepWorkflow = self.get_object(pk) + DataPrepWorkflow.delete() + return Response(status=status.HTTP_204_NO_CONTENT) + + +class DataPrepWorkflowDatasetList(GenericAPIView): + permission_classes = [IsAdmin | IsDataPrepWorkflowOwner] + serializer_class = DatasetFullSerializer + queryset = "" + + def get_object(self, pk): + try: + return DataPrepWorkflow.objects.get(pk=pk) + except DataPrepWorkflow.DoesNotExist: + raise Http404 + + def get(self, request, pk, format=None): + """ + Retrieve datasets associated with an DataPrepWorkflow instance. + """ + datasets = Dataset.objects.filter(data_preparation_DataPrepWorkflow__pk=pk) + datasets = self.paginate_queryset(datasets) + serializer = DatasetFullSerializer(datasets, many=True) + return self.get_paginated_response(serializer.data) diff --git a/server/medperf/settings.py b/server/medperf/settings.py index 43ba5e377..2950bae2d 100644 --- a/server/medperf/settings.py +++ b/server/medperf/settings.py @@ -105,6 +105,7 @@ "traindataset_association", "aggregator_association", "ca_association", + "data_preparation_workflow", "trainingevent", "rest_framework", "rest_framework.authtoken", From 6b2f8558e33b3b9ff9cf490aa78ace13a3595fe9 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 28 Oct 2025 16:54:14 -0300 Subject: [PATCH 014/176] Add DataPrepWorkflow object to Dataset and Benchmark --- ...mark_data_preparation_workflow_and_more.py | 37 +++++++++++++++++++ server/benchmark/models.py | 6 +++ server/benchmark/serializers.py | 17 +++++++++ ...aset_data_preparation_workflow_and_more.py | 37 +++++++++++++++++++ server/dataset/models.py | 6 +++ server/dataset/serializers.py | 26 ++++++++++++- 6 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py create mode 100644 server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py diff --git a/server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py b/server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py new file mode 100644 index 000000000..110c8f7a9 --- /dev/null +++ b/server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py @@ -0,0 +1,37 @@ +# Generated by Django 4.2.23 on 2025-10-28 19:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("data_preparation_workflow", "__first__"), + ("mlcube", "0002_alter_mlcube_unique_together"), + ("benchmark", "0004_alter_benchmark_dataset_auto_approval_allow_list_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="benchmark", + name="data_preparation_workflow", + field=models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="data_preparation_workflow.dataprepworkflow", + ), + ), + migrations.AlterField( + model_name="benchmark", + name="data_preparation_mlcube", + field=models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="data_preprocessor_mlcube", + to="mlcube.mlcube", + ), + ), + ] diff --git a/server/benchmark/models.py b/server/benchmark/models.py index 23af2867c..b6f956f4e 100644 --- a/server/benchmark/models.py +++ b/server/benchmark/models.py @@ -1,5 +1,6 @@ from django.db import models from django.contrib.auth import get_user_model +from data_preparation_workflow.models import DataPrepWorkflow User = get_user_model() @@ -32,6 +33,11 @@ class Benchmark(models.Model): "mlcube.MlCube", on_delete=models.PROTECT, related_name="data_preprocessor_mlcube", + null=True, + default=None, + ) + data_preparation_workflow = models.ForeignKey( + DataPrepWorkflow, on_delete=models.PROTECT, default=None, null=True ) reference_model_mlcube = models.ForeignKey( "mlcube.MlCube", diff --git a/server/benchmark/serializers.py b/server/benchmark/serializers.py index 235d88837..95a72e210 100644 --- a/server/benchmark/serializers.py +++ b/server/benchmark/serializers.py @@ -4,6 +4,21 @@ from .models import Benchmark +def validate_exactly_one_preparation(data: dict): + no_data_prep_provided = ( + data.get("data_preparation_mlcube") is None + and data.get("data_preparation_workflow") is None + ) + multiple_data_prep_provided = ( + data.get("data_preparation_mlcube") is not None + and data.get("data_preparation_workflow") is not None + ) + if no_data_prep_provided or multiple_data_prep_provided: + raise serializers.ValidationError( + "Exactly one of 'data_preparation_mlcube' or 'data_preparation_workflow' must be provided to register a Benchmark" + ) + + class BenchmarkSerializer(serializers.ModelSerializer): class Meta: model = Benchmark @@ -20,6 +35,7 @@ def validate(self, data): "User can own at most one pending benchmark" ) + validate_exactly_one_preparation(data) if "state" in data and data["state"] == "OPERATION": dev_mlcubes = [ data["data_preparation_mlcube"].state == "DEVELOPMENT", @@ -99,6 +115,7 @@ def validate(self, data): raise serializers.ValidationError( "User cannot update non editable fields in Operation mode" ) + validate_exactly_one_preparation(data) return data diff --git a/server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py b/server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py new file mode 100644 index 000000000..8a9332206 --- /dev/null +++ b/server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py @@ -0,0 +1,37 @@ +# Generated by Django 4.2.23 on 2025-10-28 19:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("data_preparation_workflow", "__first__"), + ("mlcube", "0002_alter_mlcube_unique_together"), + ("dataset", "0005_alter_dataset_generated_metadata"), + ] + + operations = [ + migrations.AddField( + model_name="dataset", + name="data_preparation_workflow", + field=models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="data_preparation_workflow.dataprepworkflow", + ), + ), + migrations.AlterField( + model_name="dataset", + name="data_preparation_mlcube", + field=models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="benchmark_preprocessor_mlcube", + to="mlcube.mlcube", + ), + ), + ] diff --git a/server/dataset/models.py b/server/dataset/models.py index 8b351c075..a34b5f102 100644 --- a/server/dataset/models.py +++ b/server/dataset/models.py @@ -1,5 +1,6 @@ from django.db import models from django.contrib.auth import get_user_model +from data_preparation_workflow.models import DataPrepWorkflow User = get_user_model() @@ -21,6 +22,11 @@ class Dataset(models.Model): "mlcube.MlCube", on_delete=models.PROTECT, related_name="benchmark_preprocessor_mlcube", + null=True, + default=None, + ) + data_preparation_workflow = models.ForeignKey( + DataPrepWorkflow, on_delete=models.PROTECT, null=True, default=None ) is_valid = models.BooleanField(default=True) submitted_as_prepared = models.BooleanField() diff --git a/server/dataset/serializers.py b/server/dataset/serializers.py index 13ae93f21..6bea7f0db 100644 --- a/server/dataset/serializers.py +++ b/server/dataset/serializers.py @@ -3,6 +3,21 @@ from user.serializers import UserSerializer +def validate_exactly_one_preparation(data: dict): + no_data_prep_provided = ( + data.get("data_preparation_mlcube") is None + and data.get("data_preparation_workflow") is None + ) + multiple_data_prep_provided = ( + data.get("data_preparation_mlcube") is not None + and data.get("data_preparation_workflow") is not None + ) + if no_data_prep_provided or multiple_data_prep_provided: + raise serializers.ValidationError( + "Exactly one of 'data_preparation_mlcube' or 'data_preparation_workflow' must be provided to register a Benchmark" + ) + + class DatasetFullSerializer(serializers.ModelSerializer): """A private serializer. used for users who are permitted to see "sensitive" information. This serializer is also used for POST""" @@ -12,6 +27,9 @@ class Meta: fields = "__all__" read_only_fields = ["owner", "state"] + def validate(self, data): + validate_exactly_one_preparation(data) + class DatasetPublicSerializer(serializers.ModelSerializer): """A restrictive serializer""" @@ -20,6 +38,9 @@ class Meta: model = Dataset exclude = ["owner", "report"] + def validate(self, data): + validate_exactly_one_preparation(data) + class DatasetDetailSerializer(serializers.ModelSerializer): """This is a private serializer like DatasetFullSerializer""" @@ -70,7 +91,7 @@ def validate(self, data): "User cannot update non editable fields in Operation mode" ) self._validate_guid(data) - + validate_exactly_one_preparation(data) return data @@ -83,3 +104,6 @@ class DatasetWithOwnerInfoSerializer(serializers.ModelSerializer): class Meta: model = Dataset fields = ["id", "owner"] + + def validate(self, data): + validate_exactly_one_preparation(data) From 419dbecd901a2e756cd71a502b751058a330d8c8 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 29 Oct 2025 16:11:11 -0300 Subject: [PATCH 015/176] Migrate code from workflows repo into medperf --- cli/medperf/airflow_runner/.gitignore | 2 + .../airflow_runner/airflow_requirements.txt | 8 + .../airflow_runner/api_client/client.py | 154 ++++++++ .../components/airflow_component.py | 52 +++ .../airflow_runner/components/api_server.py | 26 ++ .../airflow_runner/components/component.py | 101 +++++ .../components/dag_processor.py | 33 ++ .../airflow_runner/components/db_component.py | 10 + .../airflow_runner/components/db_postgres.py | 88 +++++ .../airflow_runner/components/scheduler.py | 28 ++ .../airflow_runner/components/triggerer.py | 33 ++ .../airflow_runner/components/utils.py | 28 ++ cli/medperf/airflow_runner/create_venv.py | 46 +++ .../airflow_runner/dags/.airflowignore | 8 + cli/medperf/airflow_runner/dags/constants.py | 15 + .../airflow_runner/dags/dag_builder.py | 73 ++++ .../airflow_runner/dags/dag_from_yaml.py | 6 + cli/medperf/airflow_runner/dags/dag_utils.py | 17 + .../dags/operator_builders/__init__.py | 0 .../branch_from_sensor_operator_builder.py | 32 ++ .../container_operator_builder.py | 29 ++ .../docker_operator_buider.py | 30 ++ .../empty_operator_builder.py | 13 + .../manual_approval_buider.py | 50 +++ .../operator_builders/operator_builder.py | 193 ++++++++++ .../python_sensor_builder.py | 93 +++++ .../singularity_operator_builder.py | 24 ++ .../airflow_runner/dags/operator_factory.py | 31 ++ .../airflow_runner/dags/pipeline_state.py | 16 + .../dags/yaml_parser/yaml_parser.py | 256 ++++++++++++ .../monitor/yaml_dag_monitor.py | 172 +++++++++ cli/medperf/airflow_runner/system_runner.py | 363 ++++++++++++++++++ cli/medperf/airflow_runner/utils.py | 16 + .../airflow_runner/yaml_partial_parser.py | 92 +++++ cli/medperf/config.py | 2 + cli/medperf/utils.py | 66 +++- cli/requirements.txt | 1 + 37 files changed, 2206 insertions(+), 1 deletion(-) create mode 100644 cli/medperf/airflow_runner/.gitignore create mode 100644 cli/medperf/airflow_runner/airflow_requirements.txt create mode 100644 cli/medperf/airflow_runner/api_client/client.py create mode 100644 cli/medperf/airflow_runner/components/airflow_component.py create mode 100644 cli/medperf/airflow_runner/components/api_server.py create mode 100644 cli/medperf/airflow_runner/components/component.py create mode 100644 cli/medperf/airflow_runner/components/dag_processor.py create mode 100644 cli/medperf/airflow_runner/components/db_component.py create mode 100644 cli/medperf/airflow_runner/components/db_postgres.py create mode 100644 cli/medperf/airflow_runner/components/scheduler.py create mode 100644 cli/medperf/airflow_runner/components/triggerer.py create mode 100644 cli/medperf/airflow_runner/components/utils.py create mode 100644 cli/medperf/airflow_runner/create_venv.py create mode 100644 cli/medperf/airflow_runner/dags/.airflowignore create mode 100644 cli/medperf/airflow_runner/dags/constants.py create mode 100644 cli/medperf/airflow_runner/dags/dag_builder.py create mode 100644 cli/medperf/airflow_runner/dags/dag_from_yaml.py create mode 100644 cli/medperf/airflow_runner/dags/dag_utils.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/__init__.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/branch_from_sensor_operator_builder.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/container_operator_builder.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/docker_operator_buider.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/empty_operator_builder.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/manual_approval_buider.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/operator_builder.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/python_sensor_builder.py create mode 100644 cli/medperf/airflow_runner/dags/operator_builders/singularity_operator_builder.py create mode 100644 cli/medperf/airflow_runner/dags/operator_factory.py create mode 100644 cli/medperf/airflow_runner/dags/pipeline_state.py create mode 100644 cli/medperf/airflow_runner/dags/yaml_parser/yaml_parser.py create mode 100644 cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py create mode 100644 cli/medperf/airflow_runner/system_runner.py create mode 100644 cli/medperf/airflow_runner/utils.py create mode 100644 cli/medperf/airflow_runner/yaml_partial_parser.py diff --git a/cli/medperf/airflow_runner/.gitignore b/cli/medperf/airflow_runner/.gitignore new file mode 100644 index 000000000..9e776a5bc --- /dev/null +++ b/cli/medperf/airflow_runner/.gitignore @@ -0,0 +1,2 @@ +airflow_home*/ +*workspace/ \ No newline at end of file diff --git a/cli/medperf/airflow_runner/airflow_requirements.txt b/cli/medperf/airflow_runner/airflow_requirements.txt new file mode 100644 index 000000000..8a2686ec5 --- /dev/null +++ b/cli/medperf/airflow_runner/airflow_requirements.txt @@ -0,0 +1,8 @@ +apache-airflow==3.0.1 +apache-airflow-providers-singularity==3.8.0 +apache-airflow-providers-docker==4.4.0 +apache-airflow-providers-fab==2.0.2 +pandas==2.1.0 +numpy==1.26.4 +psycopg2-binary==2.9.9 +asyncpg==0.30.0 \ No newline at end of file diff --git a/cli/medperf/airflow_runner/api_client/client.py b/cli/medperf/airflow_runner/api_client/client.py new file mode 100644 index 000000000..ff01485b4 --- /dev/null +++ b/cli/medperf/airflow_runner/api_client/client.py @@ -0,0 +1,154 @@ +from __future__ import annotations +import os +from typing import Optional +from methodtools import lru_cache +import time +import httpx +from pydantic import SecretStr + +""" +The AirflowAPIClient defined in this Module if structured similarly to the internal +Client class used by Airflow (i.e airflow.sdk.api.client.Client), but simplified +so that only methods necessary for the Airflow <> MedPerf integration are +implemented. +""" + + +class BearerAuth(httpx.Auth): + def __init__( + self, + token: str, + expires_at: Optional[float] = None, + leeway_seconds: float = None, + ): + if expires_at is None: + twenty_four_hours = 60 * 60 * 24 # Default duration from airflow + token_duration = os.getenv( + "AIRFLOW__API_AUTH__JWT_EXPIRATION_TIME", twenty_four_hours + ) + + leeway_seconds = leeway_seconds or 30 + now = time.time() + expires_at = now + token_duration + leeway_seconds + + self.expires_at = expires_at + self.token = token + + def is_valid(self): + now = time.time() + return now < self.expires_at + + def auth_flow(self, request: httpx.Request): + if self.token: + request.headers["Authorization"] = "Bearer " + self.token + yield request + + +class AirflowAPIClient(httpx.Client): + + def __init__( + self, + username: str, + password: SecretStr, + api_url: str, + **kwargs, + ): + self.username = username + self.password = password + token = self._get_token(api_url) + auth = BearerAuth(token) + event_hooks = {"request": [self.renew_token]} + super().__init__(base_url=api_url, auth=auth, event_hooks=event_hooks, **kwargs) + + def _get_token(self, base_url): + if base_url is None: + return "" + + base_for_auth = base_url.split("/api")[0] + headers = {"Content-Type": "application/json"} + data = {"username": self.username, "password": self.password.get_secret_value()} + + auth_url = f"{base_for_auth}/auth/token" + response = httpx.post(auth_url, headers=headers, json=data) + + if response.status_code != 201: + print("Failed to get token:", response.status_code, response.text) + jwt_token = response.json().get("access_token") + return jwt_token + + def renew_token(self, request: httpx.Request): + if not self.auth.is_valid(): + new_token = self._get_token(str(self.base_url)) + self.auth.token = new_token + request.headers["Authorization"] = "Bearer " + self.auth.token + + @lru_cache() + @property + def dags(self) -> DagOperations: + return DagOperations(self) + + @lru_cache() + @property + def dag_runs(self) -> DagRunOperations: + return DagRunOperations(self) + + @lru_cache() + @property + def task_instances(self) -> TaskInstanceOperations: + return TaskInstanceOperations(self) + + @lru_cache() + @property + def tasks(self) -> TaskOperations: + return TaskOperations(self) + + @lru_cache() + @property + def assets(self) -> AssetOperations: + return AssetOperations(self) + + +class BaseOperations: + __slots__ = ("client",) + + def __init__(self, client: AirflowAPIClient): + self.client = client + + +class DagOperations(BaseOperations): + + def get_all_dags(self): + return self.client.get("dags").json() + + +class DagRunOperations(BaseOperations): + + def get_most_recent_dag_run(self, dag_id: str): + params = {"dag_id": dag_id, "limit": 1, "order_by": "logical_date"} + return self.client.get(f"dags/{dag_id}/dagRuns", params=params).json() + + def get_dag_run_by_run_id(self, dag_id: str, dag_run_id: str): + return self.client.get(f"dags/{dag_id}/dagRuns/{dag_run_id}").json() + + def trigger_dag_run(self, dag_id: str): + json_data = {"logical_date": None} + response = self.client.post(f"dags/{dag_id}/dagRuns", json=json_data) + return response.json() + + +class TaskInstanceOperations(BaseOperations): + def get_task_instances_in_dag_run(self, dag_id: str, dag_run_id: str): + return self.client.get( + f"dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances" + ).json() + + +class TaskOperations(BaseOperations): + def get_tasks(self, dag_id: str): + return self.client.get(f"dags/{dag_id}/tasks").json() + + +class AssetOperations(BaseOperations): + + def get_asset_events(self): + return self.client.get("assets/events").json() diff --git a/cli/medperf/airflow_runner/components/airflow_component.py b/cli/medperf/airflow_runner/components/airflow_component.py new file mode 100644 index 000000000..9d4853862 --- /dev/null +++ b/cli/medperf/airflow_runner/components/airflow_component.py @@ -0,0 +1,52 @@ +import os +import sys +from abc import abstractmethod +from typing import List +from .component import ComponentRunner + + +class AirflowComponentRunner(ComponentRunner): + + def __init__( + self, + python_executable: str, + airflow_home: str, + container_type: str, + workspace_dir: os.PathLike, + data_dir: os.PathLike, + input_data_dir: os.PathLike, + yaml_dags_dir: str, + dags_folder: os.PathLike, + ): + self._python_exec = python_executable + self.process = None + user_dags_folder = os.path.join(dags_folder, "user") + self.airflow_home = airflow_home + self._env_vars = { + "AIRFLOW_HOME": airflow_home, + "WORKSPACE_DIR": workspace_dir, + "DATA_DIR": data_dir, + "INPUT_DATA_DIR": input_data_dir, + "AIRFLOW_INPUT_DATA_DIR": input_data_dir, + "AIRFLOW_DATA_DIR": data_dir, + "AIRFLOW_WORKSPACE_DIR": workspace_dir, + "PYTHONPATH": f"{dags_folder}:{user_dags_folder}:{yaml_dags_dir}", + "YAML_DAGS_DIR": yaml_dags_dir, + "CONTAINER_TYPE": container_type, + } + + @property + @abstractmethod + def initialize_command(self) -> List[str]: + pass + + async def start_logic(self): + actual_command = [self._python_exec, "-m", *self.initialize_command] + base_env = os.environ.copy() + base_env.update(**self._env_vars) + + logfile_path = os.path.join(self.airflow_home, "logs", self.logfile) + self.run_command_with_logging( + command=actual_command, logfile_path=logfile_path, env=base_env + ) + await self.wait_for_start() diff --git a/cli/medperf/airflow_runner/components/api_server.py b/cli/medperf/airflow_runner/components/api_server.py new file mode 100644 index 000000000..313a7a0f1 --- /dev/null +++ b/cli/medperf/airflow_runner/components/api_server.py @@ -0,0 +1,26 @@ +from __future__ import annotations +from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner +from medperf.airflow_runner.components.utils import validate_port +from typing import Union +from .utils import run_healthcheck + + +class AirflowApiServer(AirflowComponentRunner): + def __init__(self, port: Union[str, int], **kwargs): + self.port = validate_port(port) + super().__init__(**kwargs) + + @property + def component_name(self): + return "Airflow API Server" + + @property + def logfile(self): + return "apiserver.log" + + @property + def initialize_command(self): + return ["airflow", "api-server", "--port", self.port] + + def has_successfully_started(self): + return run_healthcheck("http://localhost:8080/api/v2/version") diff --git a/cli/medperf/airflow_runner/components/component.py b/cli/medperf/airflow_runner/components/component.py new file mode 100644 index 000000000..1c1d37532 --- /dev/null +++ b/cli/medperf/airflow_runner/components/component.py @@ -0,0 +1,101 @@ +import os +import subprocess +from abc import ABC, abstractmethod +from typing import List, Dict +import asyncio +import async_timeout +import logging + +logger = logging.getLogger(__name__) + + +class ComponentRunner(ABC): + + START_PERIOD = 5 + INTERVAL = 10 + TIMEOUT = 60 + MAX_TRIES = 5 + + def __init__(self): + self.process = None + + @property + @abstractmethod + def logfile(self) -> str: + pass + + @property + @abstractmethod + def has_successfully_started(self) -> bool: + pass + + @property + def component_name(self): + """Can be overriden to customize name""" + return self.__class__.__name__ + + @property + def starting_message(self): + return f"Starting component {self.component_name}" + + @property + def finished_message(self): + return f"Component {self.component_name} started succesfully" + + @property + def fail_message(self): + return f"Failed to start up component {self.component_name}" + + def run_command_with_logging( + self, command: List[str], logfile_path: os.PathLike, env: Dict = None + ): + with open(logfile_path, "a") as f: + self.process = subprocess.Popen(command, env=env, stdout=f, stderr=f) + + async def start(self): + logger.debug(self.starting_message) + await self.start_logic() + logger.debug(self.finished_message) + + @abstractmethod + async def start_logic(self): + pass + + async def wait_for_start(self): + try: + async with async_timeout.timeout(self.TIMEOUT): + await self._sync_wait_for_start() + except asyncio.TimeoutError: + raise TimeoutError(self.fail_message) + + async def _sync_wait_for_start(self): + current_try = 1 + while current_try < self.MAX_TRIES: + if self.has_successfully_started(): + return + await asyncio.sleep(self.INTERVAL) + current_try += 1 + raise ValueError( + f"Component {self.component_name} exceeded maximum number of checks to start." + ) + + def terminate(self): + if self.process is not None: + self.process.terminate() + + def kill(self): + if self.process is not None: + self.process.kill() + + def __enter__(self): + self.start_logic() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if exc_type is None: + self.terminate() + + else: + self.kill() + + return False # Propagate exception, if any diff --git a/cli/medperf/airflow_runner/components/dag_processor.py b/cli/medperf/airflow_runner/components/dag_processor.py new file mode 100644 index 000000000..29ac48bb4 --- /dev/null +++ b/cli/medperf/airflow_runner/components/dag_processor.py @@ -0,0 +1,33 @@ +from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner +import subprocess +import sys + + +class AirflowDagProcessor(AirflowComponentRunner): + @property + def logfile(self): + return "processor.log" + + @property + def initialize_command(self): + return ["airflow", "dag-processor"] + + @property + def component_name(self): + return "Airflow DAG Processor" + + def has_successfully_started(self): + has_dag_processor_jobs = subprocess.run( + [ + self._python_exec, + "-m", + "airflow", + "jobs", + "check", + "--job-type", + "DagProcessorJob", + "--local", + ], + capture_output=True, + ) + return has_dag_processor_jobs.returncode == 0 diff --git a/cli/medperf/airflow_runner/components/db_component.py b/cli/medperf/airflow_runner/components/db_component.py new file mode 100644 index 000000000..d47bb4471 --- /dev/null +++ b/cli/medperf/airflow_runner/components/db_component.py @@ -0,0 +1,10 @@ +from .component import ComponentRunner +from abc import abstractmethod + + +class DatabaseComponent(ComponentRunner): + + @property + @abstractmethod + def connection_string(self): + pass diff --git a/cli/medperf/airflow_runner/components/db_postgres.py b/cli/medperf/airflow_runner/components/db_postgres.py new file mode 100644 index 000000000..8842b1c81 --- /dev/null +++ b/cli/medperf/airflow_runner/components/db_postgres.py @@ -0,0 +1,88 @@ +from .db_component import DatabaseComponent +from .utils import validate_port, generate_random_password +from pydantic import SecretStr +from typing import Union + +import os +import random +import string +import subprocess + + +class PostgresDBDocker(DatabaseComponent): + + POSTGRES_IMAGE = 'postgres:14.19' + START_PERIOD = 2 + INTERVAL = 5 + MAX_TRIES = 5 + TIMEOUT = 30 + + def __init__(self, project_name: str, root_dir: os.PathLike, + postgres_user: str = 'postgres', postgres_password: SecretStr = None, + postgres_db: str = 'postgres', postgres_port: Union[str, int] = 5432, + hostname: str = 'localhost'): + super().__init__() + self.user = postgres_user + self.db = postgres_db + self.password = postgres_password or generate_random_password() + self.hostname = hostname + self.port = validate_port(postgres_port) + self.data_dir = os.path.join(root_dir, 'postgres_data') + self.logs_dir = os.path.join(root_dir, 'logs') + self.container_name = self.generate_container_name(project_name) + self.container_id = None + + @property + def component_name(self): + return 'PostgreSQL Database for Airflow' + + @property + def logfile(self): + return os.path.join(self.logs_dir, 'postgres_db.log') + + @staticmethod + def generate_container_name(project_name): + all_characters = string.ascii_lowercase + string.digits + num_digits = 4 + random_part = ''.join(random.choice(all_characters) for _ in range(num_digits)) + complete_name = f'postgres_{project_name}_{random_part}' + return complete_name + + async def start_logic(self): + self.process = subprocess.run( + [ + 'docker', 'run', '-d', '--name', self.container_name, + '-e', f'POSTGRES_USER={self.user}', + '-e', f'POSTGRES_PASSWORD={self.password.get_secret_value()}', + '-e', f'POSTGRES_DB={self.db}', + '-v', f'{self.data_dir}:/var/lib/postgresql/data', + '-p', f'{self.port}:{self.port}', + f'{self.POSTGRES_IMAGE}' + ], + capture_output=True, + text=True + ) + self.container_id = self.process.stdout + await self.wait_for_start() + + def has_successfully_started(self): + postgres_status: subprocess.CompletedProcess = subprocess.run( + [ + 'docker', 'exec', '-it', self.container_id, + "pg_isready", "-U", self.user, "-d", self.db + ], capture_output=True, text=True + ) + return postgres_status.returncode == 0 + + def terminate(self): + subprocess.run(['docker', 'stop', self.container_id], capture_output=True, text=True) + subprocess.run(['docker', 'rm', self.container_id], capture_output=True, text=True) + + + def kill(self): + subprocess.run(['docker', 'rm', '-f', self.container_id], capture_output=True, text=True) + + @property + def connection_string(self): + return f'postgresql+psycopg2://{self.user}:{self.password.get_secret_value()}@{self.hostname}:{self.port}/{self.db}' + \ No newline at end of file diff --git a/cli/medperf/airflow_runner/components/scheduler.py b/cli/medperf/airflow_runner/components/scheduler.py new file mode 100644 index 000000000..8fad832c0 --- /dev/null +++ b/cli/medperf/airflow_runner/components/scheduler.py @@ -0,0 +1,28 @@ +from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner +from pydantic import SecretStr +from .utils import run_healthcheck + + +class AirflowScheduler(AirflowComponentRunner): + def __init__(self, user: str, password: SecretStr, *args, **kwargs): + super().__init__(*args, **kwargs) + extra_vars = { + "_AIRFLOW_WWW_USER_USERNAME": user, + "_AIRFLOW_WWW_USER_PASSWORD": password.get_secret_value(), + } + self._env_vars.update(extra_vars) + + @property + def logfile(self): + return "scheduler.log" + + @property + def component_name(self): + return "Airflow Scheduler" + + @property + def initialize_command(self): + return ["airflow", "scheduler"] + + def has_successfully_started(self): + return run_healthcheck("http://localhost:8974/health") diff --git a/cli/medperf/airflow_runner/components/triggerer.py b/cli/medperf/airflow_runner/components/triggerer.py new file mode 100644 index 000000000..350ccd917 --- /dev/null +++ b/cli/medperf/airflow_runner/components/triggerer.py @@ -0,0 +1,33 @@ +from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner +import subprocess +import sys + + +class AirflowTriggerer(AirflowComponentRunner): + @property + def logfile(self): + return "triggerer.log" + + @property + def component_name(self): + return "Airflow Triggerer" + + @property + def initialize_command(self): + return ["airflow", "triggerer"] + + def has_successfully_started(self): + has_triggerer_jobs = subprocess.run( + [ + self._python_exec, + "-m", + "airflow", + "jobs", + "check", + "--job-type", + "TriggererJob", + "--local", + ], + capture_output=True, + ) + return has_triggerer_jobs.returncode == 0 diff --git a/cli/medperf/airflow_runner/components/utils.py b/cli/medperf/airflow_runner/components/utils.py new file mode 100644 index 000000000..310497a1b --- /dev/null +++ b/cli/medperf/airflow_runner/components/utils.py @@ -0,0 +1,28 @@ +from typing import Union +import requests +from http import HTTPStatus +from pydantic import SecretStr +import secrets + + +def validate_port(port: Union[int, str]) -> str: + try: + is_valid_port = 1 <= int(port) <= 65535 + except ValueError: + is_valid_port = False + + if not is_valid_port: + raise ValueError(f'Port value sent ({port}) is not a valid port!') + + return str(port) + + +def run_healthcheck(healthcheck_url: str) -> bool: + try: + response = requests.get(healthcheck_url) + return response.status_code == HTTPStatus.OK + except requests.exceptions.RequestException: + return False + +def generate_random_password(nbytes: int = 16) -> SecretStr: + return SecretStr(secrets.token_urlsafe(nbytes)) \ No newline at end of file diff --git a/cli/medperf/airflow_runner/create_venv.py b/cli/medperf/airflow_runner/create_venv.py new file mode 100644 index 000000000..38897e609 --- /dev/null +++ b/cli/medperf/airflow_runner/create_venv.py @@ -0,0 +1,46 @@ +import venv +from medperf import config +import os +import shutil +from pathlib import Path +from medperf.exceptions import MedperfException +from medperf.utils import spawn_and_kill, combine_proc_sp_text +import shlex + + +def create_airflow_venv_if_not_exists(force_creation=False): + if os.path.exists(config.airflow_venv_dir) and not force_creation: + return + + requirements_file = str( + Path(__file__).parent.resolve() / config.airflow_requirements_file + ) + if not os.path.exists(requirements_file): + raise MedperfException( + f"Could not find the {config.airflow_requirements_file}! Please verify your MedPerf installation." + ) + # TODO add Windows executable if we eventually support windows + python_executable = os.path.join(config.airflow_venv_dir, "bin", "python") + + venv.create(env_dir=config.airflow_venv_dir, clear=True, with_pip=True) + if not os.path.exists(python_executable): + shutil.rmtree(config.airflow_venv_dir) + raise MedperfException( + "Failed to find the Python executable for Airflow environment " + f"in directory {config.airflow_venv_dir}. " + "The virtual environment has been deleted." + ) + + command = [python_executable, "-m", "pip", "install", "-r", requirements_file] + with spawn_and_kill(shlex.join(command), timeout=None) as spawn_wrapper: + combine_proc_sp_text(spawn_wrapper.proc) + + if spawn_wrapper.proc.exitstatus != 0: + shutil.rmtree(config.airflow_venv_dir) + error_msg = f"Failed to install dependencies to the Airflow environment located at {config.airflow_venv_dir}.\n" + error_msg += "The virtual environment has been deleted." + raise MedperfException(error_msg) + + +if __name__ == "__main__": + create_airflow_venv_if_not_exists(force_creation=True) diff --git a/cli/medperf/airflow_runner/dags/.airflowignore b/cli/medperf/airflow_runner/dags/.airflowignore new file mode 100644 index 000000000..b4bb6e52d --- /dev/null +++ b/cli/medperf/airflow_runner/dags/.airflowignore @@ -0,0 +1,8 @@ +dag_utils.py +operator_factory.py +dag_builder.py +constants.py +pipeline_state.py +operator_builders/ +yaml_parser/ +api_client/ \ No newline at end of file diff --git a/cli/medperf/airflow_runner/dags/constants.py b/cli/medperf/airflow_runner/dags/constants.py new file mode 100644 index 000000000..b4bef0a9d --- /dev/null +++ b/cli/medperf/airflow_runner/dags/constants.py @@ -0,0 +1,15 @@ +from datetime import datetime, timedelta +import os + +SUMMARIZER_ID = "pipeline_summarizer" +SUMMARIZER_TAG = "Pipeline Summarizer" +ALWAYS_CONDITION = "ALWAYS" +YESTERDAY = datetime.today() - timedelta(days=1) +FINAL_ASSET = "medperf_airflow_completed_asset" +YAML_DIR = os.getenv("YAML_DAGS_DIR") or "/yaml_dags" +AIRFLOW_WORKSPACE_DIR = os.getenv("AIRFLOW_WORKSPACE_DIR") +AIRFLOW_DATA_DIR = os.getenv("AIRFLOW_DATA_DIR") +AIRFLOW_INPUT_DATA_DIR = os.getenv("AIRFLOW_INPUT_DATA_DIR") +HOST_WORKSPACE_DIR = os.getenv("WORKSPACE_DIR") +HOST_DATA_DIR = os.getenv("DATA_DIR") +HOST_INPUT_DATA_DIR = os.getenv("INPUT_DATA_DIR") diff --git a/cli/medperf/airflow_runner/dags/dag_builder.py b/cli/medperf/airflow_runner/dags/dag_builder.py new file mode 100644 index 000000000..9f82d571e --- /dev/null +++ b/cli/medperf/airflow_runner/dags/dag_builder.py @@ -0,0 +1,73 @@ +from __future__ import annotations +from airflow.sdk import Asset, DAG +from typing import Any +from constants import YESTERDAY +from operator_factory import operator_factory + + +class DagBuilder: + + def __init__(self, expanded_step: dict[str, Any]): + raw_inlets = expanded_step.pop("inlets", []) + self.builder_id = expanded_step["id"] + self.inlets = [Asset(raw_inlet) for raw_inlet in raw_inlets] + self.partition = expanded_step.get("partition", None) + self.operator_builders = operator_factory(**expanded_step) + self._operator_id_to_builder_obj = { + operator.operator_id: operator for operator in self.operator_builders + } + self._generated_operators = {} + + @property + def num_operators(self) -> int: + return len(self.operator_builders) + + def __str__(self): + return f"{self.__class__.__name__}(id={self.builder_id}, num_ops={self.num_operators})" + + def __repr__(self): + return str(self) + + @property + def display_name(self): + return self.operator_builders[0].display_name + + @property + def tags(self): + return self.operator_builders[0].tags + + def build_dag(self): + schedule = self.inlets or "@once" + + with DAG( + dag_id=self.builder_id, + dag_display_name=self.display_name, + catchup=False, + max_active_runs=1, + schedule=schedule, + start_date=YESTERDAY, + is_paused_upon_creation=False, + tags=self.tags, + auto_register=True, + ) as dag: + for operator_builder in self.operator_builders: + current_operator = self._get_generated_operator_by_id( + operator_builder.operator_id + ) + + for next_id in operator_builder.next_ids: + next_operator = self._get_generated_operator_by_id(next_id) + if next_operator is not None: + current_operator >> next_operator + return dag + + def _get_generated_operator_by_id( + self, + operator_id, + ): + if operator_id not in self._generated_operators: + builder_for_this_operator = self._operator_id_to_builder_obj[operator_id] + self._generated_operators[operator_id] = ( + builder_for_this_operator.get_airflow_operator() + ) + return self._generated_operators[operator_id] diff --git a/cli/medperf/airflow_runner/dags/dag_from_yaml.py b/cli/medperf/airflow_runner/dags/dag_from_yaml.py new file mode 100644 index 000000000..019cd0db1 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/dag_from_yaml.py @@ -0,0 +1,6 @@ +from __future__ import annotations +from yaml_parser.yaml_parser import YamlParser +from airflow.sdk import DAG # noqa: necessary for Airflow to detect DAGs in this file + +parser = YamlParser() +dags = parser.build_dags() diff --git a/cli/medperf/airflow_runner/dags/dag_utils.py b/cli/medperf/airflow_runner/dags/dag_utils.py new file mode 100644 index 000000000..6d5392ff5 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/dag_utils.py @@ -0,0 +1,17 @@ +import re + + +def import_external_python_function(function_path: str): + import importlib + + condition_module, condition_function = function_path.rsplit(".", maxsplit=1) + imported_module = importlib.import_module(condition_module) + function_obj = getattr(imported_module, condition_function) + + return function_obj + + +def create_legal_dag_id(subject_slash_timepoint, replace_char="_"): + legal_chars = "A-Za-z0-9_-" + legal_id = re.sub(rf"[^{legal_chars}]", replace_char, subject_slash_timepoint) + return legal_id diff --git a/cli/medperf/airflow_runner/dags/operator_builders/__init__.py b/cli/medperf/airflow_runner/dags/operator_builders/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/airflow_runner/dags/operator_builders/branch_from_sensor_operator_builder.py b/cli/medperf/airflow_runner/dags/operator_builders/branch_from_sensor_operator_builder.py new file mode 100644 index 000000000..c17b1d072 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/branch_from_sensor_operator_builder.py @@ -0,0 +1,32 @@ +from .python_sensor_builder import PythonSensorBuilder +from .operator_builder import OperatorBuilder +from airflow.decorators import task +from airflow.models.taskinstance import TaskInstance + + +class BranchFromSensorOperatorBuilder(OperatorBuilder): + + def __init__( + self, + previous_sensor: PythonSensorBuilder, + **kwargs, + ): + + self.sensor_task_id = previous_sensor.operator_id + super().__init__(**kwargs) + + def _define_base_operator(self): + + @task.branch( + task_id=self.operator_id, + task_display_name=self.display_name, + outlets=self.outlets, + ) + def branching(task_instance: TaskInstance): + """Read next task from the Sensor XCom (which detected any of the branching conditions) + and branch into that""" + print(f"{self.next_ids=}") + xcom_data = task_instance.xcom_pull(task_ids=self.sensor_task_id) + return [xcom_data] + + return branching() diff --git a/cli/medperf/airflow_runner/dags/operator_builders/container_operator_builder.py b/cli/medperf/airflow_runner/dags/operator_builders/container_operator_builder.py new file mode 100644 index 000000000..6fe9ba51b --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/container_operator_builder.py @@ -0,0 +1,29 @@ +from __future__ import annotations +from .operator_builder import OperatorBuilder +from abc import abstractmethod +from copy import deepcopy + + +class ContainerOperatorBuilder(OperatorBuilder): + + def __init__( + self, image: str, command: str | list[str], mounts: list[str], **kwargs + ): + self.image = image + if isinstance(command, str): + self.command = command.split(" ") + else: + self.command = command + self.mounts = self.build_mounts(mounts) + super().__init__(**kwargs) + + @abstractmethod + def build_mounts(self): + pass + + def _get_command(self): + if self.partition: + command = [*self.command, "--subject-subdir", self.partition] + else: + command = self.command + return command diff --git a/cli/medperf/airflow_runner/dags/operator_builders/docker_operator_buider.py b/cli/medperf/airflow_runner/dags/operator_builders/docker_operator_buider.py new file mode 100644 index 000000000..5681347a4 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/docker_operator_buider.py @@ -0,0 +1,30 @@ +from .container_operator_builder import ContainerOperatorBuilder +from airflow.providers.docker.operators.docker import DockerOperator +from docker.types import Mount + + +class DockerOperatorBuilder(ContainerOperatorBuilder): + + def build_mounts(self, mounts): + docker_mounts = [] + for mount in mounts: + host_path, docker_path = mount.rsplit(":", maxsplit=1) + docker_mounts.append( + Mount(source=host_path, target=docker_path, type="bind") + ) + return docker_mounts + + def _define_base_operator(self) -> DockerOperator: + + command = self._get_command() + + return DockerOperator( + image=self.image, + command=command, + mounts=self.mounts, + task_id=self.operator_id, + task_display_name=self.display_name, + auto_remove="success", + mount_tmp_dir=False, + outlets=self.outlets, + ) diff --git a/cli/medperf/airflow_runner/dags/operator_builders/empty_operator_builder.py b/cli/medperf/airflow_runner/dags/operator_builders/empty_operator_builder.py new file mode 100644 index 000000000..4a9e521ef --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/empty_operator_builder.py @@ -0,0 +1,13 @@ +from .operator_builder import OperatorBuilder +from airflow.providers.standard.operators.empty import EmptyOperator + + +class EmptyOperatorBuilder(OperatorBuilder): + + def _define_base_operator(self): + + return EmptyOperator( + task_id=self.operator_id, + task_display_name=self.display_name, + outlets=self.outlets, + ) diff --git a/cli/medperf/airflow_runner/dags/operator_builders/manual_approval_buider.py b/cli/medperf/airflow_runner/dags/operator_builders/manual_approval_buider.py new file mode 100644 index 000000000..36f9af0d3 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/manual_approval_buider.py @@ -0,0 +1,50 @@ +from .operator_builder import OperatorBuilder +from airflow.sdk import task +from airflow.exceptions import AirflowException + + +class ManualApprovalBuilder(OperatorBuilder): + def _define_base_operator(self): + + @task( + task_id=self.operator_id, + task_display_name=self.display_name, + outlets=self.outlets, + ) + def auto_fail(): + raise AirflowException("This task must be approved manually!") + + task_instance = auto_fail() + return task_instance + + @classmethod + def build_operator_list(cls, **kwargs): + """ + An Empty Operator must be added after this operator so that the downstream + Asset triggers properly after manually setting this task as Success. + If necessary, it is added here. + """ + from .empty_operator_builder import EmptyOperatorBuilder + + initial_operator_list = super().build_operator_list(**kwargs) + if len(initial_operator_list) > 1: + return initial_operator_list + + original_approval_operator = initial_operator_list[0] + + empty_id = f"empty_{original_approval_operator.operator_id}" + empty_operator_builder = EmptyOperatorBuilder( + operator_id=empty_id, + raw_id=f"empty_{original_approval_operator.raw_id}", + next_ids=kwargs.get("next_ids", kwargs.get("next", [])), + make_outlet=True, + from_yaml=False, + ) + new_approval_operator = ManualApprovalBuilder( + operator_id=original_approval_operator.operator_id, + raw_id=original_approval_operator.raw_id, + next_ids=[empty_id], + make_outlet=False, + ) + + return [new_approval_operator, empty_operator_builder] diff --git a/cli/medperf/airflow_runner/dags/operator_builders/operator_builder.py b/cli/medperf/airflow_runner/dags/operator_builders/operator_builder.py new file mode 100644 index 000000000..364fafdfb --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/operator_builder.py @@ -0,0 +1,193 @@ +from __future__ import annotations +from airflow.sdk import Asset, BaseOperator +from abc import ABC, abstractmethod +from constants import ALWAYS_CONDITION, FINAL_ASSET + + +class OperatorBuilder(ABC): + def __init__( + self, + operator_id: str, + raw_id: str, + next_ids: list[str] | str = None, + limit: int = None, + from_yaml: bool = True, + make_outlet: bool = True, + on_error: str = None, + **kwargs, + ): + # TODO add logic to import on_error as a callable + # Always call this init during subclass inits + self.operator_id = operator_id + self.raw_id = raw_id + self.display_name = self._convert_id_to_display_name(self.raw_id) + + if make_outlet: + self.next_ids = [] + self.outlets = self._make_outlets(next_ids) + else: + self.next_ids = next_ids or [] + self.outlets = None + + self.from_yaml = from_yaml + if limit is None: + self.pool_info = None + else: + self.pool_info = f'{self.raw_id}_pool' + + self.partition = kwargs.get("partition") + self.tags = [self.raw_id, self.display_name] + if self.partition: + self.tags.append(self.partition) + self.display_name += f" - {self.partition}" + + def __str__(self): + return f"{self.__class__.__name__}(operator_id={self.operator_id})" + + def __repr__(self): + return str(self) + + def __hash__(self): + return hash(self.operator_id) + + def _make_outlets(self, next_ids): + if next_ids is not None: + if isinstance(next_ids, str): + next_ids = [next_ids] + outlets = [Asset(next_id) for next_id in next_ids] + else: + outlets = [Asset(FINAL_ASSET)] + return outlets + + @staticmethod + def _convert_id_to_display_name(original_id): + return original_id.replace("_", " ").title() + + def get_airflow_operator(self) -> BaseOperator: + base_operator = self._define_base_operator() + if self.pool_info is not None: + base_operator.pool = self.pool_info + + if self.outlets: + base_operator.outlets = self.outlets + + return base_operator + + @abstractmethod + def _define_base_operator(self) -> BaseOperator: + """ + Returns the initial definition of the operator object, without defining pools or outlets. + These, if defined, are patched later in get_airflow_operator. + """ + pass + + @classmethod + def build_operator_list(cls, **kwargs) -> list[OperatorBuilder]: + """ + Helper method to build a list of required Operators for a DAG Builder. + Usually will return a list with a single element that is the desired operator + If conditional next_ids are sent from the YAML file, then this will return a list including + a Python Sensor Operator and a Python Branching Operator, which are both used to deal with branching + """ + operator_list = [] + kwargs["operator_id"] = kwargs.pop("id", None) + + id_info = kwargs.pop("next", []) + make_outlet_for_main_operator = True + if isinstance(id_info, dict): + # If we have a branching condition in YAML, we return three operators: + # OperatorFromYAML -> PythonSensorOperator -> PythonBranchOperator -> EmptyOperator -> NextOperatorFromYAML + # OperatorFromYAML runs as defind by the YAML File. + # A PythonSensorOperator then waits for any of the defind conditions to be True and + # forwards the True condition to the PythonBranchOperator, which then branches accordingly. + # The Sensor and Branch Operators are defined here, so we can adapt the input arguments of the first operator accordingly + # (ie make it go into sensor that goes into branch which then goes into other operators from the YAML file) + # Empty operators are used between the branch operator and next operator from YAML to simplify breaking DAG cycles, if any + # are present. If DAG cycles are not present, the Empty operators do not interfere with DAG execution. + from .branch_from_sensor_operator_builder import ( + BranchFromSensorOperatorBuilder, + ) + from .python_sensor_builder import PythonSensorBuilder + from .empty_operator_builder import EmptyOperatorBuilder + + make_outlet_for_main_operator = False + conditions_definitions = kwargs.pop( + "conditions_definitions", [] + ) # [{'id': 'condition_1', 'type': 'function', 'function_name': 'function_name'}...] + conditions_definitions = { + condition["id"]: { + key: value for key, value in condition.items() if key != "id" + } + for condition in conditions_definitions + } # {'condition_1: {'type': 'function', 'function_name': 'function_name'}, ...} + + branching_info: list[dict[str, str]] = id_info.pop("if") + partition = kwargs.get("partition") + operator_id = kwargs["operator_id"] + operator_raw_id = kwargs["raw_id"] + sensor_id = f"conditions_{operator_id}" + branching_id = f"branch_{operator_id}" + wait_time = id_info.pop("wait", None) + default_conditions = id_info.pop("else", []) + kwargs["next_ids"] = [sensor_id] + + conditions = branching_info + for default_condition in default_conditions: + if default_condition and default_condition != kwargs["operator_id"]: + conditions.append( + {"condition": ALWAYS_CONDITION, "target": default_condition} + ) + processed_conditions = [] + for condition in conditions: + temp_conditions = [ + { + "condition": condition["condition"], + "target": f"empty_{operator_id}_{target}", + } + for target in condition["target"] + ] + processed_conditions.extend(temp_conditions) + + empty_ids = [condition["target"] for condition in processed_conditions] + ids_after_empty = [condition["target"] for condition in conditions] + + sensor_operator = PythonSensorBuilder( + conditions=processed_conditions, + raw_id=f"conditions_{operator_raw_id}", + wait_time=wait_time, + operator_id=sensor_id, + next_ids=[branching_id], + conditions_definitions=conditions_definitions, + from_yaml=False, + make_outlet=False, + partition=partition, + ) + + # TODO this will break! + empty_operators = [ + EmptyOperatorBuilder( + operator_id=empty_id, + raw_id=empty_id, + from_yaml=False, + next_ids=next_id, + partition=partition, + make_outlet=True, + ) + for empty_id, next_id in zip(empty_ids, ids_after_empty) + ] + + branch_operator = BranchFromSensorOperatorBuilder( + next_ids=[empty_id for empty_id in empty_ids], + previous_sensor=sensor_operator, + operator_id=branching_id, + raw_id=f"branch_{operator_raw_id}", + from_yaml=False, + make_outlet=False, + ) + operator_list.extend([sensor_operator, branch_operator, *empty_operators]) + else: + kwargs["next_ids"] = id_info + + this_operator = cls(**kwargs, make_outlet=make_outlet_for_main_operator) + operator_list = [this_operator, *operator_list] + return operator_list diff --git a/cli/medperf/airflow_runner/dags/operator_builders/python_sensor_builder.py b/cli/medperf/airflow_runner/dags/operator_builders/python_sensor_builder.py new file mode 100644 index 000000000..d8ae2d4a1 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/python_sensor_builder.py @@ -0,0 +1,93 @@ +from __future__ import annotations +from .operator_builder import OperatorBuilder +from airflow.decorators import task +from airflow.sensors.base import PokeReturnValue +from copy import deepcopy +from pipeline_state import PipelineState +from constants import ALWAYS_CONDITION +from datetime import timedelta +from dag_utils import import_external_python_function + +DEFAULT_WAIT_TIME = timedelta(seconds=60) + + +class Condition: + + def __init__( + self, + condition_id: str, + next_id: str, + conditions_definitions: dict[str, dict[str, str]], + ): + self.condition_id = condition_id + self.next_id = next_id + + if self.condition_id == ALWAYS_CONDITION: + self.type = ALWAYS_CONDITION + self.complete_function_name = None + + else: + this_definition = conditions_definitions[self.condition_id] + self.type = this_definition["type"] # Currently unused + self.complete_function_name = this_definition["function_name"] + + +def evaluate_external_condition(condition: Condition, pipeline_state: PipelineState): + # TODO implement properly! Should call the external python files and define a + # pipeline object from airflow_kwargs that is sent to the Python callable. + # For this first proof of concept, hardcode functions just to validate functionality. + if condition.condition_id == ALWAYS_CONDITION: + return True + + condition_function_obj = import_external_python_function( + condition.complete_function_name + ) + print(f"Checking condition {condition.condition_id}...") + condition_result = condition_function_obj(pipeline_state) + + if condition_result: + print(f"Condition {condition.condition_id} met!") + else: + print(f"Condition {condition.condition_id} not met.") + return condition_result + + +class PythonSensorBuilder(OperatorBuilder): + + def __init__( + self, + conditions: list[dict[str, str]], + conditions_definitions: dict[str, dict[str, str]], + wait_time: float = 60, + **kwargs, + ): + super().__init__(**kwargs) + self.conditions = [ + Condition( + condition_id=condition["condition"], + next_id=condition["target"], + conditions_definitions=conditions_definitions, + ) + for condition in conditions + ] + self.wait_time = wait_time or DEFAULT_WAIT_TIME + + def _define_base_operator(self): + + @task.sensor( + poke_interval=self.wait_time, + mode="reschedule", + task_id=self.operator_id, + task_display_name=self.display_name, + outlets=self.outlets, + ) + def wait_for_conditions(**kwargs): + pipeline_state = PipelineState(running_subject=self.partition, **kwargs) + + for condition in self.conditions: + if evaluate_external_condition(condition, pipeline_state): + return PokeReturnValue(is_done=True, xcom_value=condition.next_id) + + return False + + return wait_for_conditions() diff --git a/cli/medperf/airflow_runner/dags/operator_builders/singularity_operator_builder.py b/cli/medperf/airflow_runner/dags/operator_builders/singularity_operator_builder.py new file mode 100644 index 000000000..32f6244df --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_builders/singularity_operator_builder.py @@ -0,0 +1,24 @@ +from .container_operator_builder import ContainerOperatorBuilder +from airflow.providers.singularity.operators.singularity import SingularityOperator + + +class SingularityOperatorBuilder(ContainerOperatorBuilder): + """ + Currently untested!! + """ + + def build_mounts(self, mounts: list[str]): + """Singularity operator uses raw mount strings as they are, /path/in/host:/path/in/container""" + return mounts + + def _define_base_operator(self) -> SingularityOperator: + command = self._get_command() + return SingularityOperator( + image=self.image, + command=command, + volumes=self.mounts, + task_id=self.operator_id, + task_display_name=self.display_name, + auto_remove=True, + outlets=self.outlets, + ) diff --git a/cli/medperf/airflow_runner/dags/operator_factory.py b/cli/medperf/airflow_runner/dags/operator_factory.py new file mode 100644 index 000000000..3ef7756d7 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/operator_factory.py @@ -0,0 +1,31 @@ +from __future__ import annotations +from operator_builders.singularity_operator_builder import SingularityOperatorBuilder +from operator_builders.docker_operator_buider import DockerOperatorBuilder +from operator_builders.empty_operator_builder import EmptyOperatorBuilder +from operator_builders.manual_approval_buider import ManualApprovalBuilder +from operator_builders.operator_builder import OperatorBuilder +import os + +container_builder = ( + SingularityOperatorBuilder + if os.getenv("CONTAINER_TYPE") == "singularity" + else DockerOperatorBuilder +) + +OPERATOR_MAPPING: dict[str, OperatorBuilder] = { + "container": container_builder, + "dummy": EmptyOperatorBuilder, + "manual_approval": ManualApprovalBuilder, +} + + +def operator_factory(type, **kwargs) -> list[OperatorBuilder]: + + return_list = [] + try: + operator_obj = OPERATOR_MAPPING[type] + except KeyError: + raise TypeError(f"Tasks of type {type} are not supported!") + + return_list = operator_obj.build_operator_list(**kwargs) + return return_list diff --git a/cli/medperf/airflow_runner/dags/pipeline_state.py b/cli/medperf/airflow_runner/dags/pipeline_state.py new file mode 100644 index 000000000..0e641a0b3 --- /dev/null +++ b/cli/medperf/airflow_runner/dags/pipeline_state.py @@ -0,0 +1,16 @@ +from constants import ( + AIRFLOW_DATA_DIR, + AIRFLOW_INPUT_DATA_DIR, + AIRFLOW_WORKSPACE_DIR, +) + + +class PipelineState: + # TODO properly define + + def __init__(self, running_subject: str = None, **airflow_kwargs): + self.running_subject = running_subject + self.airflow_kwargs = airflow_kwargs + self.input_data_dir = AIRFLOW_INPUT_DATA_DIR + self.data_dir = AIRFLOW_DATA_DIR + self.workspace_dir = AIRFLOW_WORKSPACE_DIR diff --git a/cli/medperf/airflow_runner/dags/yaml_parser/yaml_parser.py b/cli/medperf/airflow_runner/dags/yaml_parser/yaml_parser.py new file mode 100644 index 000000000..7cf016eee --- /dev/null +++ b/cli/medperf/airflow_runner/dags/yaml_parser/yaml_parser.py @@ -0,0 +1,256 @@ +import yaml +import os +from constants import YAML_DIR +from typing import Union, Any +from dag_utils import import_external_python_function +from collections import defaultdict +from airflow.sdk import DAG +from dag_utils import create_legal_dag_id +from dag_builder import DagBuilder +from copy import deepcopy + + +class YamlParser: + + def __init__(self, yaml_dir_path: str = None): + self.yaml_dir_path = yaml_dir_path or YAML_DIR + yaml_content = self.read_yaml_definition() + self.raw_steps = yaml_content["steps"] + self._raw_conditions = yaml_content.get("conditions", []) + self._raw_subject_definitions = yaml_content.get("per_subject_def", {}) + self.dag_builders = None + + @staticmethod + def read_yaml_definition() -> ( + dict[str, Union[list[dict[str, str]], dict[str, str]]] + ): + yaml_files = [yaml_file for yaml_file in os.listdir(YAML_DIR)] + yaml_files = [os.path.join(YAML_DIR, yaml_file) for yaml_file in yaml_files] + yaml_files = [ + yaml_file + for yaml_file in yaml_files + if os.path.isfile(yaml_file) + and (yaml_file.endswith(".yaml") or yaml_file.endswith(".yml")) + ] + + if len(yaml_files) == 0: + raise ValueError("No YAML files found!") + elif len(yaml_files) > 1: + raise ValueError( + "More than one YAML file found! The parser currently only supports parsing a single file!" + ) + + yaml_file = yaml_files[0] + try: + with open(yaml_file, "r") as f: + raw_content = f.read() + expanded_content = os.path.expandvars(raw_content) + yaml_info = yaml.safe_load(expanded_content) + except Exception: + print(f"Unable to load YAML file {yaml_file}. It will be skipped.") + + return yaml_info + + def read_subject_partitions(self): + from pipeline_state import PipelineState + + if not self._raw_subject_definitions: + return [] + + per_subjection_function_name = self._raw_subject_definitions["function_name"] + per_subject_function_obj = import_external_python_function( + per_subjection_function_name + ) + subject_partition_list = per_subject_function_obj(PipelineState()) + return subject_partition_list + + def _get_next_id_from_expanded_step(self, raw_step): + next_field = raw_step.get("next") + if next_field is None: + return [] + elif isinstance(next_field, str): + return [next_field] + elif isinstance(next_field, list): + return next_field + else: + if_fields = next_field.get("if", []) + default_fields = next_field.get("else", None) + next_fields = [ + target for if_field in if_fields for target in if_field["target"] + ] + if default_fields: + next_fields.extend(default_fields) + return next_fields + + def _update_next_id_in_expanded_step( + self, current_step, id_to_partition_to_partition_id + ): + next_field = deepcopy(current_step.get("next")) + this_partition = current_step["partition"] + + def get_updated_ids(this_partition, partition_to_partition_id): + if this_partition is None: + # This step is not partitioned, but leads to a partition -> use all as next + updated_ids = list(partition_to_partition_id.values()) + else: + # This step is also partitioned. Pick corresponding partition + updated_ids = [partition_to_partition_id[this_partition]] + return updated_ids + + def update_next_ids(original_next_ids): + new_ids = [] + for next_id in original_next_ids: + partition_to_partition_id = id_to_partition_to_partition_id.get(next_id) + if not partition_to_partition_id: + new_ids.append(next_id) + continue + + updated_ids = get_updated_ids( + this_partition=this_partition, + partition_to_partition_id=partition_to_partition_id, + ) + new_ids.extend(updated_ids) + return new_ids + + if not next_field: + return + elif isinstance(next_field, str): + next_field = [next_field] + + if isinstance(next_field, list): + updated_next = update_next_ids(next_field) + next_field = updated_next + else: + if_fields = next_field.get("if", []) + for if_field in if_fields: + next_ids = if_field["target"] + + if isinstance(next_ids, str): + next_ids = [next_ids] + updated_ids = update_next_ids(next_ids) + if_field["target"] = updated_ids + + default_field = next_field.get("else") + if default_field: + if isinstance(default_field, str): + default_field = [default_field] + new_default = update_next_ids(default_field) + next_field["else"] = new_default + + return next_field + + def _verify_unique_id(self, potential_id, original_id, mapped_steps): + if potential_id in mapped_steps: + raise ValueError(f"ID {original_id} has been used more than one time!") + + def _create_expanded_steps( + self, raw_steps: list[dict[str, Any]], subject_partitions: list[str] + ): + step_id_to_expanded_step = {} + original_id_to_partition_to_partitioned_id = defaultdict(dict) + for step in raw_steps: + original_id = step["id"] + step["conditions_definitions"] = self._raw_conditions + if step.get("per_subject"): + for subject_partition in subject_partitions: + partitioned_step = {k: v for k, v in step.items()} + partitioned_id = create_legal_dag_id( + f"{original_id}_{subject_partition}" + ) + self._verify_unique_id( + potential_id=partitioned_id, + original_id=original_id, + mapped_steps=step_id_to_expanded_step, + ) + + partitioned_step["id"] = partitioned_id + partitioned_step["raw_id"] = original_id + partitioned_step["partition"] = subject_partition + step_id_to_expanded_step[partitioned_step["id"]] = partitioned_step + original_id_to_partition_to_partitioned_id[original_id][ + subject_partition + ] = partitioned_id + else: + step["partition"] = None + step_id = create_legal_dag_id(original_id) + step["id"] = step_id + step["raw_id"] = original_id + self._verify_unique_id( + potential_id=step_id, + original_id=original_id, + mapped_steps=step_id_to_expanded_step, + ) + step_id_to_expanded_step[step_id] = step + + for step_id, step in step_id_to_expanded_step.items(): + new_next = self._update_next_id_in_expanded_step( + step, original_id_to_partition_to_partitioned_id + ) + step["next"] = new_next + + next_id_to_upstream_ids = defaultdict(set) + for step_id, step in step_id_to_expanded_step.items(): + next_ids = self._get_next_id_from_expanded_step(step) + for next_id in next_ids: + next_id_to_upstream_ids[next_id].add(step_id) + + for step_id, step in step_id_to_expanded_step.items(): + upstream_ids = list(next_id_to_upstream_ids[step_id]) + if upstream_ids: + this_step_inlets = [] + if step["partition"] is None: + for upstream_id in upstream_ids: + upstream_dict = step_id_to_expanded_step[upstream_id] + upstream_partition = upstream_dict["partition"] + if upstream_partition: + new_inlet = create_legal_dag_id( + f"{step_id}_{upstream_partition}" + ) + this_step_inlets.append(new_inlet) + self._update_next_with_new_partition( + upstream_dict, step_id, new_inlet + ) + if not this_step_inlets: + this_step_inlets = [step_id] + step["inlets"] = this_step_inlets + else: + step["inlets"] = [] + + expanded_steps = list(step_id_to_expanded_step.values()) + return expanded_steps + + def _update_next_with_new_partition(self, original_dict, original_next, new_next): + next_field = original_dict["next"] + if isinstance(next_field, list): + next_field = [ + item if item != original_next else new_next for item in next_field + ] + else: + if_fields = next_field["if"] + if_fields = [ + item if item != original_next else new_next for item in if_fields + ] + default_fields = next_field["else"] + default_fields = [ + item if item != original_next else new_next for item in default_fields + ] + original_dict["next"] = next_field + + def map_dag_builders_from_yaml(self) -> list[DagBuilder]: + + subject_partitions = self.read_subject_partitions() + expanded_steps = self._create_expanded_steps( + self.raw_steps, subject_partitions=subject_partitions + ) + dag_builder_list = [ + DagBuilder(expanded_step=expanded_step) for expanded_step in expanded_steps + ] + + return dag_builder_list + + def build_dags(self) -> list[DAG]: + if self.dag_builders is None: + self.dag_builders = self.map_dag_builders_from_yaml() + + dags_list = [builder.build_dag() for builder in self.dag_builders] + return dags_list diff --git a/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py b/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py new file mode 100644 index 000000000..738aa9634 --- /dev/null +++ b/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py @@ -0,0 +1,172 @@ +""" +This DAG is responsible for summarizing the status of the pipeline into a +yaml file that can be sent to the MedPerf stage. This summary can be used +by the Benchmark Comitte to track how Data Preparation is going at each +participant and assist users that appear to be struggling. +""" + +from __future__ import annotations +import os +import yaml +import pandas as pd +import asyncio +from typing import Any, Literal +from collections import defaultdict +from medperf.airflow_runner.api_client.client import AirflowAPIClient +from medperf.airflow_runner.yaml_partial_parser import YamlPartialParser +from medperf.airflow_runner.utils import DagRunState + + +class ReportSummary: + + def __init__( + self, + report_directory: str, + execution_status: Literal["running", "failure", "done"], + progress_dict: dict[str, Any] = None, + ): + self.report_summary_file = os.path.join(report_directory, "report_summary.yaml") + self.execution_status = execution_status + self.progress_dict = progress_dict if progress_dict is not None else {} + + def to_dict(self): + report_dict = { + "execution_status": self.execution_status, + "progress": self.progress_dict, + } + return report_dict + + def write_yaml(self): + report_dict = self.to_dict() + with open(self.report_summary_file, "w") as f: + yaml.dump( + report_dict, + f, + sort_keys=False, + ) + + +class Summarizer: + + def __init__(self, yaml_parser: YamlPartialParser, report_directory: os.PathLike): + self.step_ids = yaml_parser.step_ids + self.report_directory = report_directory + + @staticmethod + def _get_dag_id_to_dag_dict(client: AirflowAPIClient) -> dict[str, dict[str, Any]]: + all_dags = client.dags.get_all_dags()["dags"] + + all_dags = {dag["dag_id"]: dag for dag in all_dags} + + return all_dags + + @staticmethod + def _get_most_recent_dag_runs( + all_dags: dict[str, dict[str, Any]], client: AirflowAPIClient + ) -> dict[str, dict[str, Any] | None]: + most_recent_dag_runs = {} + + for dag_id in all_dags.keys(): + most_recent_run = client.dag_runs.get_most_recent_dag_run(dag_id=dag_id)[ + "dag_runs" + ] + if not most_recent_run: + most_recent_run = None + else: + most_recent_run = most_recent_run[0] + most_recent_dag_runs[dag_id] = most_recent_run + + return most_recent_dag_runs + + def _sort_column(self, col): + sorted_indices = [] + for task_id in col: + if task_id in self.step_ids: + sorted_indices.append(self.step_ids.index(task_id)) + else: + sorted_indices.append(0) + + return sorted_indices + + def _get_report_summary( + self, + all_dags: dict[str, dict[str, Any]], + most_recent_dag_runs: dict[str, dict[str, Any] | None], + ) -> ReportSummary: + + dag_info_dicts = [] + for dag_id, run_dict in most_recent_dag_runs.items(): + this_dag = all_dags[dag_id] + if run_dict is None: + run_state = None + else: + run_state = run_dict["state"] + + dag_step_tags = [ + tag["name"] for tag in this_dag["tags"] if tag["name"] in self.step_ids + ] + update_dict = { + "DAG ID": dag_id, + "DAG Display Name": this_dag["dag_display_name"], + "DAG Run State": run_state, + "DAG Step Tag": dag_step_tags, + } + + dag_info_dicts.append(update_dict) + + progress_df = pd.DataFrame(dag_info_dicts) + progress_df = progress_df.explode("DAG Step Tag") + progress_df = progress_df.sort_values( + by=["DAG Step Tag"], + key=self._sort_column, + ) + all_dag_tags = progress_df["DAG Step Tag"].unique() + summary_dict = defaultdict(lambda: dict()) + + for dag_tag in all_dag_tags: + + relevant_df = progress_df[progress_df["DAG Step Tag"] == dag_tag] + if relevant_df.empty: + continue + task_success_ratio = len( + relevant_df[relevant_df["DAG Run State"] == DagRunState.SUCCESS] + ) / len(relevant_df) + success_percentage = round(task_success_ratio * 100, 3) + summary_dict[dag_tag] = success_percentage + + summary_dict = dict(summary_dict) + + if all( + dag_run_state == DagRunState.SUCCESS + for dag_run_state in relevant_df["DAG Run State"] + ): + execution_status = "done" + else: + execution_status = "running" + + report_summary = ReportSummary( + report_directory=self.report_directory, + execution_status=execution_status, + progress_dict=summary_dict, + ) + return report_summary + + def summarize( + self, + airflow_client: AirflowAPIClient, + ): + all_dags = self._get_dag_id_to_dag_dict(airflow_client) + most_recent_dag_runs = self._get_most_recent_dag_runs(all_dags, airflow_client) + report_summary = self._get_report_summary(all_dags, most_recent_dag_runs) + report_summary.write_yaml() + + async def summarize_every_x_seconds( + self, + interval_seconds: int, + airflow_client: AirflowAPIClient, + ): + attempts = 1 + while True: + attempts += 1 + self.summarize(airflow_client) + await asyncio.sleep(interval_seconds) diff --git a/cli/medperf/airflow_runner/system_runner.py b/cli/medperf/airflow_runner/system_runner.py new file mode 100644 index 000000000..203074e15 --- /dev/null +++ b/cli/medperf/airflow_runner/system_runner.py @@ -0,0 +1,363 @@ +from __future__ import annotations +import subprocess +import os +from .api_client.client import AirflowAPIClient +from .components.api_server import AirflowApiServer +from .components.airflow_component import AirflowComponentRunner +from .components.dag_processor import AirflowDagProcessor +from .components.db_postgres import PostgresDBDocker +from .components.scheduler import AirflowScheduler +from .components.triggerer import AirflowTriggerer +from .components.utils import validate_port +from .monitor.yaml_dag_monitor import Summarizer +from .yaml_partial_parser import YamlPartialParser +from .utils import DagRunState +from .create_venv import create_airflow_venv_if_not_exists +from typing import List, Union, TYPE_CHECKING +import sys +import configparser +import secrets +from pydantic import SecretStr +import json +import logging +import asyncio +import logging +from medperf.airflow_runner.dags.constants import FINAL_ASSET, SUMMARIZER_ID +from medperf import config + + +if TYPE_CHECKING: + from .components.airflow_component import AirflowComponentRunner +logger = logging.getLogger(__name__) + + +class AirflowSystemRunner: + def __init__( + self, + airflow_home: os.PathLike, + user: str, + dags_folder: os.PathLike, + workspace_dir: os.PathLike, + data_dir: os.PathLike, + input_data_dir: os.PathLike, + yaml_dags_dir: os.PathLike, + project_name: str, + port: Union[str, int] = 8080, + postgres_port: Union[str, int] = 5432, + airflow_venv_dir: os.PathLike = config.airflow_venv_dir, + **extra_airflow_configs: dict, + ): + self.airflow_home = airflow_home + self._python_exec = os.path.join(airflow_venv_dir, "bin", "python") + # TODO windows + self.port = validate_port(port) + self.dags_folder = dags_folder + self.extra_configs = extra_airflow_configs + self.workspace_dir = workspace_dir + self.data_dir = data_dir + self.input_data_dir = input_data_dir + self.yaml_parser = YamlPartialParser(yaml_file_dir=yaml_dags_dir) + self.user = user + self._password = SecretStr(secrets.token_urlsafe(16)) + self.airflow_config_file = os.path.join(self.airflow_home, "airflow.cfg") + self.project_name = project_name + self._postgres_password = SecretStr(secrets.token_urlsafe(16)) + self._postgres_user = self._postgres_db = "airflow" + self.postgres_port = postgres_port + self.scheduler = self.api_server = self.dag_processor = self.db = ( + self.triggerer + ) = None + self.host = "localhost" + + @property + def _complete_link(self): + return f"http://{self.host}:{self.port}" + + @property + def _airflow_components(self) -> List[AirflowComponentRunner]: + return [ + self.scheduler, + self.api_server, + self.dag_processor, + self.db, + self.triggerer, + ] + + def _initial_setup(self): + logger.debug("Creating initial Airflow configuration") + a = subprocess.run( + [self._python_exec, "-m", "airflow", "config", "list"], + capture_output=True, + env=self._run_env, + ) + config = configparser.ConfigParser() + with open(self.airflow_config_file, "r") as f: + config.read_file(f) + config["core"].update( + { + "dags_folder": self.dags_folder, + "executor": "LocalExecutor", + "auth_manager": "airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager", + "load_examples": "false", + } + ) + config["database"].update({"sql_alchemy_conn": self.db.connection_string}) + config["scheduler"].update({"enable_health_check": "true"}) + + logger.debug(f"Saving Airflow configuration to {self.airflow_config_file}") + with open(self.airflow_config_file, "w") as f: + config.write(f) + + def init_airflow(self, force_venv_creation: bool = False): + logger.info("Starting Airflow components") + create_airflow_venv_if_not_exists(force_creation=force_venv_creation) + os.makedirs(os.path.join(self.airflow_home, "logs"), exist_ok=True) + self._initialize_components() + + asyncio.run(self.db.start()) + if not os.path.exists(self.airflow_config_file): + self._initial_setup() + + self._start_airflow_db() + self._create_admin_user() + self._create_pools() + asyncio.run(self._start_non_db_components()) + logger.info("Airflow components successfully started") + + @property + def _run_env(self): + sys_env = os.environ.copy() + sys_env["AIRFLOW_HOME"] = self.airflow_home + return sys_env + + def _initialize_components(self): + common_args = { + "python_executable": self._python_exec, + "airflow_home": self.airflow_home, + "container_type": "docker", # TODO when integrating with MedPerf, get from config + "workspace_dir": self.workspace_dir, + "data_dir": self.data_dir, + "input_data_dir": self.input_data_dir, + "yaml_dags_dir": self.yaml_parser.yaml_dir_path, + "dags_folder": self.dags_folder, + } + + self.db = PostgresDBDocker( + project_name=self.project_name, # TODO when integerating with MedPerf, use singularity version if config says so + root_dir=self.airflow_home, + postgres_user="airflow", + postgres_db="airflow", + hostname=self.host, + ) + self.api_server = AirflowApiServer(**common_args, port=self.port) + self.scheduler = AirflowScheduler( + **common_args, user=self.user, password=self._password + ) + self.dag_processor = AirflowDagProcessor(**common_args) + self.triggerer = AirflowTriggerer(**common_args) + + def _start_airflow_db(self): + logger.debug("Migrating Airflow DB") + init_db_logs = os.path.join(self.airflow_home, "logs", "init_db.log") + with open(init_db_logs, "a") as f: + db_migrate = subprocess.run( + [self._python_exec, "-m", "airflow", "db", "migrate"], + stdout=f, + stderr=f, + ) + + if db_migrate.returncode != 0: + raise ValueError("Failed Airflow Database migration") + + async def _start_non_db_components(self): + await asyncio.gather( + self.api_server.start(), + self.scheduler.start(), + self.dag_processor.start(), + self.triggerer.start(), + ) + + def _create_admin_user(self): + """First attempts to delete user by email, so that it can be generated again with a new password""" + admin_email = "admin@admin.com" + + logging.debug("Deleting existing admin user, if any") + delete_previous_user = subprocess.run( + [ + self._python_exec, + "-m", + "airflow", + "users", + "delete", + "--email", + admin_email, + ], + capture_output=True, + text=True, + env=self._run_env, + ) + logging.debug("Creating new admin user") + create_new_user = subprocess.run( + [ + self._python_exec, + "-m", + "airflow", + "users", + "create", + "--username", + self.user, + "--role", + "Admin", + "--password", + self._password.get_secret_value(), + "--firstname", + "admin", + "--lastname", + "admin", + "--email", + "admin@admin.com", + ], + capture_output=True, + text=True, + env=self._run_env, + ) + + def _create_pools(self): + logging.debug("Creating pools") + if self.yaml_parser.pools is None: + logging.debug("No pool definitions found") + return + + pools_json = os.path.join(self.airflow_home, "pools.json") + + logging.debug(f"Writing pools to {pools_json}") + with open(pools_json, "w") as f: + json.dump(self.yaml_parser.pools, f, indent=4) + + logging.debug("Running pool creation command in Airflow") + create_pools = subprocess.run( + [self._python_exec, "-m", "airflow", "pools", "import", pools_json], + capture_output=True, + text=True, + env=self._run_env, + ) + + if create_pools.stderr: + raise ValueError( + f"Error when attempting to create pools:\n{create_pools.stderr}" + ) + + def wait_for_dag(self): + asyncio.run(self._async_wait_for_dag()) + + async def _async_wait_for_dag(self): + msg = [ + f"MedPerf has started executing the Data Pipeline {self.project_name} via Airflow." + ] + msg.append( + f"Execution will continue until the pipeline successfully completes." + ) + msg.append( + f"The Airflow UI is available at the following link: {self._complete_link}." + ) + msg.append( + "Please use the following credentials for interacting with the Airflow WebUI" + ) + msg.append("-------------------------------------------------------") + msg.append(f"User: {self.user}") + msg.append(f"Password: {self._password.get_secret_value()}") + msg.append("-------------------------------------------------------") + msg.append( + "Note that the password value will change every time Airflow is restarted via MedPerf." + ) + msg.append( + "If this process must be stopped prematurely, please use the Ctrl+C command!" + ) + + httpx_logger = logging.getLogger("httpx") + httpx_logger.setLevel(logging.WARN) + wait_interval = 10 # seconds + for line in msg: + logger.info(line) + api_url = f"{self._complete_link}/api/v2" + with AirflowAPIClient( + username=self.user, password=self._password, api_url=api_url + ) as airflow_client: + try: + summarizer = Summarizer( + yaml_parser=self.yaml_parser, report_directory=self.workspace_dir + ) + summarizer_task = asyncio.create_task( + summarizer.summarize_every_x_seconds( + interval_seconds=1, airflow_client=airflow_client + ) + ) + while True: + await asyncio.sleep(wait_interval) + if self._check_completed_asset(airflow_client): + break + + except KeyboardInterrupt: + logger.info("Interrupting Airflow Execution. Please wait...") + raise + + finally: + summarizer_task.cancel() + summarizer.summarize(airflow_client) + + logger.info( + "Pipeline Execution finished. Please press Enter to close Airflow..." + ) + input() + + def _check_completed_asset(self, airflow_client: AirflowAPIClient) -> bool: + """Checks if the final asset that marks pipeline completion has been updated""" + asset_events = airflow_client.assets.get_asset_events()["asset_events"] + + if not asset_events: + return False + + final_asset = [event for event in asset_events if event["uri"] == FINAL_ASSET] + return bool(final_asset) + + def _check_ran_summarizer(self, airflow_client: AirflowAPIClient) -> bool: + """Checks if the summarizer has finished running. It is triggered by the final asset.""" + last_summarizer_run = airflow_client.dag_runs.get_most_recent_dag_run( + dag_id=SUMMARIZER_ID + )["dag_runs"] + if not last_summarizer_run: + return False + + last_summarizer_run = last_summarizer_run[0] + run_state = last_summarizer_run["state"] + + if run_state == DagRunState.FAILED: + raise ValueError("Final summarizer run failed!") + + return last_summarizer_run["state"] == DagRunState.SUCCESS + + def _stop_airflow(self): + logger.debug("Stopping Airflow execution") + for component in self._airflow_components: + if component is not None and component.process: + logger.debug(f"Stopping component {component.component_name}") + component.terminate() + + def _kill_airflow(self): + logger.debug("Forcefully terminating Airflow execution") + for component in self._airflow_components: + if component is not None: + logger.debug(f"Killing component {component.component_name}") + component.kill() + + def __enter__(self): + logger.debug("Entering Airflow context manager") + return self + + def __exit__(self, exc_type, exc_value, traceback): + logger.debug("Exiting Airflow context manager") + if exc_type is None: + self._stop_airflow() + + else: + self._kill_airflow() diff --git a/cli/medperf/airflow_runner/utils.py b/cli/medperf/airflow_runner/utils.py new file mode 100644 index 000000000..495fc4724 --- /dev/null +++ b/cli/medperf/airflow_runner/utils.py @@ -0,0 +1,16 @@ +from enum import Enum + + +class DagRunState(str, Enum): + """ + Duplicated from Airflow code so we do not need to install + an explicit Airflow dependency in the MedPerf venv + """ + + QUEUED = "queued" + RUNNING = "running" + SUCCESS = "success" + FAILED = "failed" + + def __str__(self) -> str: + return self.value diff --git a/cli/medperf/airflow_runner/yaml_partial_parser.py b/cli/medperf/airflow_runner/yaml_partial_parser.py new file mode 100644 index 000000000..53984e147 --- /dev/null +++ b/cli/medperf/airflow_runner/yaml_partial_parser.py @@ -0,0 +1,92 @@ +import yaml +import os +from typing import Dict, Union + + +class YamlPartialParser: + """ + Does the initial partial parsing of the DAG YAML directory. + THe directory should contain a single YAML file and optionally python files to support its execution. + This parsing simply finds which steps require pools and the final step in the DAG. + Complete parsing for DAG generation is delegated to the Parser in the DAGs directory. + """ + + YAML_EXTENSIONS = (".yaml", ".yml") + + def __init__(self, yaml_file_dir: os.PathLike): + self.yaml_dir_path = yaml_file_dir + self.yaml_path = None + self.pools = {} + self.step_ids = [] + self._parse_yaml_dir() + + def _parse_yaml_dir(self): + file_candidates = [ + filename + for filename in os.listdir(self.yaml_dir_path) + if filename.endswith(self.YAML_EXTENSIONS) + ] + + if not file_candidates: + raise ValueError( + f"No YAML file was found in the directory {self.yaml_dir_path}" + ) + + elif len(file_candidates) > 1: + raise ValueError( + f"Multiple YAML files found at directory {self.yaml_dir_path}. Please make sure only one file is supplied!" + ) + + self.yaml_path = os.path.join(self.yaml_dir_path, file_candidates[0]) + self._parse_yaml_file() + + def _parse_yaml_file(self): + final_step_candidates = [] + error_msgs = [] + tmp_pools = {} + + with open(self.yaml_path, "r") as f: + yaml_content = yaml.safe_load(f) + + for step in yaml_content["steps"]: + self.step_ids.append(step["id"]) + is_marked_as_last = step.get("last", False) + inferred_as_last = step.get("next") is None + if is_marked_as_last or inferred_as_last: + if step.get("per_subject", False): + msg = f"Step {step['id']} appears to be the final step, but is also part of a partition.\n" + msg += "Please make sure the final step is not part of any partitions. " + msg += "You may need to add a final dummy step to join all results." + error_msgs.append(msg) + else: + final_step_candidates.append(step["id"]) + + if "limit" in step.keys() and "id" in step.keys(): + tmp_pools.update(self._create_pool_info(step)) + + if not final_step_candidates: + msg = "The provided YAML DAG file has no clear final step!" + error_msgs.append(msg) + + elif len(final_step_candidates) > 1: + msg = "The provided YAML DAG has multiple potential last steps. Please verify the following steps:\n" + msg += "\n".join(final_step_candidates) + error_msgs.append(msg) + + if error_msgs: + full_msg = "\n\n".join(error_msgs) + raise ValueError(full_msg) + + self.pools = tmp_pools or None + + @staticmethod + def _create_pool_info(step: Dict[str, Union[str, int]]): + return { + f'{step["id"]}_pool': { + "slots": step["limit"], + "include_deferred": False, + "description": f"Pool to limit the execution of " + f'tasks with ID {step["id"]} to {step["limit"]} ' + "parallel executions", + } + } diff --git a/cli/medperf/config.py b/cli/medperf/config.py index 07e66490a..d8f0fa490 100644 --- a/cli/medperf/config.py +++ b/cli/medperf/config.py @@ -49,6 +49,7 @@ # Storage config config_storage = Path.home().resolve() / ".medperf_config" logs_storage = Path.home().resolve() / ".medperf_logs" +airflow_venv_dir = str(config_storage / ".airflow_venv") config_path = getenv("MEDPERF_CONFIG_PATH", str(config_storage / "config.yaml")) auth_jwks_file = str(config_storage / ".jwks") creds_folder = str(config_storage / ".tokens") @@ -198,6 +199,7 @@ executed_flag = ".executed" results_filename = "results.yaml" local_metrics_outputs = "local_outputs" +airflow_requirements_file = "airflow_requirements.txt" # MLCube assets conventions cube_filename = "container_config.yaml" diff --git a/cli/medperf/utils.py b/cli/medperf/utils.py index 743cf8c84..64f5059b0 100644 --- a/cli/medperf/utils.py +++ b/cli/medperf/utils.py @@ -21,7 +21,15 @@ from pexpect.exceptions import TIMEOUT from git import Repo, GitCommandError import medperf.config as config -from medperf.exceptions import CleanExit, ExecutionError, InvalidArgumentError +from medperf.exceptions import ( + CleanExit, + ExecutionError, + InvalidArgumentError, + MedperfException, +) +import subprocess +import venv +import shlex from pydantic import TypeAdapter @@ -576,3 +584,59 @@ def parse_datetime(datetime_obj: Union[str, int, datetime]): "Current implementation of parse_datetime only supports strings, ints and datetimes!\n" f"Object sent was of type {type(datetime_obj)}\n{datetime_obj=}" ) + + +def run_command(cmd, timeout=None, output_logs=None): + with spawn_and_kill(shlex.join(cmd), timeout=timeout) as proc_wrapper: + proc = proc_wrapper.proc + proc_out = combine_proc_sp_text(proc) + + if output_logs is not None: + with open(output_logs, "w") as f: + f.write(proc_out) + + if proc.exitstatus != 0: + raise ExecutionError("There was an error while executing the container") + + return proc_out + + +def create_airflow_venv_if_not_exists(force_creation=False): + if os.path.exists(config.airflow_venv_dir) and not force_creation: + return + + requirements_file = str( + Path(__file__).parent.resolve() / config.airflow_requirements_file + ) + if not os.path.exists(requirements_file): + raise MedperfException( + f"Could not find the {config.airflow_requirements_file}! Please verify your MedPerf installation." + ) + # TODO add Windows executable if we eventually support windows + python_executable = os.path.join(config.airflow_venv_dir, "bin", "python") + + venv.create(env_dir=config.airflow_venv_dir, clear=True, with_pip=True) + if not os.path.exists(python_executable): + shutil.rmtree(config.airflow_venv_dir) + raise MedperfException( + "Failed to find the Python executable for Airflow environment " + f"in directory {config.airflow_venv_dir}. " + "The virtual environment has been deleted." + ) + + install_dependencies_process = subprocess.run( + [python_executable, "-m", "pip", "install", "-r", requirements_file], + capture_output=True, + text=True, + ) + + if install_dependencies_process.returncode != 0: + shutil.rmtree(config.airflow_venv_dir) + error_msg = f"Failed to install dependencies to the Airflow environment located at {config.airflow_venv_dir}.\n" + error_msg += "The virtual environment has been deleted. Error details:\n" + if install_dependencies_process.stderr: + error_msg += f"Stderr: {install_dependencies_process.stderr}" + if install_dependencies_process.stdout: + error_msg += f"Stdout: {install_dependencies_process.stdout}" + + raise MedperfException(error_msg) diff --git a/cli/requirements.txt b/cli/requirements.txt index b29976bfa..7662f3d16 100644 --- a/cli/requirements.txt +++ b/cli/requirements.txt @@ -25,3 +25,4 @@ cookiecutter==2.1.1 uvicorn==0.30.1 fastapi==0.116.1 fastapi-login==1.10.2 +methodtools==0.4.7 \ No newline at end of file From e304fbd98e0e5173073aa792db05610d947cbe0f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 29 Oct 2025 16:52:26 -0300 Subject: [PATCH 016/176] Standardize logging with Medperf --- .../airflow_runner/components/component.py | 6 ++-- cli/medperf/airflow_runner/create_venv.py | 20 +++++++----- cli/medperf/airflow_runner/system_runner.py | 32 ++++++++----------- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/cli/medperf/airflow_runner/components/component.py b/cli/medperf/airflow_runner/components/component.py index 1c1d37532..ea3678d37 100644 --- a/cli/medperf/airflow_runner/components/component.py +++ b/cli/medperf/airflow_runner/components/component.py @@ -6,8 +6,6 @@ import async_timeout import logging -logger = logging.getLogger(__name__) - class ComponentRunner(ABC): @@ -53,9 +51,9 @@ def run_command_with_logging( self.process = subprocess.Popen(command, env=env, stdout=f, stderr=f) async def start(self): - logger.debug(self.starting_message) + logging.debug(self.starting_message) await self.start_logic() - logger.debug(self.finished_message) + logging.debug(self.finished_message) @abstractmethod async def start_logic(self): diff --git a/cli/medperf/airflow_runner/create_venv.py b/cli/medperf/airflow_runner/create_venv.py index 38897e609..3fdae86eb 100644 --- a/cli/medperf/airflow_runner/create_venv.py +++ b/cli/medperf/airflow_runner/create_venv.py @@ -4,11 +4,13 @@ import shutil from pathlib import Path from medperf.exceptions import MedperfException -from medperf.utils import spawn_and_kill, combine_proc_sp_text +from medperf.utils import spawn_and_kill import shlex +import logging +from pexpect import EOF -def create_airflow_venv_if_not_exists(force_creation=False): +def create_airflow_venv_if_not_exists(force_creation=False, timeout: int = 5 * 60): if os.path.exists(config.airflow_venv_dir) and not force_creation: return @@ -32,15 +34,17 @@ def create_airflow_venv_if_not_exists(force_creation=False): ) command = [python_executable, "-m", "pip", "install", "-r", requirements_file] - with spawn_and_kill(shlex.join(command), timeout=None) as spawn_wrapper: - combine_proc_sp_text(spawn_wrapper.proc) + config.ui.print( + "Installing additional requirements for Airflow Execution. " + "This may take a few minutes. " + "This step will not be run in future Airflow executions." + ) + with spawn_and_kill(shlex.join(command), timeout=timeout) as spawn_wrapper: + spawn_wrapper.proc.expect(EOF) if spawn_wrapper.proc.exitstatus != 0: shutil.rmtree(config.airflow_venv_dir) error_msg = f"Failed to install dependencies to the Airflow environment located at {config.airflow_venv_dir}.\n" error_msg += "The virtual environment has been deleted." + logging.debug(spawn_wrapper.proc.before) raise MedperfException(error_msg) - - -if __name__ == "__main__": - create_airflow_venv_if_not_exists(force_creation=True) diff --git a/cli/medperf/airflow_runner/system_runner.py b/cli/medperf/airflow_runner/system_runner.py index 203074e15..f811baa81 100644 --- a/cli/medperf/airflow_runner/system_runner.py +++ b/cli/medperf/airflow_runner/system_runner.py @@ -14,7 +14,6 @@ from .utils import DagRunState from .create_venv import create_airflow_venv_if_not_exists from typing import List, Union, TYPE_CHECKING -import sys import configparser import secrets from pydantic import SecretStr @@ -28,7 +27,6 @@ if TYPE_CHECKING: from .components.airflow_component import AirflowComponentRunner -logger = logging.getLogger(__name__) class AirflowSystemRunner: @@ -84,7 +82,7 @@ def _airflow_components(self) -> List[AirflowComponentRunner]: ] def _initial_setup(self): - logger.debug("Creating initial Airflow configuration") + logging.debug("Creating initial Airflow configuration") a = subprocess.run( [self._python_exec, "-m", "airflow", "config", "list"], capture_output=True, @@ -104,16 +102,16 @@ def _initial_setup(self): config["database"].update({"sql_alchemy_conn": self.db.connection_string}) config["scheduler"].update({"enable_health_check": "true"}) - logger.debug(f"Saving Airflow configuration to {self.airflow_config_file}") + logging.debug(f"Saving Airflow configuration to {self.airflow_config_file}") with open(self.airflow_config_file, "w") as f: config.write(f) def init_airflow(self, force_venv_creation: bool = False): - logger.info("Starting Airflow components") create_airflow_venv_if_not_exists(force_creation=force_venv_creation) os.makedirs(os.path.join(self.airflow_home, "logs"), exist_ok=True) self._initialize_components() + config.ui.print("Starting Airflow components") asyncio.run(self.db.start()) if not os.path.exists(self.airflow_config_file): self._initial_setup() @@ -122,7 +120,7 @@ def init_airflow(self, force_venv_creation: bool = False): self._create_admin_user() self._create_pools() asyncio.run(self._start_non_db_components()) - logger.info("Airflow components successfully started") + config.ui.print("Airflow components successfully started") @property def _run_env(self): @@ -157,7 +155,7 @@ def _initialize_components(self): self.triggerer = AirflowTriggerer(**common_args) def _start_airflow_db(self): - logger.debug("Migrating Airflow DB") + logging.debug("Migrating Airflow DB") init_db_logs = os.path.join(self.airflow_home, "logs", "init_db.log") with open(init_db_logs, "a") as f: db_migrate = subprocess.run( @@ -274,11 +272,9 @@ async def _async_wait_for_dag(self): "If this process must be stopped prematurely, please use the Ctrl+C command!" ) - httpx_logger = logging.getLogger("httpx") - httpx_logger.setLevel(logging.WARN) wait_interval = 10 # seconds for line in msg: - logger.info(line) + config.ui.print(line) api_url = f"{self._complete_link}/api/v2" with AirflowAPIClient( username=self.user, password=self._password, api_url=api_url @@ -298,14 +294,14 @@ async def _async_wait_for_dag(self): break except KeyboardInterrupt: - logger.info("Interrupting Airflow Execution. Please wait...") + config.ui.print("Interrupting Airflow Execution. Please wait...") raise finally: summarizer_task.cancel() summarizer.summarize(airflow_client) - logger.info( + config.ui.print( "Pipeline Execution finished. Please press Enter to close Airflow..." ) input() @@ -337,25 +333,25 @@ def _check_ran_summarizer(self, airflow_client: AirflowAPIClient) -> bool: return last_summarizer_run["state"] == DagRunState.SUCCESS def _stop_airflow(self): - logger.debug("Stopping Airflow execution") + logging.debug("Stopping Airflow execution") for component in self._airflow_components: if component is not None and component.process: - logger.debug(f"Stopping component {component.component_name}") + logging.debug(f"Stopping component {component.component_name}") component.terminate() def _kill_airflow(self): - logger.debug("Forcefully terminating Airflow execution") + logging.debug("Forcefully terminating Airflow execution") for component in self._airflow_components: if component is not None: - logger.debug(f"Killing component {component.component_name}") + logging.debug(f"Killing component {component.component_name}") component.kill() def __enter__(self): - logger.debug("Entering Airflow context manager") + logging.debug("Entering Airflow context manager") return self def __exit__(self, exc_type, exc_value, traceback): - logger.debug("Exiting Airflow context manager") + logging.debug("Exiting Airflow context manager") if exc_type is None: self._stop_airflow() From 2c23d1b453121242ddbabfd8cb97546a70ecd8db Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 3 Nov 2025 17:17:08 -0300 Subject: [PATCH 017/176] Refactor code considering local airflow installation alongside MedPerf. --- .../airflow_runner/api_client/client.py | 10 ++-- cli/medperf/airflow_runner/create_venv.py | 50 ------------------- .../monitor/yaml_dag_monitor.py | 2 +- cli/medperf/airflow_runner/system_runner.py | 12 ++--- cli/medperf/airflow_runner/utils.py | 16 ------ 5 files changed, 10 insertions(+), 80 deletions(-) delete mode 100644 cli/medperf/airflow_runner/create_venv.py delete mode 100644 cli/medperf/airflow_runner/utils.py diff --git a/cli/medperf/airflow_runner/api_client/client.py b/cli/medperf/airflow_runner/api_client/client.py index ff01485b4..64d1c3c8b 100644 --- a/cli/medperf/airflow_runner/api_client/client.py +++ b/cli/medperf/airflow_runner/api_client/client.py @@ -1,5 +1,6 @@ from __future__ import annotations import os +from airflow.sdk.api.client import BearerAuth as AirflowBearerAuth from typing import Optional from methodtools import lru_cache import time @@ -14,7 +15,7 @@ """ -class BearerAuth(httpx.Auth): +class BearerAuth(AirflowBearerAuth): def __init__( self, token: str, @@ -32,17 +33,12 @@ def __init__( expires_at = now + token_duration + leeway_seconds self.expires_at = expires_at - self.token = token + super().__init__(token=token) def is_valid(self): now = time.time() return now < self.expires_at - def auth_flow(self, request: httpx.Request): - if self.token: - request.headers["Authorization"] = "Bearer " + self.token - yield request - class AirflowAPIClient(httpx.Client): diff --git a/cli/medperf/airflow_runner/create_venv.py b/cli/medperf/airflow_runner/create_venv.py deleted file mode 100644 index 3fdae86eb..000000000 --- a/cli/medperf/airflow_runner/create_venv.py +++ /dev/null @@ -1,50 +0,0 @@ -import venv -from medperf import config -import os -import shutil -from pathlib import Path -from medperf.exceptions import MedperfException -from medperf.utils import spawn_and_kill -import shlex -import logging -from pexpect import EOF - - -def create_airflow_venv_if_not_exists(force_creation=False, timeout: int = 5 * 60): - if os.path.exists(config.airflow_venv_dir) and not force_creation: - return - - requirements_file = str( - Path(__file__).parent.resolve() / config.airflow_requirements_file - ) - if not os.path.exists(requirements_file): - raise MedperfException( - f"Could not find the {config.airflow_requirements_file}! Please verify your MedPerf installation." - ) - # TODO add Windows executable if we eventually support windows - python_executable = os.path.join(config.airflow_venv_dir, "bin", "python") - - venv.create(env_dir=config.airflow_venv_dir, clear=True, with_pip=True) - if not os.path.exists(python_executable): - shutil.rmtree(config.airflow_venv_dir) - raise MedperfException( - "Failed to find the Python executable for Airflow environment " - f"in directory {config.airflow_venv_dir}. " - "The virtual environment has been deleted." - ) - - command = [python_executable, "-m", "pip", "install", "-r", requirements_file] - config.ui.print( - "Installing additional requirements for Airflow Execution. " - "This may take a few minutes. " - "This step will not be run in future Airflow executions." - ) - with spawn_and_kill(shlex.join(command), timeout=timeout) as spawn_wrapper: - spawn_wrapper.proc.expect(EOF) - - if spawn_wrapper.proc.exitstatus != 0: - shutil.rmtree(config.airflow_venv_dir) - error_msg = f"Failed to install dependencies to the Airflow environment located at {config.airflow_venv_dir}.\n" - error_msg += "The virtual environment has been deleted." - logging.debug(spawn_wrapper.proc.before) - raise MedperfException(error_msg) diff --git a/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py b/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py index 738aa9634..2cf8600be 100644 --- a/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py +++ b/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py @@ -14,7 +14,7 @@ from collections import defaultdict from medperf.airflow_runner.api_client.client import AirflowAPIClient from medperf.airflow_runner.yaml_partial_parser import YamlPartialParser -from medperf.airflow_runner.utils import DagRunState +from airflow.utils.state import DagRunState class ReportSummary: diff --git a/cli/medperf/airflow_runner/system_runner.py b/cli/medperf/airflow_runner/system_runner.py index f811baa81..2d59bceb3 100644 --- a/cli/medperf/airflow_runner/system_runner.py +++ b/cli/medperf/airflow_runner/system_runner.py @@ -11,7 +11,7 @@ from .components.utils import validate_port from .monitor.yaml_dag_monitor import Summarizer from .yaml_partial_parser import YamlPartialParser -from .utils import DagRunState +from airflow.utils.state import DagRunState from .create_venv import create_airflow_venv_if_not_exists from typing import List, Union, TYPE_CHECKING import configparser @@ -23,7 +23,7 @@ import logging from medperf.airflow_runner.dags.constants import FINAL_ASSET, SUMMARIZER_ID from medperf import config - +import sys if TYPE_CHECKING: from .components.airflow_component import AirflowComponentRunner @@ -42,11 +42,11 @@ def __init__( project_name: str, port: Union[str, int] = 8080, postgres_port: Union[str, int] = 5432, - airflow_venv_dir: os.PathLike = config.airflow_venv_dir, + airflow_python_executable: os.PathLike = None, **extra_airflow_configs: dict, ): self.airflow_home = airflow_home - self._python_exec = os.path.join(airflow_venv_dir, "bin", "python") + self._python_exec = airflow_python_executable or sys.executable # TODO windows self.port = validate_port(port) self.dags_folder = dags_folder @@ -83,7 +83,7 @@ def _airflow_components(self) -> List[AirflowComponentRunner]: def _initial_setup(self): logging.debug("Creating initial Airflow configuration") - a = subprocess.run( + config_create_process = subprocess.run( [self._python_exec, "-m", "airflow", "config", "list"], capture_output=True, env=self._run_env, @@ -107,7 +107,7 @@ def _initial_setup(self): config.write(f) def init_airflow(self, force_venv_creation: bool = False): - create_airflow_venv_if_not_exists(force_creation=force_venv_creation) + # create_airflow_venv_if_not_exists(force_creation=force_venv_creation) os.makedirs(os.path.join(self.airflow_home, "logs"), exist_ok=True) self._initialize_components() diff --git a/cli/medperf/airflow_runner/utils.py b/cli/medperf/airflow_runner/utils.py deleted file mode 100644 index 495fc4724..000000000 --- a/cli/medperf/airflow_runner/utils.py +++ /dev/null @@ -1,16 +0,0 @@ -from enum import Enum - - -class DagRunState(str, Enum): - """ - Duplicated from Airflow code so we do not need to install - an explicit Airflow dependency in the MedPerf venv - """ - - QUEUED = "queued" - RUNNING = "running" - SUCCESS = "success" - FAILED = "failed" - - def __str__(self) -> str: - return self.value From ee3b87c4f700ef7ddb06591aca54591179b29c66 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 4 Nov 2025 11:06:18 -0300 Subject: [PATCH 018/176] Convert mlcube_hash field from string do JSON (dict) --- .../0003_convert_mlcube_hash_to_json.py | 83 +++++++++++++++++++ server/mlcube/models.py | 2 +- 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py diff --git a/server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py b/server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py new file mode 100644 index 000000000..15c850eca --- /dev/null +++ b/server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py @@ -0,0 +1,83 @@ +# Generated by Django 4.2.23 on 2025-11-04 14:05 + +from django.db import migrations, models + + +def convert_str_hash_to_json_hash(apps, schema_editor): + MlCube = apps.get_model("mlcube", "MlCube") + for mlcube in MlCube.objects.all(): + mlcube.mlcube_hash_temp = {"default": mlcube.mlcube_hash} + mlcube.save() + + +def convert_json_hash_to_str_hash(apps, schema_editor): + MlCube = apps.get_model("mlcube", "MlCube") + for mlcube in MlCube.objects.all(): + mlcube.mlcube_hash = list(mlcube.mlcube_hash_temp.values())[0] + mlcube.save() + + +class Migration(migrations.Migration): + + replaces = [ + ("mlcube", "0003_tmp_mlcube_hash"), + ( + "mlcube", + "0004_alter_mlcube_unique_together_mlcube_mlcube_hash_temp_and_more", + ), + ("mlcube", "0005_rename_mlcube_hash_temp_mlcube_mlcube_hash_and_more"), + ] + + dependencies = [ + ("mlcube", "0002_alter_mlcube_unique_together"), + ] + + operations = [ + migrations.RunPython( + code=convert_str_hash_to_json_hash, + reverse_code=convert_json_hash_to_str_hash, + ), + migrations.AlterUniqueTogether( + name="mlcube", + unique_together=set(), + ), + migrations.AddField( + model_name="mlcube", + name="mlcube_hash_temp", + field=models.JSONField(default=dict), + preserve_default=False, + ), + migrations.AlterUniqueTogether( + name="mlcube", + unique_together={ + ( + "image_tarball_hash", + "image_hash", + "additional_files_tarball_hash", + "mlcube_hash_temp", + "parameters_hash", + ) + }, + ), + migrations.RemoveField( + model_name="mlcube", + name="mlcube_hash", + ), + migrations.RenameField( + model_name="mlcube", + old_name="mlcube_hash_temp", + new_name="mlcube_hash", + ), + migrations.AlterUniqueTogether( + name="mlcube", + unique_together={ + ( + "image_tarball_hash", + "image_hash", + "additional_files_tarball_hash", + "mlcube_hash", + "parameters_hash", + ) + }, + ), + ] diff --git a/server/mlcube/models.py b/server/mlcube/models.py index 8835b31cb..e01b09b04 100644 --- a/server/mlcube/models.py +++ b/server/mlcube/models.py @@ -12,7 +12,7 @@ class MlCube(models.Model): name = models.CharField(max_length=20, unique=True) git_mlcube_url = models.CharField(max_length=256) - mlcube_hash = models.CharField(max_length=100) + mlcube_hash = models.JSONField() git_parameters_url = models.CharField(max_length=256, blank=True) parameters_hash = models.CharField(max_length=100, blank=True) image_tarball_url = models.CharField(max_length=256, blank=True) From 0c9add0d4eed0d32846c05dedbb12b159b863a9e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 5 Nov 2025 14:44:02 -0300 Subject: [PATCH 019/176] Update hashes on seed_utils.py --- server/seed_utils.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index cf6da9721..a68993d98 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -103,7 +103,9 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): { "name": "chestxray_prep", "git_mlcube_url": (ASSETS_URL + "data_preparator/container_config.yaml"), - "mlcube_hash": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31", + "mlcube_hash": { + "default": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31" + }, "git_parameters_url": ( ASSETS_URL + "data_preparator/workspace/parameters.yaml" ), @@ -146,7 +148,9 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): { "name": "chestxray_cnn", "git_mlcube_url": (ASSETS_URL + "model_custom_cnn/container_config.yaml"), - "mlcube_hash": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc", + "mlcube_hash": { + "default": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc" + }, "git_parameters_url": ( ASSETS_URL + "model_custom_cnn/workspace/parameters.yaml" ), @@ -192,7 +196,9 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): { "name": "chestxray_metrics", "git_mlcube_url": (ASSETS_URL + "metrics/container_config.yaml"), - "mlcube_hash": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7", + "mlcube_hash": { + "default": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7" + }, "git_parameters_url": (ASSETS_URL + "metrics/workspace/parameters.yaml"), "parameters_hash": "16cad451c54b801a5b50d999330465d7f68ab5f6d30a0674268d2d17c7f26b73", "image_tarball_url": "", @@ -279,7 +285,9 @@ def create_model(api_server, model_owner_token, benchmark_owner_token, benchmark { "name": "chestxray_mobilenet", "git_mlcube_url": (ASSETS_URL + "model_mobilenetv2/container_config.yaml"), - "mlcube_hash": "618ce7ef9f2b0dbdb0f361823aa4e2efc32e3ef9b29334466bd33eb3eca2aa02", + "mlcube_hash": { + "default": "618ce7ef9f2b0dbdb0f361823aa4e2efc32e3ef9b29334466bd33eb3eca2aa02" + }, "git_parameters_url": ( ASSETS_URL + "model_mobilenetv2/workspace/parameters.yaml" ), From 0e3f43d4459c60e4b7c643d97511d78c4c0b6afd Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 5 Nov 2025 14:44:42 -0300 Subject: [PATCH 020/176] Revert "Create DataPreparationWorkflow Object" This reverts commit afee7ff0f9f9cfa44ca0929377e6b6a9ca76ff41. --- server/data_preparation_workflow/__init__.py | 0 server/data_preparation_workflow/admin.py | 14 --- server/data_preparation_workflow/apps.py | 6 - server/data_preparation_workflow/models.py | 31 ----- .../data_preparation_workflow/permissions.py | 27 ----- .../data_preparation_workflow/serializers.py | 24 ---- server/data_preparation_workflow/urls.py | 12 -- server/data_preparation_workflow/views.py | 106 ------------------ server/medperf/settings.py | 1 - 9 files changed, 221 deletions(-) delete mode 100644 server/data_preparation_workflow/__init__.py delete mode 100644 server/data_preparation_workflow/admin.py delete mode 100644 server/data_preparation_workflow/apps.py delete mode 100644 server/data_preparation_workflow/models.py delete mode 100644 server/data_preparation_workflow/permissions.py delete mode 100644 server/data_preparation_workflow/serializers.py delete mode 100644 server/data_preparation_workflow/urls.py delete mode 100644 server/data_preparation_workflow/views.py diff --git a/server/data_preparation_workflow/__init__.py b/server/data_preparation_workflow/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/server/data_preparation_workflow/admin.py b/server/data_preparation_workflow/admin.py deleted file mode 100644 index 94691fb6a..000000000 --- a/server/data_preparation_workflow/admin.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.contrib import admin -from .models import DataPrepWorkflow - - -class DataPrepWorkflowAdmin(admin.ModelAdmin): - list_display = ( - "name", - "owner", - "prep_tarball_url", - "prep_tarball_hash", - ) - - -admin.site.register(DataPrepWorkflow, DataPrepWorkflowAdmin) diff --git a/server/data_preparation_workflow/apps.py b/server/data_preparation_workflow/apps.py deleted file mode 100644 index 58ca5af38..000000000 --- a/server/data_preparation_workflow/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class DataPrepWorkflowConfig(AppConfig): - default_auto_field = "django.db.models.BigAutoField" - name = "data_preparation_workflow" diff --git a/server/data_preparation_workflow/models.py b/server/data_preparation_workflow/models.py deleted file mode 100644 index aa57bec4a..000000000 --- a/server/data_preparation_workflow/models.py +++ /dev/null @@ -1,31 +0,0 @@ -from django.db import models -from django.contrib.auth import get_user_model -from mlcube.models import MlCube - -User = get_user_model() - - -class DataPrepWorkflow(models.Model): - name = models.CharField(max_length=20, unique=True) - owner = models.ForeignKey(User, on_delete=models.PROTECT) - prep_tarball_url = models.CharField(max_length=256) - prep_tarball_hash = models.CharField(max_length=100) - containers = models.ManyToManyField(MlCube) - is_valid = models.BooleanField(default=True) - metadata = models.JSONField(default=dict, blank=True, null=True) - user_metadata = models.JSONField(default=dict, blank=True, null=True) - created_at = models.DateTimeField(auto_now_add=True) - modified_at = models.DateTimeField(auto_now=True) - - def __str__(self): - return self.name - - class Meta: - constraints = [ - models.constraints.UniqueConstraint( - fields=["prep_tarball_hash"], - name="unique_tarball_hash_for_workflow", - ) - ] - verbose_name_plural = "DataPrepWorkflows" - ordering = ["modified_at"] diff --git a/server/data_preparation_workflow/permissions.py b/server/data_preparation_workflow/permissions.py deleted file mode 100644 index 2647e7b91..000000000 --- a/server/data_preparation_workflow/permissions.py +++ /dev/null @@ -1,27 +0,0 @@ -from rest_framework.permissions import BasePermission -from .models import DataPrepWorkflow - - -class IsAdmin(BasePermission): - def has_permission(self, request, view): - return request.user.is_superuser - - -class IsDataPrepWorkflowOwner(BasePermission): - def get_object(self, pk): - try: - return DataPrepWorkflow.objects.get(pk=pk) - except DataPrepWorkflow.DoesNotExist: - return None - - def has_permission(self, request, view): - pk = view.kwargs.get("pk", None) - if not pk: - return False - workflow = self.get_object(pk) - if not workflow: - return False - if workflow.owner.id == request.user.id: - return True - else: - return False diff --git a/server/data_preparation_workflow/serializers.py b/server/data_preparation_workflow/serializers.py deleted file mode 100644 index ac087e8df..000000000 --- a/server/data_preparation_workflow/serializers.py +++ /dev/null @@ -1,24 +0,0 @@ -from rest_framework import serializers -from .models import DataPrepWorkflow - - -class DataPrepWorkflowSerializer(serializers.ModelSerializer): - class Meta: - model = DataPrepWorkflow - fields = "__all__" - read_only_fields = ["owner"] - - def validate(self, data): - tarball_url = data.get("prep_tarball_url", "") - tarball_hash = data.get("prep_tarball_hash", "") - - # validate nonblank parameters file hash - if tarball_url and not tarball_hash: - raise serializers.ValidationError("Preparation tarball requires file hash") - - if not tarball_url and tarball_hash: - raise serializers.ValidationError( - "preparation tarball hash was provided without URL" - ) - - return data diff --git a/server/data_preparation_workflow/urls.py b/server/data_preparation_workflow/urls.py deleted file mode 100644 index e1ce16494..000000000 --- a/server/data_preparation_workflow/urls.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.urls import path -from . import views - -app_name = "DataPrepWorkflow" - -urlpatterns = [ - path("", views.DataPrepWorkflowList.as_view()), - path("/", views.DataPrepWorkflowDetail.as_view()), - path("/datasets/", views.DataPrepWorkflowDatasetList.as_view()), - # path("/benchmarks/", bviews.ModelBenchmarksList.as_view()), - # NOTE: when activating this endpoint later, check permissions and write tests -] diff --git a/server/data_preparation_workflow/views.py b/server/data_preparation_workflow/views.py deleted file mode 100644 index c8f02590d..000000000 --- a/server/data_preparation_workflow/views.py +++ /dev/null @@ -1,106 +0,0 @@ -from django.http import Http404 -from rest_framework.generics import GenericAPIView -from rest_framework.response import Response -from rest_framework import status -from drf_spectacular.utils import extend_schema - -from .models import DataPrepWorkflow -from .serializers import DataPrepWorkflowSerializer -from .permissions import IsAdmin, IsDataPrepWorkflowOwner -from dataset.serializers import DatasetFullSerializer -from dataset.models import Dataset - - -class DataPrepWorkflowList(GenericAPIView): - serializer_class = DataPrepWorkflowSerializer - queryset = "" - filterset_fields = ("name", "owner", "state", "is_valid") - - @extend_schema(operation_id="DataPrepWorkflows_retrieve_all") - def get(self, request, format=None): - """ - List all DataPrepWorkflows - """ - workflows = DataPrepWorkflow.objects.all() - workflows = self.filter_queryset(workflows) - workflows = self.paginate_queryset(workflows) - serializer = DataPrepWorkflowSerializer(workflows, many=True) - return self.get_paginated_response(serializer.data) - - def post(self, request, format=None): - """ - Creates a new DataPrepWorkflow - """ - serializer = DataPrepWorkflowSerializer(data=request.data) - if serializer.is_valid(): - serializer.save(owner=request.user) - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - -class DataPrepWorkflowDetail(GenericAPIView): - serializer_class = DataPrepWorkflowSerializer - queryset = "" - - def get_permissions(self): - if self.request.method == "PUT": - self.permission_classes = [IsAdmin | IsDataPrepWorkflowOwner] - elif self.request.method == "DELETE": - self.permission_classes = [IsAdmin] - return super(self.__class__, self).get_permissions() - - def get_object(self, pk): - try: - return DataPrepWorkflow.objects.get(pk=pk) - except DataPrepWorkflow.DoesNotExist: - raise Http404 - - def get(self, request, pk, format=None): - """ - Retrieve a DataPrepWorkflow instance. - """ - DataPrepWorkflow = self.get_object(pk) - serializer = DataPrepWorkflowSerializer(DataPrepWorkflow) - return Response(serializer.data) - - def put(self, request, pk, format=None): - """ - Update a DataPrepWorkflow instance. - """ - DataPrepWorkflow = self.get_object(pk) - serializer = DataPrepWorkflowSerializer( - DataPrepWorkflow, data=request.data, partial=True - ) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - def delete(self, request, pk, format=None): - """ - Delete a DataPrepWorkflow instance. - """ - DataPrepWorkflow = self.get_object(pk) - DataPrepWorkflow.delete() - return Response(status=status.HTTP_204_NO_CONTENT) - - -class DataPrepWorkflowDatasetList(GenericAPIView): - permission_classes = [IsAdmin | IsDataPrepWorkflowOwner] - serializer_class = DatasetFullSerializer - queryset = "" - - def get_object(self, pk): - try: - return DataPrepWorkflow.objects.get(pk=pk) - except DataPrepWorkflow.DoesNotExist: - raise Http404 - - def get(self, request, pk, format=None): - """ - Retrieve datasets associated with an DataPrepWorkflow instance. - """ - datasets = Dataset.objects.filter(data_preparation_DataPrepWorkflow__pk=pk) - datasets = self.paginate_queryset(datasets) - serializer = DatasetFullSerializer(datasets, many=True) - return self.get_paginated_response(serializer.data) diff --git a/server/medperf/settings.py b/server/medperf/settings.py index 2950bae2d..43ba5e377 100644 --- a/server/medperf/settings.py +++ b/server/medperf/settings.py @@ -105,7 +105,6 @@ "traindataset_association", "aggregator_association", "ca_association", - "data_preparation_workflow", "trainingevent", "rest_framework", "rest_framework.authtoken", From cbba26b930b119e4a43e4598e2dd66a4e45d33b1 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 5 Nov 2025 14:44:44 -0300 Subject: [PATCH 021/176] Revert "Add DataPrepWorkflow object to Dataset and Benchmark" This reverts commit 6b2f8558e33b3b9ff9cf490aa78ace13a3595fe9. --- ...mark_data_preparation_workflow_and_more.py | 37 ------------------- server/benchmark/models.py | 6 --- server/benchmark/serializers.py | 17 --------- ...aset_data_preparation_workflow_and_more.py | 37 ------------------- server/dataset/models.py | 6 --- server/dataset/serializers.py | 26 +------------ 6 files changed, 1 insertion(+), 128 deletions(-) delete mode 100644 server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py delete mode 100644 server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py diff --git a/server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py b/server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py deleted file mode 100644 index 110c8f7a9..000000000 --- a/server/benchmark/migrations/0005_benchmark_data_preparation_workflow_and_more.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 4.2.23 on 2025-10-28 19:53 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("data_preparation_workflow", "__first__"), - ("mlcube", "0002_alter_mlcube_unique_together"), - ("benchmark", "0004_alter_benchmark_dataset_auto_approval_allow_list_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="benchmark", - name="data_preparation_workflow", - field=models.ForeignKey( - default=None, - null=True, - on_delete=django.db.models.deletion.PROTECT, - to="data_preparation_workflow.dataprepworkflow", - ), - ), - migrations.AlterField( - model_name="benchmark", - name="data_preparation_mlcube", - field=models.ForeignKey( - default=None, - null=True, - on_delete=django.db.models.deletion.PROTECT, - related_name="data_preprocessor_mlcube", - to="mlcube.mlcube", - ), - ), - ] diff --git a/server/benchmark/models.py b/server/benchmark/models.py index b6f956f4e..23af2867c 100644 --- a/server/benchmark/models.py +++ b/server/benchmark/models.py @@ -1,6 +1,5 @@ from django.db import models from django.contrib.auth import get_user_model -from data_preparation_workflow.models import DataPrepWorkflow User = get_user_model() @@ -33,11 +32,6 @@ class Benchmark(models.Model): "mlcube.MlCube", on_delete=models.PROTECT, related_name="data_preprocessor_mlcube", - null=True, - default=None, - ) - data_preparation_workflow = models.ForeignKey( - DataPrepWorkflow, on_delete=models.PROTECT, default=None, null=True ) reference_model_mlcube = models.ForeignKey( "mlcube.MlCube", diff --git a/server/benchmark/serializers.py b/server/benchmark/serializers.py index 95a72e210..235d88837 100644 --- a/server/benchmark/serializers.py +++ b/server/benchmark/serializers.py @@ -4,21 +4,6 @@ from .models import Benchmark -def validate_exactly_one_preparation(data: dict): - no_data_prep_provided = ( - data.get("data_preparation_mlcube") is None - and data.get("data_preparation_workflow") is None - ) - multiple_data_prep_provided = ( - data.get("data_preparation_mlcube") is not None - and data.get("data_preparation_workflow") is not None - ) - if no_data_prep_provided or multiple_data_prep_provided: - raise serializers.ValidationError( - "Exactly one of 'data_preparation_mlcube' or 'data_preparation_workflow' must be provided to register a Benchmark" - ) - - class BenchmarkSerializer(serializers.ModelSerializer): class Meta: model = Benchmark @@ -35,7 +20,6 @@ def validate(self, data): "User can own at most one pending benchmark" ) - validate_exactly_one_preparation(data) if "state" in data and data["state"] == "OPERATION": dev_mlcubes = [ data["data_preparation_mlcube"].state == "DEVELOPMENT", @@ -115,7 +99,6 @@ def validate(self, data): raise serializers.ValidationError( "User cannot update non editable fields in Operation mode" ) - validate_exactly_one_preparation(data) return data diff --git a/server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py b/server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py deleted file mode 100644 index 8a9332206..000000000 --- a/server/dataset/migrations/0006_dataset_data_preparation_workflow_and_more.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 4.2.23 on 2025-10-28 19:53 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("data_preparation_workflow", "__first__"), - ("mlcube", "0002_alter_mlcube_unique_together"), - ("dataset", "0005_alter_dataset_generated_metadata"), - ] - - operations = [ - migrations.AddField( - model_name="dataset", - name="data_preparation_workflow", - field=models.ForeignKey( - default=None, - null=True, - on_delete=django.db.models.deletion.PROTECT, - to="data_preparation_workflow.dataprepworkflow", - ), - ), - migrations.AlterField( - model_name="dataset", - name="data_preparation_mlcube", - field=models.ForeignKey( - default=None, - null=True, - on_delete=django.db.models.deletion.PROTECT, - related_name="benchmark_preprocessor_mlcube", - to="mlcube.mlcube", - ), - ), - ] diff --git a/server/dataset/models.py b/server/dataset/models.py index a34b5f102..8b351c075 100644 --- a/server/dataset/models.py +++ b/server/dataset/models.py @@ -1,6 +1,5 @@ from django.db import models from django.contrib.auth import get_user_model -from data_preparation_workflow.models import DataPrepWorkflow User = get_user_model() @@ -22,11 +21,6 @@ class Dataset(models.Model): "mlcube.MlCube", on_delete=models.PROTECT, related_name="benchmark_preprocessor_mlcube", - null=True, - default=None, - ) - data_preparation_workflow = models.ForeignKey( - DataPrepWorkflow, on_delete=models.PROTECT, null=True, default=None ) is_valid = models.BooleanField(default=True) submitted_as_prepared = models.BooleanField() diff --git a/server/dataset/serializers.py b/server/dataset/serializers.py index 6bea7f0db..13ae93f21 100644 --- a/server/dataset/serializers.py +++ b/server/dataset/serializers.py @@ -3,21 +3,6 @@ from user.serializers import UserSerializer -def validate_exactly_one_preparation(data: dict): - no_data_prep_provided = ( - data.get("data_preparation_mlcube") is None - and data.get("data_preparation_workflow") is None - ) - multiple_data_prep_provided = ( - data.get("data_preparation_mlcube") is not None - and data.get("data_preparation_workflow") is not None - ) - if no_data_prep_provided or multiple_data_prep_provided: - raise serializers.ValidationError( - "Exactly one of 'data_preparation_mlcube' or 'data_preparation_workflow' must be provided to register a Benchmark" - ) - - class DatasetFullSerializer(serializers.ModelSerializer): """A private serializer. used for users who are permitted to see "sensitive" information. This serializer is also used for POST""" @@ -27,9 +12,6 @@ class Meta: fields = "__all__" read_only_fields = ["owner", "state"] - def validate(self, data): - validate_exactly_one_preparation(data) - class DatasetPublicSerializer(serializers.ModelSerializer): """A restrictive serializer""" @@ -38,9 +20,6 @@ class Meta: model = Dataset exclude = ["owner", "report"] - def validate(self, data): - validate_exactly_one_preparation(data) - class DatasetDetailSerializer(serializers.ModelSerializer): """This is a private serializer like DatasetFullSerializer""" @@ -91,7 +70,7 @@ def validate(self, data): "User cannot update non editable fields in Operation mode" ) self._validate_guid(data) - validate_exactly_one_preparation(data) + return data @@ -104,6 +83,3 @@ class DatasetWithOwnerInfoSerializer(serializers.ModelSerializer): class Meta: model = Dataset fields = ["id", "owner"] - - def validate(self, data): - validate_exactly_one_preparation(data) From 30cde594764e6ede7c6653cb381ed66754b76402 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 5 Nov 2025 14:45:35 -0300 Subject: [PATCH 022/176] Revert "Bump google-cloud-secret-manager version" This reverts commit f98b2fdeaf77f6bed5d8a4cec44e49026164b20a. --- server/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/requirements.txt b/server/requirements.txt index 5016bed11..0d8e7ee4e 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -7,7 +7,7 @@ django-environ==0.11.2 django-cors-headers==4.3.1 psycopg2-binary==2.9.9 gunicorn==23.0.0 -google-cloud-secret-manager==2.25.0 +google-cloud-secret-manager==2.19.0 whitenoise==6.6.0 pyOpenSSL==24.1.0 Werkzeug==3.0.6 From f5c32d7897534a47f35e1ffc665c6c59cdcfafad Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 5 Nov 2025 15:03:00 -0300 Subject: [PATCH 023/176] Reunify requirements using the synapse development build with better psutil reqs --- cli/airflow_requirements.txt | 8 -------- cli/requirements.txt | 11 ++++++++++- cli/setup.py | 12 +----------- cli/synapse_requirements.txt | 1 - 4 files changed, 11 insertions(+), 21 deletions(-) delete mode 100644 cli/airflow_requirements.txt delete mode 100644 cli/synapse_requirements.txt diff --git a/cli/airflow_requirements.txt b/cli/airflow_requirements.txt deleted file mode 100644 index 9eccbac1a..000000000 --- a/cli/airflow_requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -methodtools==0.4.7 -apache-airflow==3.0.1 -apache-airflow-task-sdk==1.0.1 -apache-airflow-providers-singularity==3.8.0 -apache-airflow-providers-docker==4.4.0 -apache-airflow-providers-fab==2.0.2 -psycopg2-binary==2.9.9 -asyncpg==0.30.0 \ No newline at end of file diff --git a/cli/requirements.txt b/cli/requirements.txt index 7662f3d16..f698bbf65 100644 --- a/cli/requirements.txt +++ b/cli/requirements.txt @@ -25,4 +25,13 @@ cookiecutter==2.1.1 uvicorn==0.30.1 fastapi==0.116.1 fastapi-login==1.10.2 -methodtools==0.4.7 \ No newline at end of file +methodtools==0.4.7 +synapseclient @ git+https://github.com/Sage-Bionetworks/synapsePythonClient@develop +methodtools==0.4.7 +apache-airflow==3.0.1 +apache-airflow-task-sdk==1.0.1 +apache-airflow-providers-singularity==3.8.0 +apache-airflow-providers-docker==4.4.0 +apache-airflow-providers-fab==2.0.2 +psycopg2-binary==2.9.9 +asyncpg==0.30.0 \ No newline at end of file diff --git a/cli/setup.py b/cli/setup.py index ad29615c1..7a784aed6 100644 --- a/cli/setup.py +++ b/cli/setup.py @@ -11,15 +11,6 @@ if req and not req.startswith("--"): requires.append(req) -with open("airflow_requirements.txt", "r") as f: - airflow_requires = [line.strip() for line in f] - -with open("synapse_requirements.txt", "r") as f: - synapse_requires = [line.strip() for line in f] - -extras_require = {"airflow": airflow_requires, "synapse": synapse_requires} - - # TODO: doesn't work right now because medperf wheel is not building properly package_data = ["medperf/web_ui/templates/*", "medperf/web_ui/static/*"] @@ -32,8 +23,7 @@ license="Apache 2.0", packages=["medperf"], install_requires=requires, - extras_require=extras_require, - python_requires=">=3.9", + python_requires=">=3.6", entry_points=""" [console_scripts] medperf=medperf.__main__:app diff --git a/cli/synapse_requirements.txt b/cli/synapse_requirements.txt deleted file mode 100644 index 94da324a4..000000000 --- a/cli/synapse_requirements.txt +++ /dev/null @@ -1 +0,0 @@ -synapseclient==4.5.0 \ No newline at end of file From b4ea88761e13dfa2f7c6ad7b64a10509ca53b77d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 09:05:43 -0300 Subject: [PATCH 024/176] Revert "Convert mlcube_hash field from string do JSON (dict)" This reverts commit ee3b87c4f700ef7ddb06591aca54591179b29c66. --- .../0003_convert_mlcube_hash_to_json.py | 83 ------------------- server/mlcube/models.py | 2 +- 2 files changed, 1 insertion(+), 84 deletions(-) delete mode 100644 server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py diff --git a/server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py b/server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py deleted file mode 100644 index 15c850eca..000000000 --- a/server/mlcube/migrations/0003_convert_mlcube_hash_to_json.py +++ /dev/null @@ -1,83 +0,0 @@ -# Generated by Django 4.2.23 on 2025-11-04 14:05 - -from django.db import migrations, models - - -def convert_str_hash_to_json_hash(apps, schema_editor): - MlCube = apps.get_model("mlcube", "MlCube") - for mlcube in MlCube.objects.all(): - mlcube.mlcube_hash_temp = {"default": mlcube.mlcube_hash} - mlcube.save() - - -def convert_json_hash_to_str_hash(apps, schema_editor): - MlCube = apps.get_model("mlcube", "MlCube") - for mlcube in MlCube.objects.all(): - mlcube.mlcube_hash = list(mlcube.mlcube_hash_temp.values())[0] - mlcube.save() - - -class Migration(migrations.Migration): - - replaces = [ - ("mlcube", "0003_tmp_mlcube_hash"), - ( - "mlcube", - "0004_alter_mlcube_unique_together_mlcube_mlcube_hash_temp_and_more", - ), - ("mlcube", "0005_rename_mlcube_hash_temp_mlcube_mlcube_hash_and_more"), - ] - - dependencies = [ - ("mlcube", "0002_alter_mlcube_unique_together"), - ] - - operations = [ - migrations.RunPython( - code=convert_str_hash_to_json_hash, - reverse_code=convert_json_hash_to_str_hash, - ), - migrations.AlterUniqueTogether( - name="mlcube", - unique_together=set(), - ), - migrations.AddField( - model_name="mlcube", - name="mlcube_hash_temp", - field=models.JSONField(default=dict), - preserve_default=False, - ), - migrations.AlterUniqueTogether( - name="mlcube", - unique_together={ - ( - "image_tarball_hash", - "image_hash", - "additional_files_tarball_hash", - "mlcube_hash_temp", - "parameters_hash", - ) - }, - ), - migrations.RemoveField( - model_name="mlcube", - name="mlcube_hash", - ), - migrations.RenameField( - model_name="mlcube", - old_name="mlcube_hash_temp", - new_name="mlcube_hash", - ), - migrations.AlterUniqueTogether( - name="mlcube", - unique_together={ - ( - "image_tarball_hash", - "image_hash", - "additional_files_tarball_hash", - "mlcube_hash", - "parameters_hash", - ) - }, - ), - ] diff --git a/server/mlcube/models.py b/server/mlcube/models.py index e01b09b04..8835b31cb 100644 --- a/server/mlcube/models.py +++ b/server/mlcube/models.py @@ -12,7 +12,7 @@ class MlCube(models.Model): name = models.CharField(max_length=20, unique=True) git_mlcube_url = models.CharField(max_length=256) - mlcube_hash = models.JSONField() + mlcube_hash = models.CharField(max_length=100) git_parameters_url = models.CharField(max_length=256, blank=True) parameters_hash = models.CharField(max_length=100, blank=True) image_tarball_url = models.CharField(max_length=256, blank=True) From 180e977cb95eb67462f8e7215d87b4f89a76d0de Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 09:11:40 -0300 Subject: [PATCH 025/176] Revert "Update hashes on seed_utils.py" This reverts commit 0c9add0d4eed0d32846c05dedbb12b159b863a9e. --- server/seed_utils.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index a68993d98..cf6da9721 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -103,9 +103,7 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): { "name": "chestxray_prep", "git_mlcube_url": (ASSETS_URL + "data_preparator/container_config.yaml"), - "mlcube_hash": { - "default": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31" - }, + "mlcube_hash": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31", "git_parameters_url": ( ASSETS_URL + "data_preparator/workspace/parameters.yaml" ), @@ -148,9 +146,7 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): { "name": "chestxray_cnn", "git_mlcube_url": (ASSETS_URL + "model_custom_cnn/container_config.yaml"), - "mlcube_hash": { - "default": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc" - }, + "mlcube_hash": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc", "git_parameters_url": ( ASSETS_URL + "model_custom_cnn/workspace/parameters.yaml" ), @@ -196,9 +192,7 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): { "name": "chestxray_metrics", "git_mlcube_url": (ASSETS_URL + "metrics/container_config.yaml"), - "mlcube_hash": { - "default": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7" - }, + "mlcube_hash": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7", "git_parameters_url": (ASSETS_URL + "metrics/workspace/parameters.yaml"), "parameters_hash": "16cad451c54b801a5b50d999330465d7f68ab5f6d30a0674268d2d17c7f26b73", "image_tarball_url": "", @@ -285,9 +279,7 @@ def create_model(api_server, model_owner_token, benchmark_owner_token, benchmark { "name": "chestxray_mobilenet", "git_mlcube_url": (ASSETS_URL + "model_mobilenetv2/container_config.yaml"), - "mlcube_hash": { - "default": "618ce7ef9f2b0dbdb0f361823aa4e2efc32e3ef9b29334466bd33eb3eca2aa02" - }, + "mlcube_hash": "618ce7ef9f2b0dbdb0f361823aa4e2efc32e3ef9b29334466bd33eb3eca2aa02", "git_parameters_url": ( ASSETS_URL + "model_mobilenetv2/workspace/parameters.yaml" ), From 766e5dd4506e53315218b1efa8decb9245669c08 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 10:02:08 -0300 Subject: [PATCH 026/176] Convert image_hash field to JSONField --- .../0003_convert_image_hash_to_json.py | 80 +++++++++++++++++++ server/mlcube/models.py | 2 +- 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 server/mlcube/migrations/0003_convert_image_hash_to_json.py diff --git a/server/mlcube/migrations/0003_convert_image_hash_to_json.py b/server/mlcube/migrations/0003_convert_image_hash_to_json.py new file mode 100644 index 000000000..31cd172ea --- /dev/null +++ b/server/mlcube/migrations/0003_convert_image_hash_to_json.py @@ -0,0 +1,80 @@ +# Generated by Django 4.2.23 on 2025-11-06 12:53 + +from django.db import migrations, models + + +def convert_image_hash_from_string_to_json(apps, schema_editor): + MlCube = apps.get_model("mlcube", "MlCube") + for mlcube in MlCube.objects.all(): + mlcube.image_hash_tmp = {"default": mlcube.image_hash} + mlcube.save() + + +def convert_image_hash_from_json_to_str(apps, schema_editor): + MlCube = apps.get_model("mlcube", "MlCube") + for mlcube in MlCube.objects.all(): + mlcube.image_hash = list(mlcube.image_hash_tmp.values())[0] + mlcube.save() + + +class Migration(migrations.Migration): + + replaces = [ + ("mlcube", "0003_add_mlcube_hash_tmp"), + ("mlcube", "0004_alter_mlcube_unique_together_mlcube_image_hash_tmp_and_more"), + ("mlcube", "0005_rename_image_hash_tmp_mlcube_image_hash_and_more"), + ] + + dependencies = [ + ("mlcube", "0002_alter_mlcube_unique_together"), + ] + + operations = [ + migrations.RunPython( + code=convert_image_hash_from_string_to_json, + reverse_code=convert_image_hash_from_json_to_str, + ), + migrations.AlterUniqueTogether( + name="mlcube", + unique_together=set(), + ), + migrations.AddField( + model_name="mlcube", + name="image_hash_tmp", + field=models.JSONField(default=dict), + preserve_default=False, + ), + migrations.AlterUniqueTogether( + name="mlcube", + unique_together={ + ( + "image_tarball_hash", + "image_hash_tmp", + "additional_files_tarball_hash", + "mlcube_hash", + "parameters_hash", + ) + }, + ), + migrations.RemoveField( + model_name="mlcube", + name="image_hash", + ), + migrations.RenameField( + model_name="mlcube", + old_name="image_hash_tmp", + new_name="image_hash", + ), + migrations.AlterUniqueTogether( + name="mlcube", + unique_together={ + ( + "image_tarball_hash", + "image_hash", + "additional_files_tarball_hash", + "mlcube_hash", + "parameters_hash", + ) + }, + ), + ] diff --git a/server/mlcube/models.py b/server/mlcube/models.py index 8835b31cb..225a89337 100644 --- a/server/mlcube/models.py +++ b/server/mlcube/models.py @@ -17,7 +17,7 @@ class MlCube(models.Model): parameters_hash = models.CharField(max_length=100, blank=True) image_tarball_url = models.CharField(max_length=256, blank=True) image_tarball_hash = models.CharField(max_length=100, blank=True) - image_hash = models.CharField(max_length=100, blank=True) + image_hash = models.JSONField() additional_files_tarball_url = models.CharField(max_length=256, blank=True) additional_files_tarball_hash = models.CharField(max_length=100, blank=True) owner = models.ForeignKey(User, on_delete=models.PROTECT) From 637485adddc2ece98613c246ee7b91a2130a5ec7 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 10:03:48 -0300 Subject: [PATCH 027/176] update server tests --- server/medperf/testing_utils.py | 2 +- server/mlcube/tests/test_pk.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/server/medperf/testing_utils.py b/server/medperf/testing_utils.py index 86e0f558e..0ca6009ff 100644 --- a/server/medperf/testing_utils.py +++ b/server/medperf/testing_utils.py @@ -63,7 +63,7 @@ def mock_mlcube(**kwargs): "parameters_hash": "string", "image_tarball_url": "", "image_tarball_hash": "", - "image_hash": "string", + "image_hash": {"default": "string"}, "additional_files_tarball_url": "string", "additional_files_tarball_hash": "string", "state": "DEVELOPMENT", diff --git a/server/mlcube/tests/test_pk.py b/server/mlcube/tests/test_pk.py index e7ee4216d..cf25343e1 100644 --- a/server/mlcube/tests/test_pk.py +++ b/server/mlcube/tests/test_pk.py @@ -91,7 +91,7 @@ def test_put_modifies_editable_fields_in_development(self): "parameters_hash": "newstring", "image_tarball_url": "new", "image_tarball_hash": "new", - "image_hash": "", + "image_hash": {}, "additional_files_tarball_url": "newstring", "additional_files_tarball_hash": "newstring", "state": "OPERATION", @@ -105,6 +105,9 @@ def test_put_modifies_editable_fields_in_development(self): response = self.client.put(url, newtestmlcube, format="json") # Assert + print(f"{response.status_code=}") + print(f"{response.content=}") + print(f"{response.json()=}") self.assertEqual(response.status_code, status.HTTP_200_OK) for k, v in response.data.items(): if k in newtestmlcube: @@ -166,7 +169,7 @@ def test_put_does_not_modify_non_editable_fields_in_operation(self): "name": "newtestmlcube", "mlcube_hash": "newstring", "parameters_hash": "newstring", - "image_hash": "newhash", + "image_hash": {"default": "newhash"}, "additional_files_tarball_hash": "newstring", "state": "DEVELOPMENT", "metadata": {"newkey": "newvalue"}, @@ -196,7 +199,7 @@ def test_put_does_not_modify_non_editable_fields_in_operation_special_case(self) newtestmlcube = { "image_tarball_url": "newurl", "image_tarball_hash": "new", - "image_hash": "", + "image_hash": {"default": ""}, } url = self.url.format(testmlcube["id"]) @@ -396,7 +399,7 @@ def test_put_doesnot_allow_adding_image_tarball_url_without_hash(self, state): ) testmlcube = self.create_mlcube(testmlcube).data - put_body = {"image_hash": "", "image_tarball_url": "url"} + put_body = {"image_hash": {"default": ""}, "image_tarball_url": "url"} url = self.url.format(testmlcube["id"]) # Act @@ -536,7 +539,7 @@ def test_put_permissions(self, user, expected_status): "parameters_hash": "newstring", "image_tarball_url": "new", "image_tarball_hash": "new", - "image_hash": "", + "image_hash": {"default": ""}, "additional_files_tarball_url": "newstring", "additional_files_tarball_hash": "newstring", "state": "OPERATION", From b2efff15b9885566ca24213dd9c3fbc871abb43a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 10:13:32 -0300 Subject: [PATCH 028/176] Update seed_utils.py to new image hash format --- server/seed_utils.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index cf6da9721..37d71548a 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -110,7 +110,9 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", "image_tarball_url": "", "image_tarball_hash": "", - "image_hash": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22", + "image_hash": { + "default": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" + }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": { @@ -156,7 +158,9 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): "chestxray_tutorial/cnn_weights.tar.gz" ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", - "image_hash": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5", + "image_hash": { + "default": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5" + }, "image_tarball_url": "", "image_tarball_hash": "", "metadata": { @@ -197,7 +201,9 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): "parameters_hash": "16cad451c54b801a5b50d999330465d7f68ab5f6d30a0674268d2d17c7f26b73", "image_tarball_url": "", "image_tarball_hash": "", - "image_hash": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa", + "image_hash": { + "default": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa" + }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": { @@ -291,7 +297,9 @@ def create_model(api_server, model_owner_token, benchmark_owner_token, benchmark "additional_files_tarball_hash": "771f67bba92a11c83d16a522f0ba1018020ff758e2277d33f49056680c788892", "image_tarball_url": "", "image_tarball_hash": "", - "image_hash": "33d26c8e266be9fe072081fb157313bfa51778b2934ab64bd622c8f0cd52dfa1", + "image_hash": { + "default": "33d26c8e266be9fe072081fb157313bfa51778b2934ab64bd622c8f0cd52dfa1" + }, "metadata": { "digest": "f27deb052eafd48ad1e350ceef7b0b9600aef0ea3f8cba47baee2b1d17411a83" }, From 186cc520f6466f256285a55b68d6d9f7dbc0dfde Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 11:53:19 -0300 Subject: [PATCH 029/176] Update client side code to expect hashes as dicts --- .../containers/runners/docker_runner.py | 9 +++++---- cli/medperf/containers/runners/runner.py | 5 +++-- .../containers/runners/singularity_runner.py | 19 +++++++++++-------- cli/medperf/entities/cube.py | 4 ++-- cli/medperf/entities/schemas.py | 13 +++++++++++-- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/cli/medperf/containers/runners/docker_runner.py b/cli/medperf/containers/runners/docker_runner.py index 5d6ffa9b0..dffa954d4 100644 --- a/cli/medperf/containers/runners/docker_runner.py +++ b/cli/medperf/containers/runners/docker_runner.py @@ -11,7 +11,7 @@ from .runner import Runner import logging from .docker_utils import craft_docker_run_command, get_docker_image_hash -from pydantic import Field +from typing import Dict class DockerRunner(Runner): @@ -20,19 +20,20 @@ def __init__(self, container_config_parser): def download( self, - expected_image_hash, + hashes_dict: Dict[str, str], download_timeout: int = None, get_hash_timeout: int = None, alternative_image_hash: str = None, - ): + ) -> Dict[str, str]: docker_image = self.parser.get_setup_args() + expected_image_hash = hashes_dict.get(docker_image) command = ["docker", "pull", docker_image] run_command(command, timeout=download_timeout) computed_image_hash = get_docker_image_hash(docker_image, get_hash_timeout) check_docker_image_hash( computed_image_hash, expected_image_hash, alternative_image_hash ) - return computed_image_hash + return {docker_image: computed_image_hash} def run( self, diff --git a/cli/medperf/containers/runners/runner.py b/cli/medperf/containers/runners/runner.py index b0accdd1e..b1e98b51c 100644 --- a/cli/medperf/containers/runners/runner.py +++ b/cli/medperf/containers/runners/runner.py @@ -1,15 +1,16 @@ from abc import ABC, abstractmethod +from typing import Dict class Runner(ABC): @abstractmethod def download( self, - expected_image_hash: str, + hashes_dict: Dict[str, str], download_timeout: int = None, get_hash_timeout: int = None, alternative_image_hash: str = None, - ): + ) -> Dict[str, str]: pass @abstractmethod diff --git a/cli/medperf/containers/runners/singularity_runner.py b/cli/medperf/containers/runners/singularity_runner.py index 9ea1ee147..3d8608465 100644 --- a/cli/medperf/containers/runners/singularity_runner.py +++ b/cli/medperf/containers/runners/singularity_runner.py @@ -21,6 +21,7 @@ import semver from .runner import Runner import logging +from typing import Dict class SingularityRunner(Runner): @@ -48,20 +49,20 @@ def _supports_nvccli(self): def download( self, - expected_image_hash, + hashes_dict: Dict[str, str], download_timeout: int = None, get_hash_timeout: int = None, alternative_image_hash: str = None, - ): + ) -> Dict[str, str]: if self.parser.container_type == "SingularityFile": return self._download_singularity_file( - expected_image_hash, + hashes_dict, download_timeout, get_hash_timeout, ) else: return self._download_and_convert_docker_image( - expected_image_hash, + hashes_dict, download_timeout, get_hash_timeout, alternative_image_hash, @@ -69,25 +70,27 @@ def download( def _download_singularity_file( self, - expected_image_hash, + hashes_dict: Dict[str, str], download_timeout: int = None, get_hash_timeout: int = None, ): sif_url = self.parser.get_setup_args() + expected_image_hash = hashes_dict.get(sif_url) sif_image_path, computed_image_hash = resources.get_cube_image( sif_url, expected_image_hash ) # Hash checking happens in resources self.sif_image_path = sif_image_path - return computed_image_hash + return {sif_url: computed_image_hash} def _download_and_convert_docker_image( self, - expected_image_hash, + hashes_dict: Dict[str, str], download_timeout: int = None, get_hash_timeout: int = None, alternative_image_hash: str = None, ): docker_image = self.parser.get_setup_args() + expected_image_hash = hashes_dict.get(docker_image) computed_image_hash = get_docker_image_hash_from_dockerhub( docker_image, get_hash_timeout ) @@ -114,7 +117,7 @@ def _download_and_convert_docker_image( run_command(command, timeout=download_timeout) self.sif_image_path = sif_image_file - return computed_image_hash + return {docker_image: computed_image_hash} def run( self, diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 9ef0f500b..39cc5093f 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -30,7 +30,7 @@ class Cube(Entity, DeployableSchema): parameters_hash: Optional[str] = None image_tarball_url: Optional[str] = None image_tarball_hash: Optional[str] = None - image_hash: Optional[str] = None + image_hash: Optional[dict] = Field(default_factory=dict) additional_files_tarball_url: Optional[str] = Field(None, alias="tarball_url") additional_files_tarball_hash: Optional[str] = Field(None, alias="tarball_hash") metadata: dict = Field(default_factory=dict) @@ -178,7 +178,7 @@ def download_run_files(self): alternative_image_hash = self.metadata.get("digest", None) try: self.image_hash = self.runner.download( - expected_image_hash=self.image_hash, + hashes_dict=self.image_hash, download_timeout=config.mlcube_configure_timeout, get_hash_timeout=config.mlcube_inspect_timeout, alternative_image_hash=alternative_image_hash, diff --git a/cli/medperf/entities/schemas.py b/cli/medperf/entities/schemas.py index 035fd52a6..16aecf0aa 100644 --- a/cli/medperf/entities/schemas.py +++ b/cli/medperf/entities/schemas.py @@ -8,6 +8,7 @@ ConfigDict, ValidationInfo, ) +from pydantic_core import PydanticUndefined from typing import Optional from collections import defaultdict @@ -86,9 +87,17 @@ def todict(self) -> dict: return og_dict @field_validator("*", mode="before") - def empty_str_to_none(cls, v): + @classmethod + def empty_str_to_none(cls, v, info: ValidationInfo): if v == "": - return None + current_attribute = cls.model_fields[info.field_name] + default_value = None + if current_attribute.default != PydanticUndefined: + default_value = current_attribute.default + elif current_attribute.default_factory is not None: + default_value = current_attribute.default_factory() + return default_value + return v @field_validator("name", mode="before") From 1519a5e459fb418bee04dbdfabf4a529aba7db15 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 16:54:33 -0300 Subject: [PATCH 030/176] Migrate airflow_runner files to subdirectory of container/runners --- cli/medperf/airflow_runner/airflow_requirements.txt | 8 -------- .../runners/airflow_runner_utils}/.gitignore | 0 .../runners/airflow_runner_utils}/api_client/client.py | 0 .../airflow_runner_utils}/components/airflow_component.py | 0 .../airflow_runner_utils}/components/api_server.py | 8 ++++++-- .../runners/airflow_runner_utils}/components/component.py | 0 .../airflow_runner_utils}/components/dag_processor.py | 4 +++- .../airflow_runner_utils}/components/db_component.py | 0 .../airflow_runner_utils}/components/db_postgres.py | 0 .../runners/airflow_runner_utils}/components/scheduler.py | 4 +++- .../runners/airflow_runner_utils}/components/triggerer.py | 4 +++- .../runners/airflow_runner_utils}/components/utils.py | 0 .../runners/airflow_runner_utils}/dags/.airflowignore | 0 .../runners/airflow_runner_utils}/dags/constants.py | 0 .../runners/airflow_runner_utils}/dags/dag_builder.py | 0 .../runners/airflow_runner_utils}/dags/dag_from_yaml.py | 0 .../runners/airflow_runner_utils}/dags/dag_utils.py | 0 .../dags/operator_builders/__init__.py | 0 .../branch_from_sensor_operator_builder.py | 0 .../dags/operator_builders/container_operator_builder.py | 0 .../dags/operator_builders/docker_operator_buider.py | 0 .../dags/operator_builders/empty_operator_builder.py | 0 .../dags/operator_builders/manual_approval_buider.py | 0 .../dags/operator_builders/operator_builder.py | 0 .../dags/operator_builders/python_sensor_builder.py | 0 .../operator_builders/singularity_operator_builder.py | 0 .../airflow_runner_utils}/dags/operator_factory.py | 0 .../runners/airflow_runner_utils}/dags/pipeline_state.py | 0 .../airflow_runner_utils}/dags/yaml_parser/yaml_parser.py | 0 .../airflow_runner_utils}/monitor/yaml_dag_monitor.py | 8 ++++++-- .../runners/airflow_runner_utils}/system_runner.py | 6 ++++-- .../runners/airflow_runner_utils}/yaml_partial_parser.py | 0 32 files changed, 25 insertions(+), 17 deletions(-) delete mode 100644 cli/medperf/airflow_runner/airflow_requirements.txt rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/.gitignore (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/api_client/client.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/airflow_component.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/api_server.py (74%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/component.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/dag_processor.py (86%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/db_component.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/db_postgres.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/scheduler.py (86%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/triggerer.py (86%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/components/utils.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/.airflowignore (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/constants.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/dag_builder.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/dag_from_yaml.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/dag_utils.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/__init__.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/branch_from_sensor_operator_builder.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/container_operator_builder.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/docker_operator_buider.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/empty_operator_builder.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/manual_approval_buider.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/operator_builder.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/python_sensor_builder.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_builders/singularity_operator_builder.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/operator_factory.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/pipeline_state.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/dags/yaml_parser/yaml_parser.py (100%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/monitor/yaml_dag_monitor.py (96%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/system_runner.py (98%) rename cli/medperf/{airflow_runner => containers/runners/airflow_runner_utils}/yaml_partial_parser.py (100%) diff --git a/cli/medperf/airflow_runner/airflow_requirements.txt b/cli/medperf/airflow_runner/airflow_requirements.txt deleted file mode 100644 index 8a2686ec5..000000000 --- a/cli/medperf/airflow_runner/airflow_requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -apache-airflow==3.0.1 -apache-airflow-providers-singularity==3.8.0 -apache-airflow-providers-docker==4.4.0 -apache-airflow-providers-fab==2.0.2 -pandas==2.1.0 -numpy==1.26.4 -psycopg2-binary==2.9.9 -asyncpg==0.30.0 \ No newline at end of file diff --git a/cli/medperf/airflow_runner/.gitignore b/cli/medperf/containers/runners/airflow_runner_utils/.gitignore similarity index 100% rename from cli/medperf/airflow_runner/.gitignore rename to cli/medperf/containers/runners/airflow_runner_utils/.gitignore diff --git a/cli/medperf/airflow_runner/api_client/client.py b/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py similarity index 100% rename from cli/medperf/airflow_runner/api_client/client.py rename to cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py diff --git a/cli/medperf/airflow_runner/components/airflow_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py similarity index 100% rename from cli/medperf/airflow_runner/components/airflow_component.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py diff --git a/cli/medperf/airflow_runner/components/api_server.py b/cli/medperf/containers/runners/airflow_runner_utils/components/api_server.py similarity index 74% rename from cli/medperf/airflow_runner/components/api_server.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/api_server.py index 313a7a0f1..36fb26ab7 100644 --- a/cli/medperf/airflow_runner/components/api_server.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/api_server.py @@ -1,6 +1,10 @@ from __future__ import annotations -from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner -from medperf.airflow_runner.components.utils import validate_port +from medperf.containers.runners.airflow_runner_utils.components.airflow_component import ( + AirflowComponentRunner, +) +from medperf.containers.runners.airflow_runner_utils.components.utils import ( + validate_port, +) from typing import Union from .utils import run_healthcheck diff --git a/cli/medperf/airflow_runner/components/component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py similarity index 100% rename from cli/medperf/airflow_runner/components/component.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/component.py diff --git a/cli/medperf/airflow_runner/components/dag_processor.py b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py similarity index 86% rename from cli/medperf/airflow_runner/components/dag_processor.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py index 29ac48bb4..f7daff613 100644 --- a/cli/medperf/airflow_runner/components/dag_processor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py @@ -1,4 +1,6 @@ -from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner +from medperf.containers.runners.airflow_runner_utils.components.airflow_component import ( + AirflowComponentRunner, +) import subprocess import sys diff --git a/cli/medperf/airflow_runner/components/db_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py similarity index 100% rename from cli/medperf/airflow_runner/components/db_component.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py diff --git a/cli/medperf/airflow_runner/components/db_postgres.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres.py similarity index 100% rename from cli/medperf/airflow_runner/components/db_postgres.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres.py diff --git a/cli/medperf/airflow_runner/components/scheduler.py b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py similarity index 86% rename from cli/medperf/airflow_runner/components/scheduler.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py index 8fad832c0..32288fcb5 100644 --- a/cli/medperf/airflow_runner/components/scheduler.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py @@ -1,4 +1,6 @@ -from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner +from medperf.containers.runners.airflow_runner_utils.components.airflow_component import ( + AirflowComponentRunner, +) from pydantic import SecretStr from .utils import run_healthcheck diff --git a/cli/medperf/airflow_runner/components/triggerer.py b/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py similarity index 86% rename from cli/medperf/airflow_runner/components/triggerer.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py index 350ccd917..dffacb5f8 100644 --- a/cli/medperf/airflow_runner/components/triggerer.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py @@ -1,4 +1,6 @@ -from medperf.airflow_runner.components.airflow_component import AirflowComponentRunner +from medperf.containers.runners.airflow_runner_utils.components.airflow_component import ( + AirflowComponentRunner, +) import subprocess import sys diff --git a/cli/medperf/airflow_runner/components/utils.py b/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py similarity index 100% rename from cli/medperf/airflow_runner/components/utils.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/utils.py diff --git a/cli/medperf/airflow_runner/dags/.airflowignore b/cli/medperf/containers/runners/airflow_runner_utils/dags/.airflowignore similarity index 100% rename from cli/medperf/airflow_runner/dags/.airflowignore rename to cli/medperf/containers/runners/airflow_runner_utils/dags/.airflowignore diff --git a/cli/medperf/airflow_runner/dags/constants.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py similarity index 100% rename from cli/medperf/airflow_runner/dags/constants.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py diff --git a/cli/medperf/airflow_runner/dags/dag_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py similarity index 100% rename from cli/medperf/airflow_runner/dags/dag_builder.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py diff --git a/cli/medperf/airflow_runner/dags/dag_from_yaml.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py similarity index 100% rename from cli/medperf/airflow_runner/dags/dag_from_yaml.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py diff --git a/cli/medperf/airflow_runner/dags/dag_utils.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_utils.py similarity index 100% rename from cli/medperf/airflow_runner/dags/dag_utils.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/dag_utils.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/__init__.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/__init__.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/__init__.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/__init__.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/branch_from_sensor_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/branch_from_sensor_operator_builder.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/container_operator_builder.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/docker_operator_buider.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/empty_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/empty_operator_builder.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/empty_operator_builder.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/empty_operator_builder.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/manual_approval_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/manual_approval_buider.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/operator_builder.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/python_sensor_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/python_sensor_builder.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py diff --git a/cli/medperf/airflow_runner/dags/operator_builders/singularity_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_builders/singularity_operator_builder.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py diff --git a/cli/medperf/airflow_runner/dags/operator_factory.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py similarity index 100% rename from cli/medperf/airflow_runner/dags/operator_factory.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py diff --git a/cli/medperf/airflow_runner/dags/pipeline_state.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py similarity index 100% rename from cli/medperf/airflow_runner/dags/pipeline_state.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py diff --git a/cli/medperf/airflow_runner/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py similarity index 100% rename from cli/medperf/airflow_runner/dags/yaml_parser/yaml_parser.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py diff --git a/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py b/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py similarity index 96% rename from cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py rename to cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py index 2cf8600be..9b3c1a53c 100644 --- a/cli/medperf/airflow_runner/monitor/yaml_dag_monitor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py @@ -12,8 +12,12 @@ import asyncio from typing import Any, Literal from collections import defaultdict -from medperf.airflow_runner.api_client.client import AirflowAPIClient -from medperf.airflow_runner.yaml_partial_parser import YamlPartialParser +from medperf.containers.runners.airflow_runner_utils.api_client.client import ( + AirflowAPIClient, +) +from medperf.containers.runners.airflow_runner_utils.yaml_partial_parser import ( + YamlPartialParser, +) from airflow.utils.state import DagRunState diff --git a/cli/medperf/airflow_runner/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py similarity index 98% rename from cli/medperf/airflow_runner/system_runner.py rename to cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 2d59bceb3..71be90ac6 100644 --- a/cli/medperf/airflow_runner/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -12,7 +12,6 @@ from .monitor.yaml_dag_monitor import Summarizer from .yaml_partial_parser import YamlPartialParser from airflow.utils.state import DagRunState -from .create_venv import create_airflow_venv_if_not_exists from typing import List, Union, TYPE_CHECKING import configparser import secrets @@ -21,7 +20,10 @@ import logging import asyncio import logging -from medperf.airflow_runner.dags.constants import FINAL_ASSET, SUMMARIZER_ID +from medperf.containers.runners.airflow_runner_utils.dags.constants import ( + FINAL_ASSET, + SUMMARIZER_ID, +) from medperf import config import sys diff --git a/cli/medperf/airflow_runner/yaml_partial_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py similarity index 100% rename from cli/medperf/airflow_runner/yaml_partial_parser.py rename to cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py From d6079a1962ebdb98f0b209ac9f1390f2a1d0f649 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 6 Nov 2025 16:54:55 -0300 Subject: [PATCH 031/176] First version of airflow_parser --- .../containers/parsers/airflow_parser.py | 118 ++++++++++++++++++ cli/medperf/containers/parsers/factory.py | 14 +++ 2 files changed, 132 insertions(+) create mode 100644 cli/medperf/containers/parsers/airflow_parser.py diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py new file mode 100644 index 000000000..c8a471060 --- /dev/null +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -0,0 +1,118 @@ +from typing import Dict, Union, Tuple +from medperf.exceptions import InvalidContainerSpec +from medperf.containers.parsers.parser import Parser + + +class AirflowParser(Parser): + """ + MedPerf-facing side of the tool to parse YAML files for Airflow. + The actual DAG generation portion of the parser is implemented separately + in the `airflow_runner` directory. + """ + + def __init__(self, airflow_config: dict, allowed_runners: list): + self.airflow_config = airflow_config + self.allowed_runners = allowed_runners + + # The following variables are set when calling check_schema for the first time + self._steps = None + self.pools = None + self.step_ids = None + + def check_schema(self) -> str: + """ + This is still the preliminary version of the schema. Subject to change. + """ + if "steps" not in self.airflow_config: + raise InvalidContainerSpec("Airflow config should have a 'steps' field.") + + self._steps = self.airflow_config["steps"] + self.step_ids = [] + + final_step_candidates = [] + error_msgs = [] + tmp_pools = {} + + for i, step in enumerate(self._steps): + self.step_ids.append(step["id"]) + + # Check if has minimal fields + missing_fields_msg = self._check_mandatory_fields(step=step, step_index=i) + if missing_fields_msg is not None: + error_msgs.append(missing_fields_msg) + continue + + # Check last step + last_step_is_partioned_msg, is_last_step_candidate = self._check_last_step( + step=step + ) + if is_last_step_candidate: + final_step_candidates.append(step["id"]) + if last_step_is_partioned_msg: + error_msgs.append(last_step_is_partioned_msg) + + if "limit" in step.keys(): + tmp_pools.update(self._create_pool_info(step)) + + if not final_step_candidates: + msg = "The provided YAML DAG file has no clear final step!" + error_msgs.append(msg) + + elif len(final_step_candidates) > 1: + msg = "The provided YAML DAG file has multiple potential last steps. Please verify the following steps:\n" + msg += "\n".join(final_step_candidates) + error_msgs.append(msg) + + if error_msgs: + full_msg = "\n\n".join(error_msgs) + raise InvalidContainerSpec(full_msg) + + self.pools = tmp_pools or None + + def _check_mandatory_fields( + step: Dict[str, str], step_index: int + ) -> Union[str, None]: + mandatory_fields = set("id", "type", "command") + missing_fields = mandatory_fields.difference(set(step.keys())) + if missing_fields: + ordered_fields = sorted(list(missing_fields)) + msg = ( + f"The {step_index+1}th step in the yaml file is missing the " + f"following mandatory fields: ', '.join({ordered_fields})" + ) + return msg + else: + return None + + def _check_last_step( + step: Dict[str, str], step_index: int + ) -> Tuple[Union[str, None], bool]: + is_marked_as_last = step.get("last", False) + inferred_as_last = step.get("next") is None + error_msg = None + if is_marked_as_last or inferred_as_last: + is_last_step_candidate = True + if step.get("per_subject", False): + error_msg = f"Step {step['id']} appears to be the final step, but is also part of a partition.\n" + error_msg += ( + "Please make sure the final step is not part of any partitions. " + ) + error_msg += ( + "You may need to add a final dummy step to join all results." + ) + else: + is_last_step_candidate = False + + return error_msg, is_last_step_candidate + + @staticmethod + def _create_pool_info(step: Dict[str, Union[str, int]]): + return { + f'{step["id"]}_pool': { + "slots": step["limit"], + "include_deferred": False, + "description": f"Pool to limit the execution of " + f'tasks with ID {step["id"]} to {step["limit"]} ' + "parallel executions", + } + } diff --git a/cli/medperf/containers/parsers/factory.py b/cli/medperf/containers/parsers/factory.py index dbd1d143c..2c96f04f5 100644 --- a/cli/medperf/containers/parsers/factory.py +++ b/cli/medperf/containers/parsers/factory.py @@ -4,6 +4,7 @@ import yaml from .mlcube import MLCubeParser from .simple_container import SimpleContainerParser +from .airflow_parser import AirflowParser def _is_mlcube_yaml_file(container_config: dict): @@ -14,6 +15,10 @@ def _is_mlcube_yaml_file(container_config: dict): ) +def _is_airflow_yaml_file(airflow_config: dict): + return "container_type" not in airflow_config and "steps" in airflow_config + + def load_parser(container_config_path: str) -> Parser: if not os.path.exists(container_config_path): # Internal error @@ -40,6 +45,15 @@ def load_parser(container_config_path: str) -> Parser: parser.check_schema() return parser + elif _is_airflow_yaml_file(container_config): + # TODO add modifications to use container hashes rather than tags for download + # TODO maybe change workspace dir and so on here? We need to think about this + parser = AirflowParser( + airflow_config=container_config, allowed_runners=["docker", "singularity"] + ) + parser.check_schema() + return parser + if "container_type" not in container_config: raise InvalidContainerSpec( "Container config file should contain a 'container_type' field." From 43e0ef38f1f90451bbda94bc38a02881e8f2078b Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 7 Nov 2025 09:20:48 -0300 Subject: [PATCH 032/176] Improvements to airflow_parser --- .../containers/parsers/airflow_parser.py | 89 +++++++++++++------ 1 file changed, 64 insertions(+), 25 deletions(-) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index c8a471060..d3c207bbd 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -1,4 +1,4 @@ -from typing import Dict, Union, Tuple +from typing import Dict, Union from medperf.exceptions import InvalidContainerSpec from medperf.containers.parsers.parser import Parser @@ -15,9 +15,12 @@ def __init__(self, airflow_config: dict, allowed_runners: list): self.allowed_runners = allowed_runners # The following variables are set when calling check_schema for the first time - self._steps = None + self._steps = [] self.pools = None - self.step_ids = None + self.step_ids = [] + self.container_ids = ( + [] + ) # TODO currently assumes only images on some registry, does not support files def check_schema(self) -> str: """ @@ -27,7 +30,6 @@ def check_schema(self) -> str: raise InvalidContainerSpec("Airflow config should have a 'steps' field.") self._steps = self.airflow_config["steps"] - self.step_ids = [] final_step_candidates = [] error_msgs = [] @@ -36,20 +38,19 @@ def check_schema(self) -> str: for i, step in enumerate(self._steps): self.step_ids.append(step["id"]) - # Check if has minimal fields - missing_fields_msg = self._check_mandatory_fields(step=step, step_index=i) - if missing_fields_msg is not None: - error_msgs.append(missing_fields_msg) - continue + self._check_mandatory_fields( + step=step, step_index=i, error_msg_list=error_msgs + ) - # Check last step - last_step_is_partioned_msg, is_last_step_candidate = self._check_last_step( - step=step + is_last_step_candidate = self._check_last_step( + step=step, error_msg_list=error_msgs ) if is_last_step_candidate: final_step_candidates.append(step["id"]) - if last_step_is_partioned_msg: - error_msgs.append(last_step_is_partioned_msg) + + container_image = self._verify_container(step, error_msg_list=error_msgs) + if container_image is not None: + self.container_ids.append(container_image) if "limit" in step.keys(): tmp_pools.update(self._create_pool_info(step)) @@ -69,27 +70,29 @@ def check_schema(self) -> str: self.pools = tmp_pools or None + @staticmethod def _check_mandatory_fields( - step: Dict[str, str], step_index: int + step: Dict[str, str], step_index: int, error_msg_list: list[str] ) -> Union[str, None]: - mandatory_fields = set("id", "type", "command") + mandatory_fields = {"id", "type"} missing_fields = mandatory_fields.difference(set(step.keys())) if missing_fields: ordered_fields = sorted(list(missing_fields)) + if step.get("id"): + step_identifier = f"step {step['id']}" + else: + step_identifier = f"{step_index+1}th step" msg = ( - f"The {step_index+1}th step in the yaml file is missing the " + f"The {step_identifier} in the yaml file is missing the " f"following mandatory fields: ', '.join({ordered_fields})" ) - return msg - else: - return None + error_msg_list.append(msg) - def _check_last_step( - step: Dict[str, str], step_index: int - ) -> Tuple[Union[str, None], bool]: + @staticmethod + def _check_last_step(step: Dict[str, str], error_msg_list: list[str]) -> bool: is_marked_as_last = step.get("last", False) inferred_as_last = step.get("next") is None - error_msg = None + if is_marked_as_last or inferred_as_last: is_last_step_candidate = True if step.get("per_subject", False): @@ -100,10 +103,11 @@ def _check_last_step( error_msg += ( "You may need to add a final dummy step to join all results." ) + error_msg_list.append(error_msg) else: is_last_step_candidate = False - return error_msg, is_last_step_candidate + return is_last_step_candidate @staticmethod def _create_pool_info(step: Dict[str, Union[str, int]]): @@ -116,3 +120,38 @@ def _create_pool_info(step: Dict[str, Union[str, int]]): "parallel executions", } } + + @staticmethod + def _verify_container(step: Dict[str, str], error_msg_list: list[str]): + if step.get("type") != "container": + return None + + if "command" not in step: + msg = f"Step {step['id']} is of type 'container' bu does not specify a 'command' field!" + error_msg_list.append(msg) + + try: + return step["image"] + except KeyError: + msg = f"Step {step['id']} is of type 'container' but does not specify a 'image' field!!" + error_msg_list.append(msg) + return None + + # TODO validate how to add these methods to this parser + def check_task_schema(self, task): + pass + + def get_setup_args(self): + pass + + def get_volumes(self, task: str, medperf_mounts: dict): + pass + + def get_run_args(self, task: str, medperf_mounts: dict): + pass + + def is_report_specified(self): + pass + + def is_metadata_specified(self): + pass From 2c0eba6b418a2bdd2835e54a6414f9ac014d1a48 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 7 Nov 2025 16:36:36 -0300 Subject: [PATCH 033/176] Fix env in db migrate command --- .../containers/runners/airflow_runner_utils/system_runner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 71be90ac6..6202c5ad5 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -164,6 +164,7 @@ def _start_airflow_db(self): [self._python_exec, "-m", "airflow", "db", "migrate"], stdout=f, stderr=f, + env=self._run_env, ) if db_migrate.returncode != 0: From 991bcaf7d5580c8ea5e8c5c929998be8756d9644 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 10 Nov 2025 09:54:44 -0300 Subject: [PATCH 034/176] Add proper env when runing health checks on processor and triggerer --- .../components/airflow_component.py | 10 +++++++--- .../airflow_runner_utils/components/dag_processor.py | 1 + .../airflow_runner_utils/components/triggerer.py | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py index 9d4853862..57342c60a 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py @@ -35,6 +35,12 @@ def __init__( "CONTAINER_TYPE": container_type, } + @property + def _run_env(self): + base_env = os.environ.copy() + base_env.update(**self._env_vars) + return base_env + @property @abstractmethod def initialize_command(self) -> List[str]: @@ -42,11 +48,9 @@ def initialize_command(self) -> List[str]: async def start_logic(self): actual_command = [self._python_exec, "-m", *self.initialize_command] - base_env = os.environ.copy() - base_env.update(**self._env_vars) logfile_path = os.path.join(self.airflow_home, "logs", self.logfile) self.run_command_with_logging( - command=actual_command, logfile_path=logfile_path, env=base_env + command=actual_command, logfile_path=logfile_path, env=self._run_env ) await self.wait_for_start() diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py index f7daff613..3df5b4ed8 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py @@ -31,5 +31,6 @@ def has_successfully_started(self): "--local", ], capture_output=True, + env=self._run_env, ) return has_dag_processor_jobs.returncode == 0 diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py b/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py index dffacb5f8..f9a4eb239 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py @@ -31,5 +31,6 @@ def has_successfully_started(self): "--local", ], capture_output=True, + env=self._run_env, ) return has_triggerer_jobs.returncode == 0 From 6f94e2818c67313321cd30f5c455e2341e8cf02a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 10 Nov 2025 09:55:11 -0300 Subject: [PATCH 035/176] Very first version of airflow_runner. Still needs finishing. --- .../containers/parsers/airflow_parser.py | 5 +- cli/medperf/containers/parsers/factory.py | 4 +- .../containers/runners/airflow_runner.py | 91 +++++++++++++++++++ cli/medperf/containers/runners/factory.py | 8 +- cli/medperf/entities/cube.py | 2 +- 5 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 cli/medperf/containers/runners/airflow_runner.py diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index d3c207bbd..cbfa0884c 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -10,9 +10,12 @@ class AirflowParser(Parser): in the `airflow_runner` directory. """ - def __init__(self, airflow_config: dict, allowed_runners: list): + def __init__( + self, airflow_config: dict, allowed_runners: list, config_file_path: str + ): self.airflow_config = airflow_config self.allowed_runners = allowed_runners + self.config_file_path = config_file_path # The following variables are set when calling check_schema for the first time self._steps = [] diff --git a/cli/medperf/containers/parsers/factory.py b/cli/medperf/containers/parsers/factory.py index 2c96f04f5..745e7011a 100644 --- a/cli/medperf/containers/parsers/factory.py +++ b/cli/medperf/containers/parsers/factory.py @@ -49,7 +49,9 @@ def load_parser(container_config_path: str) -> Parser: # TODO add modifications to use container hashes rather than tags for download # TODO maybe change workspace dir and so on here? We need to think about this parser = AirflowParser( - airflow_config=container_config, allowed_runners=["docker", "singularity"] + airflow_config=container_config, + allowed_runners=["docker", "singularity"], + config_file_path=container_config_path, ) parser.check_schema() return parser diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py new file mode 100644 index 000000000..f587ca3bd --- /dev/null +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -0,0 +1,91 @@ +from .runner import Runner +from typing import Dict +from medperf.containers.runners.airflow_runner_utils.system_runner import ( + AirflowSystemRunner, +) +from pathlib import Path +from .airflow_runner_utils.dags import constants +import os +import shutil +from medperf.containers.parsers.airflow_parser import AirflowParser +from medperf.account_management import get_medperf_user_data + + +class AirflowRunner(Runner): + + _DAGS_FOLDER = str(Path(constants.__file__).parent.resolve()) + + def __init__( + self, + airflow_config_parser: AirflowParser, + container_files_base_path, + workflow_name, + ): + self.parser = airflow_config_parser + self.container_dir = container_files_base_path + self.workflow_name = workflow_name # TODO this needs validation! + + def download( + self, + hashes_dict: Dict[str, str], + download_timeout: int = None, + get_hash_timeout: int = None, + alternative_image_hash: str = None, + container_base_dir: str = None, + ) -> Dict[str, str]: + # TODO implement image downloads too + pass + + def run( + self, + task: str = None, # Not used + tmp_folder: str = None, # TODO implement + output_logs: str = None, # TODO currently hardcoded; figure this out + timeout: int = None, + medperf_mounts: dict[str, str] = {}, + medperf_env: dict[str, str] = {}, + ports: list = [], + disable_network: bool = True, + ): + # TODO properly implement MedPerf mounts similar to other use cases + # For now, assume medperf_mounts has the form of + # medperf_mounts = { + # 'workspace_dir': 'path/to/local/workspace', + # 'input_data_dir': 'path/to/local/input/data/dir', + # 'data_dir': 'path/to/local/output/data/dir' + # } + + workspace_dir = medperf_mounts["workspace_dir"] + input_data_dir = medperf_mounts["input_data_dir"] + data_dir = medperf_mounts["data_dir"] + + for necessary_dir in [workspace_dir, input_data_dir, data_dir]: + os.makedirs(necessary_dir, exist_ok=True) + + email = get_medperf_user_data()["email"] + username = email.split("@", maxsplit=1)[0] + + airflow_home = os.path.join(self.container_dir, "airflow_home") + additional_files_path = medperf_mounts["additional_files"] + self._copy_yaml_dag_to_additional_files(additional_files_path) + + with AirflowSystemRunner( + airflow_home=airflow_home, + user=username, + dags_folder=self._DAGS_FOLDER, + workspace_dir=workspace_dir, + data_dir=data_dir, + input_data_dir=input_data_dir, + yaml_dags_dir=additional_files_path, + project_name=self.workflow_name, + yaml_parser=self.parser, + ) as system_runner: + system_runner.init_airflow() + system_runner.wait_for_dag() + + def _copy_yaml_dag_to_additional_files(self, additional_files_path: str): + # TODO also needs to move the auxiliary python files; or maybe they'll be part of additional files? + yaml_file_name = os.path.basename(self.parser.config_file_path) + os.makedirs(additional_files_path, exist_ok=True) + moved_yaml_file_path = os.path.join(additional_files_path, yaml_file_name) + shutil.copy2(self.parser.config_file_path, moved_yaml_file_path) diff --git a/cli/medperf/containers/runners/factory.py b/cli/medperf/containers/runners/factory.py index 3374fd08e..5d2ea891a 100644 --- a/cli/medperf/containers/runners/factory.py +++ b/cli/medperf/containers/runners/factory.py @@ -1,13 +1,19 @@ from .docker_runner import DockerRunner from .singularity_runner import SingularityRunner +from .airflow_runner import AirflowRunner from medperf import config from medperf.exceptions import InvalidArgumentError +from medperf.containers.parsers.airflow_parser import AirflowParser -def load_runner(container_config_parser, container_files_base_path): +def load_runner(container_config_parser, container_files_base_path, container_name): if config.platform not in container_config_parser.allowed_runners: raise InvalidArgumentError(f"Cannot run this container using {config.platform}") + if isinstance(container_config_parser, AirflowParser): + return AirflowRunner( + container_config_parser, container_files_base_path, container_name + ) if config.platform == "docker": return DockerRunner(container_config_parser) if config.platform == "singularity": diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 39cc5093f..ffc852e57 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -85,7 +85,7 @@ def parser(self): @property def runner(self): if self._runner is None: - self._runner = load_runner(self.parser, self.path) + self._runner = load_runner(self.parser, self.path, self.name) return self._runner @property From 3c878814faef35448f6d1cef14e76f83e5a1fe1d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 10 Nov 2025 10:55:00 -0300 Subject: [PATCH 036/176] Rename file db_postgres_docker.py to explicitly mention docker --- .../components/{db_postgres.py => db_postgres_docker.py} | 0 .../containers/runners/airflow_runner_utils/system_runner.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename cli/medperf/containers/runners/airflow_runner_utils/components/{db_postgres.py => db_postgres_docker.py} (100%) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py similarity index 100% rename from cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres.py rename to cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 6202c5ad5..51ecb4f58 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -5,7 +5,7 @@ from .components.api_server import AirflowApiServer from .components.airflow_component import AirflowComponentRunner from .components.dag_processor import AirflowDagProcessor -from .components.db_postgres import PostgresDBDocker +from .components.db_postgres_docker import PostgresDBDocker from .components.scheduler import AirflowScheduler from .components.triggerer import AirflowTriggerer from .components.utils import validate_port From a1ea28c47bd65575f1c7fbab3488105542f90f01 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 10 Nov 2025 15:58:51 -0300 Subject: [PATCH 037/176] Add airflow import to ensure our log config overrides airflow's --- cli/medperf/logging/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cli/medperf/logging/__init__.py b/cli/medperf/logging/__init__.py index 6f13bc315..ff8e6e6e3 100644 --- a/cli/medperf/logging/__init__.py +++ b/cli/medperf/logging/__init__.py @@ -8,12 +8,18 @@ def setup_logging(log_file: str, loglevel: str): + # Airflow overrides root logger, so we import it + # here first to override it immediately with our config + import airflow # noqa: F401 + # Ensure root folder exists log_folder = os.path.dirname(log_file) os.makedirs(log_folder, exist_ok=True) log_fmt = "%(asctime)s | %(module)s.%(funcName)s | %(levelname)s: %(message)s" - handler = handlers.RotatingFileHandler(log_file, backupCount=config.logs_backup_count) + handler = handlers.RotatingFileHandler( + log_file, backupCount=config.logs_backup_count + ) handler.setFormatter(NewLineFormatter(log_fmt)) logging.basicConfig( level=loglevel.upper(), From cfbabba4af6f917c014a055f5ac41702d1cd002a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 10 Nov 2025 16:05:43 -0300 Subject: [PATCH 038/176] linting --- .../airflow_runner_utils/api_client/client.py | 2 +- .../components/airflow_component.py | 1 - .../components/dag_processor.py | 1 - .../components/db_component.py | 2 +- .../components/db_postgres_docker.py | 96 ++++++++++++------- .../components/triggerer.py | 1 - .../airflow_runner_utils/components/utils.py | 7 +- .../dags/dag_from_yaml.py | 4 +- .../container_operator_builder.py | 1 - .../operator_builders/operator_builder.py | 11 ++- .../python_sensor_builder.py | 1 - .../dags/yaml_parser/yaml_parser.py | 4 +- .../airflow_runner_utils/system_runner.py | 14 ++- 13 files changed, 85 insertions(+), 60 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py b/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py index 64d1c3c8b..d18ef5961 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py @@ -10,7 +10,7 @@ """ The AirflowAPIClient defined in this Module if structured similarly to the internal Client class used by Airflow (i.e airflow.sdk.api.client.Client), but simplified -so that only methods necessary for the Airflow <> MedPerf integration are +so that only methods necessary for the Airflow <> MedPerf integration are implemented. """ diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py index 57342c60a..0c67092c4 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py @@ -1,5 +1,4 @@ import os -import sys from abc import abstractmethod from typing import List from .component import ComponentRunner diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py index 3df5b4ed8..2d3daadd7 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py @@ -2,7 +2,6 @@ AirflowComponentRunner, ) import subprocess -import sys class AirflowDagProcessor(AirflowComponentRunner): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py index d47bb4471..9af10b454 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py @@ -3,7 +3,7 @@ class DatabaseComponent(ComponentRunner): - + @property @abstractmethod def connection_string(self): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py index 8842b1c81..7fbb01679 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py @@ -11,78 +11,106 @@ class PostgresDBDocker(DatabaseComponent): - POSTGRES_IMAGE = 'postgres:14.19' + POSTGRES_IMAGE = "postgres:14.19" START_PERIOD = 2 INTERVAL = 5 MAX_TRIES = 5 TIMEOUT = 30 - def __init__(self, project_name: str, root_dir: os.PathLike, - postgres_user: str = 'postgres', postgres_password: SecretStr = None, - postgres_db: str = 'postgres', postgres_port: Union[str, int] = 5432, - hostname: str = 'localhost'): + def __init__( + self, + project_name: str, + root_dir: os.PathLike, + postgres_user: str = "postgres", + postgres_password: SecretStr = None, + postgres_db: str = "postgres", + postgres_port: Union[str, int] = 5432, + hostname: str = "localhost", + ): super().__init__() self.user = postgres_user self.db = postgres_db self.password = postgres_password or generate_random_password() self.hostname = hostname self.port = validate_port(postgres_port) - self.data_dir = os.path.join(root_dir, 'postgres_data') - self.logs_dir = os.path.join(root_dir, 'logs') + self.data_dir = os.path.join(root_dir, "postgres_data") + self.logs_dir = os.path.join(root_dir, "logs") self.container_name = self.generate_container_name(project_name) self.container_id = None @property def component_name(self): - return 'PostgreSQL Database for Airflow' - + return "PostgreSQL Database for Airflow" + @property def logfile(self): - return os.path.join(self.logs_dir, 'postgres_db.log') - + return os.path.join(self.logs_dir, "postgres_db.log") + @staticmethod def generate_container_name(project_name): all_characters = string.ascii_lowercase + string.digits num_digits = 4 - random_part = ''.join(random.choice(all_characters) for _ in range(num_digits)) - complete_name = f'postgres_{project_name}_{random_part}' + random_part = "".join(random.choice(all_characters) for _ in range(num_digits)) + complete_name = f"postgres_{project_name}_{random_part}" return complete_name async def start_logic(self): self.process = subprocess.run( [ - 'docker', 'run', '-d', '--name', self.container_name, - '-e', f'POSTGRES_USER={self.user}', - '-e', f'POSTGRES_PASSWORD={self.password.get_secret_value()}', - '-e', f'POSTGRES_DB={self.db}', - '-v', f'{self.data_dir}:/var/lib/postgresql/data', - '-p', f'{self.port}:{self.port}', - f'{self.POSTGRES_IMAGE}' - ], - capture_output=True, - text=True - ) + "docker", + "run", + "-d", + "--name", + self.container_name, + "-e", + f"POSTGRES_USER={self.user}", + "-e", + f"POSTGRES_PASSWORD={self.password.get_secret_value()}", + "-e", + f"POSTGRES_DB={self.db}", + "-v", + f"{self.data_dir}:/var/lib/postgresql/data", + "-p", + f"{self.port}:{self.port}", + f"{self.POSTGRES_IMAGE}", + ], + capture_output=True, + text=True, + ) self.container_id = self.process.stdout await self.wait_for_start() def has_successfully_started(self): postgres_status: subprocess.CompletedProcess = subprocess.run( [ - 'docker', 'exec', '-it', self.container_id, - "pg_isready", "-U", self.user, "-d", self.db - ], capture_output=True, text=True + "docker", + "exec", + "-it", + self.container_id, + "pg_isready", + "-U", + self.user, + "-d", + self.db, + ], + capture_output=True, + text=True, ) return postgres_status.returncode == 0 def terminate(self): - subprocess.run(['docker', 'stop', self.container_id], capture_output=True, text=True) - subprocess.run(['docker', 'rm', self.container_id], capture_output=True, text=True) - + subprocess.run( + ["docker", "stop", self.container_id], capture_output=True, text=True + ) + subprocess.run( + ["docker", "rm", self.container_id], capture_output=True, text=True + ) def kill(self): - subprocess.run(['docker', 'rm', '-f', self.container_id], capture_output=True, text=True) - + subprocess.run( + ["docker", "rm", "-f", self.container_id], capture_output=True, text=True + ) + @property def connection_string(self): - return f'postgresql+psycopg2://{self.user}:{self.password.get_secret_value()}@{self.hostname}:{self.port}/{self.db}' - \ No newline at end of file + return f"postgresql+psycopg2://{self.user}:{self.password.get_secret_value()}@{self.hostname}:{self.port}/{self.db}" diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py b/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py index f9a4eb239..986f87949 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/triggerer.py @@ -2,7 +2,6 @@ AirflowComponentRunner, ) import subprocess -import sys class AirflowTriggerer(AirflowComponentRunner): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py b/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py index 310497a1b..e0a80fe18 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py @@ -12,7 +12,7 @@ def validate_port(port: Union[int, str]) -> str: is_valid_port = False if not is_valid_port: - raise ValueError(f'Port value sent ({port}) is not a valid port!') + raise ValueError(f"Port value sent ({port}) is not a valid port!") return str(port) @@ -23,6 +23,7 @@ def run_healthcheck(healthcheck_url: str) -> bool: return response.status_code == HTTPStatus.OK except requests.exceptions.RequestException: return False - + + def generate_random_password(nbytes: int = 16) -> SecretStr: - return SecretStr(secrets.token_urlsafe(nbytes)) \ No newline at end of file + return SecretStr(secrets.token_urlsafe(nbytes)) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py index 019cd0db1..c6300593a 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py @@ -1,6 +1,8 @@ from __future__ import annotations from yaml_parser.yaml_parser import YamlParser -from airflow.sdk import DAG # noqa: necessary for Airflow to detect DAGs in this file + +# We need to import DAG so that airflow recognizes the auto-generated DAGs +from airflow.sdk import DAG # noqa: F401 parser = YamlParser() dags = parser.build_dags() diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index 6fe9ba51b..04b084bdd 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -1,7 +1,6 @@ from __future__ import annotations from .operator_builder import OperatorBuilder from abc import abstractmethod -from copy import deepcopy class ContainerOperatorBuilder(OperatorBuilder): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py index 364fafdfb..837c54c29 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py @@ -33,7 +33,7 @@ def __init__( if limit is None: self.pool_info = None else: - self.pool_info = f'{self.raw_id}_pool' + self.pool_info = f"{self.raw_id}_pool" self.partition = kwargs.get("partition") self.tags = [self.raw_id, self.display_name] @@ -100,10 +100,11 @@ def build_operator_list(cls, **kwargs) -> list[OperatorBuilder]: # OperatorFromYAML runs as defind by the YAML File. # A PythonSensorOperator then waits for any of the defind conditions to be True and # forwards the True condition to the PythonBranchOperator, which then branches accordingly. - # The Sensor and Branch Operators are defined here, so we can adapt the input arguments of the first operator accordingly - # (ie make it go into sensor that goes into branch which then goes into other operators from the YAML file) - # Empty operators are used between the branch operator and next operator from YAML to simplify breaking DAG cycles, if any - # are present. If DAG cycles are not present, the Empty operators do not interfere with DAG execution. + # The Sensor and Branch Operators are defined here, so we can adapt the input arguments of the first operator + # accordingly (ie make it go into sensor that goes into branch which then goes into other operators from the + # YAML file). Empty operators are used between the branch operator and next operator from YAML to simplify + # breaking DAG cycles, if any are present. If DAG cycles are not present, the Empty operators do not + # interfere with DAG execution. from .branch_from_sensor_operator_builder import ( BranchFromSensorOperatorBuilder, ) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py index d8ae2d4a1..9746d4727 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py @@ -2,7 +2,6 @@ from .operator_builder import OperatorBuilder from airflow.decorators import task from airflow.sensors.base import PokeReturnValue -from copy import deepcopy from pipeline_state import PipelineState from constants import ALWAYS_CONDITION from datetime import timedelta diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index 7cf016eee..7175f1991 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -82,7 +82,7 @@ def _get_next_id_from_expanded_step(self, raw_step): next_fields.extend(default_fields) return next_fields - def _update_next_id_in_expanded_step( + def _update_next_id_in_expanded_step( # noqa: C901 self, current_step, id_to_partition_to_partition_id ): next_field = deepcopy(current_step.get("next")) @@ -143,7 +143,7 @@ def _verify_unique_id(self, potential_id, original_id, mapped_steps): if potential_id in mapped_steps: raise ValueError(f"ID {original_id} has been used more than one time!") - def _create_expanded_steps( + def _create_expanded_steps( # noqa: C901 self, raw_steps: list[dict[str, Any]], subject_partitions: list[str] ): step_id_to_expanded_step = {} diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 51ecb4f58..226e75707 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -12,14 +12,12 @@ from .monitor.yaml_dag_monitor import Summarizer from .yaml_partial_parser import YamlPartialParser from airflow.utils.state import DagRunState -from typing import List, Union, TYPE_CHECKING import configparser import secrets from pydantic import SecretStr import json import logging import asyncio -import logging from medperf.containers.runners.airflow_runner_utils.dags.constants import ( FINAL_ASSET, SUMMARIZER_ID, @@ -27,9 +25,6 @@ from medperf import config import sys -if TYPE_CHECKING: - from .components.airflow_component import AirflowComponentRunner - class AirflowSystemRunner: def __init__( @@ -91,6 +86,9 @@ def _initial_setup(self): env=self._run_env, ) config = configparser.ConfigParser() + logging.debug( + f"Airflow process creation stdout:\n{config_create_process.stdout}" + ) with open(self.airflow_config_file, "r") as f: config.read_file(f) config["core"].update( @@ -197,6 +195,7 @@ def _create_admin_user(self): text=True, env=self._run_env, ) + logging.debug(f"User deletion stdout:\n{delete_previous_user.stdout}") logging.debug("Creating new admin user") create_new_user = subprocess.run( [ @@ -222,6 +221,7 @@ def _create_admin_user(self): text=True, env=self._run_env, ) + logging.debug(f"Admin creation stdout:\n{create_new_user.stdout}") def _create_pools(self): logging.debug("Creating pools") @@ -255,9 +255,7 @@ async def _async_wait_for_dag(self): msg = [ f"MedPerf has started executing the Data Pipeline {self.project_name} via Airflow." ] - msg.append( - f"Execution will continue until the pipeline successfully completes." - ) + msg.append("Execution will continue until the pipeline successfully completes.") msg.append( f"The Airflow UI is available at the following link: {self._complete_link}." ) From 84cb115f6c608a2c042899b10ba3c6c7ceacc08f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 11 Nov 2025 10:30:28 -0300 Subject: [PATCH 039/176] Add ChestXRay data prep with workflow to examples directory --- .../chexpert_prep_workflow/workflow.yaml | 33 +++++++++++++++++++ .../workspace/parameters.yaml | 7 ++++ 2 files changed, 40 insertions(+) create mode 100644 examples/ChestXRay/chexpert_prep_workflow/workflow.yaml create mode 100644 examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml diff --git a/examples/ChestXRay/chexpert_prep_workflow/workflow.yaml b/examples/ChestXRay/chexpert_prep_workflow/workflow.yaml new file mode 100644 index 000000000..350a901b6 --- /dev/null +++ b/examples/ChestXRay/chexpert_prep_workflow/workflow.yaml @@ -0,0 +1,33 @@ +steps: + - id: prepare + type: container + image: mlcommons/chexpert-prep:0.1.0 + command: prepare --data_path /workspace/CheXPert-v1.0-small --labels_path /workspace/CheXPert-v1.0-small --parameters_file /workspace/parameters.yaml --output_path /data + mounts: + - ${WORKSPACE_DIR}:/workspace + - ${INPUT_DATA_DIR}:/workspace/CheXPert-v1.0-small + - ${DATA_DIR}:/data + next: sanity_check + on_error: do_something + + - id: sanity_check + type: container + image: mlcommons/chexpert-prep:0.1.0 + command: sanity_check --data_path /data --parameters_file /workspace/parameters.yaml + mounts: + - ${WORKSPACE_DIR}:/workspace + - ${INPUT_DATA_DIR}:/workspace/CheXPert-v1.0-small + - ${DATA_DIR}:/data + next: statistics + on_error: do_something + + - id: statistics + type: container + image: mlcommons/chexpert-prep:0.1.0 + command: statistics --data_path /data --parameters_file /workspace/parameters.yaml --output_path /data/statistics.yaml + mounts: + - ${WORKSPACE_DIR}:/workspace + - ${INPUT_DATA_DIR}:/workspace/CheXPert-v1.0-small + - ${DATA_DIR}:/data + next: null + on_error: do_something \ No newline at end of file diff --git a/examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml b/examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml new file mode 100644 index 000000000..fd0b6000b --- /dev/null +++ b/examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml @@ -0,0 +1,7 @@ +output_datafile: data.csv +output_imagepath: images +labels: + - Atelectasis + - Cardiomegaly + - Consolidation + - Edema From 468d7575d4e3df315cd18b0815cdd0ec116bc51d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 11 Nov 2025 10:55:04 -0300 Subject: [PATCH 040/176] Initial support for submitting workflows via "medperf container submit" --- .../containers/parsers/airflow_parser.py | 35 +++++++++++++++-- .../containers/runners/airflow_runner.py | 39 +++++++++++++++++-- cli/medperf/containers/runners/runner.py | 5 +++ 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index cbfa0884c..7044fe1c2 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -1,8 +1,33 @@ -from typing import Dict, Union +from typing import Dict, Union, Literal, Set from medperf.exceptions import InvalidContainerSpec from medperf.containers.parsers.parser import Parser +class ContainerForAirflow: + + def __init__(self, image: str, platform: Literal["docker", "singularity"]): + self._image = image + if platform not in ["docker", "singularity"]: + raise InvalidContainerSpec(f"Container type {platform} is not supported!") + self._platform = platform + + @property + def image(self): + return self._image + + @property + def platform(self): + return self._platform + + def __eq__(self, other): + if not isinstance(other, ContainerForAirflow): + return False + return self._image == other._image and self._platform == other._platform + + def __hash__(self): + return hash((self._image, self._platform)) + + class AirflowParser(Parser): """ MedPerf-facing side of the tool to parse YAML files for Airflow. @@ -21,8 +46,8 @@ def __init__( self._steps = [] self.pools = None self.step_ids = [] - self.container_ids = ( - [] + self.containers: Set[ContainerForAirflow] = ( + set() ) # TODO currently assumes only images on some registry, does not support files def check_schema(self) -> str: @@ -53,7 +78,9 @@ def check_schema(self) -> str: container_image = self._verify_container(step, error_msg_list=error_msgs) if container_image is not None: - self.container_ids.append(container_image) + self.containers.add( # TODO add support for singularity containers + ContainerForAirflow(image=container_image, platform="docker") + ) if "limit" in step.keys(): tmp_pools.update(self._create_pool_info(step)) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index f587ca3bd..4f265cbb2 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -9,6 +9,14 @@ import shutil from medperf.containers.parsers.airflow_parser import AirflowParser from medperf.account_management import get_medperf_user_data +from .utils import ( + run_command, + check_docker_image_hash, +) +from medperf.comms.entity_resources import resources +from .runner import Runner +import logging +from .docker_utils import get_docker_image_hash class AirflowRunner(Runner): @@ -23,7 +31,7 @@ def __init__( ): self.parser = airflow_config_parser self.container_dir = container_files_base_path - self.workflow_name = workflow_name # TODO this needs validation! + self.workflow_name = workflow_name def download( self, @@ -33,8 +41,29 @@ def download( alternative_image_hash: str = None, container_base_dir: str = None, ) -> Dict[str, str]: - # TODO implement image downloads too - pass + # TODO currently no support for singularity user environment + # converting a docker image to singularity + for container in self.parser.containers: + if container.platform == "docker": + expected_image_hash = hashes_dict.get(container.image) + command = ["docker", "pull", container.image] + run_command(command, timeout=download_timeout) + computed_image_hash = get_docker_image_hash( + container.image, get_hash_timeout + ) + check_docker_image_hash( + computed_image_hash, expected_image_hash, alternative_image_hash + ) + hashes_dict[container.image] = computed_image_hash + elif container.platform == "singularity": + expected_image_hash = hashes_dict.get(container.image) + sif_image_path, computed_image_hash = resources.get_cube_image( + container.image, expected_image_hash + ) # Hash checking happens in resources + self.sif_image_path = sif_image_path + hashes_dict[container.image] = computed_image_hash + + return hashes_dict def run( self, @@ -89,3 +118,7 @@ def _copy_yaml_dag_to_additional_files(self, additional_files_path: str): os.makedirs(additional_files_path, exist_ok=True) moved_yaml_file_path = os.path.join(additional_files_path, yaml_file_name) shutil.copy2(self.parser.config_file_path, moved_yaml_file_path) + + @property + def is_workflow(self): + return True diff --git a/cli/medperf/containers/runners/runner.py b/cli/medperf/containers/runners/runner.py index b1e98b51c..9f8f3a2a3 100644 --- a/cli/medperf/containers/runners/runner.py +++ b/cli/medperf/containers/runners/runner.py @@ -26,3 +26,8 @@ def run( disable_network: bool = True, ): pass + + @property + def is_workflow(self): + """Can be overriden for workflow runners""" + return False From 9ac6cf7a05b81f4c5ac4dbfd0d1cd2318e34a16c Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 17 Nov 2025 09:16:09 -0300 Subject: [PATCH 041/176] Partial rework of airflow builders to use medperf-style mounts --- .../containers/runners/airflow_runner.py | 31 +++++------------- .../components/airflow_component.py | 9 ------ .../components/dag_processor.py | 7 ++++ .../components/scheduler.py | 7 ++-- .../airflow_runner_utils/components/utils.py | 7 ++++ .../airflow_runner_utils/dags/constants.py | 8 +---- .../container_operator_builder.py | 17 ++++------ .../docker_operator_buider.py | 32 +++++++++++++++---- .../singularity_operator_builder.py | 24 ++++++++++++-- .../dags/pipeline_state.py | 10 ------ .../airflow_runner_utils/system_runner.py | 23 ++++++------- 11 files changed, 90 insertions(+), 85 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 4f265cbb2..d1716d2c6 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -6,7 +6,6 @@ from pathlib import Path from .airflow_runner_utils.dags import constants import os -import shutil from medperf.containers.parsers.airflow_parser import AirflowParser from medperf.account_management import get_medperf_user_data from .utils import ( @@ -76,48 +75,34 @@ def run( ports: list = [], disable_network: bool = True, ): - # TODO properly implement MedPerf mounts similar to other use cases - # For now, assume medperf_mounts has the form of - # medperf_mounts = { - # 'workspace_dir': 'path/to/local/workspace', - # 'input_data_dir': 'path/to/local/input/data/dir', - # 'data_dir': 'path/to/local/output/data/dir' - # } - - workspace_dir = medperf_mounts["workspace_dir"] - input_data_dir = medperf_mounts["input_data_dir"] - data_dir = medperf_mounts["data_dir"] - - for necessary_dir in [workspace_dir, input_data_dir, data_dir]: - os.makedirs(necessary_dir, exist_ok=True) email = get_medperf_user_data()["email"] username = email.split("@", maxsplit=1)[0] airflow_home = os.path.join(self.container_dir, "airflow_home") additional_files_path = medperf_mounts["additional_files"] - self._copy_yaml_dag_to_additional_files(additional_files_path) + self._symlink_yaml_dag_to_additional_files(additional_files_path) with AirflowSystemRunner( airflow_home=airflow_home, user=username, dags_folder=self._DAGS_FOLDER, - workspace_dir=workspace_dir, - data_dir=data_dir, - input_data_dir=input_data_dir, yaml_dags_dir=additional_files_path, + mounts=medperf_mounts, project_name=self.workflow_name, yaml_parser=self.parser, ) as system_runner: system_runner.init_airflow() system_runner.wait_for_dag() - def _copy_yaml_dag_to_additional_files(self, additional_files_path: str): - # TODO also needs to move the auxiliary python files; or maybe they'll be part of additional files? + def _symlink_yaml_dag_to_additional_files(self, additional_files_path: str): yaml_file_name = os.path.basename(self.parser.config_file_path) os.makedirs(additional_files_path, exist_ok=True) - moved_yaml_file_path = os.path.join(additional_files_path, yaml_file_name) - shutil.copy2(self.parser.config_file_path, moved_yaml_file_path) + symlinked_yaml_file_path = os.path.join(additional_files_path, yaml_file_name) + try: + os.symlink(self.parser.config_file_path, symlinked_yaml_file_path) + except FileExistsError: + pass @property def is_workflow(self): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py index 0c67092c4..24195dc14 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py @@ -11,9 +11,6 @@ def __init__( python_executable: str, airflow_home: str, container_type: str, - workspace_dir: os.PathLike, - data_dir: os.PathLike, - input_data_dir: os.PathLike, yaml_dags_dir: str, dags_folder: os.PathLike, ): @@ -23,12 +20,6 @@ def __init__( self.airflow_home = airflow_home self._env_vars = { "AIRFLOW_HOME": airflow_home, - "WORKSPACE_DIR": workspace_dir, - "DATA_DIR": data_dir, - "INPUT_DATA_DIR": input_data_dir, - "AIRFLOW_INPUT_DATA_DIR": input_data_dir, - "AIRFLOW_DATA_DIR": data_dir, - "AIRFLOW_WORKSPACE_DIR": workspace_dir, "PYTHONPATH": f"{dags_folder}:{user_dags_folder}:{yaml_dags_dir}", "YAML_DAGS_DIR": yaml_dags_dir, "CONTAINER_TYPE": container_type, diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py index 2d3daadd7..59b9877dd 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/dag_processor.py @@ -2,9 +2,16 @@ AirflowComponentRunner, ) import subprocess +from .utils import build_mounts_dict class AirflowDagProcessor(AirflowComponentRunner): + + def __init__(self, mounts: dict, *args, **kwargs): + super().__init__(*args, **kwargs) + formatted_mounts = build_mounts_dict(mounts) + self._env_vars.update(**formatted_mounts) + @property def logfile(self): return "processor.log" diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py index 32288fcb5..10596f2f6 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py @@ -2,17 +2,18 @@ AirflowComponentRunner, ) from pydantic import SecretStr -from .utils import run_healthcheck +from .utils import run_healthcheck, build_mounts_dict class AirflowScheduler(AirflowComponentRunner): - def __init__(self, user: str, password: SecretStr, *args, **kwargs): + def __init__(self, user: str, password: SecretStr, mounts: dict, *args, **kwargs): super().__init__(*args, **kwargs) extra_vars = { "_AIRFLOW_WWW_USER_USERNAME": user, "_AIRFLOW_WWW_USER_PASSWORD": password.get_secret_value(), } - self._env_vars.update(extra_vars) + formatted_mounts = build_mounts_dict(mounts) + self._env_vars.update(**extra_vars, **formatted_mounts) @property def logfile(self): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py b/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py index e0a80fe18..08a2b5e9f 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/utils.py @@ -27,3 +27,10 @@ def run_healthcheck(healthcheck_url: str) -> bool: def generate_random_password(nbytes: int = 16) -> SecretStr: return SecretStr(secrets.token_urlsafe(nbytes)) + + +def build_mounts_dict(mounts: dict[str, str]): + formatted_dict = { + f"host_{mount_name}": host_path for mount_name, host_path in mounts.items() + } + return formatted_dict diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py index b4bef0a9d..28027fb7b 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py @@ -6,10 +6,4 @@ ALWAYS_CONDITION = "ALWAYS" YESTERDAY = datetime.today() - timedelta(days=1) FINAL_ASSET = "medperf_airflow_completed_asset" -YAML_DIR = os.getenv("YAML_DAGS_DIR") or "/yaml_dags" -AIRFLOW_WORKSPACE_DIR = os.getenv("AIRFLOW_WORKSPACE_DIR") -AIRFLOW_DATA_DIR = os.getenv("AIRFLOW_DATA_DIR") -AIRFLOW_INPUT_DATA_DIR = os.getenv("AIRFLOW_INPUT_DATA_DIR") -HOST_WORKSPACE_DIR = os.getenv("WORKSPACE_DIR") -HOST_DATA_DIR = os.getenv("DATA_DIR") -HOST_INPUT_DATA_DIR = os.getenv("INPUT_DATA_DIR") +YAML_DIR = os.getenv("YAML_DAGS_DIR") diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index 04b084bdd..d6e3847bb 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -5,24 +5,21 @@ class ContainerOperatorBuilder(OperatorBuilder): - def __init__( - self, image: str, command: str | list[str], mounts: list[str], **kwargs - ): + def __init__(self, image: str, command: str | list[str], mounts: dict, **kwargs): self.image = image if isinstance(command, str): - self.command = command.split(" ") + self.base_command = command.split(" ") else: - self.command = command - self.mounts = self.build_mounts(mounts) + self.base_command = command + self.mounts, self.command_args = self.build_mounts_and_command_args(mounts) super().__init__(**kwargs) @abstractmethod - def build_mounts(self): + def build_mounts_and_command_args(self): pass def _get_command(self): + command = [*self.base_command, *self.command_args] if self.partition: - command = [*self.command, "--subject-subdir", self.partition] - else: - command = self.command + command = [*command, "--subject-subdir", self.partition] return command diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index 5681347a4..afd86bf41 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -1,18 +1,36 @@ from .container_operator_builder import ContainerOperatorBuilder from airflow.providers.docker.operators.docker import DockerOperator from docker.types import Mount +import os +from medperf.exceptions import MedperfException class DockerOperatorBuilder(ContainerOperatorBuilder): - def build_mounts(self, mounts): + def build_mounts_and_command_args(self, mounts): docker_mounts = [] - for mount in mounts: - host_path, docker_path = mount.rsplit(":", maxsplit=1) - docker_mounts.append( - Mount(source=host_path, target=docker_path, type="bind") - ) - return docker_mounts + command_args = [] + for mount_type, mount_info in mounts.items(): + read_only = mount_type == "input_volumes" + for var_name, mount_details in mount_info.items(): + host_path = os.getenv(f"host_{var_name}", None) + if host_path is None: + raise MedperfException( + f"Could not find definition for mount {var_name} in the Airflow environment!" + ) + docker_path = mount_details["mount_path"] + docker_mounts.append( + Mount( + source=host_path, + target=docker_path, + type="bind", + read_only=read_only, + ) + ) + command_args.extend([f"--{var_name}", docker_path]) + if mount_details.get("type") == "directory": + os.makedirs(host_path, exist_ok=True) + return docker_mounts, command_args def _define_base_operator(self) -> DockerOperator: diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py index 32f6244df..0458e59e9 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py @@ -1,5 +1,7 @@ from .container_operator_builder import ContainerOperatorBuilder from airflow.providers.singularity.operators.singularity import SingularityOperator +import os +from medperf.exceptions import MedperfException class SingularityOperatorBuilder(ContainerOperatorBuilder): @@ -7,9 +9,27 @@ class SingularityOperatorBuilder(ContainerOperatorBuilder): Currently untested!! """ - def build_mounts(self, mounts: list[str]): + def build_mounts_and_command_args(self, mounts: dict): """Singularity operator uses raw mount strings as they are, /path/in/host:/path/in/container""" - return mounts + singularity_mounts = [] + command_args = [] + for mount_type, mount_info in mounts.items(): + read_only = mount_type == "input_volumes" + for var_name, mount_details in mount_info.items(): + host_path = os.getenv(f"host_{var_name}", None) + if host_path is None: + raise MedperfException( + f"Could not find definition for mount {var_name} in the Airflow environment!" + ) + singularity_path = mount_details["mount_path"] + mount_suffix = "ro" if read_only else "rw" + mount_str = f"{host_path}:{singularity_path}:{mount_suffix}" + singularity_mounts.append(mount_str) + command_args.extend([f"--{var_name}", singularity_path]) + + if mount_details.get("type") == "directory": + os.makedirs(host_path, exist_ok=True) + return singularity_mounts, command_args def _define_base_operator(self) -> SingularityOperator: command = self._get_command() diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py index 0e641a0b3..f282aa6fc 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py @@ -1,16 +1,6 @@ -from constants import ( - AIRFLOW_DATA_DIR, - AIRFLOW_INPUT_DATA_DIR, - AIRFLOW_WORKSPACE_DIR, -) - - class PipelineState: # TODO properly define def __init__(self, running_subject: str = None, **airflow_kwargs): self.running_subject = running_subject self.airflow_kwargs = airflow_kwargs - self.input_data_dir = AIRFLOW_INPUT_DATA_DIR - self.data_dir = AIRFLOW_DATA_DIR - self.workspace_dir = AIRFLOW_WORKSPACE_DIR diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 226e75707..726ea79d1 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -13,6 +13,7 @@ from .yaml_partial_parser import YamlPartialParser from airflow.utils.state import DagRunState import configparser +from typing import Union, List import secrets from pydantic import SecretStr import json @@ -32,9 +33,7 @@ def __init__( airflow_home: os.PathLike, user: str, dags_folder: os.PathLike, - workspace_dir: os.PathLike, - data_dir: os.PathLike, - input_data_dir: os.PathLike, + mounts: dict[str, os.PathLike], yaml_dags_dir: os.PathLike, project_name: str, port: Union[str, int] = 8080, @@ -48,9 +47,7 @@ def __init__( self.port = validate_port(port) self.dags_folder = dags_folder self.extra_configs = extra_airflow_configs - self.workspace_dir = workspace_dir - self.data_dir = data_dir - self.input_data_dir = input_data_dir + self.mounts = mounts self.yaml_parser = YamlPartialParser(yaml_file_dir=yaml_dags_dir) self.user = user self._password = SecretStr(secrets.token_urlsafe(16)) @@ -132,16 +129,13 @@ def _initialize_components(self): common_args = { "python_executable": self._python_exec, "airflow_home": self.airflow_home, - "container_type": "docker", # TODO when integrating with MedPerf, get from config - "workspace_dir": self.workspace_dir, - "data_dir": self.data_dir, - "input_data_dir": self.input_data_dir, + "container_type": config.platform, "yaml_dags_dir": self.yaml_parser.yaml_dir_path, "dags_folder": self.dags_folder, } self.db = PostgresDBDocker( - project_name=self.project_name, # TODO when integerating with MedPerf, use singularity version if config says so + project_name=self.project_name, # TODO Check platform to instantiate singularity version, when singularity version is implementated root_dir=self.airflow_home, postgres_user="airflow", postgres_db="airflow", @@ -149,9 +143,9 @@ def _initialize_components(self): ) self.api_server = AirflowApiServer(**common_args, port=self.port) self.scheduler = AirflowScheduler( - **common_args, user=self.user, password=self._password + **common_args, user=self.user, password=self._password, mounts=self.mounts ) - self.dag_processor = AirflowDagProcessor(**common_args) + self.dag_processor = AirflowDagProcessor(**common_args, mounts=self.mounts) self.triggerer = AirflowTriggerer(**common_args) def _start_airflow_db(self): @@ -282,7 +276,8 @@ async def _async_wait_for_dag(self): ) as airflow_client: try: summarizer = Summarizer( - yaml_parser=self.yaml_parser, report_directory=self.workspace_dir + yaml_parser=self.yaml_parser, + report_directory=self.mounts["output_path"], ) summarizer_task = asyncio.create_task( summarizer.summarize_every_x_seconds( From 41c7082bf5093de8ba287683a41365860ee71d18 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 09:28:56 -0300 Subject: [PATCH 042/176] Quick and dirty way to run workflows with medperf mounts. Needs improving --- cli/medperf/commands/dataset/prepare.py | 14 +++- .../containers/runners/airflow_runner.py | 11 +++- .../container_operator_builder.py | 19 ++++-- .../docker_operator_buider.py | 65 +++++++++++++------ .../monitor/yaml_dag_monitor.py | 18 +++-- .../airflow_runner_utils/system_runner.py | 2 +- cli/medperf/entities/cube.py | 4 ++ .../data_preparator_workflow/workflow.yaml | 65 +++++++++++++++++++ .../workspace/parameters.yaml | 20 ++++++ 9 files changed, 181 insertions(+), 37 deletions(-) create mode 100644 examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml create mode 100644 examples/chestxray_tutorial/data_preparator_workflow/workspace/parameters.yaml diff --git a/cli/medperf/commands/dataset/prepare.py b/cli/medperf/commands/dataset/prepare.py index b23b0eff7..0d070cde0 100644 --- a/cli/medperf/commands/dataset/prepare.py +++ b/cli/medperf/commands/dataset/prepare.py @@ -92,9 +92,10 @@ def run(cls, dataset_id: int, approve_sending_reports: bool = False): with preparation.ui.interactive(): preparation.run_prepare() - with preparation.ui.interactive(): - preparation.run_sanity_check() - preparation.run_statistics() + if not preparation.is_workflow: + with preparation.ui.interactive(): + preparation.run_sanity_check() + preparation.run_statistics() preparation.mark_dataset_as_ready() @@ -118,6 +119,10 @@ def __init__(self, dataset_id: int, approve_sending_reports: bool): self.metadata_specified = None self._lock = Lock() + @property + def is_workflow(self): + return self.cube.is_workflow + def should_run_prepare(self): return not self.dataset.submitted_as_prepared and not self.dataset.is_ready() @@ -178,6 +183,9 @@ def run_prepare(self): if self.report_specified: prepare_mounts["report_file"] = self.report_path + if self.cube.is_workflow: + prepare_mounts["statistics_file"] = self.out_statistics_path + self.ui.text = "Running preparation step..." try: with self.ui.interactive(): diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index d1716d2c6..cec046cac 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -83,6 +83,12 @@ def run( additional_files_path = medperf_mounts["additional_files"] self._symlink_yaml_dag_to_additional_files(additional_files_path) + logging.debug( + f"Starting Airflow runner with the following airflow home directory: {airflow_home}." + ) + logging.debug( + f"Airflow execution based on the following YAML file: {self.parser.config_file_path}" + ) with AirflowSystemRunner( airflow_home=airflow_home, user=username, @@ -100,9 +106,10 @@ def _symlink_yaml_dag_to_additional_files(self, additional_files_path: str): os.makedirs(additional_files_path, exist_ok=True) symlinked_yaml_file_path = os.path.join(additional_files_path, yaml_file_name) try: - os.symlink(self.parser.config_file_path, symlinked_yaml_file_path) - except FileExistsError: + os.unlink(symlinked_yaml_file_path) + except FileNotFoundError: pass + os.symlink(self.parser.config_file_path, symlinked_yaml_file_path) @property def is_workflow(self): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index d6e3847bb..4998def4b 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -1,21 +1,32 @@ from __future__ import annotations from .operator_builder import OperatorBuilder from abc import abstractmethod +from typing import Optional class ContainerOperatorBuilder(OperatorBuilder): - def __init__(self, image: str, command: str | list[str], mounts: dict, **kwargs): + def __init__( + self, + image: str, + command: str | list[str], + mounts: dict, + base_inlet: Optional[str] = None, + **kwargs, + ): + super().__init__(**kwargs) self.image = image if isinstance(command, str): self.base_command = command.split(" ") else: self.base_command = command - self.mounts, self.command_args = self.build_mounts_and_command_args(mounts) - super().__init__(**kwargs) + + self.mounts, self.command_args = self.build_mounts_and_command_args( + mounts, base_inlet + ) @abstractmethod - def build_mounts_and_command_args(self): + def build_mounts_and_command_args(self, base_inlet): pass def _get_command(self): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index afd86bf41..15844dd51 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -7,29 +7,52 @@ class DockerOperatorBuilder(ContainerOperatorBuilder): - def build_mounts_and_command_args(self, mounts): + def build_mounts_and_command_args(self, mounts, base_inlet): docker_mounts = [] command_args = [] - for mount_type, mount_info in mounts.items(): - read_only = mount_type == "input_volumes" - for var_name, mount_details in mount_info.items(): - host_path = os.getenv(f"host_{var_name}", None) - if host_path is None: - raise MedperfException( - f"Could not find definition for mount {var_name} in the Airflow environment!" - ) - docker_path = mount_details["mount_path"] - docker_mounts.append( - Mount( - source=host_path, - target=docker_path, - type="bind", - read_only=read_only, + try: + for mount_type, mount_info in mounts.items(): + read_only = mount_type == "input_volumes" + for var_name, mount_details in mount_info.items(): + if var_name == "data_path" and base_inlet is not None: + env_name = "output_path" + elif var_name == "labels_path" and base_inlet is not None: + env_name = "output_labels_path" + elif var_name == "output_path" and self.raw_id == "statistics": + env_name = "statistics_file" + else: + env_name = var_name + + host_path = os.getenv(f"host_{env_name}", None) + + if host_path is None: + raise MedperfException( + f"Could not find definition for mount {var_name} in the Airflow environment!" + ) + docker_path = mount_details["mount_path"] + docker_mounts.append( + Mount( + source=host_path, + target=docker_path, + type="bind", + read_only=read_only, + ) ) - ) - command_args.extend([f"--{var_name}", docker_path]) - if mount_details.get("type") == "directory": - os.makedirs(host_path, exist_ok=True) + command_args.extend([f"--{var_name}", docker_path]) + if mount_details.get("type") == "directory": + os.makedirs(host_path, exist_ok=True) + elif mount_details.get("type") == "file" and not os.path.exists( + host_path + ): + open(host_path, "x").close() + except AttributeError: + msg = "----------------------------------------------------------\n" + msg += f"{self.image=}\n" + msg += f"{self.base_command=}\n" + msg += f"{mounts=}\n" + msg += f"{base_inlet=}\n" + msg += "----------------------------------------------------------" + raise AttributeError(msg) return docker_mounts, command_args def _define_base_operator(self) -> DockerOperator: @@ -42,7 +65,7 @@ def _define_base_operator(self) -> DockerOperator: mounts=self.mounts, task_id=self.operator_id, task_display_name=self.display_name, - auto_remove="success", + # auto_remove="success", mount_tmp_dir=False, outlets=self.outlets, ) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py b/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py index 9b3c1a53c..d3974d667 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py @@ -25,11 +25,11 @@ class ReportSummary: def __init__( self, - report_directory: str, + report_file: str, execution_status: Literal["running", "failure", "done"], progress_dict: dict[str, Any] = None, ): - self.report_summary_file = os.path.join(report_directory, "report_summary.yaml") + self.report_file = report_file self.execution_status = execution_status self.progress_dict = progress_dict if progress_dict is not None else {} @@ -41,8 +41,11 @@ def to_dict(self): return report_dict def write_yaml(self): + if self.report_file is None: + return + report_dict = self.to_dict() - with open(self.report_summary_file, "w") as f: + with open(self.report_file, "w") as f: yaml.dump( report_dict, f, @@ -52,9 +55,9 @@ def write_yaml(self): class Summarizer: - def __init__(self, yaml_parser: YamlPartialParser, report_directory: os.PathLike): + def __init__(self, yaml_parser: YamlPartialParser, report_file: os.PathLike): self.step_ids = yaml_parser.step_ids - self.report_directory = report_directory + self.report_file = report_file @staticmethod def _get_dag_id_to_dag_dict(client: AirflowAPIClient) -> dict[str, dict[str, Any]]: @@ -149,7 +152,7 @@ def _get_report_summary( execution_status = "running" report_summary = ReportSummary( - report_directory=self.report_directory, + report_file=self.report_file, execution_status=execution_status, progress_dict=summary_dict, ) @@ -159,6 +162,9 @@ def summarize( self, airflow_client: AirflowAPIClient, ): + if self.report_file is None: + return + all_dags = self._get_dag_id_to_dag_dict(airflow_client) most_recent_dag_runs = self._get_most_recent_dag_runs(all_dags, airflow_client) report_summary = self._get_report_summary(all_dags, most_recent_dag_runs) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 726ea79d1..dd773da69 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -277,7 +277,7 @@ async def _async_wait_for_dag(self): try: summarizer = Summarizer( yaml_parser=self.yaml_parser, - report_directory=self.mounts["output_path"], + report_file=self.mounts.get("report_file"), ) summarizer_task = asyncio.create_task( summarizer.summarize_every_x_seconds( diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index ffc852e57..19ffd05e5 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -88,6 +88,10 @@ def runner(self): self._runner = load_runner(self.parser, self.path, self.name) return self._runner + @property + def is_workflow(self) -> bool: + return self.runner.is_workflow + @property def local_id(self): return self.name diff --git a/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml b/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml new file mode 100644 index 000000000..9d532412d --- /dev/null +++ b/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml @@ -0,0 +1,65 @@ +steps: + - id: prepare + type: container + image: mlcommons/chestxray-tutorial-prep:0.0.1 + command: python3 /project/prepare.py + mounts: + input_volumes: + data_path: + mount_path: /mlcommons/volumes/raw_data + type: directory + labels_path: + mount_path: /mlcommons/volumes/raw_labels + type: directory + parameters_file: + mount_path: /mlcommons/volumes/parameters/parameters_file.yaml + type: file + output_volumes: + output_path: + mount_path: /mlcommons/volumes/data + type: directory + output_labels_path: + mount_path: /mlcommons/volumes/labels + type: directory + next: sanity_check + on_error: do_something + + - id: sanity_check + type: container + image: mlcommons/chestxray-tutorial-prep:0.0.1 + command: python3 /project/sanity_check.py + mounts: + input_volumes: + data_path: + mount_path: /mlcommons/volumes/data + type: directory + labels_path: + mount_path: /mlcommons/volumes/labels + type: directory + parameters_file: + mount_path: /mlcommons/volumes/parameters/parameters_file.yaml + type: file + next: statistics + on_error: do_something + + - id: statistics + type: container + image: mlcommons/chestxray-tutorial-prep:0.0.1 + command: python3 /project/statistics.py + mounts: + input_volumes: + data_path: + mount_path: /mlcommons/volumes/data + type: directory + labels_path: + mount_path: /mlcommons/volumes/labels + type: directory + parameters_file: + mount_path: /mlcommons/volumes/parameters/parameters_file.yaml + type: file + output_volumes: + output_path: + mount_path: /mlcommons/volumes/statistics/statistics.yaml + type: file + next: null + on_error: do_something \ No newline at end of file diff --git a/examples/chestxray_tutorial/data_preparator_workflow/workspace/parameters.yaml b/examples/chestxray_tutorial/data_preparator_workflow/workspace/parameters.yaml new file mode 100644 index 000000000..cf1348d59 --- /dev/null +++ b/examples/chestxray_tutorial/data_preparator_workflow/workspace/parameters.yaml @@ -0,0 +1,20 @@ +labels_list: + [ + "atelectasis", + "cardiomegaly", + "effusion", + "infiltration", + "mass", + "nodule", + "pneumonia", + "pneumothorax", + "consolidation", + "edema", + "emphysema", + "fibrosis", + "pleural", + "hernia", + ] +image_column_id: Image ID +label_column_id: Label +image_output_size: [28, 28, 1] From 2d27fe7e7e69914650ea193f66d391833a60cda9 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 09:29:10 -0300 Subject: [PATCH 043/176] remove outdated todo --- .../dags/operator_builders/operator_builder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py index 837c54c29..0a0915605 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py @@ -164,7 +164,6 @@ def build_operator_list(cls, **kwargs) -> list[OperatorBuilder]: partition=partition, ) - # TODO this will break! empty_operators = [ EmptyOperatorBuilder( operator_id=empty_id, From 56850bba9902485bbb1aff5192f19575f083f30e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 09:29:32 -0300 Subject: [PATCH 044/176] parser changes necessary for quick and dirty workflow solution --- .../airflow_runner_utils/dags/yaml_parser/yaml_parser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index 7175f1991..081c38521 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -213,8 +213,10 @@ def _create_expanded_steps( # noqa: C901 if not this_step_inlets: this_step_inlets = [step_id] step["inlets"] = this_step_inlets + step["base_inlet"] = step_id else: step["inlets"] = [] + step["base_inlet"] = None expanded_steps = list(step_id_to_expanded_step.values()) return expanded_steps From 4e25077f0a7368dc4c7a343c41e30a5699c85e4f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 09:36:29 -0300 Subject: [PATCH 045/176] Refactor quick and dirty solution for Docker/Singularity/generic container operator builders --- .../container_operator_builder.py | 41 +++++++++++++- .../docker_operator_buider.py | 54 +++---------------- .../singularity_operator_builder.py | 25 ++------- 3 files changed, 51 insertions(+), 69 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index 4998def4b..82ff3956d 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -2,6 +2,8 @@ from .operator_builder import OperatorBuilder from abc import abstractmethod from typing import Optional +import os +from medperf.exceptions import MedperfException class ContainerOperatorBuilder(OperatorBuilder): @@ -25,8 +27,45 @@ def __init__( mounts, base_inlet ) + def build_mounts_and_command_args(self, mounts, base_inlet): + container_mounts = [] + command_args = [] + + for mount_type, mount_info in mounts.items(): + read_only = mount_type == "input_volumes" + for var_name, mount_details in mount_info.items(): + if var_name == "data_path" and base_inlet is not None: + env_name = "output_path" + elif var_name == "labels_path" and base_inlet is not None: + env_name = "output_labels_path" + elif var_name == "output_path" and self.raw_id == "statistics": + env_name = "statistics_file" + else: + env_name = var_name + + host_path = os.getenv(f"host_{env_name}", None) + + if host_path is None: + raise MedperfException( + f"Could not find definition for mount {var_name} in the Airflow environment!" + ) + mount_path = mount_details["mount_path"] + mount_item = self._build_mount_item(host_path, mount_path, read_only) + + container_mounts.append(mount_item) + command_args.extend([f"--{var_name}", mount_path]) + if mount_details.get("type") == "directory": + os.makedirs(host_path, exist_ok=True) + elif mount_details.get("type") == "file" and not os.path.exists( + host_path + ): + open(host_path, "x").close() + + return container_mounts, command_args + @abstractmethod - def build_mounts_and_command_args(self, base_inlet): + def _build_mount_item(self, host_path, mount_path, read_only): + """Logic for building mounts in Docker or Singularity. Implemented in subclasses""" pass def _get_command(self): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index 15844dd51..1e9139113 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -7,53 +7,13 @@ class DockerOperatorBuilder(ContainerOperatorBuilder): - def build_mounts_and_command_args(self, mounts, base_inlet): - docker_mounts = [] - command_args = [] - try: - for mount_type, mount_info in mounts.items(): - read_only = mount_type == "input_volumes" - for var_name, mount_details in mount_info.items(): - if var_name == "data_path" and base_inlet is not None: - env_name = "output_path" - elif var_name == "labels_path" and base_inlet is not None: - env_name = "output_labels_path" - elif var_name == "output_path" and self.raw_id == "statistics": - env_name = "statistics_file" - else: - env_name = var_name - - host_path = os.getenv(f"host_{env_name}", None) - - if host_path is None: - raise MedperfException( - f"Could not find definition for mount {var_name} in the Airflow environment!" - ) - docker_path = mount_details["mount_path"] - docker_mounts.append( - Mount( - source=host_path, - target=docker_path, - type="bind", - read_only=read_only, - ) - ) - command_args.extend([f"--{var_name}", docker_path]) - if mount_details.get("type") == "directory": - os.makedirs(host_path, exist_ok=True) - elif mount_details.get("type") == "file" and not os.path.exists( - host_path - ): - open(host_path, "x").close() - except AttributeError: - msg = "----------------------------------------------------------\n" - msg += f"{self.image=}\n" - msg += f"{self.base_command=}\n" - msg += f"{mounts=}\n" - msg += f"{base_inlet=}\n" - msg += "----------------------------------------------------------" - raise AttributeError(msg) - return docker_mounts, command_args + def _build_mount_item(self, host_path, mount_path, read_only): + return Mount( + source=host_path, + target=mount_path, + type="bind", + read_only=read_only, + ) def _define_base_operator(self) -> DockerOperator: diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py index 0458e59e9..82ef29568 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py @@ -9,27 +9,10 @@ class SingularityOperatorBuilder(ContainerOperatorBuilder): Currently untested!! """ - def build_mounts_and_command_args(self, mounts: dict): - """Singularity operator uses raw mount strings as they are, /path/in/host:/path/in/container""" - singularity_mounts = [] - command_args = [] - for mount_type, mount_info in mounts.items(): - read_only = mount_type == "input_volumes" - for var_name, mount_details in mount_info.items(): - host_path = os.getenv(f"host_{var_name}", None) - if host_path is None: - raise MedperfException( - f"Could not find definition for mount {var_name} in the Airflow environment!" - ) - singularity_path = mount_details["mount_path"] - mount_suffix = "ro" if read_only else "rw" - mount_str = f"{host_path}:{singularity_path}:{mount_suffix}" - singularity_mounts.append(mount_str) - command_args.extend([f"--{var_name}", singularity_path]) - - if mount_details.get("type") == "directory": - os.makedirs(host_path, exist_ok=True) - return singularity_mounts, command_args + def _build_mount_item(self, host_path, mount_path, read_only): + mount_suffix = "ro" if read_only else "rw" + mount_str = f"{host_path}:{mount_path}:{mount_suffix}" + return mount_str def _define_base_operator(self) -> SingularityOperator: command = self._get_command() From bcc1b77a0390686c75c4867836900319c5ff5b23 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 15:38:07 -0300 Subject: [PATCH 046/176] Improve the temporary logic for mounts in Airflow --- .../container_operator_builder.py | 17 +---- .../dags/yaml_parser/yaml_parser.py | 73 +++++++++++++++---- 2 files changed, 64 insertions(+), 26 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index 82ff3956d..11aed95bd 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -13,7 +13,7 @@ def __init__( image: str, command: str | list[str], mounts: dict, - base_inlet: Optional[str] = None, + host_mounts: dict, **kwargs, ): super().__init__(**kwargs) @@ -24,26 +24,17 @@ def __init__( self.base_command = command self.mounts, self.command_args = self.build_mounts_and_command_args( - mounts, base_inlet + mounts, host_mounts ) - def build_mounts_and_command_args(self, mounts, base_inlet): + def build_mounts_and_command_args(self, mounts, host_mounts): container_mounts = [] command_args = [] for mount_type, mount_info in mounts.items(): read_only = mount_type == "input_volumes" for var_name, mount_details in mount_info.items(): - if var_name == "data_path" and base_inlet is not None: - env_name = "output_path" - elif var_name == "labels_path" and base_inlet is not None: - env_name = "output_labels_path" - elif var_name == "output_path" and self.raw_id == "statistics": - env_name = "statistics_file" - else: - env_name = var_name - - host_path = os.getenv(f"host_{env_name}", None) + host_path = host_mounts[var_name] if host_path is None: raise MedperfException( diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index 081c38521..433d09769 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -1,12 +1,16 @@ import yaml import os -from constants import YAML_DIR +from medperf.containers.runners.airflow_runner_utils.dags.constants import YAML_DIR from typing import Union, Any -from dag_utils import import_external_python_function +from medperf.containers.runners.airflow_runner_utils.dags.dag_utils import ( + import_external_python_function, +) from collections import defaultdict from airflow.sdk import DAG -from dag_utils import create_legal_dag_id -from dag_builder import DagBuilder +from medperf.containers.runners.airflow_runner_utils.dags.dag_utils import ( + create_legal_dag_id, +) +from medperf.containers.runners.airflow_runner_utils.dags.dag_builder import DagBuilder from copy import deepcopy @@ -20,12 +24,13 @@ def __init__(self, yaml_dir_path: str = None): self._raw_subject_definitions = yaml_content.get("per_subject_def", {}) self.dag_builders = None - @staticmethod - def read_yaml_definition() -> ( - dict[str, Union[list[dict[str, str]], dict[str, str]]] - ): - yaml_files = [yaml_file for yaml_file in os.listdir(YAML_DIR)] - yaml_files = [os.path.join(YAML_DIR, yaml_file) for yaml_file in yaml_files] + def read_yaml_definition( + self, + ) -> dict[str, Union[list[dict[str, str]], dict[str, str]]]: + yaml_files = [yaml_file for yaml_file in os.listdir(self.yaml_dir_path)] + yaml_files = [ + os.path.join(self.yaml_dir_path, yaml_file) for yaml_file in yaml_files + ] yaml_files = [ yaml_file for yaml_file in yaml_files @@ -52,7 +57,9 @@ def read_yaml_definition() -> ( return yaml_info def read_subject_partitions(self): - from pipeline_state import PipelineState + from medperf.containers.runners.airflow_runner_utils.dags.pipeline_state import ( + PipelineState, + ) if not self._raw_subject_definitions: return [] @@ -213,14 +220,54 @@ def _create_expanded_steps( # noqa: C901 if not this_step_inlets: this_step_inlets = [step_id] step["inlets"] = this_step_inlets - step["base_inlet"] = step_id else: step["inlets"] = [] - step["base_inlet"] = None + step["host_mounts"] = self._make_mounts(step, upstream_ids) expanded_steps = list(step_id_to_expanded_step.values()) return expanded_steps + @staticmethod + def _make_mounts(step, upstream_ids): + + # Always the same in all containers + fixed_keys = [ + "metadata_path", + "report_file", + "parameters_file", + "additional_files", + "statistics_file", + ] + + # May change depending on container + variable_keys = [ + "data_path", + "labels_path", + "output_path", + "output_labels_path", + ] + + host_mounts = {key: os.getenv(f"host_{key}") for key in fixed_keys} + if not upstream_ids: + extra_mounts = {key: os.getenv(f"host_{key}") for key in variable_keys} + else: + # For now, this assumes all steps have the same output directories + # So steps that are not the first one in the pipeline will take the output directory as input + # TODO generalize for different output directories + extra_mounts = { + "data_path": os.getenv(f"host_output_path"), + "labels_path": os.getenv(f"host_output_labels_path"), + "output_labels_path": os.getenv(f"host_output_labels_path"), + } + + if step.get("next"): + extra_mounts["output_path"] = os.getenv("host_output_path") + else: + extra_mounts["output_path"] = os.getenv("host_statistics_file") + host_mounts.update(**extra_mounts) + + return host_mounts + def _update_next_with_new_partition(self, original_dict, original_next, new_next): next_field = original_dict["next"] if isinstance(next_field, list): From 3f353553046d8494833ee411713cec4dd96a2f05 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 15:38:36 -0300 Subject: [PATCH 047/176] use complete imports --- .../airflow_runner_utils/dags/dag_builder.py | 6 ++++-- .../operator_builders/operator_builder.py | 5 ++++- .../dags/operator_factory.py | 20 ++++++++++++++----- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py index 9f82d571e..040172a86 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py @@ -1,8 +1,10 @@ from __future__ import annotations from airflow.sdk import Asset, DAG from typing import Any -from constants import YESTERDAY -from operator_factory import operator_factory +from medperf.containers.runners.airflow_runner_utils.dags.constants import YESTERDAY +from medperf.containers.runners.airflow_runner_utils.dags.operator_factory import ( + operator_factory, +) class DagBuilder: diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py index 0a0915605..5b68ab372 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py @@ -1,7 +1,10 @@ from __future__ import annotations from airflow.sdk import Asset, BaseOperator from abc import ABC, abstractmethod -from constants import ALWAYS_CONDITION, FINAL_ASSET +from medperf.containers.runners.airflow_runner_utils.dags.constants import ( + ALWAYS_CONDITION, + FINAL_ASSET, +) class OperatorBuilder(ABC): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py index 3ef7756d7..3fedef3a2 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py @@ -1,9 +1,19 @@ from __future__ import annotations -from operator_builders.singularity_operator_builder import SingularityOperatorBuilder -from operator_builders.docker_operator_buider import DockerOperatorBuilder -from operator_builders.empty_operator_builder import EmptyOperatorBuilder -from operator_builders.manual_approval_buider import ManualApprovalBuilder -from operator_builders.operator_builder import OperatorBuilder +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.singularity_operator_builder import ( + SingularityOperatorBuilder, +) +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.docker_operator_buider import ( + DockerOperatorBuilder, +) +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.empty_operator_builder import ( + EmptyOperatorBuilder, +) +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.manual_approval_buider import ( + ManualApprovalBuilder, +) +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( + OperatorBuilder, +) import os container_builder = ( From 63959ab6b35982a395d2c09d087cd97b48569f49 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 15:38:47 -0300 Subject: [PATCH 048/176] auto_remove containrs on successful runs --- .../dags/operator_builders/docker_operator_buider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index 1e9139113..3afdae4c5 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -25,7 +25,7 @@ def _define_base_operator(self) -> DockerOperator: mounts=self.mounts, task_id=self.operator_id, task_display_name=self.display_name, - # auto_remove="success", + auto_remove="success", mount_tmp_dir=False, outlets=self.outlets, ) From 3fcc1038ac2783456f03650284db1df7df8998e1 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 15:39:51 -0300 Subject: [PATCH 049/176] remove old chestxray workflow, use the same one as the tutorial --- .../chexpert_prep_workflow/workflow.yaml | 33 ------------------- .../workspace/parameters.yaml | 7 ---- 2 files changed, 40 deletions(-) delete mode 100644 examples/ChestXRay/chexpert_prep_workflow/workflow.yaml delete mode 100644 examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml diff --git a/examples/ChestXRay/chexpert_prep_workflow/workflow.yaml b/examples/ChestXRay/chexpert_prep_workflow/workflow.yaml deleted file mode 100644 index 350a901b6..000000000 --- a/examples/ChestXRay/chexpert_prep_workflow/workflow.yaml +++ /dev/null @@ -1,33 +0,0 @@ -steps: - - id: prepare - type: container - image: mlcommons/chexpert-prep:0.1.0 - command: prepare --data_path /workspace/CheXPert-v1.0-small --labels_path /workspace/CheXPert-v1.0-small --parameters_file /workspace/parameters.yaml --output_path /data - mounts: - - ${WORKSPACE_DIR}:/workspace - - ${INPUT_DATA_DIR}:/workspace/CheXPert-v1.0-small - - ${DATA_DIR}:/data - next: sanity_check - on_error: do_something - - - id: sanity_check - type: container - image: mlcommons/chexpert-prep:0.1.0 - command: sanity_check --data_path /data --parameters_file /workspace/parameters.yaml - mounts: - - ${WORKSPACE_DIR}:/workspace - - ${INPUT_DATA_DIR}:/workspace/CheXPert-v1.0-small - - ${DATA_DIR}:/data - next: statistics - on_error: do_something - - - id: statistics - type: container - image: mlcommons/chexpert-prep:0.1.0 - command: statistics --data_path /data --parameters_file /workspace/parameters.yaml --output_path /data/statistics.yaml - mounts: - - ${WORKSPACE_DIR}:/workspace - - ${INPUT_DATA_DIR}:/workspace/CheXPert-v1.0-small - - ${DATA_DIR}:/data - next: null - on_error: do_something \ No newline at end of file diff --git a/examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml b/examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml deleted file mode 100644 index fd0b6000b..000000000 --- a/examples/ChestXRay/chexpert_prep_workflow/workspace/parameters.yaml +++ /dev/null @@ -1,7 +0,0 @@ -output_datafile: data.csv -output_imagepath: images -labels: - - Atelectasis - - Cardiomegaly - - Consolidation - - Edema From 38dd693399ca712e53ca349097e0e9a146e14418 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 15:40:01 -0300 Subject: [PATCH 050/176] Add new seeding option for workflows --- server/seed.py | 21 ++++- server/seed_utils.py | 189 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+), 2 deletions(-) diff --git a/server/seed.py b/server/seed.py index be4d387f4..e51c47a60 100644 --- a/server/seed.py +++ b/server/seed.py @@ -8,7 +8,13 @@ executes Django code to set admin permissions for a test user.""" import argparse -from seed_utils import Server, set_user_as_admin, create_benchmark, create_model +from seed_utils import ( + Server, + set_user_as_admin, + create_benchmark, + create_model, + create_workflow_benchmark, +) from auth_provider_token import auth_provider_token from pathlib import Path import json @@ -37,7 +43,12 @@ def seed(args): return # create benchmark benchmark_owner_token = get_token("testbo@example.com") - benchmark = create_benchmark(api_server, benchmark_owner_token, admin_token) + if args.workflow: + benchmark = create_workflow_benchmark( + api_server, benchmark_owner_token, admin_token + ) + else: + benchmark = create_benchmark(api_server, benchmark_owner_token, admin_token) if args.demo == "model": return # create model @@ -80,6 +91,12 @@ def seed(args): help="Path to local tokens file", default=default_tokens_file, ) + parser.add_argument( + "-w", + "--workflow", + action="store_true", + help="Use an Airflow workflow instead of a container for Data Preparation", + ) args = parser.parse_args() if args.cert.lower() == "none": args.cert = None diff --git a/server/seed_utils.py b/server/seed_utils.py index 37d71548a..6254854e5 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -273,6 +273,195 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): return benchmark +def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): + print("##########################BENCHMARK OWNER##########################") + + DATA_PREP_ASSETS_WORKFLOW_URL = ( + "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" + "41c7082bf5093de8ba287683a41365860ee71d18/examples/" + "chestxray_tutorial/" + ) + # Create a Data preprocessor MLCube by Benchmark Owner + data_preprocessor_mlcube = api_server.request( + "/mlcubes/", + "POST", + benchmark_owner_token, + { + "name": "chestxray_wprep", + "git_mlcube_url": ( + DATA_PREP_ASSETS_WORKFLOW_URL + "data_preparator_workflow/workflow.yaml" + ), + "mlcube_hash": "9b65373a0cae9b2cbbd5027a3d692f2ed080e6f15c0ff5d45e9d92517409651d", + "git_parameters_url": ( + DATA_PREP_ASSETS_WORKFLOW_URL + + "data_preparator/workspace/parameters.yaml" + ), + "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", + "image_tarball_url": "", + "image_tarball_hash": "", + "image_hash": { + "mlcommons/chestxray-tutorial-prep:0.0.1": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" + }, + "additional_files_tarball_url": "", + "additional_files_tarball_hash": "", + "metadata": { + "digest": "f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + }, + }, + "id", + ) + print( + "Data Preprocessor MLCube Created(by Benchmark Owner). ID:", + data_preprocessor_mlcube, + ) + + # Update state of the Data preprocessor MLCube to OPERATION + data_preprocessor_mlcube_state = api_server.request( + "/mlcubes/" + str(data_preprocessor_mlcube) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", + ) + print( + "Data Preprocessor MlCube state updated to", + data_preprocessor_mlcube_state, + "by Benchmark Owner", + ) + + # Create a reference model executor mlcube by Benchmark Owner + reference_model_executor_mlcube = api_server.request( + "/mlcubes/", + "POST", + benchmark_owner_token, + { + "name": "chestxray_cnn", + "git_mlcube_url": (ASSETS_URL + "model_custom_cnn/container_config.yaml"), + "mlcube_hash": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc", + "git_parameters_url": ( + ASSETS_URL + "model_custom_cnn/workspace/parameters.yaml" + ), + "parameters_hash": "af0aed4735b5075c198f8b49b3afbf7a0d7eaaaaa2a2b914d5931f0bee51d3f6", + "additional_files_tarball_url": ( + "https://storage.googleapis.com/medperf-storage/" + "chestxray_tutorial/cnn_weights.tar.gz" + ), + "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", + "image_hash": { + "default": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5" + }, + "image_tarball_url": "", + "image_tarball_hash": "", + "metadata": { + "digest": "a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" + }, + }, + "id", + ) + print( + "Reference Model Executor MlCube Created(by Benchmark Owner). ID:", + reference_model_executor_mlcube, + ) + + # Update state of the Reference Model Executor MLCube to OPERATION + reference_model_executor_mlcube_state = api_server.request( + "/mlcubes/" + str(reference_model_executor_mlcube) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", + ) + print( + "Reference Model Executor MlCube state updated to", + reference_model_executor_mlcube_state, + "by Benchmark Owner", + ) + + # Create a Data evalutor MLCube by Benchmark Owner + data_evaluator_mlcube = api_server.request( + "/mlcubes/", + "POST", + benchmark_owner_token, + { + "name": "chestxray_metrics", + "git_mlcube_url": (ASSETS_URL + "metrics/container_config.yaml"), + "mlcube_hash": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7", + "git_parameters_url": (ASSETS_URL + "metrics/workspace/parameters.yaml"), + "parameters_hash": "16cad451c54b801a5b50d999330465d7f68ab5f6d30a0674268d2d17c7f26b73", + "image_tarball_url": "", + "image_tarball_hash": "", + "image_hash": { + "default": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa" + }, + "additional_files_tarball_url": "", + "additional_files_tarball_hash": "", + "metadata": { + "digest": "d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" + }, + }, + "id", + ) + print( + "Data Evaluator MlCube Created(by Benchmark Owner). ID:", + data_evaluator_mlcube, + ) + + # Update state of the Data Evaluator MLCube to OPERATION + data_evaluator_mlcube_state = api_server.request( + "/mlcubes/" + str(data_evaluator_mlcube) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", + ) + print( + "Data Evaluator MlCube state updated to", + data_evaluator_mlcube_state, + "by Benchmark Owner", + ) + + # Create a new benchmark by Benchmark owner + benchmark = api_server.request( + "/benchmarks/", + "POST", + benchmark_owner_token, + { + "name": "chestxray", + "description": "benchmark-sample", + "docs_url": "", + "demo_dataset_tarball_url": "https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz", + "demo_dataset_tarball_hash": "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00", + "demo_dataset_generated_uid": "730d2474d8f22340d9da89fa2eb925fcb95683e0", + "data_preparation_mlcube": data_preprocessor_mlcube, + "reference_model_mlcube": reference_model_executor_mlcube, + "data_evaluator_mlcube": data_evaluator_mlcube, + }, + "id", + ) + print("Benchmark Created(by Benchmark Owner). ID:", benchmark) + + # Update the benchmark state to OPERATION + benchmark_state = api_server.request( + "/benchmarks/" + str(benchmark) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", + ) + print("Benchmark state updated to", benchmark_state, "by Benchmark owner") + + # Mark the benchmark to be APPROVED + benchmark_status = api_server.request( + "/benchmarks/" + str(benchmark) + "/", + "PUT", + admin_token, + {"approval_status": "APPROVED"}, + "approval_status", + ) + print("Benchmark Id:", benchmark, "is marked", benchmark_status, "(by Admin)") + return benchmark + + def create_model(api_server, model_owner_token, benchmark_owner_token, benchmark): print("##########################MODEL OWNER##########################") # Model Owner Interaction From 9399c03dd27b68f279b28f2c2a702d2b8b8c6a18 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 16:42:18 -0300 Subject: [PATCH 051/176] Improve seeding logic. Always create 2 benchmarks (1 with workflow, 1 with container) so tests can use both --- server/seed.py | 35 ++++--- server/seed_utils.py | 232 ++++++++++++++++--------------------------- 2 files changed, 109 insertions(+), 158 deletions(-) diff --git a/server/seed.py b/server/seed.py index e51c47a60..1ab0c1f93 100644 --- a/server/seed.py +++ b/server/seed.py @@ -14,6 +14,8 @@ create_benchmark, create_model, create_workflow_benchmark, + associate_model_to_benchmark, + create_benchmark_ref_model_and_metrics_containers, ) from auth_provider_token import auth_provider_token from pathlib import Path @@ -43,17 +45,30 @@ def seed(args): return # create benchmark benchmark_owner_token = get_token("testbo@example.com") - if args.workflow: - benchmark = create_workflow_benchmark( - api_server, benchmark_owner_token, admin_token - ) - else: - benchmark = create_benchmark(api_server, benchmark_owner_token, admin_token) + ref_model, evaluator = create_benchmark_ref_model_and_metrics_containers( + api_server, benchmark_owner_token, admin_token + ) + container_benchmark = create_benchmark( + api_server, ref_model, evaluator, benchmark_owner_token, admin_token + ) + workflow_benchmark = create_workflow_benchmark( + api_server, ref_model, evaluator, benchmark_owner_token, admin_token + ) if args.demo == "model": return # create model model_owner_token = get_token("testmo@example.com") - create_model(api_server, model_owner_token, benchmark_owner_token, benchmark) + model = create_model(api_server, model_owner_token) + associate_model_to_benchmark( + api_server, model_owner_token, benchmark_owner_token, model, container_benchmark + ) + associate_model_to_benchmark( + api_server, + model_owner_token, + benchmark_owner_token, + model, + workflow_benchmark, + ) if __name__ == "__main__": @@ -91,12 +106,6 @@ def seed(args): help="Path to local tokens file", default=default_tokens_file, ) - parser.add_argument( - "-w", - "--workflow", - action="store_true", - help="Use an Airflow workflow instead of a container for Data Preparation", - ) args = parser.parse_args() if args.cert.lower() == "none": args.cert = None diff --git a/server/seed_utils.py b/server/seed_utils.py index 6254854e5..03671f78f 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -92,54 +92,10 @@ def set_user_as_admin(api_server, access_token): os.chdir(cwd) -def create_benchmark(api_server, benchmark_owner_token, admin_token): +def create_benchmark_ref_model_and_metrics_containers( + api_server, benchmark_owner_token, admin_token +): print("##########################BENCHMARK OWNER##########################") - - # Create a Data preprocessor MLCube by Benchmark Owner - data_preprocessor_mlcube = api_server.request( - "/mlcubes/", - "POST", - benchmark_owner_token, - { - "name": "chestxray_prep", - "git_mlcube_url": (ASSETS_URL + "data_preparator/container_config.yaml"), - "mlcube_hash": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31", - "git_parameters_url": ( - ASSETS_URL + "data_preparator/workspace/parameters.yaml" - ), - "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", - "image_tarball_url": "", - "image_tarball_hash": "", - "image_hash": { - "default": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" - }, - "additional_files_tarball_url": "", - "additional_files_tarball_hash": "", - "metadata": { - "digest": "f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" - }, - }, - "id", - ) - print( - "Data Preprocessor MLCube Created(by Benchmark Owner). ID:", - data_preprocessor_mlcube, - ) - - # Update state of the Data preprocessor MLCube to OPERATION - data_preprocessor_mlcube_state = api_server.request( - "/mlcubes/" + str(data_preprocessor_mlcube) + "/", - "PUT", - benchmark_owner_token, - {"state": "OPERATION"}, - "state", - ) - print( - "Data Preprocessor MlCube state updated to", - data_preprocessor_mlcube_state, - "by Benchmark Owner", - ) - # Create a reference model executor mlcube by Benchmark Owner reference_model_executor_mlcube = api_server.request( "/mlcubes/", @@ -231,6 +187,65 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): "by Benchmark Owner", ) + return reference_model_executor_mlcube, data_evaluator_mlcube + + +def create_benchmark( + api_server, + reference_model_executor_mlcube, + data_evaluator_mlcube, + benchmark_owner_token, + admin_token, +): + print( + "#################BENCHMARK WITH DATA PREPARATION CONTAINER###################" + ) + + # Create a Data preprocessor MLCube by Benchmark Owner + data_preprocessor_mlcube = api_server.request( + "/mlcubes/", + "POST", + benchmark_owner_token, + { + "name": "chestxray_prep", + "git_mlcube_url": (ASSETS_URL + "data_preparator/container_config.yaml"), + "mlcube_hash": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31", + "git_parameters_url": ( + ASSETS_URL + "data_preparator/workspace/parameters.yaml" + ), + "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", + "image_tarball_url": "", + "image_tarball_hash": "", + "image_hash": { + "default": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" + }, + "additional_files_tarball_url": "", + "additional_files_tarball_hash": "", + "metadata": { + "digest": "f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + }, + }, + "id", + ) + print( + "Data Preprocessor MLCube Created(by Benchmark Owner). ID:", + data_preprocessor_mlcube, + ) + + # Update state of the Data preprocessor MLCube to OPERATION + data_preprocessor_mlcube_state = api_server.request( + "/mlcubes/" + str(data_preprocessor_mlcube) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", + ) + print( + "Data Preprocessor MlCube state updated to", + data_preprocessor_mlcube_state, + "by Benchmark Owner", + ) + # Create a new benchmark by Benchmark owner benchmark = api_server.request( "/benchmarks/", @@ -273,8 +288,16 @@ def create_benchmark(api_server, benchmark_owner_token, admin_token): return benchmark -def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): - print("##########################BENCHMARK OWNER##########################") +def create_workflow_benchmark( + api_server, + reference_model_executor_mlcube, + data_evaluator_mlcube, + benchmark_owner_token, + admin_token, +): + print( + "#################BENCHMARK WITH DATA PREPARATION CONTAINER###################" + ) DATA_PREP_ASSETS_WORKFLOW_URL = ( "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" @@ -311,7 +334,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): "id", ) print( - "Data Preprocessor MLCube Created(by Benchmark Owner). ID:", + "Data Preprocessor Workflow Created(by Benchmark Owner). ID:", data_preprocessor_mlcube, ) @@ -324,110 +347,19 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): "state", ) print( - "Data Preprocessor MlCube state updated to", + "Data Preprocessor Workflow state updated to", data_preprocessor_mlcube_state, "by Benchmark Owner", ) - # Create a reference model executor mlcube by Benchmark Owner - reference_model_executor_mlcube = api_server.request( - "/mlcubes/", - "POST", - benchmark_owner_token, - { - "name": "chestxray_cnn", - "git_mlcube_url": (ASSETS_URL + "model_custom_cnn/container_config.yaml"), - "mlcube_hash": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc", - "git_parameters_url": ( - ASSETS_URL + "model_custom_cnn/workspace/parameters.yaml" - ), - "parameters_hash": "af0aed4735b5075c198f8b49b3afbf7a0d7eaaaaa2a2b914d5931f0bee51d3f6", - "additional_files_tarball_url": ( - "https://storage.googleapis.com/medperf-storage/" - "chestxray_tutorial/cnn_weights.tar.gz" - ), - "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", - "image_hash": { - "default": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5" - }, - "image_tarball_url": "", - "image_tarball_hash": "", - "metadata": { - "digest": "a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" - }, - }, - "id", - ) - print( - "Reference Model Executor MlCube Created(by Benchmark Owner). ID:", - reference_model_executor_mlcube, - ) - - # Update state of the Reference Model Executor MLCube to OPERATION - reference_model_executor_mlcube_state = api_server.request( - "/mlcubes/" + str(reference_model_executor_mlcube) + "/", - "PUT", - benchmark_owner_token, - {"state": "OPERATION"}, - "state", - ) - print( - "Reference Model Executor MlCube state updated to", - reference_model_executor_mlcube_state, - "by Benchmark Owner", - ) - - # Create a Data evalutor MLCube by Benchmark Owner - data_evaluator_mlcube = api_server.request( - "/mlcubes/", - "POST", - benchmark_owner_token, - { - "name": "chestxray_metrics", - "git_mlcube_url": (ASSETS_URL + "metrics/container_config.yaml"), - "mlcube_hash": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7", - "git_parameters_url": (ASSETS_URL + "metrics/workspace/parameters.yaml"), - "parameters_hash": "16cad451c54b801a5b50d999330465d7f68ab5f6d30a0674268d2d17c7f26b73", - "image_tarball_url": "", - "image_tarball_hash": "", - "image_hash": { - "default": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa" - }, - "additional_files_tarball_url": "", - "additional_files_tarball_hash": "", - "metadata": { - "digest": "d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" - }, - }, - "id", - ) - print( - "Data Evaluator MlCube Created(by Benchmark Owner). ID:", - data_evaluator_mlcube, - ) - - # Update state of the Data Evaluator MLCube to OPERATION - data_evaluator_mlcube_state = api_server.request( - "/mlcubes/" + str(data_evaluator_mlcube) + "/", - "PUT", - benchmark_owner_token, - {"state": "OPERATION"}, - "state", - ) - print( - "Data Evaluator MlCube state updated to", - data_evaluator_mlcube_state, - "by Benchmark Owner", - ) - # Create a new benchmark by Benchmark owner benchmark = api_server.request( "/benchmarks/", "POST", benchmark_owner_token, { - "name": "chestxray", - "description": "benchmark-sample", + "name": "wchestxray", + "description": "workflow-sample", "docs_url": "", "demo_dataset_tarball_url": "https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz", "demo_dataset_tarball_hash": "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00", @@ -462,7 +394,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): return benchmark -def create_model(api_server, model_owner_token, benchmark_owner_token, benchmark): +def create_model(api_server, model_owner_token): print("##########################MODEL OWNER##########################") # Model Owner Interaction @@ -511,6 +443,16 @@ def create_model(api_server, model_owner_token, benchmark_owner_token, benchmark "by Model Owner", ) + return model_executor1_mlcube + + +def associate_model_to_benchmark( + api_server, + model_owner_token, + benchmark_owner_token, + model_executor1_mlcube, + benchmark, +): # Associate the model-executor1 mlcube to the created benchmark by model owner user model_executor1_in_benchmark = api_server.request( "/mlcubes/benchmarks/", From c4ac63cff5899b91b156309f480535ede1ab9486 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 18 Nov 2025 16:42:30 -0300 Subject: [PATCH 052/176] Remove Enter prompt when systemrunner finished Airflow --- .../containers/runners/airflow_runner_utils/system_runner.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index dd773da69..e0bf0d9d9 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -298,9 +298,8 @@ async def _async_wait_for_dag(self): summarizer.summarize(airflow_client) config.ui.print( - "Pipeline Execution finished. Please press Enter to close Airflow..." + "Pipeline Execution finished. Airflow will now be closed and MedPerf will proceed." ) - input() def _check_completed_asset(self, airflow_client: AirflowAPIClient) -> bool: """Checks if the final asset that marks pipeline completion has been updated""" From 39e04adce22bb8b8f8ea9ec389286652c020d3cb Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 19 Nov 2025 09:23:15 -0300 Subject: [PATCH 053/176] Add workflow tests --- .github/workflows/local-ci.yml | 4 ++++ cli/cli_chestxray_tutorial_test.sh | 26 ++++++++++++++++++++++---- cli/tests_setup.sh | 5 ++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 9f04a4d8d..33994136a 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -63,6 +63,10 @@ jobs: working-directory: . run: sh cli/cli_chestxray_tutorial_test.sh -f + - name: Run chestxray demo with workflow + working-directory: . + run: sh cli/cli_chestxray_tutorial_test.sh -f -w + - name: Run client integration tests working-directory: . run: sh cli/cli_tests.sh -f diff --git a/cli/cli_chestxray_tutorial_test.sh b/cli/cli_chestxray_tutorial_test.sh index c4c1cc3e8..01aab871f 100755 --- a/cli/cli_chestxray_tutorial_test.sh +++ b/cli/cli_chestxray_tutorial_test.sh @@ -11,6 +11,24 @@ echo "=====================================" echo "downloading files to $DIRECTORY" wget -P $DIRECTORY https://storage.googleapis.com/medperf-storage/chestxray_tutorial/sample_raw_data.tar.gz tar -xzvf $DIRECTORY/sample_raw_data.tar.gz -C $DIRECTORY + +if ${WORKFLOW}; then + BMK_UID=2 + DSET_NAME="nih_chestxray_w" + + # Remove one file if workflow so we get different dataset hashes + echo "Removing $DIRECTORY/sample_raw_data/images/00028846_000.png for workflow execution" + rm -rf $DIRECTORY/sample_raw_data/images/00028846_000.png + if [[ "$OS" == "Linux" ]]; then + sed -i '$d' $DIRECTORY/sample_raw_data/labels/labels.csv + elif [[ "$OS" == "Darwin" ]]; then + sed -i '' '$d' $DIRECTORY/sample_raw_data/labels/labels.csv + fi +else + BMK_UID=1 + DSET_NAME="nih_chestxray" +fi + chmod a+w $DIRECTORY/sample_raw_data ########################################################## @@ -56,7 +74,7 @@ echo "=====================================" echo ""Change association approval policy to auto approve always"" echo "=====================================" # Log in as the benchmark owner -print_eval medperf benchmark update_associations_policy -b 1 --dataset_auto_approve_mode ALWAYS +print_eval medperf benchmark update_associations_policy -b $BMK_UID --dataset_auto_approve_mode ALWAYS checkFailed "benchmark update policy failed" echo "=====================================" @@ -68,7 +86,7 @@ echo "\n" echo "=====================================" echo "Registering dataset with medperf" echo "=====================================" -print_eval "medperf dataset submit -b 1 -d $DIRECTORY/sample_raw_data/images -l $DIRECTORY/sample_raw_data/labels --name='nih_chestxray' --description='sample dataset' --location='mock location' -y" +print_eval "medperf dataset submit -b $BMK_UID -d $DIRECTORY/sample_raw_data/images -l $DIRECTORY/sample_raw_data/labels --name='$DSET_NAME' --description='sample dataset' --location='mock location' -y" checkFailed "Data registration step failed" echo "\n" @@ -91,14 +109,14 @@ checkFailed "Data set operational step failed" echo "=====================================" echo "Creating dataset benchmark association" echo "=====================================" -print_eval medperf dataset associate -d $DSET_UID -b 1 -y +print_eval medperf dataset associate -d $DSET_UID -b $BMK_UID -y checkFailed "Data association step failed" echo "=====================================" echo "Running benchmark execution step" echo "=====================================" # Create results -print_eval medperf run -b 1 -d $DSET_UID -m 5 -y +print_eval medperf run -b $BMK_UID -d $DSET_UID -m 6 -y checkFailed "Benchmark execution step failed" # Test offline compatibility test diff --git a/cli/tests_setup.sh b/cli/tests_setup.sh index be333e23d..8e7abcfd7 100644 --- a/cli/tests_setup.sh +++ b/cli/tests_setup.sh @@ -1,11 +1,12 @@ #! /bin/bash -while getopts s:d:c:ft: flag; do +while getopts s:d:c:ft::w flag; do case "${flag}" in s) SERVER_URL=${OPTARG} ;; d) DIRECTORY=${OPTARG} ;; c) CLEANUP="true" ;; f) FRESH="true" ;; t) TIMEOUT=${OPTARG} ;; + w) WORKFLOW="true" esac done @@ -13,6 +14,8 @@ SERVER_URL="${SERVER_URL:-https://localhost:8000}" DIRECTORY="${DIRECTORY:-/tmp/medperf_test_files}" CLEANUP="${CLEANUP:-false}" FRESH="${FRESH:-false}" +WORKFLOW="${WORKFLOW:-false}" +OS=$(uname) TEST_ROOT="/tmp/medperf_tests_$(date +%Y%m%d%H%M%S)" export MEDPERF_CONFIG_PATH="$TEST_ROOT/config.yaml" # env var From 263867b1eb2f540a0e43694d62d8905a55039b99 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 19 Nov 2025 09:36:49 -0300 Subject: [PATCH 054/176] Merge migrations after merge --- .../mlcube/migrations/0004_merge_20251119_1235.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 server/mlcube/migrations/0004_merge_20251119_1235.py diff --git a/server/mlcube/migrations/0004_merge_20251119_1235.py b/server/mlcube/migrations/0004_merge_20251119_1235.py new file mode 100644 index 000000000..5a904f5b9 --- /dev/null +++ b/server/mlcube/migrations/0004_merge_20251119_1235.py @@ -0,0 +1,14 @@ +# Generated by Django 4.2.23 on 2025-11-19 12:35 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('mlcube', '0003_alter_mlcube_name'), + ('mlcube', '0003_convert_image_hash_to_json'), + ] + + operations = [ + ] From 6190d50f0d59d3e936f91ed4cde7417b9b79203a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 19 Nov 2025 10:23:46 -0300 Subject: [PATCH 055/176] Add a TODO --- .../dags/operator_builders/docker_operator_buider.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index 3afdae4c5..f895c94c1 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -1,8 +1,6 @@ from .container_operator_builder import ContainerOperatorBuilder from airflow.providers.docker.operators.docker import DockerOperator from docker.types import Mount -import os -from medperf.exceptions import MedperfException class DockerOperatorBuilder(ContainerOperatorBuilder): @@ -19,6 +17,9 @@ def _define_base_operator(self) -> DockerOperator: command = self._get_command() + # TODO when adding device requests, it should be similar to what is defined below + # from docker.types import eviceRequest + # device_request = DeviceRequest(device_ids=["0", "2"], capabilities=[["gpu"]]) return DockerOperator( image=self.image, command=command, @@ -28,4 +29,10 @@ def _define_base_operator(self) -> DockerOperator: auto_remove="success", mount_tmp_dir=False, outlets=self.outlets, + # TODO add medperf arguments: shm_size, user, network, ports, entrypoint, gpus + shm_size=None, + user=None, + network_mode=None, + port_bindings=None, + device_requests=None, # gpus ) From fdab0750d5faf3f539cb24b44c6a9a457164aa7f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 19 Nov 2025 10:24:05 -0300 Subject: [PATCH 056/176] Remove some TODOs --- cli/medperf/containers/parsers/factory.py | 1 - cli/medperf/containers/runners/airflow_runner.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cli/medperf/containers/parsers/factory.py b/cli/medperf/containers/parsers/factory.py index 745e7011a..b5fa1d08f 100644 --- a/cli/medperf/containers/parsers/factory.py +++ b/cli/medperf/containers/parsers/factory.py @@ -47,7 +47,6 @@ def load_parser(container_config_path: str) -> Parser: elif _is_airflow_yaml_file(container_config): # TODO add modifications to use container hashes rather than tags for download - # TODO maybe change workspace dir and so on here? We need to think about this parser = AirflowParser( airflow_config=container_config, allowed_runners=["docker", "singularity"], diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index cec046cac..d45030719 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -68,7 +68,7 @@ def run( self, task: str = None, # Not used tmp_folder: str = None, # TODO implement - output_logs: str = None, # TODO currently hardcoded; figure this out + output_logs: str = None, timeout: int = None, medperf_mounts: dict[str, str] = {}, medperf_env: dict[str, str] = {}, From 685bea196aa4314023dbeea939b94f44fb7efbab Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 19 Nov 2025 19:33:37 -0300 Subject: [PATCH 057/176] Adjustments to improve data dependencies between steps --- .../airflow_runner_utils/dags/dag_builder.py | 3 +- .../container_operator_builder.py | 50 +++++--- .../docker_operator_buider.py | 12 +- .../operator_builders/operator_builder.py | 9 +- .../singularity_operator_builder.py | 10 +- .../dags/operator_factory.py | 4 +- .../dags/yaml_parser/yaml_parser.py | 111 ++++++++++++------ .../data_preparator_workflow/workflow.yaml | 5 + 8 files changed, 135 insertions(+), 69 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py index 040172a86..821649080 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_builder.py @@ -11,10 +11,11 @@ class DagBuilder: def __init__(self, expanded_step: dict[str, Any]): raw_inlets = expanded_step.pop("inlets", []) + is_first = not bool(raw_inlets) # If a step has no inlets, it is the first step self.builder_id = expanded_step["id"] self.inlets = [Asset(raw_inlet) for raw_inlet in raw_inlets] self.partition = expanded_step.get("partition", None) - self.operator_builders = operator_factory(**expanded_step) + self.operator_builders = operator_factory(is_first=is_first, **expanded_step) self._operator_id_to_builder_obj = { operator.operator_id: operator for operator in self.operator_builders } diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index 11aed95bd..897b8bb00 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -1,11 +1,30 @@ from __future__ import annotations from .operator_builder import OperatorBuilder from abc import abstractmethod -from typing import Optional import os from medperf.exceptions import MedperfException +class MountInfo: + + def __init__(self, source: os.PathLike, target: os.PathLike, read_only: bool): + self.source = source + self.target = target + self.read_only = read_only + + def __eq__(self, other): + if not isinstance(other, MountInfo): + return False + return ( + self.source == other.source + and self.target == other.target + and self.read_only == other.read_only + ) + + def __hash__(self): + return hash((self.source, self.target, self.read_only)) + + class ContainerOperatorBuilder(OperatorBuilder): def __init__( @@ -23,16 +42,12 @@ def __init__( else: self.base_command = command - self.mounts, self.command_args = self.build_mounts_and_command_args( - mounts, host_mounts - ) - - def build_mounts_and_command_args(self, mounts, host_mounts): - container_mounts = [] - command_args = [] + self.mounts = self.build_mounts(mounts, host_mounts) + def build_mounts(self, mounts, host_mounts): + mount_infos = set() for mount_type, mount_info in mounts.items(): - read_only = mount_type == "input_volumes" + read_only = mount_type == "input_volumes" and self.is_first for var_name, mount_details in mount_info.items(): host_path = host_mounts[var_name] @@ -41,26 +56,29 @@ def build_mounts_and_command_args(self, mounts, host_mounts): f"Could not find definition for mount {var_name} in the Airflow environment!" ) mount_path = mount_details["mount_path"] - mount_item = self._build_mount_item(host_path, mount_path, read_only) - container_mounts.append(mount_item) - command_args.extend([f"--{var_name}", mount_path]) + mount_infos.add( + MountInfo(source=host_path, target=mount_path, read_only=read_only) + ) + if mount_details.get("type") == "directory": os.makedirs(host_path, exist_ok=True) elif mount_details.get("type") == "file" and not os.path.exists( host_path ): open(host_path, "x").close() - - return container_mounts, command_args + container_mounts = [ + self._build_mount_item(mount_info) for mount_info in mount_infos + ] + return container_mounts @abstractmethod - def _build_mount_item(self, host_path, mount_path, read_only): + def _build_mount_item(self, mount_info: MountInfo): """Logic for building mounts in Docker or Singularity. Implemented in subclasses""" pass def _get_command(self): - command = [*self.base_command, *self.command_args] + command = [*self.base_command] if self.partition: command = [*command, "--subject-subdir", self.partition] return command diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index f895c94c1..818bc3920 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -1,16 +1,16 @@ -from .container_operator_builder import ContainerOperatorBuilder +from .container_operator_builder import ContainerOperatorBuilder, MountInfo from airflow.providers.docker.operators.docker import DockerOperator from docker.types import Mount class DockerOperatorBuilder(ContainerOperatorBuilder): - def _build_mount_item(self, host_path, mount_path, read_only): + def _build_mount_item(self, mount_info: MountInfo): return Mount( - source=host_path, - target=mount_path, + source=mount_info.source, + target=mount_info.target, type="bind", - read_only=read_only, + read_only=mount_info.read_only, ) def _define_base_operator(self) -> DockerOperator: @@ -26,7 +26,7 @@ def _define_base_operator(self) -> DockerOperator: mounts=self.mounts, task_id=self.operator_id, task_display_name=self.display_name, - auto_remove="success", + # auto_remove="success", mount_tmp_dir=False, outlets=self.outlets, # TODO add medperf arguments: shm_size, user, network, ports, entrypoint, gpus diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py index 5b68ab372..fcdac4d6a 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/operator_builder.py @@ -17,6 +17,7 @@ def __init__( from_yaml: bool = True, make_outlet: bool = True, on_error: str = None, + is_first: bool = False, **kwargs, ): # TODO add logic to import on_error as a callable @@ -24,7 +25,7 @@ def __init__( self.operator_id = operator_id self.raw_id = raw_id self.display_name = self._convert_id_to_display_name(self.raw_id) - + self.is_first = is_first if make_outlet: self.next_ids = [] self.outlets = self._make_outlets(next_ids) @@ -85,7 +86,7 @@ def _define_base_operator(self) -> BaseOperator: pass @classmethod - def build_operator_list(cls, **kwargs) -> list[OperatorBuilder]: + def build_operator_list(cls, is_first: bool, **kwargs) -> list[OperatorBuilder]: """ Helper method to build a list of required Operators for a DAG Builder. Usually will return a list with a single element that is the desired operator @@ -191,6 +192,8 @@ def build_operator_list(cls, **kwargs) -> list[OperatorBuilder]: else: kwargs["next_ids"] = id_info - this_operator = cls(**kwargs, make_outlet=make_outlet_for_main_operator) + this_operator = cls( + **kwargs, is_first=is_first, make_outlet=make_outlet_for_main_operator + ) operator_list = [this_operator, *operator_list] return operator_list diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py index 82ef29568..098b5efb9 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py @@ -1,4 +1,4 @@ -from .container_operator_builder import ContainerOperatorBuilder +from .container_operator_builder import ContainerOperatorBuilder, MountInfo from airflow.providers.singularity.operators.singularity import SingularityOperator import os from medperf.exceptions import MedperfException @@ -9,9 +9,11 @@ class SingularityOperatorBuilder(ContainerOperatorBuilder): Currently untested!! """ - def _build_mount_item(self, host_path, mount_path, read_only): - mount_suffix = "ro" if read_only else "rw" - mount_str = f"{host_path}:{mount_path}:{mount_suffix}" + def _build_mount_item( + self, host_path, mount_path, read_only, mount_info: MountInfo + ): + mount_suffix = "ro" if mount_info.read_only else "rw" + mount_str = f"{mount_info.source}:{mount_info.target}:{mount_suffix}" return mount_str def _define_base_operator(self) -> SingularityOperator: diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py index 3fedef3a2..7005282aa 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py @@ -29,7 +29,7 @@ } -def operator_factory(type, **kwargs) -> list[OperatorBuilder]: +def operator_factory(type, is_first: bool, **kwargs) -> list[OperatorBuilder]: return_list = [] try: @@ -37,5 +37,5 @@ def operator_factory(type, **kwargs) -> list[OperatorBuilder]: except KeyError: raise TypeError(f"Tasks of type {type} are not supported!") - return_list = operator_obj.build_operator_list(**kwargs) + return_list = operator_obj.build_operator_list(is_first=is_first, **kwargs) return return_list diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index 433d09769..287594b21 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -222,51 +222,88 @@ def _create_expanded_steps( # noqa: C901 step["inlets"] = this_step_inlets else: step["inlets"] = [] - step["host_mounts"] = self._make_mounts(step, upstream_ids) + self._make_host_mounts(step_id_to_expanded_step) expanded_steps = list(step_id_to_expanded_step.values()) + return expanded_steps - @staticmethod - def _make_mounts(step, upstream_ids): - - # Always the same in all containers - fixed_keys = [ - "metadata_path", - "report_file", - "parameters_file", - "additional_files", - "statistics_file", - ] + def _make_host_mounts(self, step_id_to_expanded_step: dict): - # May change depending on container - variable_keys = [ - "data_path", - "labels_path", - "output_path", - "output_labels_path", - ] + look_on_second_pass = set() - host_mounts = {key: os.getenv(f"host_{key}") for key in fixed_keys} - if not upstream_ids: - extra_mounts = {key: os.getenv(f"host_{key}") for key in variable_keys} - else: - # For now, this assumes all steps have the same output directories - # So steps that are not the first one in the pipeline will take the output directory as input - # TODO generalize for different output directories - extra_mounts = { - "data_path": os.getenv(f"host_output_path"), - "labels_path": os.getenv(f"host_output_labels_path"), - "output_labels_path": os.getenv(f"host_output_labels_path"), - } - - if step.get("next"): - extra_mounts["output_path"] = os.getenv("host_output_path") + for step_id, step in step_id_to_expanded_step.items(): + host_mounts = {} + self._host_mounts_first_pass( + step=step, + look_on_second_pass=look_on_second_pass, + host_mounts=host_mounts, + volume_key="input_volumes", + ) + self._host_mounts_first_pass( + step=step, + look_on_second_pass=look_on_second_pass, + host_mounts=host_mounts, + volume_key="output_volumes", + ) + if step.get("next") is None: # last step + host_mounts["output_path"] = os.getenv("host_statistics_file") + step["host_mounts"] = host_mounts + + for step_id in look_on_second_pass: + step = step_id_to_expanded_step[step_id] + self._host_mounts_second_pass( + step=step, + step_id_to_expanded_step=step_id_to_expanded_step, + volume_key="input_volumes", + ) + # self._host_mounts_second_pass( + # step=step, + # step_id_to_expanded_step=step_id_to_expanded_step, + # volume_key="output_volumes", + # ) + + @staticmethod + def _host_mounts_first_pass( + step: dict, + look_on_second_pass: set, + host_mounts: dict, + volume_key: str, + ): + step_mounts = step["mounts"] + volumes = step_mounts.get(volume_key, {}) + for volume_name, volume_data in volumes.items(): + from_step = volume_data.get("from") + if from_step is not None: + look_on_second_pass.add(step["id"]) else: - extra_mounts["output_path"] = os.getenv("host_statistics_file") - host_mounts.update(**extra_mounts) + host_mounts[volume_name] = os.getenv(f"host_{volume_name}") - return host_mounts + @staticmethod + def _host_mounts_second_pass( + step: dict, + step_id_to_expanded_step: dict, + volume_key: str, + ): + step_mounts = step["mounts"] + volumes = step_mounts.get(volume_key, {}) + for volume_name, volume_data in volumes.items(): + input_step_id = volume_data.get("from") + + if input_step_id is None: + continue # Done in first pass + + input_step = step_id_to_expanded_step[input_step_id] + output_key = ( + "output_path" + if volume_name == "data_path" + else ( + "output_labels_path" + if volume_name == "labels_path" + else volume_name + ) + ) + step["host_mounts"][volume_name] = input_step["host_mounts"][output_key] def _update_next_with_new_partition(self, original_dict, original_next, new_next): next_field = original_dict["next"] diff --git a/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml b/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml index 9d532412d..1d6776c0e 100644 --- a/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml +++ b/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml @@ -33,12 +33,15 @@ steps: data_path: mount_path: /mlcommons/volumes/data type: directory + from: prepare labels_path: mount_path: /mlcommons/volumes/labels type: directory + from: prepare parameters_file: mount_path: /mlcommons/volumes/parameters/parameters_file.yaml type: file + from: prepare next: statistics on_error: do_something @@ -51,9 +54,11 @@ steps: data_path: mount_path: /mlcommons/volumes/data type: directory + from: prepare labels_path: mount_path: /mlcommons/volumes/labels type: directory + from: prepare parameters_file: mount_path: /mlcommons/volumes/parameters/parameters_file.yaml type: file From d9dddc75b6f0e59a0fd1f03e3816a0afd44a6828 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 20 Nov 2025 10:09:00 -0300 Subject: [PATCH 058/176] Fix in logic for using mounts from other pipeline stages --- .../dags/yaml_parser/yaml_parser.py | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index 287594b21..a9492794a 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -14,6 +14,17 @@ from copy import deepcopy +def get_dict_value_by_key_prefix(key_prefix: str, dictionary: dict): + """ + This assumes the values are effectively the same for the purposes this function is called. + If they are different, then calling by suffix does not make sense! + """ + relevant_dict = { + key: value for key, value in dictionary.items() if key.startswith(key_prefix) + } + return list(relevant_dict.values())[0] + + class YamlParser: def __init__(self, yaml_dir_path: str = None): @@ -257,11 +268,6 @@ def _make_host_mounts(self, step_id_to_expanded_step: dict): step_id_to_expanded_step=step_id_to_expanded_step, volume_key="input_volumes", ) - # self._host_mounts_second_pass( - # step=step, - # step_id_to_expanded_step=step_id_to_expanded_step, - # volume_key="output_volumes", - # ) @staticmethod def _host_mounts_first_pass( @@ -270,7 +276,10 @@ def _host_mounts_first_pass( host_mounts: dict, volume_key: str, ): - step_mounts = step["mounts"] + step_mounts = step.get("mounts") + if step_mounts is None: + return + volumes = step_mounts.get(volume_key, {}) for volume_name, volume_data in volumes.items(): from_step = volume_data.get("from") @@ -285,15 +294,20 @@ def _host_mounts_second_pass( step_id_to_expanded_step: dict, volume_key: str, ): - step_mounts = step["mounts"] + step_mounts = step.get("mounts") + if step_mounts is None: + return + volumes = step_mounts.get(volume_key, {}) for volume_name, volume_data in volumes.items(): - input_step_id = volume_data.get("from") + input_step_id_prefix = volume_data.get("from") - if input_step_id is None: + if input_step_id_prefix is None: continue # Done in first pass - input_step = step_id_to_expanded_step[input_step_id] + input_step = get_dict_value_by_key_prefix( + key_prefix=input_step_id_prefix, dictionary=step_id_to_expanded_step + ) output_key = ( "output_path" if volume_name == "data_path" From db5219a2093cd68a4541dcb1eb65b606829e9e1b Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 21 Nov 2025 08:41:01 -0300 Subject: [PATCH 059/176] Add user ID and GID to DockerOperatorBuilder --- .../dags/operator_builders/docker_operator_buider.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index 818bc3920..f9cce5016 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -1,6 +1,7 @@ from .container_operator_builder import ContainerOperatorBuilder, MountInfo from airflow.providers.docker.operators.docker import DockerOperator from docker.types import Mount +import os class DockerOperatorBuilder(ContainerOperatorBuilder): @@ -26,12 +27,12 @@ def _define_base_operator(self) -> DockerOperator: mounts=self.mounts, task_id=self.operator_id, task_display_name=self.display_name, - # auto_remove="success", + auto_remove="success", mount_tmp_dir=False, outlets=self.outlets, + user=f"{os.getuid()}:{os.getgid()}", # TODO add medperf arguments: shm_size, user, network, ports, entrypoint, gpus shm_size=None, - user=None, network_mode=None, port_bindings=None, device_requests=None, # gpus From 4289bfc09467988eec963dfd0a4ce12f0ba8e143 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 21 Nov 2025 14:10:30 -0300 Subject: [PATCH 060/176] Rename config to airflow_config to avoid confusion with medperf config --- .../runners/airflow_runner_utils/system_runner.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index e0bf0d9d9..5dfb1042e 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -82,13 +82,13 @@ def _initial_setup(self): capture_output=True, env=self._run_env, ) - config = configparser.ConfigParser() + airflow_config = configparser.ConfigParser() logging.debug( f"Airflow process creation stdout:\n{config_create_process.stdout}" ) with open(self.airflow_config_file, "r") as f: - config.read_file(f) - config["core"].update( + airflow_config.read_file(f) + airflow_config["core"].update( { "dags_folder": self.dags_folder, "executor": "LocalExecutor", @@ -96,12 +96,14 @@ def _initial_setup(self): "load_examples": "false", } ) - config["database"].update({"sql_alchemy_conn": self.db.connection_string}) - config["scheduler"].update({"enable_health_check": "true"}) + airflow_config["database"].update( + {"sql_alchemy_conn": self.db.connection_string} + ) + airflow_config["scheduler"].update({"enable_health_check": "true"}) logging.debug(f"Saving Airflow configuration to {self.airflow_config_file}") with open(self.airflow_config_file, "w") as f: - config.write(f) + airflow_config.write(f) def init_airflow(self, force_venv_creation: bool = False): # create_airflow_venv_if_not_exists(force_creation=force_venv_creation) From d17d8b5944810b9737452b61bd286ee26da47750 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 21 Nov 2025 18:47:47 -0300 Subject: [PATCH 061/176] Update seed_utils.py seeded workflow with links and hashes relate dto updated chest xray workflow --- server/seed_utils.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index f72e2cc8a..8756d0315 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -292,8 +292,8 @@ def create_workflow_benchmark( DATA_PREP_ASSETS_WORKFLOW_URL = ( "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" - "41c7082bf5093de8ba287683a41365860ee71d18/examples/" - "chestxray_tutorial/" + "685bea196aa4314023dbeea939b94f44fb7efbab/examples/" + "chestxray_tutorial/data_preparator_workflow/" ) # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( @@ -302,13 +302,10 @@ def create_workflow_benchmark( benchmark_owner_token, { "name": "chestxray_wprep", - "git_mlcube_url": ( - DATA_PREP_ASSETS_WORKFLOW_URL + "data_preparator_workflow/workflow.yaml" - ), - "mlcube_hash": "9b65373a0cae9b2cbbd5027a3d692f2ed080e6f15c0ff5d45e9d92517409651d", + "git_mlcube_url": (DATA_PREP_ASSETS_WORKFLOW_URL + "workflow.yaml"), + "mlcube_hash": "4617173987929fc78471c77318318340067c669eb54f4e0aa3f7d88c4e973f9b", "git_parameters_url": ( - DATA_PREP_ASSETS_WORKFLOW_URL - + "data_preparator/workspace/parameters.yaml" + DATA_PREP_ASSETS_WORKFLOW_URL + "workspace/parameters.yaml" ), "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", "image_tarball_url": "", From e4a4dccc5ed5e1e6c4ec87688704c9c68cf09da2 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 21 Nov 2025 18:48:30 -0300 Subject: [PATCH 062/176] Move airflow_home for data preparation into dataset directory rather than container directory --- cli/medperf/containers/runners/airflow_runner.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index d45030719..63b4ae1fa 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -79,7 +79,8 @@ def run( email = get_medperf_user_data()["email"] username = email.split("@", maxsplit=1)[0] - airflow_home = os.path.join(self.container_dir, "airflow_home") + dataset_dir = medperf_mounts.pop("dataset_path") + airflow_home = os.path.join(dataset_dir, "airflow_home") additional_files_path = medperf_mounts["additional_files"] self._symlink_yaml_dag_to_additional_files(additional_files_path) From 3a760df48e75cbe5f917ae7c2c1c91fd55376248 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 21 Nov 2025 18:49:31 -0300 Subject: [PATCH 063/176] Implement methods is_report/metadata_specified for airflowparser --- cli/medperf/containers/parsers/airflow_parser.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index 7044fe1c2..77846eb72 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -44,6 +44,7 @@ def __init__( # The following variables are set when calling check_schema for the first time self._steps = [] + self._has_metadata = None self.pools = None self.step_ids = [] self.containers: Set[ContainerForAirflow] = ( @@ -181,7 +182,18 @@ def get_run_args(self, task: str, medperf_mounts: dict): pass def is_report_specified(self): - pass + """Can always get report data from Airflow REST API""" + return True + + @property + def has_metadata(self): + if self._has_metadata is None: + self._has_metadata = any( + "metadata_path" in step["mounts"].get("output_volumes", {}) + for step in self._steps + ) + + return self._has_metadata def is_metadata_specified(self): - pass + return self._has_metadata From 3ec2123afc79e28f931ea11e594030697a8c4403 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 21 Nov 2025 18:49:52 -0300 Subject: [PATCH 064/176] Modify processing of report files to work with airflow files --- cli/medperf/commands/dataset/prepare.py | 28 +++++++++---------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/cli/medperf/commands/dataset/prepare.py b/cli/medperf/commands/dataset/prepare.py index 0d070cde0..55b1c0e7c 100644 --- a/cli/medperf/commands/dataset/prepare.py +++ b/cli/medperf/commands/dataset/prepare.py @@ -1,3 +1,4 @@ +from __future__ import annotations import logging import os import pandas as pd @@ -18,7 +19,7 @@ class ReportHandler(FileSystemEventHandler): - def __init__(self, preparation_obj: "DataPreparation"): + def __init__(self, preparation_obj: DataPreparation): self.preparation = preparation_obj self.timer = None @@ -48,7 +49,7 @@ def on_modified(self, event): class ReportSender: - def __init__(self, preparation_obj: "DataPreparation"): + def __init__(self, preparation_obj: DataPreparation): self.preparation = preparation_obj def start(self): @@ -185,6 +186,7 @@ def run_prepare(self): if self.cube.is_workflow: prepare_mounts["statistics_file"] = self.out_statistics_path + prepare_mounts["dataset_path"] = self.dataset.path self.ui.text = "Running preparation step..." try: @@ -282,31 +284,20 @@ def mark_dataset_as_ready(self): self.dataset.mark_as_ready() def __generate_report_dict(self): - report_status_dict = {} - if os.path.exists(self.report_path): with open(self.report_path, "r") as f: report_dict = yaml.safe_load(f) + return report_dict.get("progress", {}) - # TODO: this specific logic with status is very tuned to the RANO. Hope we'd - # make it more general once - report = pd.DataFrame(report_dict) - if "status" in report.keys(): - report_status = report.status.value_counts() / len(report) - report_status_dict = report_status.round(3).to_dict() - report_status_dict = { - f"Stage {key}": str(val * 100) + "%" - for key, val in report_status_dict.items() - } - - return report_status_dict + # If no report has been generated yet, return a blank report + return {} def prompt_for_report_sending_approval(self): example = { "execution_status": "running", "progress": { - "Stage 1": "40%", - "Stage 3": "60%", + "Stage 1": "40.0", + "Stage 3": "60.0", }, } @@ -351,6 +342,7 @@ def _send_report(self, report_metadata): report_status_dict = {} if self.allow_sending_reports: report_status_dict = self.__generate_report_dict() + report = {"progress": report_status_dict, **report_metadata} if report == self.dataset.report: # Watchdog may trigger an event even if contents didn't change From c46085bf37b501cc665b13697a06ae6972582785 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 15:35:54 -0300 Subject: [PATCH 065/176] Improve error message readability --- cli/medperf/containers/parsers/airflow_parser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index 77846eb72..3ba25d93b 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -91,6 +91,7 @@ def check_schema(self) -> str: error_msgs.append(msg) elif len(final_step_candidates) > 1: + final_step_candidates = [f"- {step}" for step in final_step_candidates] msg = "The provided YAML DAG file has multiple potential last steps. Please verify the following steps:\n" msg += "\n".join(final_step_candidates) error_msgs.append(msg) From edd5658a5a6856d44f8b7fa0eb538a5d6a67a0c3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 15:36:51 -0300 Subject: [PATCH 066/176] Various improvements in preparation to HEMnet pipeline --- .../dags/pipeline_state.py | 7 ++++ .../dags/yaml_parser/yaml_parser.py | 38 ++++++++++++------- cli/medperf/enums.py | 10 +++++ .../data_preparator_workflow/workflow.yaml | 19 +++++++--- 4 files changed, 54 insertions(+), 20 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py index f282aa6fc..d3846caf6 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/pipeline_state.py @@ -1,6 +1,13 @@ +import os + + class PipelineState: # TODO properly define def __init__(self, running_subject: str = None, **airflow_kwargs): self.running_subject = running_subject self.airflow_kwargs = airflow_kwargs + self.host_input_data_path = os.getenv("host_data_path") + self.host_output_data_path = os.getenv("host_output_path") + self.host_labels_path = os.getenv("host_labels_path") + self.host_output_labels_path = os.getenv("host_output_labels_path") diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index a9492794a..f948e3fe7 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -12,13 +12,25 @@ ) from medperf.containers.runners.airflow_runner_utils.dags.dag_builder import DagBuilder from copy import deepcopy +from medperf.enums import ContainerConfigMountKeys +from medperf.exceptions import MedperfException -def get_dict_value_by_key_prefix(key_prefix: str, dictionary: dict): +valid_mount_keys = [item.value for item in ContainerConfigMountKeys] + + +def get_dict_value_by_key_prefix( + key_prefix: str, dictionary: dict, key_suffix: str = None +): """ This assumes the values are effectively the same for the purposes this function is called. If they are different, then calling by suffix does not make sense! """ + if key_suffix is not None: + complete_key = create_legal_dag_id(f"{key_prefix}_{key_suffix}") + if complete_key in dictionary: + return dictionary[complete_key] + relevant_dict = { key: value for key, value in dictionary.items() if key.startswith(key_prefix) } @@ -285,8 +297,12 @@ def _host_mounts_first_pass( from_step = volume_data.get("from") if from_step is not None: look_on_second_pass.add(step["id"]) - else: + elif volume_name in valid_mount_keys: host_mounts[volume_name] = os.getenv(f"host_{volume_name}") + else: + raise MedperfException( + f'Invalid mount {volume_name} in step {step["id"]}' + ) @staticmethod def _host_mounts_second_pass( @@ -300,23 +316,17 @@ def _host_mounts_second_pass( volumes = step_mounts.get(volume_key, {}) for volume_name, volume_data in volumes.items(): - input_step_id_prefix = volume_data.get("from") + input_step_info = volume_data.get("from") - if input_step_id_prefix is None: + if input_step_info is None: continue # Done in first pass input_step = get_dict_value_by_key_prefix( - key_prefix=input_step_id_prefix, dictionary=step_id_to_expanded_step - ) - output_key = ( - "output_path" - if volume_name == "data_path" - else ( - "output_labels_path" - if volume_name == "labels_path" - else volume_name - ) + key_prefix=input_step_info["step"], + dictionary=step_id_to_expanded_step, + key_suffix=step.get("partition"), ) + output_key = input_step_info["mount"] step["host_mounts"][volume_name] = input_step["host_mounts"][output_key] def _update_next_with_new_partition(self, original_dict, original_next, new_next): diff --git a/cli/medperf/enums.py b/cli/medperf/enums.py index c240c935c..86654a2ef 100644 --- a/cli/medperf/enums.py +++ b/cli/medperf/enums.py @@ -18,3 +18,13 @@ class AutoApprovalMode(Enum): NEVER = "NEVER" ALWAYS = "ALWAYS" ALLOWLIST = "ALLOWLIST" + + +class ContainerConfigMountKeys(Enum): + data_path = "data_path" + output_path = "output_path" + labels_path = "labels_path" + output_labels_path = "output_labels_path" + statistics_file = "statistics_file" + additional_files = "additional_files" + parameters_file = "parameters_file" diff --git a/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml b/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml index 1d6776c0e..cfa99e653 100644 --- a/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml +++ b/examples/chestxray_tutorial/data_preparator_workflow/workflow.yaml @@ -33,15 +33,18 @@ steps: data_path: mount_path: /mlcommons/volumes/data type: directory - from: prepare + from: + step: prepare + mount: output_path labels_path: mount_path: /mlcommons/volumes/labels type: directory - from: prepare + from: + step: prepare + mount: output_labels_path parameters_file: mount_path: /mlcommons/volumes/parameters/parameters_file.yaml type: file - from: prepare next: statistics on_error: do_something @@ -54,16 +57,20 @@ steps: data_path: mount_path: /mlcommons/volumes/data type: directory - from: prepare + from: + step: prepare + mount: output_path labels_path: mount_path: /mlcommons/volumes/labels type: directory - from: prepare + from: + step: prepare + mount: output_path parameters_file: mount_path: /mlcommons/volumes/parameters/parameters_file.yaml type: file output_volumes: - output_path: + statistics_file: mount_path: /mlcommons/volumes/statistics/statistics.yaml type: file next: null From 93e28e10cfdebb376392751a8b34b37e04fff691 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 15:37:07 -0300 Subject: [PATCH 067/176] Avoid crash if asset events cannot be collected for checking completion --- .../runners/airflow_runner_utils/system_runner.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 5dfb1042e..13683fb62 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -305,7 +305,13 @@ async def _async_wait_for_dag(self): def _check_completed_asset(self, airflow_client: AirflowAPIClient) -> bool: """Checks if the final asset that marks pipeline completion has been updated""" - asset_events = airflow_client.assets.get_asset_events()["asset_events"] + try: + asset_events = airflow_client.assets.get_asset_events()["asset_events"] + except json.JSONDecodeError: + config.ui.print( + f"Error checking completion of the pipeline. Please use the Airflow WebUI to verify execution status." + ) + asset_events = [] if not asset_events: return False From 644ce388cb5511082b7f14f1be7a57b4bd5bcde8 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 15:37:46 -0300 Subject: [PATCH 068/176] First attempt at implementing HEMnet pipeline --- examples/HEMnet/data_preparator/.gitignore | 2 + examples/HEMnet/data_preparator/README.md | 67 +++++ .../HEMnet/data_preparator/project/Dockerfile | 6 + .../project/affine_registration.py | 159 +++++++++++ .../project/bspline_registration.py | 241 +++++++++++++++++ .../HEMnet/data_preparator/project/cleanup.py | 7 + .../project/consolidate_metrics.py | 29 ++ .../data_preparator/project/generate_masks.py | 189 +++++++++++++ .../project/image_registration.py | 165 ++++++++++++ .../data_preparator/project/mod_constants.py | 21 ++ .../data_preparator/project/mod_utils.py | 253 ++++++++++++++++++ .../project/normaliser_step.py | 42 +++ .../data_preparator/project/save_tiles.py | 115 ++++++++ examples/HEMnet/data_preparator/workflow.yaml | 162 +++++++++++ .../additional_files/slides_definition.py | 20 ++ .../workspace/additional_files/workflow.yaml | 1 + 16 files changed, 1479 insertions(+) create mode 100644 examples/HEMnet/data_preparator/.gitignore create mode 100644 examples/HEMnet/data_preparator/README.md create mode 100644 examples/HEMnet/data_preparator/project/Dockerfile create mode 100644 examples/HEMnet/data_preparator/project/affine_registration.py create mode 100644 examples/HEMnet/data_preparator/project/bspline_registration.py create mode 100644 examples/HEMnet/data_preparator/project/cleanup.py create mode 100644 examples/HEMnet/data_preparator/project/consolidate_metrics.py create mode 100644 examples/HEMnet/data_preparator/project/generate_masks.py create mode 100644 examples/HEMnet/data_preparator/project/image_registration.py create mode 100644 examples/HEMnet/data_preparator/project/mod_constants.py create mode 100644 examples/HEMnet/data_preparator/project/mod_utils.py create mode 100644 examples/HEMnet/data_preparator/project/normaliser_step.py create mode 100644 examples/HEMnet/data_preparator/project/save_tiles.py create mode 100644 examples/HEMnet/data_preparator/workflow.yaml create mode 100644 examples/HEMnet/data_preparator/workspace/additional_files/slides_definition.py create mode 120000 examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml diff --git a/examples/HEMnet/data_preparator/.gitignore b/examples/HEMnet/data_preparator/.gitignore new file mode 100644 index 000000000..de412e3b4 --- /dev/null +++ b/examples/HEMnet/data_preparator/.gitignore @@ -0,0 +1,2 @@ +svs/ +additional_files/workflow.yaml* \ No newline at end of file diff --git a/examples/HEMnet/data_preparator/README.md b/examples/HEMnet/data_preparator/README.md new file mode 100644 index 000000000..80a022958 --- /dev/null +++ b/examples/HEMnet/data_preparator/README.md @@ -0,0 +1,67 @@ +# HEMnet pipeline + +This pipeline runs the training data preparation procedure from [HEMnet](https://github.com/BiomedicalMachineLearning/HEMnet/tree/master). A modified version of their original [Docker image](https://hub.docker.com/layers/andrewsu1/hemnet/latest/images/sha256-5b371f828cfd41e223b46678cef157ec599847f17f0cf5711a0288908b287d5b) is used here, which splits the processing into separate steps that are chained together via CWL. This modified Docker image is available in DockerHub at [this link](), with the source code available in the `./project`subdirectory. The main modification of this version is splitting the pipeline into separate stages that can be executed by Airflow. + +## 1. Get the HEMnet data + +The data used for the HEMnet study is available on [this location](https://dna-discovery.stanford.edu/publicmaterial/web-resources/HEMnet/images/). The pipeline runs on pairs of TP53 and H&E (HandE suffix) slides. *The code does **NOT** check for valid pairings in inputs!* Make sure your input data is correctly formatted as shown below + + +``` +. +svs +├── NNN_C_XXXX_Y_TP53.svs +├── NNN_C_XXXX_Y_HandE.svs +``` + +Where `NNN` and `XXXX` ID numbers (`XXXX` may contain letters), `C` may be either equal to `T` (tumor) or `N` (non_tumor) and `Y` is a single digit number that may differ between slides of a given pair. For example, the structure below contains only valid input data pairings: + +``` +. +svs +├── 526_T_15907_2_TP53.svs +├── 526_T_15907_3_HandE.svs +├── 2065_N_127524A_2_HandE.svs +├── 2065_N_127524A_4_.TP53svs +├── 2171_T_11524A_2_HandE.svs +├── 2171_T_11524A_4_TP53.svs +``` + +While the example below is invalid. Notice the slightly different IDs in the pseudo-parings marked with (*) and (**). + +``` +. +svs +├── 526_T_15907_2_TP53.svs +├── 526_T_15907_3_HandE.svs +├── 2065_N_12752A_2_HandE.svs (*) +├── 2065_T_12756A_4_.TP53svs. (*) +├── 2171_N_11521A_2_HandE.svs (**) +├── 2171_T_11524A_4_TP53.svs (**) +``` + +### 2.1 Define the template slide +One of the slides used as input must be also used as the template slide. This template must be a copy of the original slide into the `templates` directory, inside the `svs` directory. The example below shows valid input using the `2171_T_11524A_4_TP53.svs` slide as the template slide: + +``` +. +svs +├──template +│ └── 2171_T_11524A_4_TP53.svs +├── 526_T_15907_2_TP53.svs +├── 526_T_15907_3_HandE.svs +├── 2065_N_127524A_2_HandE.svs +├── 2065_N_127524A_4_.TP53svs +├── 2171_T_11524A_2_HandE.svs +├── 2171_T_11524A_4_TP53.svs +``` + + + +## Appendix. Build the customized Docker image +From the directory of this README file, run the following commands +```shell +cd customized_image +docker build . -t local/hemnet:0.0.9 +``` +*NOTE!* If a different image tag is used, the CWL steps located at `./cwl/indivivdual_steps` must have their Docker requirements modified to match the name used. \ No newline at end of file diff --git a/examples/HEMnet/data_preparator/project/Dockerfile b/examples/HEMnet/data_preparator/project/Dockerfile new file mode 100644 index 000000000..9af4106e3 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/Dockerfile @@ -0,0 +1,6 @@ +FROM andrewsu1/hemnet:latest +RUN rm -rf /HEMnet && git clone -b master --single-branch --depth 1 https://github.com/BiomedicalMachineLearning/HEMnet.git +COPY *.py /HEMnet/HEMnet/ +WORKDIR "/HEMnet/HEMnet" +ENV PATH="/opt/conda/envs/HEMnet/bin:$PATH" +CMD [ "/bin/bash" ] \ No newline at end of file diff --git a/examples/HEMnet/data_preparator/project/affine_registration.py b/examples/HEMnet/data_preparator/project/affine_registration.py new file mode 100644 index 000000000..3cef6ff8a --- /dev/null +++ b/examples/HEMnet/data_preparator/project/affine_registration.py @@ -0,0 +1,159 @@ +import argparse +from mod_utils import ( + load_pil_image, + save_fig, + dump_sitk_transform, + dump_sitk_image, + get_fixed_and_moving_images, + load_df, + dump_df, +) +import matplotlib.pyplot as plt +import SimpleITK as sitk +from mod_constants import ( + OUTPUT_PATH, + INTERPOLATOR, + AFFINE_TRANSFORM_HDF, + MOVING_RESAMPLED_AFFINE_NPY, + TP53_GRAY, + HE_GRAY, +) +from utils import ( + calculate_mutual_info, + get_pil_from_itk, + start_plot, + update_multires_iterations, + update_plot, + plot_metric, + end_plot, +) +import time +import numpy as np + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-s", + "--subject-subdir", + type=str, + required=True, + help="Prefix that defines the slides used in this step.", + ) + parser.add_argument( + "-a", + "--align_mag", + type=float, + default=2, + help="Magnification for aligning H&E and TP53 slide", + ) + parser.add_argument( + "-v", "--verbosity", action="store_true", help="Increase output verbosity" + ) + + args = parser.parse_args() + # PATHS + PREFIX = args.subject_subdir + + # User selectable parameters + ALIGNMENT_MAG = args.align_mag + VERBOSE = args.verbosity + + print("Runing Affine Registration step on slide: {0}".format(PREFIX)) + + start = time.perf_counter() + tp53_gray = load_pil_image(TP53_GRAY, PREFIX) + he_gray = load_pil_image(HE_GRAY, PREFIX) + fixed_img, moving_img = get_fixed_and_moving_images(tp53_gray, he_gray) + performance_df = load_df(subdir=PREFIX) + end = time.perf_counter() + + print(f"Time spent on reloading normaliser and slides: {end-start}s") + + initial_transform = sitk.CenteredTransformInitializer( + fixed_img, + moving_img, + sitk.Euler2DTransform(), + sitk.CenteredTransformInitializerFilter.GEOMETRY, + ) + affine_method = sitk.ImageRegistrationMethod() + + # Similarity metric settings. + affine_method.SetMetricAsMattesMutualInformation(numberOfHistogramBins=50) + affine_method.SetMetricSamplingStrategy(affine_method.RANDOM) + affine_method.SetMetricSamplingPercentage(0.15) + + affine_method.SetInterpolator(INTERPOLATOR) + + # Optimizer settings. + affine_method.SetOptimizerAsGradientDescent( + learningRate=1, + numberOfIterations=100, + convergenceMinimumValue=1e-6, + convergenceWindowSize=20, + ) + affine_method.SetOptimizerScalesFromPhysicalShift() + + # Setup for the multi-resolution framework. + affine_method.SetShrinkFactorsPerLevel(shrinkFactors=[8, 4]) + affine_method.SetSmoothingSigmasPerLevel(smoothingSigmas=[4, 2]) + affine_method.SmoothingSigmasAreSpecifiedInPhysicalUnitsOn() + + # Don't optimize in-place, we would possibly like to run this cell multiple times. + affine_method.SetInitialTransform(initial_transform, inPlace=False) + + # Connect all of the observers so that we can perform plotting during registration. + affine_method.AddCommand(sitk.sitkStartEvent, start_plot) + affine_method.AddCommand( + sitk.sitkMultiResolutionIterationEvent, update_multires_iterations + ) + affine_method.AddCommand( + sitk.sitkIterationEvent, lambda: update_plot(affine_method) + ) + + affine_transform = affine_method.Execute( + sitk.Cast(fixed_img, sitk.sitkFloat32), + sitk.Cast(moving_img, sitk.sitkFloat32), + ) + + if VERBOSE: + affine_fig = plot_metric( + "Plot of mutual information cost in affine registration" + ) + plt.show() + save_fig(affine_fig, OUTPUT_PATH.joinpath(PREFIX + "affine_metric_plot.jpeg")) + end_plot() + + print( + "Affine Optimizer's stopping condition, {0}".format( + affine_method.GetOptimizerStopConditionDescription() + ) + ) + + # Compute the mutual information between the two images after affine registration + moving_resampled_affine = sitk.Resample( + moving_img, + fixed_img, + affine_transform, + INTERPOLATOR, + 0.0, + moving_img.GetPixelID(), + ) + affine_mutual_info = calculate_mutual_info( + np.array(he_gray), np.array(get_pil_from_itk(moving_resampled_affine)) + ) + if VERBOSE: + print("Affine mutual information metric: {0}".format(affine_mutual_info)) + + performance_df["Affine_Mutual_Info"] = affine_mutual_info + + dump_df(performance_df, subdir=PREFIX) + + dump_sitk_image( + sitk_image=moving_resampled_affine, + data_name=MOVING_RESAMPLED_AFFINE_NPY, + subdir=PREFIX, + ) + dump_sitk_transform( + sitk_transform=affine_transform, data_name=AFFINE_TRANSFORM_HDF, subdir=PREFIX + ) diff --git a/examples/HEMnet/data_preparator/project/bspline_registration.py b/examples/HEMnet/data_preparator/project/bspline_registration.py new file mode 100644 index 000000000..113856960 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/bspline_registration.py @@ -0,0 +1,241 @@ +import argparse +from mod_utils import ( + load_sitk_transform, + save_fig, + save_img, + dump_pil_image, + load_sitk_image, + load_pil_image, + get_fixed_and_moving_images, + load_and_magnify_slides_by_prefix, + load_df, + dump_df, +) +import matplotlib.pyplot as plt +import SimpleITK as sitk +from mod_constants import ( + OUTPUT_PATH, + INTERPOLATOR, + MOVING_RESAMPLED_AFFINE_NPY, + AFFINE_TRANSFORM_HDF, + HE_FILTERED_NPY, + TP53_FILTERED_NPY, + HE_GRAY, + HE_NORM, + TP53_GRAY, +) +from utils import ( + calculate_mutual_info, + get_pil_from_itk, + start_plot, + update_multires_iterations, + update_plot, + plot_metric, + end_plot, + sitk_transform_rgb, + PlotImageAlignment, + filter_green, + filter_grays, + show_alignment, +) +import time +import numpy as np + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-s", + "--subject-subdir", + type=str, + required=True, + help="Prefix that defines the slides used in this step.", + ) + parser.add_argument( + "-a", + "--align_mag", + type=float, + default=2, + help="Magnification for aligning H&E and TP53 slide", + ) + parser.add_argument( + "-v", "--verbosity", action="store_true", help="Increase output verbosity" + ) + + args = parser.parse_args() + # PATHS + PREFIX = args.subject_subdir + + # User selectable parameters + ALIGNMENT_MAG = args.align_mag + VERBOSE = args.verbosity + + print("Running B-Spline registration step on Slide: {0}".format(PREFIX)) + + start = time.perf_counter() + he, tp53 = load_and_magnify_slides_by_prefix(PREFIX, ALIGNMENT_MAG) + he_norm = load_pil_image(HE_NORM, PREFIX) + tp53_gray = load_pil_image(TP53_GRAY, PREFIX) + he_gray = load_pil_image(HE_GRAY, PREFIX) + fixed_img, moving_img = get_fixed_and_moving_images(tp53_gray, he_gray) + + moving_resampled_affine = load_sitk_image( + data_name=MOVING_RESAMPLED_AFFINE_NPY, subdir=PREFIX + ) + affine_transform = load_sitk_transform( + data_name=AFFINE_TRANSFORM_HDF, subdir=PREFIX + ) + performance_df = load_df(subdir=PREFIX) + end = time.perf_counter() + print(f"Time spent on reloading images and transforms: {end-start}s") + + bspline_method = sitk.ImageRegistrationMethod() + + # Similarity metric settings. + bspline_method.SetMetricAsMattesMutualInformation(numberOfHistogramBins=50) + bspline_method.SetMetricSamplingStrategy(bspline_method.RANDOM) + bspline_method.SetMetricSamplingPercentage(0.15) + + bspline_method.SetInterpolator(INTERPOLATOR) + + # Optimizer settings. + bspline_method.SetOptimizerAsGradientDescent( + learningRate=1, + numberOfIterations=200, + convergenceMinimumValue=1e-6, + convergenceWindowSize=10, + ) + bspline_method.SetOptimizerScalesFromPhysicalShift() + + # Setup for the multi-resolution framework. + bspline_method.SetShrinkFactorsPerLevel(shrinkFactors=[2, 1]) + bspline_method.SetSmoothingSigmasPerLevel(smoothingSigmas=[1, 0]) + bspline_method.SmoothingSigmasAreSpecifiedInPhysicalUnitsOn() + + # Don't optimize in-place, we would possibly like to run this cell multiple times. + transformDomainMeshSize = [8] * moving_resampled_affine.GetDimension() + initial_transform = sitk.BSplineTransformInitializer( + fixed_img, transformDomainMeshSize + ) + bspline_method.SetInitialTransform(initial_transform, inPlace=False) + + # Connect all of the observers so that we can perform plotting during registration. + bspline_method.AddCommand(sitk.sitkStartEvent, start_plot) + bspline_method.AddCommand( + sitk.sitkMultiResolutionIterationEvent, update_multires_iterations + ) + bspline_method.AddCommand( + sitk.sitkIterationEvent, lambda: update_plot(bspline_method) + ) + + bspline_transform = bspline_method.Execute( + sitk.Cast(fixed_img, sitk.sitkFloat32), + sitk.Cast(moving_resampled_affine, sitk.sitkFloat32), + ) + + if VERBOSE: + bspline_fig = plot_metric( + "Plot of mutual information cost in B-spline registration" + ) + plt.show() + + save_fig(bspline_fig, OUTPUT_PATH.joinpath(PREFIX + "bspline_metric_plot.jpeg")) + end_plot() + + print( + "B-spline Optimizer's stopping condition, {0}".format( + bspline_method.GetOptimizerStopConditionDescription() + ) + ) + + # Compute the mutual information between the two images after B-spline registration + moving_resampled_final = sitk.Resample( + moving_resampled_affine, + fixed_img, + bspline_transform, + INTERPOLATOR, + 0.0, + moving_img.GetPixelID(), + ) + bspline_mutual_info = calculate_mutual_info( + np.array(he_gray), np.array(get_pil_from_itk(moving_resampled_final)) + ) + if VERBOSE: + print("B-spline mutual information metric: {0}".format(bspline_mutual_info)) + + performance_df["Final_Mutual_Info"] = bspline_mutual_info + + # Transform the original TP53 into the aligned TP53 image + moving_rgb_affine = sitk_transform_rgb( + tp53, he_norm, affine_transform, INTERPOLATOR + ) + tp53_aligned = sitk_transform_rgb( + moving_rgb_affine, he_norm, bspline_transform, INTERPOLATOR + ) + + # Visualise and save alignment + if VERBOSE: + align_plotter = PlotImageAlignment("vertical", 300) + comparison_post_v_stripes = align_plotter.plot_images(he, tp53_aligned) + save_img( + comparison_post_v_stripes.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_post_align_v_stripes.jpeg"), + "JPEG", + ) + + align_plotter = PlotImageAlignment("horizontal", 300) + comparison_post_h_stripes = align_plotter.plot_images(he, tp53_aligned) + save_img( + comparison_post_h_stripes.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_post_align_h_stripes.jpeg"), + "JPEG", + ) + + align_plotter = PlotImageAlignment("mosaic", 300) + comparison_post_mosaic = align_plotter.plot_images(he, tp53_aligned) + save_img( + comparison_post_mosaic.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_post_align_mosaic.jpeg"), + "JPEG", + ) + + # Remove backgrounds from TP53 and H&E images + tp53_filtered = filter_green(tp53_aligned) + he_filtered = filter_green(he_norm) + tp53_filtered = filter_grays(tp53_filtered, tolerance=2) + he_filtered = filter_grays(he_filtered, tolerance=15) + + dump_df(performance_df, subdir=PREFIX) + + dump_pil_image( + pil_image=tp53_filtered, + data_name=TP53_FILTERED_NPY, + subdir=PREFIX, + ) + + dump_pil_image( + pil_image=he_filtered, + data_name=HE_FILTERED_NPY, + subdir=PREFIX, + ) + # Visually compare alignment between the registered TP53 and original H&E image + if VERBOSE: + comparison_post_colour_overlay = show_alignment(he_filtered, tp53_filtered) + save_img( + comparison_post_colour_overlay.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_post_align_colour_overlay.jpeg"), + "JPEG", + ) + + save_img( + tp53_aligned.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + str(ALIGNMENT_MAG) + "x_TP53_aligned.jpeg"), + "JPEG", + ) + save_img( + tp53_filtered.convert("RGB"), + OUTPUT_PATH.joinpath( + PREFIX + str(ALIGNMENT_MAG) + "x_TP53_aligned_white.jpeg" + ), + "JPEG", + ) diff --git a/examples/HEMnet/data_preparator/project/cleanup.py b/examples/HEMnet/data_preparator/project/cleanup.py new file mode 100644 index 000000000..962eb9e44 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/cleanup.py @@ -0,0 +1,7 @@ +import os +import shutil +from mod_constants import TEMP_DATA_PATH + +print("Running cleanup step") +if os.path.exists(TEMP_DATA_PATH): + shutil.rmtree(TEMP_DATA_PATH) diff --git a/examples/HEMnet/data_preparator/project/consolidate_metrics.py b/examples/HEMnet/data_preparator/project/consolidate_metrics.py new file mode 100644 index 000000000..ab46c933b --- /dev/null +++ b/examples/HEMnet/data_preparator/project/consolidate_metrics.py @@ -0,0 +1,29 @@ +import pandas as pd +import os +from mod_constants import OUTPUT_PATH, TEMP_DATA_PATH, PERFORMANCE_DF + +if __name__ == "__main__": + + final_df = pd.DataFrame() + + slide_subidrs = [subdir for subdir in os.listdir(TEMP_DATA_PATH)] + + for slide_subdir in slide_subidrs: + full_subdir = TEMP_DATA_PATH.joinpath(slide_subdir) + if not os.path.isdir(full_subdir): + continue + elif PERFORMANCE_DF not in os.listdir(full_subdir): + print( + f"Performance data not found for slide prefix {slide_subdir}. Will not be included in final metrics." + ) + continue + + df_path = os.path.join(full_subdir, PERFORMANCE_DF) + tmp_df = pd.read_csv(df_path, encoding="utf-8", index_col=0) + final_df = pd.concat([final_df, tmp_df], axis=0) + print(f"tmp_df=\n{tmp_df}") + print(f"final_df=\n{final_df}") + print("------------------------------------") + + final_path = OUTPUT_PATH.joinpath(PERFORMANCE_DF) + final_df.to_csv(final_path) diff --git a/examples/HEMnet/data_preparator/project/generate_masks.py b/examples/HEMnet/data_preparator/project/generate_masks.py new file mode 100644 index 000000000..2e2da54f0 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/generate_masks.py @@ -0,0 +1,189 @@ +import argparse +from mod_utils import save_img, dump_numpy_array, load_pil_image +from mod_constants import ( + OUTPUT_PATH, + HE_FILTERED_NPY, + TP53_FILTERED_NPY, + U_MASK_FILTERED, + C_MASK_FILTERED, + NON_C_MASK_FILTERED, + T_MASK_FILTERED, +) +from utils import ( + cancer_mask, + tissue_mask_grabcut, + plot_masks, +) + +from HEMnet_train_dataset import uncertain_mask, restricted_float +import time +import numpy as np + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-s", + "--subject-subdir", + type=str, + required=True, + help="Prefix that defines the slides used in this step.", + ) + parser.add_argument( + "-a", + "--align_mag", + type=float, + default=2, + help="Magnification for aligning H&E and TP53 slide", + ) + parser.add_argument( + "-m", + "--tile_mag", + type=float, + default=10, + help="Magnification for generating tiles", + ) + parser.add_argument( + "-ts", "--tile_size", type=int, default=224, help="Output tile size in pixels" + ) + parser.add_argument( + "-c", + "--cancer_thresh", + type=restricted_float, + default=0.39, + help="TP53 threshold for cancer classification", + ) + parser.add_argument( + "-nc", + "--non_cancer_thresh", + type=restricted_float, + default=0.40, + help="TP53 threshold for non-cancer classification", + ) + parser.add_argument( + "-v", "--verbosity", action="store_true", help="Increase output verbosity" + ) + + args = parser.parse_args() + # PATHS + PREFIX = args.subject_subdir + + # User selectable parameters + ALIGNMENT_MAG = args.align_mag + VERBOSE = args.verbosity + CANCER_THRESH = args.cancer_thresh + NON_CANCER_THRESH = args.non_cancer_thresh + TILE_MAG = args.tile_mag + OUTPUT_TILE_SIZE = args.tile_size + + print("Running Mask Generation step on Slide: {0}".format(PREFIX)) + + start = time.perf_counter() + he_filtered = load_pil_image(HE_FILTERED_NPY, PREFIX) + tp53_filtered = load_pil_image(TP53_FILTERED_NPY, PREFIX) + end = time.perf_counter() + print(f"Time spent on reloading filtered images: {end-start}s") + #################################### + # Generate cancer and tissue masks # + #################################### + + # Scale tile size for alignment mag + tile_size = OUTPUT_TILE_SIZE * ALIGNMENT_MAG / TILE_MAG + + # Generate cancer mask and tissue mask from filtered tp53 image + c_mask = cancer_mask(tp53_filtered, tile_size, 250).astype(np.bool) + t_mask_tp53 = tissue_mask_grabcut(tp53_filtered, tile_size) + t_mask_he = tissue_mask_grabcut(he_filtered, tile_size) + + # Generate tissue mask with tissue common to both the TP53 and H&E image + t_mask = np.logical_not(np.logical_not(t_mask_tp53) & np.logical_not(t_mask_he)) + + # Generate uncertain mask + u_mask = uncertain_mask(tp53_filtered, tile_size, CANCER_THRESH, NON_CANCER_THRESH) + u_mask_filtered = np.logical_not(np.logical_not(u_mask) & np.logical_not(t_mask)) + + # Filter tissue mask such that any uncertain tiles are removed + t_mask_filtered = np.zeros(t_mask.shape) + for x in range(t_mask.shape[0]): + for y in range(t_mask.shape[1]): + if t_mask[x, y] == 0 and u_mask[x, y] == 1: + t_mask_filtered[x, y] = False + else: + t_mask_filtered[x, y] = True + + non_c_mask = np.invert(c_mask) + non_c_mask = np.logical_not( + np.logical_and(np.logical_not(non_c_mask), np.logical_not(t_mask_filtered)) + ) + + # If Slide is normal + if "_N_" in PREFIX: + # if True: + # Merge cancer mask with uncertain mask + # This marks all tiles that are uncertain or cancer as uncertain + u_mask_filtered = np.logical_not( + np.logical_or(np.logical_not(u_mask_filtered), np.logical_not(c_mask)) + ) + # Blank out cancer mask so no cancer tiles exist + c_mask_filtered = np.ones(c_mask.shape, dtype=bool) + # Non cancer tiles are tiles that are in the tissue and not cancer + non_c_mask_filtered = np.logical_not( + np.logical_and(np.logical_not(non_c_mask), np.logical_not(t_mask_filtered)) + ) + if VERBOSE: + print("Normal Slide Identified") + + # If Slide is cancerous + if "T" in PREFIX: + # if False: + # Merge non-cancer mask with uncertain mask + u_mask_filtered = np.logical_not( + np.logical_or(np.logical_not(non_c_mask), np.logical_not(u_mask_filtered)) + ) + # Blank out non cancer mask + non_c_mask_filtered = np.ones(non_c_mask.shape, dtype=bool) + # Cancer tile are tiles that are in the tissue and not cancer + # Make sure all cancer tiles exist in the tissue mask + c_mask_filtered = np.logical_not( + np.logical_not(c_mask) & np.logical_not(t_mask_filtered) + ) + + # Overlay masks onto TP53 and H&E Image + if VERBOSE: + print("Cancer Slide Identified") + overlay_tp53 = plot_masks( + tp53_filtered, + c_mask_filtered, + t_mask_filtered, + tile_size, + u_mask_filtered, + ) + save_img( + overlay_tp53.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "TP53_overlay.jpeg"), + "JPEG", + ) + + overlay_he = plot_masks( + he_filtered, + c_mask_filtered, + t_mask_filtered, + tile_size, + u_mask_filtered, + ) + save_img( + overlay_he.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "HE_overlay.jpeg"), + "JPEG", + ) + + arrays_to_save_tuples = [ + (u_mask_filtered, U_MASK_FILTERED), + (c_mask_filtered, C_MASK_FILTERED), + (non_c_mask_filtered, NON_C_MASK_FILTERED), + (t_mask_filtered, T_MASK_FILTERED), + ] + + for array_to_save_tuple in arrays_to_save_tuples: + array, filename = array_to_save_tuple + dump_numpy_array(array, filename, PREFIX) diff --git a/examples/HEMnet/data_preparator/project/image_registration.py b/examples/HEMnet/data_preparator/project/image_registration.py new file mode 100644 index 000000000..1f8b750d6 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/image_registration.py @@ -0,0 +1,165 @@ +import argparse +from mod_utils import ( + load_and_magnify_slides_by_prefix, + save_img, + load_data, + dump_pil_image, + get_fixed_and_moving_images, + dump_data, + get_slide_names_by_prefix, + get_template_slide_from_dir, + dump_df, +) +import SimpleITK as sitk +from mod_constants import ( + OUTPUT_PATH, + INTERPOLATOR, + NORMALISER_PKL, + HE_NORM, + HE_GRAY, + TP53_GRAY, +) +from utils import ( + sitk_transform_rgb, + PlotImageAlignment, + show_alignment, + calculate_mutual_info, + get_pil_from_itk, +) +import numpy as np +import os +import pandas as pd + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-s", + "--subject-subdir", + type=str, + required=True, + help="Prefix that defines the slides used in this step.", + ) + parser.add_argument( + "-a", + "--align_mag", + type=float, + default=2, + help="Magnification for aligning H&E and TP53 slide", + ) + parser.add_argument( + "-v", "--verbosity", action="store_true", help="Increase output verbosity" + ) + + args = parser.parse_args() + # PATHS + PREFIX = args.subject_subdir + + # User selectable parameters + ALIGNMENT_MAG = args.align_mag + VERBOSE = args.verbosity + + print("Running Image Registration step on Slide: {0}".format(PREFIX)) + + template_slide_name = get_template_slide_from_dir() + template_slide_name = os.path.basename(template_slide_name) + he_name, tp53_name = get_slide_names_by_prefix(PREFIX) + he, tp53 = load_and_magnify_slides_by_prefix(PREFIX, ALIGNMENT_MAG) + normaliser = load_data(data_name=NORMALISER_PKL) + + # Normalise H&E Slide + normaliser.fit_source(he) + he_norm = normaliser.transform_tile(he) + dump_data(data_obj=normaliser, data_name=NORMALISER_PKL, subdir=PREFIX) + + if VERBOSE: + save_img( + he_norm.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + str(ALIGNMENT_MAG) + "x_normalised.jpeg"), + "JPEG", + ) + + ###################### + # Image Registration # + ###################### + + # Convert to grayscale + tp53_gray = tp53.convert("L") + he_gray = he_norm.convert("L") + + # Dump images necessary for future steps + dump_pil_image(he_norm, HE_NORM, PREFIX) + dump_pil_image(he_gray, HE_GRAY, PREFIX) + dump_pil_image(tp53_gray, TP53_GRAY, PREFIX) + + # Set fixed and moving images + fixed_img, moving_img = get_fixed_and_moving_images(tp53_gray, he_gray) + + # Check initial registration + # Centre the two images, then compare their alignment + initial_transform = sitk.CenteredTransformInitializer( + fixed_img, + moving_img, + sitk.Euler2DTransform(), + sitk.CenteredTransformInitializerFilter.GEOMETRY, + ) + moving_rgb = sitk_transform_rgb(tp53, he_norm, initial_transform) + + # Visualise and save alignment + if VERBOSE: + align_plotter = PlotImageAlignment("vertical", 300) + comparison_pre_v_stripes = align_plotter.plot_images(he, moving_rgb) + save_img( + comparison_pre_v_stripes.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_pre_align_v_stripes.jpeg"), + "JPEG", + ) + + align_plotter = PlotImageAlignment("horizontal", 300) + comparison_pre_h_stripes = align_plotter.plot_images(he, moving_rgb) + save_img( + comparison_pre_h_stripes.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_pre_align_h_stripes.jpeg"), + "JPEG", + ) + + align_plotter = PlotImageAlignment("mosaic", 300) + comparison_pre_mosaic = align_plotter.plot_images(he, moving_rgb) + save_img( + comparison_pre_mosaic.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_pre_align_mosaic.jpeg"), + "JPEG", + ) + + comparison_pre_colour_overlay = show_alignment( + he_norm, moving_rgb, prefilter=True + ) + save_img( + comparison_pre_colour_overlay.convert("RGB"), + OUTPUT_PATH.joinpath(PREFIX + "comparison_pre_align_colour_overlay.jpeg"), + "JPEG", + ) + + # Compute the mutual information between the two images before registration + moving_resampled_initial = sitk.Resample( + moving_img, + fixed_img, + initial_transform, + INTERPOLATOR, + 0.0, + moving_img.GetPixelID(), + ) + initial_mutual_info = calculate_mutual_info( + np.array(he_gray), np.array(get_pil_from_itk(moving_resampled_initial)) + ) + if VERBOSE: + print("Initial mutual information metric: {0}".format(initial_mutual_info)) + + info_dict = { + "TP53_Slide_Name": tp53_name, + "H&E_Slide_Name": he_name, + "Template_Slide_Name": template_slide_name, + "Initial_Mutual_Info": initial_mutual_info, + } + performance_df = pd.DataFrame([info_dict]) + dump_df(performance_df, subdir=PREFIX) diff --git a/examples/HEMnet/data_preparator/project/mod_constants.py b/examples/HEMnet/data_preparator/project/mod_constants.py new file mode 100644 index 000000000..8fa76945d --- /dev/null +++ b/examples/HEMnet/data_preparator/project/mod_constants.py @@ -0,0 +1,21 @@ +from pathlib import Path +import SimpleITK as sitk + +BASE_DIR = Path("/workspace") +INPUT_PATH = BASE_DIR.joinpath("input_data") +OUTPUT_PATH = BASE_DIR.joinpath("data") +TEMP_DATA_PATH = BASE_DIR.joinpath(".tmp") +NORMALISER_PKL = "normaliser.pkl" +AFFINE_TRANSFORM_HDF = "affine_transform.hdf" +MOVING_RESAMPLED_AFFINE_NPY = "moving_resampled_affine.npy" +TP53_FILTERED_NPY = 'tp53_filtered.npy' +HE_FILTERED_NPY = 'he_filtered.npy' +INTERPOLATOR = sitk.sitkLanczosWindowedSinc +U_MASK_FILTERED = 'u_mask_filtered.npy' +C_MASK_FILTERED = 'c_mask_filtered.npy' +NON_C_MASK_FILTERED = 'non_c_mask_filtered.npy' +T_MASK_FILTERED = 't_mask_filtered.npy' +HE_NORM = 'he_norm.npy' +HE_GRAY = 'he_gray.npy' +TP53_GRAY = 'tp53_gray.npy' +PERFORMANCE_DF = 'performance_metrics.csv' \ No newline at end of file diff --git a/examples/HEMnet/data_preparator/project/mod_utils.py b/examples/HEMnet/data_preparator/project/mod_utils.py new file mode 100644 index 000000000..2008f1dd0 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/mod_utils.py @@ -0,0 +1,253 @@ +import os +from openslide import open_slide +from mod_constants import INPUT_PATH, TEMP_DATA_PATH, NORMALISER_PKL, PERFORMANCE_DF +from slide import read_slide_at_mag +from normaliser import IterativeNormaliser +import pickle +import SimpleITK as sitk +import numpy as np +from utils import get_pil_from_itk +from PIL import Image +from utils import get_itk_from_pil +import pandas as pd + + +def save_img(img, path, img_type): + img.save(path, img_type) + + +def save_fig(fig, path, dpi=300): + fig.savefig(path, dpi=dpi) + + +def get_template_slide_from_dir(template_slide_path: str = None): + input_dir = str(INPUT_PATH) + template_dir = os.path.join(input_dir, "template") + try: + slides = [file for file in os.listdir(template_dir) if file.endswith(".svs")] + + template_slide_path = os.path.join(template_dir, slides[0]) + + if len(slides) > 1: + print( + f"More than 1 slide found at {template_dir}. Using {template_slide_path} as the template." + ) + except OSError: + raise ValueError( + f"Please provide an explicit template slide either with the -t option or by setting a single .svs file at the {os.path.join(template_dir)} directory!" + ) + return template_slide_path + + +def create_target_fitted_normaliser( + alignment_mag, normaliser_method, standardise_luminosity +) -> IterativeNormaliser: + template_slide_path = get_template_slide_from_dir() + + print( + f"Using slide located at {template_slide_path} as the template to instantiate normaliser." + ) + template_slide = open_slide(str(template_slide_path)) + template_img = read_slide_at_mag(template_slide, alignment_mag).convert("RGB") + + normaliser = IterativeNormaliser(normaliser_method, standardise_luminosity) + normaliser.fit_target(template_img) + + return normaliser + + +def _get_saved_file_full_path(filename, subdir: str = None): + os.makedirs(TEMP_DATA_PATH, exist_ok=True) + data_dir = TEMP_DATA_PATH + if subdir is not None: + data_dir = TEMP_DATA_PATH.joinpath(subdir) + os.makedirs(data_dir, exist_ok=True) + full_pickle_path = data_dir.joinpath(filename) + return full_pickle_path + + +def dump_numpy_array(np_array, data_name: str, subdir: str = None): + np_path = _get_saved_file_full_path(data_name, subdir) + with open(np_path, "wb") as f: + np.save(f, np_array) + + +def load_numpy_array(data_name: str, subdir: str = None): + np_path = _get_saved_file_full_path(data_name, subdir) + with open(np_path, "rb") as f: + np_array = np.load(f) + return np_array + + +def dump_pil_image(pil_image, data_name: str, subdir: str = None): + as_np = np.array(pil_image) + dump_numpy_array(as_np, data_name, subdir) + + +def load_pil_image(data_name: str, subdir: str = None): + as_np = load_numpy_array(data_name, subdir) + pil_image = Image.fromarray(as_np) + return pil_image + + +def dump_sitk_image(sitk_image, data_name: str, subdir: str = None): + as_pil = get_pil_from_itk(sitk_image) + dump_pil_image(as_pil, data_name, subdir) + + +def load_sitk_image(data_name, subdir: str = None): + as_np = load_numpy_array(data_name, subdir) + as_itk = sitk.GetImageFromArray(as_np) + return as_itk + + +def dump_sitk_transform( + sitk_transform: sitk.Transform, data_name: str, subdir: str = None +): + print(f"Dumping SITK transform {data_name}...") + transform_path = str(_get_saved_file_full_path(data_name, subdir)) + sitk_transform.FlattenTransform() + sitk_transform.WriteTransform(transform_path) + + +def load_sitk_transform(data_name, subdir: str = None): + transform_path = str(_get_saved_file_full_path(data_name, subdir)) + sitk_transform = sitk.ReadTransform(transform_path) + return sitk_transform + + +def dump_data(data_obj, data_name: str, subdir: str = None): + full_path = _get_saved_file_full_path(data_name, subdir) + with open(full_path, "wb") as f: + pickle.dump(data_obj, f) + print(f"Successfully dumped object {data_name} at {full_path}.") + + +def load_data(data_name: str, subdir: str = None): + full_path = _get_saved_file_full_path(data_name, subdir) + with open(full_path, "rb") as f: + normalizer_obj = pickle.load(f) + print(f"Successfully loaded object {data_name} from {full_path}.") + return normalizer_obj + + +def dump_df(df: pd.DataFrame, df_name: str = PERFORMANCE_DF, subdir: str = None): + full_path = _get_saved_file_full_path(df_name, subdir) + df.to_csv(full_path, encoding="utf-8") + + +def load_df(df_name: str = PERFORMANCE_DF, subdir: str = None): + full_path = _get_saved_file_full_path(df_name, subdir) + df = pd.read_csv(full_path, encoding="utf-8", index_col=0) + return df + + +def get_slide_names_by_prefix(prefix: str): + relevant_filenames = sorted( + [file for file in os.listdir(INPUT_PATH) if prefix in file], + key=lambda file: ( + file.split("_")[0], + file.split("_")[-1], + ), # Order by prefix (integer) then by suffix (HandE first, then TP53) + ) + he_name, tp53_name = relevant_filenames + return he_name, tp53_name + + +def load_slides_by_prefix(prefix: str): + print(f"Loading slides with prefix {prefix}") + relevant_filenames = get_slide_names_by_prefix(prefix) + relevant_filepaths = sorted( + [os.path.join(INPUT_PATH, file) for file in relevant_filenames] + ) + + he_path, tp53_path = relevant_filepaths + + tp53_slide = open_slide(tp53_path) + he_slide = open_slide(he_path) + + print(f"Successfully loaded slides with prefix {prefix}.") + return he_slide, tp53_slide + + +def load_and_magnify_slides_by_prefix(prefix: str, aligment_mag: float): + he_slide, tp53_slide = load_slides_by_prefix(prefix) + + # Load Slides + he = read_slide_at_mag(he_slide, aligment_mag) + tp53 = read_slide_at_mag(tp53_slide, aligment_mag) + print(f"Successfully loaded and magnified slides with prefix {prefix}.") + return he, tp53 + + +def get_fixed_and_moving_images(tp53_gray, he_gray): + # Convert to ITK format + tp53_itk = get_itk_from_pil(tp53_gray) + he_itk = get_itk_from_pil(he_gray) + + fixed_img = he_itk + moving_img = tp53_itk + + return fixed_img, moving_img + + +def save_train_tiles( + path, + tile_gen, + cancer_mask, + tissue_mask, + uncertain_mask, + prefix="", + verbose: bool = False, +): + """Save tiles for train dataset + + Parameters + ---------- + path : Pathlib Path + tile_gen : tile_gen + cancer_mask : ndarray + tissue_mask : ndarray + uncertain_mask : ndarray + prefix : str (optional) + + Returns + ------- + None + """ + normaliser = load_data(data_name=NORMALISER_PKL, subdir=prefix) + os.makedirs(path.joinpath("cancer"), exist_ok=True) + os.makedirs(path.joinpath("non-cancer"), exist_ok=True) + os.makedirs(path.joinpath("uncertain"), exist_ok=True) + x_tiles, y_tiles = next(tile_gen) + + if verbose: + print("Whole Image Size is {0} x {1}".format(x_tiles, y_tiles)) + i = 0 + cancer = 0 + uncertain = 0 + non_cancer = 0 + for tile in tile_gen: + img = tile.convert("RGB") + ### + img_norm = normaliser.transform_tile(img) + ### + # Name tile as horizontal position _ vertical position starting at (0,0) + tile_name = prefix + str(np.floor_divide(i, x_tiles)) + "_" + str(i % x_tiles) + if uncertain_mask.ravel()[i] == 0: + img_norm.save(path.joinpath("uncertain", tile_name + ".jpeg"), "JPEG") + uncertain += 1 + elif cancer_mask.ravel()[i] == 0: + img_norm.save(path.joinpath("cancer", tile_name + ".jpeg"), "JPEG") + cancer += 1 + elif tissue_mask.ravel()[i] == 0: + img_norm.save(path.joinpath("non-cancer", tile_name + ".jpeg"), "JPEG") + non_cancer += 1 + i += 1 + if verbose: + print( + "Cancer tiles: {0}, Non Cancer tiles: {1}, Uncertain tiles: {2}".format( + cancer, non_cancer, uncertain + ) + ) + print("Exported tiles for {0}".format(prefix)) diff --git a/examples/HEMnet/data_preparator/project/normaliser_step.py b/examples/HEMnet/data_preparator/project/normaliser_step.py new file mode 100644 index 000000000..32f098663 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/normaliser_step.py @@ -0,0 +1,42 @@ +import argparse +from pathlib import Path +from mod_utils import ( + create_target_fitted_normaliser, + dump_data, +) +from mod_constants import NORMALISER_PKL + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "-n", + "--normaliser", + type=str, + default="vahadane", + choices=["none", "reinhard", "macenko", "vahadane"], + help="H&E normalisation method", + ) + parser.add_argument( + "-std", + "--standardise_luminosity", + action="store_false", + help="Disable luminosity standardisation", + ) + parser.add_argument( + "-a", + "--align_mag", + type=float, + default=2, + help="Magnification for aligning H&E and TP53 slide", + ) + + print("Running Normaliser step") + args = parser.parse_args() + + ALIGNMENT_MAG = args.align_mag + NORMALISER_METHOD = args.normaliser + STANDARDISE_LUMINOSITY = args.standardise_luminosity + + normaliser = create_target_fitted_normaliser(ALIGNMENT_MAG, NORMALISER_METHOD, STANDARDISE_LUMINOSITY) + dump_data(data_obj=normaliser, data_name=NORMALISER_PKL) diff --git a/examples/HEMnet/data_preparator/project/save_tiles.py b/examples/HEMnet/data_preparator/project/save_tiles.py new file mode 100644 index 000000000..798a61936 --- /dev/null +++ b/examples/HEMnet/data_preparator/project/save_tiles.py @@ -0,0 +1,115 @@ +import argparse +from mod_utils import load_numpy_array, load_slides_by_prefix, save_train_tiles, load_df, dump_df +from mod_constants import ( + OUTPUT_PATH, + U_MASK_FILTERED, + NON_C_MASK_FILTERED, + C_MASK_FILTERED, + T_MASK_FILTERED, +) +from slide import tile_gen_at_mag + +from HEMnet_train_dataset import restricted_float +import time +import numpy as np +import os + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-s", + "--subject-subdir", + type=str, + required=True, + help="Prefix that defines the slides used in this step.", + ) + parser.add_argument( + "-a", + "--align_mag", + type=float, + default=2, + help="Magnification for aligning H&E and TP53 slide", + ) + parser.add_argument( + "-m", + "--tile_mag", + type=float, + default=10, + help="Magnification for generating tiles", + ) + parser.add_argument( + "-ts", "--tile_size", type=int, default=224, help="Output tile size in pixels" + ) + parser.add_argument( + "-c", + "--cancer_thresh", + type=restricted_float, + default=0.39, + help="TP53 threshold for cancer classification", + ) + parser.add_argument( + "-nc", + "--non_cancer_thresh", + type=restricted_float, + default=0.40, + help="TP53 threshold for non-cancer classification", + ) + parser.add_argument( + "-v", "--verbosity", action="store_true", help="Increase output verbosity" + ) + + args = parser.parse_args() + # PATHS + PREFIX = args.subject_subdir + + # User selectable parameters + ALIGNMENT_MAG = args.align_mag + VERBOSE = args.verbosity + CANCER_THRESH = args.cancer_thresh + NON_CANCER_THRESH = args.non_cancer_thresh + TILE_MAG = args.tile_mag + OUTPUT_TILE_SIZE = args.tile_size + + print("Saving tiles from Slide: {0}".format(PREFIX)) + + start = time.perf_counter() + he_slide, _ = load_slides_by_prefix(PREFIX) + u_mask_filtered = load_numpy_array(U_MASK_FILTERED, PREFIX) + c_mask_filtered = load_numpy_array(C_MASK_FILTERED, PREFIX) + non_c_mask_filtered = (load_numpy_array(NON_C_MASK_FILTERED, PREFIX),) + t_mask_filtered = load_numpy_array(T_MASK_FILTERED, PREFIX) + performance_df = load_df(subdir=PREFIX) + end = time.perf_counter() + print(f"Time spent on reloading normaliser and slides: {end-start}s") + + ############## + # Save Tiles # + ############## + + # Make Directory to save tiles + TILES_PATH = OUTPUT_PATH.joinpath("tiles_" + str(TILE_MAG) + "x") + os.makedirs(TILES_PATH, exist_ok=True) + + # Save tiles + tgen = tile_gen_at_mag(he_slide, TILE_MAG, OUTPUT_TILE_SIZE) + save_train_tiles( + TILES_PATH, + tgen, + c_mask_filtered, + t_mask_filtered, + u_mask_filtered, + prefix=PREFIX, + ) + + non_cancer_tiles = np.invert(non_c_mask_filtered).sum() + + uncertain_tiles = np.invert(u_mask_filtered).sum() + + cancer_tiles = np.invert(c_mask_filtered).sum() + + performance_df["Cancer_Tiles"] = cancer_tiles + performance_df["Uncertain_Tiles"] = uncertain_tiles + performance_df["Non_Cancer_Tiles"] = non_cancer_tiles + + dump_df(performance_df, subdir=PREFIX) diff --git a/examples/HEMnet/data_preparator/workflow.yaml b/examples/HEMnet/data_preparator/workflow.yaml new file mode 100644 index 000000000..9a042f5b9 --- /dev/null +++ b/examples/HEMnet/data_preparator/workflow.yaml @@ -0,0 +1,162 @@ +steps: + - id: create_normalisation + type: container + image: local/hemnet:0.0.6 + command: python normaliser_step.py + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + next: image_registration + per_subject: false + + - id: image_registration + type: container + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + normalisation_input: + mount_path: /workspace/data + type: directory + from: + step: create_normalisation + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + image: local/hemnet:0.0.6 + command: python image_registration.py -v + per_subject: true + next: affine_registration + + - id: affine_registration + type: container + image: local/hemnet:0.0.6 + mounts: + input_volumes: + image_registration_input: + mount_path: /workspace/data + type: directory + from: + step: image_registration + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: python affine_registration.py -v + next: bspline_registration + per_subject: true + limit: 1 + + - id: bspline_registration + type: container + image: local/hemnet:0.0.6 + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + affine_registration_input: + mount_path: /workspace/data + type: directory + from: + step: affine_registration + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: python bspline_registration.py -v + next: generate_masks + per_subject: true + limit: 1 + + - id: generate_masks + type: container + image: local/hemnet:0.0.6 + mounts: + input_volumes: + bspline_registration_input: + mount_path: /workspace/data + type: directory + from: + step: bspline_registration + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: python generate_masks.py -v + next: save_tiles + per_subject: true + limit: 2 + + - id: save_tiles + type: container + image: local/hemnet:0.0.6 + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + generate_masks_input: + mount_path: /workspace/data + type: directory + from: + step: generate_masks + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: python save_tiles.py -v + next: consolidate_metrics + per_subject: true + limit: 2 + + - id: consolidate_metrics + type: container + image: local/hemnet:0.0.6 + mounts: + input_volumes: + save_tiles_input: + mount_path: /workspace/data + type: directory + from: + step: save_tiles + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: python consolidate_metrics.py + next: cleanup + per_subject: true + + - id: cleanup + type: container + image: local/hemnet:0.0.6 + per_subject: false + mounts: + input_volumes: + consolidate_metrics_input: + mount_path: /workspace/data + type: directory + from: + step: consolidate_metrics + mount: output_path + command: python cleanup.py + next: null + +per_subject_def: + type: function + function_name: slides_definition.slides_definition \ No newline at end of file diff --git a/examples/HEMnet/data_preparator/workspace/additional_files/slides_definition.py b/examples/HEMnet/data_preparator/workspace/additional_files/slides_definition.py new file mode 100644 index 000000000..d75f279e8 --- /dev/null +++ b/examples/HEMnet/data_preparator/workspace/additional_files/slides_definition.py @@ -0,0 +1,20 @@ +def slides_definition(pipeline_state): + """ + This preserves the behavior of the original code of assuming the user only + sends paired slides into the input directory. + If unpaired slides are sent, this code does NOT check for that! + """ + from pathlib import Path + + input_data_dir = Path(pipeline_state.host_input_data_path) + slides = [] + + for slide in input_data_dir.glob("*.svs"): + name = slide.name + slides.append(name) + slides.sort() + TP53_slides = [slide for slide in slides if "TP53" in slide] + HE_slides = [slide for slide in slides if "HandE" in slide] + Paired_slides = list(zip(TP53_slides, HE_slides)) + prefixes = [paired_slide[0][:-10] for paired_slide in Paired_slides] + return prefixes diff --git a/examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml b/examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml new file mode 120000 index 000000000..24a82c557 --- /dev/null +++ b/examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml @@ -0,0 +1 @@ +/Users/brunorodrigues/MLCommons/medperf/examples/HEMnet/data_preparator/workflow.yaml \ No newline at end of file From ccecfba985fed3fb3ba718e077fa3bb068e45ded Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 15:38:59 -0300 Subject: [PATCH 069/176] Remove redundant workflow yaml file --- .../data_preparator/workspace/additional_files/workflow.yaml | 1 - 1 file changed, 1 deletion(-) delete mode 120000 examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml diff --git a/examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml b/examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml deleted file mode 120000 index 24a82c557..000000000 --- a/examples/HEMnet/data_preparator/workspace/additional_files/workflow.yaml +++ /dev/null @@ -1 +0,0 @@ -/Users/brunorodrigues/MLCommons/medperf/examples/HEMnet/data_preparator/workflow.yaml \ No newline at end of file From c19ed80a9938b0c0e995a8928406474e7581c266 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 15:41:23 -0300 Subject: [PATCH 070/176] Update seed_utils with updated workflow file --- server/seed_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index 8756d0315..ad4a432ac 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -292,7 +292,7 @@ def create_workflow_benchmark( DATA_PREP_ASSETS_WORKFLOW_URL = ( "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" - "685bea196aa4314023dbeea939b94f44fb7efbab/examples/" + "edd5658a5a6856d44f8b7fa0eb538a5d6a67a0c3/examples/" "chestxray_tutorial/data_preparator_workflow/" ) # Create a Data preprocessor MLCube by Benchmark Owner From 0bd3d726a69d67ff4e5e1b05cd84bc9250109b10 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 16:05:40 -0300 Subject: [PATCH 071/176] Revert "Improve seeding logic. Always create 2 benchmarks (1 with workflow, 1 with container) so tests can use both" This reverts commit 9399c03dd27b68f279b28f2c2a702d2b8b8c6a18. --- server/seed.py | 35 +++---- server/seed_utils.py | 226 +++++++++++++++++++++++++++---------------- 2 files changed, 155 insertions(+), 106 deletions(-) diff --git a/server/seed.py b/server/seed.py index 352e30bc7..d00351b3a 100644 --- a/server/seed.py +++ b/server/seed.py @@ -14,8 +14,6 @@ create_benchmark, create_model, create_workflow_benchmark, - associate_model_to_benchmark, - create_benchmark_ref_model_and_metrics_containers, ) from auth_provider_token import auth_provider_token from pathlib import Path @@ -76,30 +74,17 @@ def seed(args): return # create benchmark benchmark_owner_token = get_token("testbo@example.com") - ref_model, evaluator = create_benchmark_ref_model_and_metrics_containers( - api_server, benchmark_owner_token, admin_token - ) - container_benchmark = create_benchmark( - api_server, ref_model, evaluator, benchmark_owner_token, admin_token - ) - workflow_benchmark = create_workflow_benchmark( - api_server, ref_model, evaluator, benchmark_owner_token, admin_token - ) + if args.workflow: + benchmark = create_workflow_benchmark( + api_server, benchmark_owner_token, admin_token + ) + else: + benchmark = create_benchmark(api_server, benchmark_owner_token, admin_token) if args.demo == "model": return # create model model_owner_token = get_token("testmo@example.com") - model = create_model(api_server, model_owner_token) - associate_model_to_benchmark( - api_server, model_owner_token, benchmark_owner_token, model, container_benchmark - ) - associate_model_to_benchmark( - api_server, - model_owner_token, - benchmark_owner_token, - model, - workflow_benchmark, - ) + create_model(api_server, model_owner_token, benchmark_owner_token, benchmark) if __name__ == "__main__": @@ -137,6 +122,12 @@ def seed(args): help="Path to local tokens file", default=default_tokens_file, ) + parser.add_argument( + "-w", + "--workflow", + action="store_true", + help="Use an Airflow workflow instead of a container for Data Preparation", + ) args = parser.parse_args() if args.cert.lower() == "none": args.cert = None diff --git a/server/seed_utils.py b/server/seed_utils.py index ad4a432ac..0876ce08c 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -92,10 +92,54 @@ def set_user_as_admin(api_server, access_token): os.chdir(cwd) -def create_benchmark_ref_model_and_metrics_containers( - api_server, benchmark_owner_token, admin_token -): +def create_benchmark(api_server, benchmark_owner_token, admin_token): print("##########################BENCHMARK OWNER##########################") + + # Create a Data preprocessor MLCube by Benchmark Owner + data_preprocessor_mlcube = api_server.request( + "/mlcubes/", + "POST", + benchmark_owner_token, + { + "name": "chestxray_prep", + "git_mlcube_url": (ASSETS_URL + "data_preparator/container_config.yaml"), + "mlcube_hash": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31", + "git_parameters_url": ( + ASSETS_URL + "data_preparator/workspace/parameters.yaml" + ), + "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", + "image_tarball_url": "", + "image_tarball_hash": "", + "image_hash": { + "default": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" + }, + "additional_files_tarball_url": "", + "additional_files_tarball_hash": "", + "metadata": { + "digest": "f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + }, + }, + "id", + ) + print( + "Data Preprocessor MLCube Created(by Benchmark Owner). ID:", + data_preprocessor_mlcube, + ) + + # Update state of the Data preprocessor MLCube to OPERATION + data_preprocessor_mlcube_state = api_server.request( + "/mlcubes/" + str(data_preprocessor_mlcube) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", + ) + print( + "Data Preprocessor MlCube state updated to", + data_preprocessor_mlcube_state, + "by Benchmark Owner", + ) + # Create a reference model executor mlcube by Benchmark Owner reference_model_executor_mlcube = api_server.request( "/mlcubes/", @@ -187,37 +231,64 @@ def create_benchmark_ref_model_and_metrics_containers( "by Benchmark Owner", ) - return reference_model_executor_mlcube, data_evaluator_mlcube - + # Create a new benchmark by Benchmark owner + benchmark = api_server.request( + "/benchmarks/", + "POST", + benchmark_owner_token, + { + "name": "chestxray", + "description": "benchmark-sample", + "docs_url": "", + "demo_dataset_tarball_url": "https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz", + "demo_dataset_tarball_hash": "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00", + "demo_dataset_generated_uid": "730d2474d8f22340d9da89fa2eb925fcb95683e0", + "data_preparation_mlcube": data_preprocessor_mlcube, + "reference_model_mlcube": reference_model_executor_mlcube, + "data_evaluator_mlcube": data_evaluator_mlcube, + }, + "id", + ) + print("Benchmark Created(by Benchmark Owner). ID:", benchmark) -def create_benchmark( - api_server, - reference_model_executor_mlcube, - data_evaluator_mlcube, - benchmark_owner_token, - admin_token, -): - print( - "#################BENCHMARK WITH DATA PREPARATION CONTAINER###################" + # Update the benchmark state to OPERATION + benchmark_state = api_server.request( + "/benchmarks/" + str(benchmark) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", ) + print("Benchmark state updated to", benchmark_state, "by Benchmark owner") + + return benchmark + +def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): + print("##########################BENCHMARK OWNER##########################") + + DATA_PREP_ASSETS_WORKFLOW_URL = ( + "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" + "edd5658a5a6856d44f8b7fa0eb538a5d6a67a0c3/examples/" + "chestxray_tutorial/data_preparator_workflow/" + ) # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( "/mlcubes/", "POST", benchmark_owner_token, { - "name": "chestxray_prep", - "git_mlcube_url": (ASSETS_URL + "data_preparator/container_config.yaml"), - "mlcube_hash": "173d593918abdde0e008dc4dbad12393e9b26cd27787570337f7ef4923946e31", + "name": "chestxray_wprep", + "git_mlcube_url": (DATA_PREP_ASSETS_WORKFLOW_URL + "workflow.yaml"), + "mlcube_hash": "4617173987929fc78471c77318318340067c669eb54f4e0aa3f7d88c4e973f9b", "git_parameters_url": ( - ASSETS_URL + "data_preparator/workspace/parameters.yaml" + DATA_PREP_ASSETS_WORKFLOW_URL + "workspace/parameters.yaml" ), "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "default": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" + "mlcommons/chestxray-tutorial-prep:0.0.1": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -246,97 +317,94 @@ def create_benchmark( "by Benchmark Owner", ) - # Create a new benchmark by Benchmark owner - benchmark = api_server.request( - "/benchmarks/", + # Create a reference model executor mlcube by Benchmark Owner + reference_model_executor_mlcube = api_server.request( + "/mlcubes/", "POST", benchmark_owner_token, { - "name": "chestxray", - "description": "benchmark-sample", - "docs_url": "", - "demo_dataset_tarball_url": "https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz", - "demo_dataset_tarball_hash": "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00", - "demo_dataset_generated_uid": "730d2474d8f22340d9da89fa2eb925fcb95683e0", - "data_preparation_mlcube": data_preprocessor_mlcube, - "reference_model_mlcube": reference_model_executor_mlcube, - "data_evaluator_mlcube": data_evaluator_mlcube, + "name": "chestxray_cnn", + "git_mlcube_url": (ASSETS_URL + "model_custom_cnn/container_config.yaml"), + "mlcube_hash": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc", + "git_parameters_url": ( + ASSETS_URL + "model_custom_cnn/workspace/parameters.yaml" + ), + "parameters_hash": "af0aed4735b5075c198f8b49b3afbf7a0d7eaaaaa2a2b914d5931f0bee51d3f6", + "additional_files_tarball_url": ( + "https://storage.googleapis.com/medperf-storage/" + "chestxray_tutorial/cnn_weights.tar.gz" + ), + "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", + "image_hash": { + "default": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5" + }, + "image_tarball_url": "", + "image_tarball_hash": "", + "metadata": { + "digest": "a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" + }, }, "id", ) - print("Benchmark Created(by Benchmark Owner). ID:", benchmark) + print( + "Reference Model Executor MlCube Created(by Benchmark Owner). ID:", + reference_model_executor_mlcube, + ) - # Update the benchmark state to OPERATION - benchmark_state = api_server.request( - "/benchmarks/" + str(benchmark) + "/", + # Update state of the Reference Model Executor MLCube to OPERATION + reference_model_executor_mlcube_state = api_server.request( + "/mlcubes/" + str(reference_model_executor_mlcube) + "/", "PUT", benchmark_owner_token, {"state": "OPERATION"}, "state", ) - print("Benchmark state updated to", benchmark_state, "by Benchmark owner") - - return benchmark - - -def create_workflow_benchmark( - api_server, - reference_model_executor_mlcube, - data_evaluator_mlcube, - benchmark_owner_token, - admin_token, -): print( - "#################BENCHMARK WITH DATA PREPARATION CONTAINER###################" + "Reference Model Executor MlCube state updated to", + reference_model_executor_mlcube_state, + "by Benchmark Owner", ) - DATA_PREP_ASSETS_WORKFLOW_URL = ( - "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" - "edd5658a5a6856d44f8b7fa0eb538a5d6a67a0c3/examples/" - "chestxray_tutorial/data_preparator_workflow/" - ) - # Create a Data preprocessor MLCube by Benchmark Owner - data_preprocessor_mlcube = api_server.request( + # Create a Data evalutor MLCube by Benchmark Owner + data_evaluator_mlcube = api_server.request( "/mlcubes/", "POST", benchmark_owner_token, { - "name": "chestxray_wprep", - "git_mlcube_url": (DATA_PREP_ASSETS_WORKFLOW_URL + "workflow.yaml"), - "mlcube_hash": "4617173987929fc78471c77318318340067c669eb54f4e0aa3f7d88c4e973f9b", - "git_parameters_url": ( - DATA_PREP_ASSETS_WORKFLOW_URL + "workspace/parameters.yaml" - ), - "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", + "name": "chestxray_metrics", + "git_mlcube_url": (ASSETS_URL + "metrics/container_config.yaml"), + "mlcube_hash": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7", + "git_parameters_url": (ASSETS_URL + "metrics/workspace/parameters.yaml"), + "parameters_hash": "16cad451c54b801a5b50d999330465d7f68ab5f6d30a0674268d2d17c7f26b73", "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "mlcommons/chestxray-tutorial-prep:0.0.1": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" + "default": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": { - "digest": "f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + "digest": "d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" }, }, "id", ) print( - "Data Preprocessor Workflow Created(by Benchmark Owner). ID:", - data_preprocessor_mlcube, + "Data Evaluator MlCube Created(by Benchmark Owner). ID:", + data_evaluator_mlcube, ) - # Update state of the Data preprocessor MLCube to OPERATION - data_preprocessor_mlcube_state = api_server.request( - "/mlcubes/" + str(data_preprocessor_mlcube) + "/", + # Update state of the Data Evaluator MLCube to OPERATION + data_evaluator_mlcube_state = api_server.request( + "/mlcubes/" + str(data_evaluator_mlcube) + "/", "PUT", benchmark_owner_token, {"state": "OPERATION"}, "state", ) print( - "Data Preprocessor Workflow state updated to", - data_preprocessor_mlcube_state, + "Data Evaluator MlCube state updated to", + data_evaluator_mlcube_state, "by Benchmark Owner", ) @@ -346,8 +414,8 @@ def create_workflow_benchmark( "POST", benchmark_owner_token, { - "name": "wchestxray", - "description": "workflow-sample", + "name": "chestxray", + "description": "benchmark-sample", "docs_url": "", "demo_dataset_tarball_url": "https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz", "demo_dataset_tarball_hash": "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00", @@ -382,7 +450,7 @@ def create_workflow_benchmark( return benchmark -def create_model(api_server, model_owner_token): +def create_model(api_server, model_owner_token, benchmark_owner_token, benchmark): print("##########################MODEL OWNER##########################") # Model Owner Interaction @@ -431,16 +499,6 @@ def create_model(api_server, model_owner_token): "by Model Owner", ) - return model_executor1_mlcube - - -def associate_model_to_benchmark( - api_server, - model_owner_token, - benchmark_owner_token, - model_executor1_mlcube, - benchmark, -): # Associate the model-executor1 mlcube to the created benchmark by model owner user model_executor1_in_benchmark = api_server.request( "/mlcubes/benchmarks/", From aae268090b2ebd8b9c7cc465b1dd6d0012a3f226 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 16:10:10 -0300 Subject: [PATCH 072/176] Quick fix import after merge --- cli/medperf/containers/runners/airflow_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 63b4ae1fa..68ebfc8e6 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -9,9 +9,9 @@ from medperf.containers.parsers.airflow_parser import AirflowParser from medperf.account_management import get_medperf_user_data from .utils import ( - run_command, check_docker_image_hash, ) +from medperf.utils import run_command from medperf.comms.entity_resources import resources from .runner import Runner import logging From b90b77ba90402d8ea2791ba97430ccd51c45e3b7 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 24 Nov 2025 16:15:14 -0300 Subject: [PATCH 073/176] linting --- cli/medperf/commands/dataset/prepare.py | 1 - .../containers/parsers/airflow_parser.py | 2 +- cli/medperf/containers/parsers/factory.py | 2 +- .../containers/runners/airflow_runner.py | 1 - .../docker_operator_buider.py | 2 +- .../singularity_operator_builder.py | 2 -- .../airflow_runner_utils/system_runner.py | 4 +-- .../containers/runners/docker_runner.py | 36 ------------------- cli/medperf/utils.py | 4 --- 9 files changed, 5 insertions(+), 49 deletions(-) diff --git a/cli/medperf/commands/dataset/prepare.py b/cli/medperf/commands/dataset/prepare.py index 55b1c0e7c..2fdba94bc 100644 --- a/cli/medperf/commands/dataset/prepare.py +++ b/cli/medperf/commands/dataset/prepare.py @@ -1,7 +1,6 @@ from __future__ import annotations import logging import os -import pandas as pd from medperf.entities.dataset import Dataset import medperf.config as config from medperf.entities.cube import Cube diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index 3ba25d93b..596cd5487 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -113,7 +113,7 @@ def _check_mandatory_fields( if step.get("id"): step_identifier = f"step {step['id']}" else: - step_identifier = f"{step_index+1}th step" + step_identifier = f"{step_index + 1}th step" msg = ( f"The {step_identifier} in the yaml file is missing the " f"following mandatory fields: ', '.join({ordered_fields})" diff --git a/cli/medperf/containers/parsers/factory.py b/cli/medperf/containers/parsers/factory.py index 78d1e7a98..ed3423965 100644 --- a/cli/medperf/containers/parsers/factory.py +++ b/cli/medperf/containers/parsers/factory.py @@ -6,6 +6,7 @@ from .simple_container import SimpleContainerParser from medperf.enums import ContainerTypes import logging +from .airflow_parser import AirflowParser DOCKER_TYPES = [ ContainerTypes.DOCKER_IMAGE.value, @@ -16,7 +17,6 @@ ContainerTypes.SINGULARITY_FILE.value, ContainerTypes.ENCRYPTED_SINGULARITY_FILE.value, ] -from .airflow_parser import AirflowParser def _is_mlcube_yaml_file(container_config: dict): diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 68ebfc8e6..515fb44b3 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -13,7 +13,6 @@ ) from medperf.utils import run_command from medperf.comms.entity_resources import resources -from .runner import Runner import logging from .docker_utils import get_docker_image_hash diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index f9cce5016..6f2f9fd18 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -27,7 +27,7 @@ def _define_base_operator(self) -> DockerOperator: mounts=self.mounts, task_id=self.operator_id, task_display_name=self.display_name, - auto_remove="success", + # auto_remove="success", mount_tmp_dir=False, outlets=self.outlets, user=f"{os.getuid()}:{os.getgid()}", diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py index 098b5efb9..34f46a189 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py @@ -1,7 +1,5 @@ from .container_operator_builder import ContainerOperatorBuilder, MountInfo from airflow.providers.singularity.operators.singularity import SingularityOperator -import os -from medperf.exceptions import MedperfException class SingularityOperatorBuilder(ContainerOperatorBuilder): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 13683fb62..8dc085fb7 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -137,7 +137,7 @@ def _initialize_components(self): } self.db = PostgresDBDocker( - project_name=self.project_name, # TODO Check platform to instantiate singularity version, when singularity version is implementated + project_name=self.project_name, # TODO Check platform to instantiate singularity version root_dir=self.airflow_home, postgres_user="airflow", postgres_db="airflow", @@ -309,7 +309,7 @@ def _check_completed_asset(self, airflow_client: AirflowAPIClient) -> bool: asset_events = airflow_client.assets.get_asset_events()["asset_events"] except json.JSONDecodeError: config.ui.print( - f"Error checking completion of the pipeline. Please use the Airflow WebUI to verify execution status." + "Error checking completion of the pipeline. Please use the Airflow WebUI to verify execution status." ) asset_events = [] diff --git a/cli/medperf/containers/runners/docker_runner.py b/cli/medperf/containers/runners/docker_runner.py index d8930412d..61b473d33 100644 --- a/cli/medperf/containers/runners/docker_runner.py +++ b/cli/medperf/containers/runners/docker_runner.py @@ -53,29 +53,6 @@ def download( alternative_image_hash, ) - def _download_docker_image( - self, - hashes_dict, - download_timeout: int = None, - get_hash_timeout: int = None, - alternative_image_hash: str = None, - ): - if self.parser.is_docker_archive(): - logging.debug("Downloading Docker archive") - return self._download_docker_archive( - hashes_dict, - download_timeout, - get_hash_timeout, - ) - else: - logging.debug("Downloading Docker image") - return self._download_docker_image( - hashes_dict, - download_timeout, - get_hash_timeout, - alternative_image_hash, - ) - def _download_docker_image( self, hashes_dict: Dict[str, str], @@ -108,19 +85,6 @@ def _download_docker_archive( self.image_archive_path = image_path return {file_url: computed_image_hash} - def _download_docker_archive( - self, - expected_image_hash, - download_timeout: int = None, - get_hash_timeout: int = None, - ): - file_url = self.parser.get_setup_args() - image_path, computed_image_hash = resources.get_cube_image( - file_url, expected_image_hash - ) # Hash checking happens in resources - self.image_archive_path = image_path - return computed_image_hash - def run( self, task: str, diff --git a/cli/medperf/utils.py b/cli/medperf/utils.py index 6e14111be..298c1a754 100644 --- a/cli/medperf/utils.py +++ b/cli/medperf/utils.py @@ -25,13 +25,9 @@ CleanExit, ExecutionError, InvalidArgumentError, - MedperfException, ) -import subprocess -import venv import shlex from pydantic import TypeAdapter -import shlex from email_validator import validate_email, EmailNotValidError From fcb188b945a6ea80e841dc3635487ca2a464bf13 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 08:19:10 -0300 Subject: [PATCH 074/176] more fixes after merge --- cli/medperf/containers/parsers/airflow_parser.py | 12 ++++++++++++ cli/medperf/containers/runners/airflow_runner.py | 1 + 2 files changed, 13 insertions(+) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index 596cd5487..83753a9dc 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -198,3 +198,15 @@ def has_metadata(self): def is_metadata_specified(self): return self._has_metadata + + def is_container_encrypted(self): + return False + + def is_docker_archive(self): + return False + + def is_docker_image(self): + return False + + def is_singularity_file(self): + return False diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 515fb44b3..52a787ae2 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -73,6 +73,7 @@ def run( medperf_env: dict[str, str] = {}, ports: list = [], disable_network: bool = True, + container_decryption_key_file: str = None, ): email = get_medperf_user_data()["email"] From 4ee5158b88032f671a976e431221eed1135e9d31 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 08:19:23 -0300 Subject: [PATCH 075/176] Update seed_utils with newer hash for data prep workflow --- server/seed_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index 0876ce08c..c5619db15 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -280,7 +280,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): { "name": "chestxray_wprep", "git_mlcube_url": (DATA_PREP_ASSETS_WORKFLOW_URL + "workflow.yaml"), - "mlcube_hash": "4617173987929fc78471c77318318340067c669eb54f4e0aa3f7d88c4e973f9b", + "mlcube_hash": "1bfb153a9ea72ccb36f24264f82a9f003d03472a4e046b9b22422b63f75688e2", "git_parameters_url": ( DATA_PREP_ASSETS_WORKFLOW_URL + "workspace/parameters.yaml" ), From fddcc00129830bedf10ba69e98ed55788171bfcf Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 08:27:04 -0300 Subject: [PATCH 076/176] Improve tests for for running workflows --- .github/workflows/local-ci.yml | 4 ++++ cli/cli_chestxray_tutorial_test.sh | 30 ++++++------------------------ cli/tests_setup.sh | 2 -- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 33994136a..9a9d53c1d 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -62,6 +62,10 @@ jobs: - name: Run chestxray demo working-directory: . run: sh cli/cli_chestxray_tutorial_test.sh -f + + - name: Refresh DB for Workflow test + working-directory: ./server + run: sh reset_db.sh && python seed.py --cert cert.crt -w - name: Run chestxray demo with workflow working-directory: . diff --git a/cli/cli_chestxray_tutorial_test.sh b/cli/cli_chestxray_tutorial_test.sh index f10461712..229bf20d5 100755 --- a/cli/cli_chestxray_tutorial_test.sh +++ b/cli/cli_chestxray_tutorial_test.sh @@ -12,24 +12,6 @@ echo "downloading files to $DIRECTORY" wget -P $DIRECTORY https://storage.googleapis.com/medperf-storage/chestxray_tutorial/sample_raw_data.tar.gz tar -xzvf $DIRECTORY/sample_raw_data.tar.gz -C $DIRECTORY -if ${WORKFLOW}; then - BMK_UID=2 - DSET_NAME="nih_chestxray_w" - - # Remove one file if workflow so we get different dataset hashes - echo "Removing $DIRECTORY/sample_raw_data/images/00028846_000.png for workflow execution" - rm -rf $DIRECTORY/sample_raw_data/images/00028846_000.png - if [[ "$OS" == "Linux" ]]; then - sed -i '$d' $DIRECTORY/sample_raw_data/labels/labels.csv - elif [[ "$OS" == "Darwin" ]]; then - sed -i '' '$d' $DIRECTORY/sample_raw_data/labels/labels.csv - fi -else - BMK_UID=1 - DSET_NAME="nih_chestxray" - PMODEL_NAME="privmodel" -fi - chmod a+w $DIRECTORY/sample_raw_data ########################################################## @@ -88,7 +70,7 @@ echo "=====================================" echo ""Change association approval policy to auto approve always"" echo "=====================================" # Log in as the benchmark owner -print_eval medperf benchmark update_associations_policy -b $BMK_UID \ +print_eval medperf benchmark update_associations_policy -b 1 \ --dataset_auto_approve_mode ALWAYS --model_auto_approve_mode ALWAYS checkFailed "benchmark update policy failed" ########################################################## @@ -109,7 +91,7 @@ echo "\n" echo "=====================================" echo "Registering dataset with medperf" echo "=====================================" -print_eval "medperf dataset submit -b $BMK_UID -d $DIRECTORY/sample_raw_data/images -l $DIRECTORY/sample_raw_data/labels --name='$DSET_NAME' --description='sample dataset' --location='mock location' -y" +print_eval "medperf dataset submit -b 1 -d $DIRECTORY/sample_raw_data/images -l $DIRECTORY/sample_raw_data/labels --name='nih_chestxray' --description='sample dataset' --location='mock location' -y" checkFailed "Data registration step failed" DSET_UID=$(medperf dataset ls | tail -n 1 | tr -s ' ' | cut -d ' ' -f 2) echo "Dataset UID: $DSET_UID" @@ -121,7 +103,7 @@ echo "\n" echo "=====================================" echo "Running data preparation step" echo "=====================================" -print_eval medperf dataset prepare -d $DSET_UID +print_eval medperf dataset prepare -d $DSET_UID -y checkFailed "Data preparation step failed" ########################################################## @@ -141,7 +123,7 @@ echo "\n" echo "=====================================" echo "Creating dataset benchmark association" echo "=====================================" -print_eval medperf dataset associate -d $DSET_UID -b $BMK_UID -y +print_eval medperf dataset associate -d $DSET_UID -b 1 -y checkFailed "Data association step failed" ########################################################## @@ -151,7 +133,7 @@ echo "\n" echo "=============================================" echo "Getting a certificate" echo "=============================================" -print_eval medperf certificate get_client_certificate +print_eval medperf certificate get_client_certificate --overwrite checkFailed "Failed to obtain Data Owner Certificate" ########################################################## @@ -225,7 +207,7 @@ echo "=====================================" echo "Running benchmark execution step - Public" echo "=====================================" # Create results -print_eval medperf run -b $BMK_UID -d $DSET_UID -m 6 -y +print_eval medperf run -b 1 -d $DSET_UID -m 5 -y checkFailed "Benchmark execution step failed (public)" ########################################################## diff --git a/cli/tests_setup.sh b/cli/tests_setup.sh index 6a6047c81..b07691bc8 100644 --- a/cli/tests_setup.sh +++ b/cli/tests_setup.sh @@ -6,7 +6,6 @@ while getopts s:d:c:ft::w flag; do c) CLEANUP="true" ;; f) FRESH="true" ;; t) TIMEOUT=${OPTARG} ;; - w) WORKFLOW="true" esac done @@ -14,7 +13,6 @@ SERVER_URL="${SERVER_URL:-https://localhost:8000}" DIRECTORY="${DIRECTORY:-/tmp/medperf_test_files}" CLEANUP="${CLEANUP:-false}" FRESH="${FRESH:-false}" -WORKFLOW="${WORKFLOW:-false}" OS=$(uname) TEST_ROOT="/tmp/medperf_tests_$(date +%Y%m%d%H%M%S)" From 0715f20df9462b29413735607faec68b6c75856d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 08:48:53 -0300 Subject: [PATCH 077/176] Add option to run chestxray test without running private model --- .github/workflows/local-ci.yml | 8 +- cli/cli_chestxray_tutorial_test.sh | 213 +++++++++++++++-------------- cli/tests_setup.sh | 4 +- 3 files changed, 120 insertions(+), 105 deletions(-) diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 9a9d53c1d..24748b5c5 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -59,17 +59,17 @@ jobs: working-directory: ./server run: python seed.py --cert cert.crt - - name: Run chestxray demo + - name: Run chestxray demo including private model working-directory: . - run: sh cli/cli_chestxray_tutorial_test.sh -f + run: sh cli/cli_chestxray_tutorial_test.sh -f -p - name: Refresh DB for Workflow test working-directory: ./server run: sh reset_db.sh && python seed.py --cert cert.crt -w - - name: Run chestxray demo with workflow + - name: Run chestxray demo with workflow (no private model) working-directory: . - run: sh cli/cli_chestxray_tutorial_test.sh -f -w + run: sh cli/cli_chestxray_tutorial_test.sh -f - name: Run client integration tests working-directory: . diff --git a/cli/cli_chestxray_tutorial_test.sh b/cli/cli_chestxray_tutorial_test.sh index 229bf20d5..31bce5fd9 100755 --- a/cli/cli_chestxray_tutorial_test.sh +++ b/cli/cli_chestxray_tutorial_test.sh @@ -28,8 +28,11 @@ print_eval medperf profile create -n testdata checkFailed "testdata profile creation failed" print_eval medperf profile create -n noserver checkFailed "noserver profile creation failed" -print_eval medperf profile create -n testprivate -checkFailed "testprivate profile creation failed" + +if ${PRIVATE}; then + print_eval medperf profile create -n testprivate + checkFailed "testprivate profile creation failed" +fi print_eval medperf profile set --server https://example.com checkFailed "setting mock server failed" @@ -48,11 +51,13 @@ checkFailed "testdata profile activation failed" print_eval medperf auth login -e $DATAOWNER checkFailed "testdata login failed" -print_eval medperf profile activate testprivate -checkFailed "testprivate profile activation failed" +if ${PRIVATE}; then + print_eval medperf profile activate testprivate + checkFailed "testprivate profile activation failed" -print_eval medperf auth login -e $PRIVATEMODELOWNER -checkFailed "testprivate login failed" + print_eval medperf auth login -e $PRIVATEMODELOWNER + checkFailed "testprivate login failed" +fi ########################################################## echo "=====================================" @@ -129,68 +134,70 @@ checkFailed "Data association step failed" echo "\n" -########################################################## -echo "=============================================" -echo "Getting a certificate" -echo "=============================================" -print_eval medperf certificate get_client_certificate --overwrite -checkFailed "Failed to obtain Data Owner Certificate" -########################################################## - -echo "\n" - -########################################################## -echo "=============================================" -echo "Submitting the certificate" -echo "=============================================" -print_eval medperf certificate submit_client_certificate -y -checkFailed "Failed to submit Data Owner Certificate" -########################################################## - -echo "\n" - -########################################################## -echo "=====================================" -echo "Activate Model Owner Profile" -echo "=====================================" -print_eval medperf profile activate testprivate -checkFailed "testprivate profile activation failed" -########################################################## - -echo "\n" - -########################################################## -echo "=====================================" -echo "Submit a private model" -echo "=====================================" -print_eval medperf container submit --name privmodel \ - -m $CHESTXRAY_ENCRYPTED_MODEL -p $CHESTXRAY_ENCRYPTED_MODEL_PARAMS \ - -a $CHESTXRAY_ENCRYPTED_MODEL_ADD --decryption_key $PRIVATE_MODEL_LOCAL/key.bin --operational -checkFailed "private container submission failed" -PMODEL_UID=$(medperf container ls | grep privmodel | head -n 1 | tr -s ' ' | cut -d ' ' -f 2) -########################################################## - -echo "\n" - -########################################################## -echo "=====================================" -echo "Running private model association" -echo "=====================================" -print_eval medperf container associate -m $PMODEL_UID -b 1 -y -checkFailed "private model association failed" -########################################################## - -echo "\n" - -########################################################## -echo "=====================================" -echo "Give Access to Private Model" -echo "=====================================" -print_eval medperf container grant_access --model-id $PMODEL_UID --benchmark-id 1 -y -checkFailed "Failed to Give Model Access to Data owner" -########################################################## - -echo "\n" +if ${PRIVATE}; then + ########################################################## + echo "=============================================" + echo "Getting a certificate" + echo "=============================================" + print_eval medperf certificate get_client_certificate --overwrite + checkFailed "Failed to obtain Data Owner Certificate" + ########################################################## + + echo "\n" + + ########################################################## + echo "=============================================" + echo "Submitting the certificate" + echo "=============================================" + print_eval medperf certificate submit_client_certificate -y + checkFailed "Failed to submit Data Owner Certificate" + ########################################################## + + echo "\n" + + ########################################################## + echo "=====================================" + echo "Activate Private Model Owner Profile" + echo "=====================================" + print_eval medperf profile activate testprivate + checkFailed "testprivate profile activation failed" + ########################################################## + + echo "\n" + + ########################################################## + echo "=====================================" + echo "Submit a private model" + echo "=====================================" + print_eval medperf container submit --name privmodel \ + -m $CHESTXRAY_ENCRYPTED_MODEL -p $CHESTXRAY_ENCRYPTED_MODEL_PARAMS \ + -a $CHESTXRAY_ENCRYPTED_MODEL_ADD --decryption_key $PRIVATE_MODEL_LOCAL/key.bin --operational + checkFailed "private container submission failed" + PMODEL_UID=$(medperf container ls | grep privmodel | head -n 1 | tr -s ' ' | cut -d ' ' -f 2) + ########################################################## + + echo "\n" + + ########################################################## + echo "=====================================" + echo "Running private model association" + echo "=====================================" + print_eval medperf container associate -m $PMODEL_UID -b 1 -y + checkFailed "private model association failed" + ########################################################## + + echo "\n" + + ########################################################## + echo "=====================================" + echo "Give Access to Private Model" + echo "=====================================" + print_eval medperf container grant_access --model-id $PMODEL_UID --benchmark-id 1 -y + checkFailed "Failed to Give Model Access to Data owner" + ########################################################## + + echo "\n" +fi ########################################################## echo "=====================================" @@ -213,16 +220,18 @@ checkFailed "Benchmark execution step failed (public)" echo "\n" -########################################################## -echo "=====================================" -echo "Running benchmark execution step - Private" -echo "=====================================" -# Create results -print_eval medperf run -b 1 -d $DSET_UID -m $PMODEL_UID -y -checkFailed "Benchmark execution step failed (private)" -########################################################## - -echo "\n" +if ${PRIVATE}; then + ########################################################## + echo "=====================================" + echo "Running benchmark execution step - Private" + echo "=====================================" + # Create results + print_eval medperf run -b 1 -d $DSET_UID -m $PMODEL_UID -y + checkFailed "Benchmark execution step failed (private)" + ########################################################## + + echo "\n" +fi ########################################################## echo "=====================================" @@ -252,26 +261,28 @@ checkFailed "offline compatibility test execution step failed - public model" echo "\n" -########################################################## -echo "=====================================" -echo " Offline Compatibility Test - Private " -echo "=====================================" -print_eval medperf test run --offline --no-cache \ - --demo_dataset_url https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz \ - --demo_dataset_hash "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00" \ - -p $PREP_LOCAL/container_config.yaml \ - -m $PRIVATE_MODEL_LOCAL/container_config.yaml \ - -e $METRIC_LOCAL/container_config.yaml \ - -d $PRIVATE_MODEL_LOCAL/key.bin - -checkFailed "offline compatibility test execution step failed - private model" - -print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.tar.gz -print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.pth -print_eval rm $PRIVATE_MODEL_LOCAL/workspace/additional_files/cnn_weights.pth -########################################################## - -echo "\n" +if ${PRIVATE}; then + ########################################################## + echo "=====================================" + echo " Offline Compatibility Test - Private " + echo "=====================================" + print_eval medperf test run --offline --no-cache \ + --demo_dataset_url https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz \ + --demo_dataset_hash "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00" \ + -p $PREP_LOCAL/container_config.yaml \ + -m $PRIVATE_MODEL_LOCAL/container_config.yaml \ + -e $METRIC_LOCAL/container_config.yaml \ + -d $PRIVATE_MODEL_LOCAL/key.bin + + checkFailed "offline compatibility test execution step failed - private model" + + print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.tar.gz + print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.pth + print_eval rm $PRIVATE_MODEL_LOCAL/workspace/additional_files/cnn_weights.pth + ########################################################## + + echo "\n" +fi ########################################################## echo "=====================================" @@ -308,8 +319,10 @@ checkFailed "Profile deletion failed" print_eval medperf profile delete noserver checkFailed "Profile deletion failed" -print_eval medperf profile delete testprivate -checkFailed "Profile deletion failed" +if ${PRIVATE}; then + print_eval medperf profile delete testprivate + checkFailed "Profile deletion failed" +fi if ${CLEANUP}; then clean diff --git a/cli/tests_setup.sh b/cli/tests_setup.sh index b07691bc8..b561cc746 100644 --- a/cli/tests_setup.sh +++ b/cli/tests_setup.sh @@ -1,11 +1,12 @@ #! /bin/bash -while getopts s:d:c:ft::w flag; do +while getopts s:d:c:ft::p flag; do case "${flag}" in s) SERVER_URL=${OPTARG} ;; d) DIRECTORY=${OPTARG} ;; c) CLEANUP="true" ;; f) FRESH="true" ;; t) TIMEOUT=${OPTARG} ;; + p) PRIVATE="true" ;; esac done @@ -13,6 +14,7 @@ SERVER_URL="${SERVER_URL:-https://localhost:8000}" DIRECTORY="${DIRECTORY:-/tmp/medperf_test_files}" CLEANUP="${CLEANUP:-false}" FRESH="${FRESH:-false}" +PRIVATE="${PRIVATE:-false}" # Include private model in cli_chestxray_tutorial_test OS=$(uname) TEST_ROOT="/tmp/medperf_tests_$(date +%Y%m%d%H%M%S)" From 881ac4399e34d553ec97fddc4e9477ee19a6eca0 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 11:00:21 -0300 Subject: [PATCH 078/176] Move .tmp dir into output --- .../data_preparator/project/mod_constants.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/HEMnet/data_preparator/project/mod_constants.py b/examples/HEMnet/data_preparator/project/mod_constants.py index 8fa76945d..4661142ea 100644 --- a/examples/HEMnet/data_preparator/project/mod_constants.py +++ b/examples/HEMnet/data_preparator/project/mod_constants.py @@ -4,18 +4,18 @@ BASE_DIR = Path("/workspace") INPUT_PATH = BASE_DIR.joinpath("input_data") OUTPUT_PATH = BASE_DIR.joinpath("data") -TEMP_DATA_PATH = BASE_DIR.joinpath(".tmp") +TEMP_DATA_PATH = OUTPUT_PATH.joinpath(".tmp") NORMALISER_PKL = "normaliser.pkl" AFFINE_TRANSFORM_HDF = "affine_transform.hdf" MOVING_RESAMPLED_AFFINE_NPY = "moving_resampled_affine.npy" -TP53_FILTERED_NPY = 'tp53_filtered.npy' -HE_FILTERED_NPY = 'he_filtered.npy' +TP53_FILTERED_NPY = "tp53_filtered.npy" +HE_FILTERED_NPY = "he_filtered.npy" INTERPOLATOR = sitk.sitkLanczosWindowedSinc -U_MASK_FILTERED = 'u_mask_filtered.npy' -C_MASK_FILTERED = 'c_mask_filtered.npy' -NON_C_MASK_FILTERED = 'non_c_mask_filtered.npy' -T_MASK_FILTERED = 't_mask_filtered.npy' -HE_NORM = 'he_norm.npy' -HE_GRAY = 'he_gray.npy' -TP53_GRAY = 'tp53_gray.npy' -PERFORMANCE_DF = 'performance_metrics.csv' \ No newline at end of file +U_MASK_FILTERED = "u_mask_filtered.npy" +C_MASK_FILTERED = "c_mask_filtered.npy" +NON_C_MASK_FILTERED = "non_c_mask_filtered.npy" +T_MASK_FILTERED = "t_mask_filtered.npy" +HE_NORM = "he_norm.npy" +HE_GRAY = "he_gray.npy" +TP53_GRAY = "tp53_gray.npy" +PERFORMANCE_DF = "performance_metrics.csv" From de7015703139e0dab87659b0abd0b586761af0be Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 11:00:39 -0300 Subject: [PATCH 079/176] Improve workflow file to have less repetion and use uploaded docker image --- examples/HEMnet/data_preparator/workflow.yaml | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/examples/HEMnet/data_preparator/workflow.yaml b/examples/HEMnet/data_preparator/workflow.yaml index 9a042f5b9..3b03aa90d 100644 --- a/examples/HEMnet/data_preparator/workflow.yaml +++ b/examples/HEMnet/data_preparator/workflow.yaml @@ -1,7 +1,10 @@ +base_step: &BASE_STEP + - type: container + image: mlcommons/hemnet-airflow:0.0.1 + steps: - id: create_normalisation - type: container - image: local/hemnet:0.0.6 + <<: *BASE_STEP command: python normaliser_step.py mounts: input_volumes: @@ -16,7 +19,7 @@ steps: per_subject: false - id: image_registration - type: container + <<: *BASE_STEP mounts: input_volumes: data_path: @@ -32,14 +35,12 @@ steps: output_path: mount_path: /workspace/data type: directory - image: local/hemnet:0.0.6 command: python image_registration.py -v per_subject: true next: affine_registration - id: affine_registration - type: container - image: local/hemnet:0.0.6 + <<: *BASE_STEP mounts: input_volumes: image_registration_input: @@ -58,8 +59,7 @@ steps: limit: 1 - id: bspline_registration - type: container - image: local/hemnet:0.0.6 + <<: *BASE_STEP mounts: input_volumes: data_path: @@ -81,8 +81,7 @@ steps: limit: 1 - id: generate_masks - type: container - image: local/hemnet:0.0.6 + <<: *BASE_STEP mounts: input_volumes: bspline_registration_input: @@ -101,8 +100,7 @@ steps: limit: 2 - id: save_tiles - type: container - image: local/hemnet:0.0.6 + <<: *BASE_STEP mounts: input_volumes: data_path: @@ -124,8 +122,7 @@ steps: limit: 2 - id: consolidate_metrics - type: container - image: local/hemnet:0.0.6 + <<: *BASE_STEP mounts: input_volumes: save_tiles_input: @@ -140,11 +137,9 @@ steps: type: directory command: python consolidate_metrics.py next: cleanup - per_subject: true - id: cleanup - type: container - image: local/hemnet:0.0.6 + <<: *BASE_STEP per_subject: false mounts: input_volumes: From dda5fb8f06bf0dace8cfc2481f6c01410a579b4f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 11:13:01 -0300 Subject: [PATCH 080/176] remove docker container on successful runs --- .../dags/operator_builders/docker_operator_buider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index 6f2f9fd18..f9cce5016 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -27,7 +27,7 @@ def _define_base_operator(self) -> DockerOperator: mounts=self.mounts, task_id=self.operator_id, task_display_name=self.display_name, - # auto_remove="success", + auto_remove="success", mount_tmp_dir=False, outlets=self.outlets, user=f"{os.getuid()}:{os.getgid()}", From 6680250f78f85891ab82b4d63574db07c40568c8 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 13:03:59 -0300 Subject: [PATCH 081/176] Format out some code into separate methods --- .../dags/yaml_parser/yaml_parser.py | 58 +++++++++++++------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index f948e3fe7..b97c22729 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -173,11 +173,47 @@ def _verify_unique_id(self, potential_id, original_id, mapped_steps): if potential_id in mapped_steps: raise ValueError(f"ID {original_id} has been used more than one time!") - def _create_expanded_steps( # noqa: C901 + def _create_expanded_steps( self, raw_steps: list[dict[str, Any]], subject_partitions: list[str] ): step_id_to_expanded_step = {} original_id_to_partition_to_partitioned_id = defaultdict(dict) + next_id_to_upstream_ids = defaultdict(set) + + self._expanded_steps_first_pass( + raw_steps=raw_steps, + subject_partitions=subject_partitions, + step_id_to_expanded_step=step_id_to_expanded_step, + original_id_to_partition_to_partitioned_id=original_id_to_partition_to_partitioned_id, + ) + + for step_id, step in step_id_to_expanded_step.items(): + new_next = self._update_next_id_in_expanded_step( + step, original_id_to_partition_to_partitioned_id + ) + step["next"] = new_next + + for step_id, step in step_id_to_expanded_step.items(): + next_ids = self._get_next_id_from_expanded_step(step) + for next_id in next_ids: + next_id_to_upstream_ids[next_id].add(step_id) + + self._make_inlets_for_expanded_steps( + step_id_to_expanded_step=step_id_to_expanded_step, + next_id_to_upstream_ids=next_id_to_upstream_ids, + ) + self._make_host_mounts(step_id_to_expanded_step) + expanded_steps = list(step_id_to_expanded_step.values()) + + return expanded_steps + + def _expanded_steps_first_pass( + self, + raw_steps, + subject_partitions, + step_id_to_expanded_step, + original_id_to_partition_to_partitioned_id, + ): for step in raw_steps: original_id = step["id"] step["conditions_definitions"] = self._raw_conditions @@ -212,18 +248,9 @@ def _create_expanded_steps( # noqa: C901 ) step_id_to_expanded_step[step_id] = step - for step_id, step in step_id_to_expanded_step.items(): - new_next = self._update_next_id_in_expanded_step( - step, original_id_to_partition_to_partitioned_id - ) - step["next"] = new_next - - next_id_to_upstream_ids = defaultdict(set) - for step_id, step in step_id_to_expanded_step.items(): - next_ids = self._get_next_id_from_expanded_step(step) - for next_id in next_ids: - next_id_to_upstream_ids[next_id].add(step_id) - + def _make_inlets_for_expanded_steps( + self, step_id_to_expanded_step, next_id_to_upstream_ids + ): for step_id, step in step_id_to_expanded_step.items(): upstream_ids = list(next_id_to_upstream_ids[step_id]) if upstream_ids: @@ -246,11 +273,6 @@ def _create_expanded_steps( # noqa: C901 else: step["inlets"] = [] - self._make_host_mounts(step_id_to_expanded_step) - expanded_steps = list(step_id_to_expanded_step.values()) - - return expanded_steps - def _make_host_mounts(self, step_id_to_expanded_step: dict): look_on_second_pass = set() From ef81688feb3bb742252796908f45425051f67b5d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 16:15:15 -0300 Subject: [PATCH 082/176] Add metadata_path to ContainerConfigMountKeys --- cli/medperf/enums.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/medperf/enums.py b/cli/medperf/enums.py index 7ffd70918..dafd184b0 100644 --- a/cli/medperf/enums.py +++ b/cli/medperf/enums.py @@ -37,3 +37,4 @@ class ContainerConfigMountKeys(Enum): statistics_file = "statistics_file" additional_files = "additional_files" parameters_file = "parameters_file" + metadata_path = "metadata_path" From ed2ccc7a41a13df37a65d219a4ba2f0d5dcc3d64 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 16:16:09 -0300 Subject: [PATCH 083/176] Add rano as workflow example --- examples/RANO/data_preparator/.gitignore | 6 + .../RANO/data_preparator/pipeline/Dockerfile | 5 + .../data_preparator/pipeline/Dockerfile.dev | 20 + .../pipeline/project/direct_stages.py | 315 ++++++++++++ .../pipeline/project/metrics.py | 57 +++ .../pipeline/project/requirements.txt | 12 + .../pipeline/project/sanity_check.py | 45 ++ .../pipeline/project/stages/comparison.py | 178 +++++++ .../pipeline/project/stages/confirm.py | 178 +++++++ .../pipeline/project/stages/dset_stage.py | 32 ++ .../pipeline/project/stages/env_vars.py | 7 + .../pipeline/project/stages/extract.py | 152 ++++++ .../pipeline/project/stages/extract_nnunet.py | 232 +++++++++ .../project/stages/generate_report.py | 468 ++++++++++++++++++ .../pipeline/project/stages/get_csv.py | 123 +++++ .../pipeline/project/stages/manual.py | 182 +++++++ .../project/stages/mlcube_constants.py | 38 ++ .../project/stages/nifti_transform.py | 146 ++++++ .../pipeline/project/stages/pipeline.py | 285 +++++++++++ .../pipeline/project/stages/row_stage.py | 34 ++ .../pipeline/project/stages/split.py | 154 ++++++ .../pipeline/project/stages/stage.py | 5 + .../pipeline/project/stages/utils.py | 320 ++++++++++++ examples/RANO/data_preparator/workflow.yaml | 270 ++++++++++ .../data_preparator/workspace/parameters.yaml | 21 + 25 files changed, 3285 insertions(+) create mode 100644 examples/RANO/data_preparator/.gitignore create mode 100644 examples/RANO/data_preparator/pipeline/Dockerfile create mode 100644 examples/RANO/data_preparator/pipeline/Dockerfile.dev create mode 100644 examples/RANO/data_preparator/pipeline/project/direct_stages.py create mode 100644 examples/RANO/data_preparator/pipeline/project/metrics.py create mode 100644 examples/RANO/data_preparator/pipeline/project/requirements.txt create mode 100644 examples/RANO/data_preparator/pipeline/project/sanity_check.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/comparison.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/confirm.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/dset_stage.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/env_vars.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/extract.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/extract_nnunet.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/generate_report.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/get_csv.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/manual.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/mlcube_constants.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/nifti_transform.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/pipeline.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/row_stage.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/split.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/stage.py create mode 100644 examples/RANO/data_preparator/pipeline/project/stages/utils.py create mode 100644 examples/RANO/data_preparator/workflow.yaml create mode 100644 examples/RANO/data_preparator/workspace/parameters.yaml diff --git a/examples/RANO/data_preparator/.gitignore b/examples/RANO/data_preparator/.gitignore new file mode 100644 index 000000000..eae22949b --- /dev/null +++ b/examples/RANO/data_preparator/.gitignore @@ -0,0 +1,6 @@ +*data/ +constants.py +tmpmodel/ +additional_files/ +atlasImage_*.nii.gz +container_config.yaml \ No newline at end of file diff --git a/examples/RANO/data_preparator/pipeline/Dockerfile b/examples/RANO/data_preparator/pipeline/Dockerfile new file mode 100644 index 000000000..c8b936927 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/Dockerfile @@ -0,0 +1,5 @@ +FROM mlcommons/rano-data-prep-mlcube:1.0.10 + +COPY ./project /project +ENV WORKSPACE_DIRECTORY='/workspace' +ENTRYPOINT ["python", "/project/direct_stages.py"] diff --git a/examples/RANO/data_preparator/pipeline/Dockerfile.dev b/examples/RANO/data_preparator/pipeline/Dockerfile.dev new file mode 100644 index 000000000..8c4cf6c26 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/Dockerfile.dev @@ -0,0 +1,20 @@ +FROM mlcommons/rano-data-prep-mlcube:1.0.10 + +COPY ./project /project +ENV WORKSPACE_DIRECTORY='/workspace' + +COPY ./atlasImage_0.125.nii.gz /project +COPY ./tmpmodel/ /project/tmpmodel/ + +# use a downsampled reference image for DICOM to NIFTI conversion +RUN mv /project/atlasImage_0.125.nii.gz /Front-End/bin/install/appdir/usr/data/sri24/atlasImage.nii.gz + +# remove heavy brain extraction models +RUN rm -rf /project/stages/data_prep_models/brain_extraction/model_0/ +RUN rm -rf /project/stages/data_prep_models/brain_extraction/model_1/ + +# use dummy brain extraction models +RUN cp -r /project/tmpmodel /project/stages/data_prep_models/brain_extraction/model_0 +RUN mv /project/tmpmodel /project/stages/data_prep_models/brain_extraction/model_1 + +ENTRYPOINT ["python", "/project/direct_stages.py"] diff --git a/examples/RANO/data_preparator/pipeline/project/direct_stages.py b/examples/RANO/data_preparator/pipeline/project/direct_stages.py new file mode 100644 index 000000000..f6d8f3f00 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/direct_stages.py @@ -0,0 +1,315 @@ +"""MLCube handler file""" + +import typer +import os +from stages.env_vars import WORKSPACE_DIR, DATA_DIR, INPUT_DIR +from stages.utils import get_aux_files_dir, get_data_csv_filepath, convert_path_to_index +from stages.mlcube_constants import ( + RAW_PATH, + AUX_FILES_PATH, + VALID_PATH, + PREP_PATH, + BRAIN_PATH, + TUMOR_PATH, + DONE_STAGE_STATUS, + BRAIN_STAGE_STATUS, + TUMOR_STAGE_STATUS, + TUMOR_BACKUP_PATH, + MANUAL_STAGE_STATUS, + MANUAL_REVIEW_PATH, + LABELS_PATH, + METADATA_PATH, +) +from stages.constants import INTERIM_FOLDER +from sanity_check import sanity_check +from metrics import calculate_statistics + +app = typer.Typer() + + +@app.command("initial_setup") +def initial_setup(): + from stages.generate_report import InitialSetup + + raw_dir = os.path.join(DATA_DIR, RAW_PATH) + labels_out_dir = os.path.join(WORKSPACE_DIR, LABELS_PATH) + brain_out = os.path.join(DATA_DIR, BRAIN_PATH) + tumor_out = os.path.join(DATA_DIR, TUMOR_PATH) + report_generator = InitialSetup( + data_csv=None, + input_path=INPUT_DIR, + output_path=raw_dir, + input_labels_path=INPUT_DIR, + output_labels_path=labels_out_dir, + done_data_out_path=DATA_DIR, + done_status=DONE_STAGE_STATUS, + brain_data_out_path=brain_out, + brain_status=BRAIN_STAGE_STATUS, + tumor_data_out_path=tumor_out, + reviewed_status=MANUAL_STAGE_STATUS, + ) + report_generator.execute(None) + + +@app.command("make_csv") +def prepare( + subject_subdir: str = typer.Option(..., "--subject-subdir"), +): + from stages.get_csv import ( + AddToCSV, + ) + + output_csv_dir = get_aux_files_dir(subject_subdir) + os.makedirs(output_csv_dir, exist_ok=True) + output_csv = get_data_csv_filepath(subject_subdir) + out_dir = os.path.join(DATA_DIR, VALID_PATH) + csv_creator = AddToCSV( + input_dir=INPUT_DIR, + output_csv=output_csv, + out_dir=out_dir, + prev_stage_path=INPUT_DIR, + ) + subject_index = convert_path_to_index(subject_subdir) + csv_creator.execute(subject_index) + print(output_csv) + + +@app.command("convert_nifti") +def convert_nifti( + subject_subdir: str = typer.Option(..., "--subject-subdir"), +): + from stages.nifti_transform import NIfTITransform + + csv_path = get_data_csv_filepath(subject_subdir) + output_path = os.path.join(DATA_DIR, PREP_PATH, subject_subdir) + metadata_path = os.path.join(WORKSPACE_DIR, METADATA_PATH) + os.makedirs(output_path, exist_ok=True) + os.makedirs(metadata_path, exist_ok=True) + + nifti_transform = NIfTITransform( + data_csv=csv_path, + out_path=output_path, + prev_stage_path=INPUT_DIR, + metadata_path=metadata_path, + data_out=DATA_DIR, + ) + subject_index = convert_path_to_index(subject_subdir) + nifti_transform.execute(subject_index) + print(output_path) + + +@app.command("extract_brain") +def extract_brain( + subject_subdir: str = typer.Option(..., "--subject-subdir"), +): + from stages.extract import Extract + + csv_path = get_data_csv_filepath(subject_subdir) + output_path = os.path.join(DATA_DIR, BRAIN_PATH, subject_subdir) + prev_path = os.path.join(DATA_DIR, PREP_PATH, subject_subdir) + os.makedirs(output_path, exist_ok=True) + + brain_extract = Extract( + data_csv=csv_path, + out_path=output_path, + subpath=INTERIM_FOLDER, + prev_stage_path=prev_path, + prev_subpath=INTERIM_FOLDER, + func_name="extract_brain", + status_code=BRAIN_STAGE_STATUS, + ) + subject_index = convert_path_to_index(subject_subdir) + brain_extract.execute(subject_index) + print(output_path) + + +@app.command("extract_tumor") +def extract_tumor( + subject_subdir: str = typer.Option(..., "--subject-subdir"), +): + from stages.extract_nnunet import ExtractNnUNet + + csv_path = get_data_csv_filepath(subject_subdir) + output_path = os.path.join(DATA_DIR, TUMOR_PATH, subject_subdir) + prev_path = os.path.join(DATA_DIR, BRAIN_PATH, subject_subdir) + os.makedirs(output_path, exist_ok=True) + + models_path = os.path.join(WORKSPACE_DIR, "additional_files", "models") + tmpfolder = os.path.join(WORKSPACE_DIR, DATA_DIR, ".tmp", subject_subdir) + cbica_tmpfolder = os.path.join(tmpfolder, ".cbicaTemp") + os.environ["TMPDIR"] = tmpfolder + os.environ["CBICA_TEMP_DIR"] = cbica_tmpfolder + os.makedirs(tmpfolder, exist_ok=True) + os.makedirs(cbica_tmpfolder, exist_ok=True) + os.environ["RESULTS_FOLDER"] = os.path.join(models_path, "nnUNet_trained_models") + os.environ["nnUNet_raw_data_base"] = os.path.join(tmpfolder, "nnUNet_raw_data_base") + os.environ["nnUNet_preprocessed"] = os.path.join(tmpfolder, "nnUNet_preprocessed") + tumor_extract = ExtractNnUNet( + data_csv=csv_path, + out_path=output_path, + subpath=INTERIM_FOLDER, + prev_stage_path=prev_path, + prev_subpath=INTERIM_FOLDER, + status_code=TUMOR_STAGE_STATUS, + ) + subject_index = convert_path_to_index(subject_subdir) + tumor_extract.execute(subject_index) + print(output_path) + + +@app.command("prepare_for_manual_review") +def prepare_for_manual_review( + subject_subdir: str = typer.Option(..., "--subject-subdir"), +): + + from stages.manual import ManualStage + + csv_path = get_data_csv_filepath(subject_subdir) + prev_stage_path = os.path.join(DATA_DIR, TUMOR_PATH, subject_subdir) + backup_out = os.path.join(WORKSPACE_DIR, LABELS_PATH, TUMOR_BACKUP_PATH) + + manual_validation = ManualStage( + data_csv=csv_path, + out_path=prev_stage_path, + prev_stage_path=prev_stage_path, + backup_path=backup_out, + ) + subject_index = convert_path_to_index(subject_subdir) + manual_validation.prepare_directories(subject_index) + + +@app.command("rollback_to_brain_extract") +def rollback( + subject_subdir: str = typer.Option(..., "--subject-subdir"), +): + + from stages.manual import ManualStage + + csv_path = get_data_csv_filepath(subject_subdir) + prev_stage_path = os.path.join(DATA_DIR, TUMOR_PATH, subject_subdir) + backup_out = os.path.join(WORKSPACE_DIR, LABELS_PATH, TUMOR_BACKUP_PATH) + + manual_validation = ManualStage( + data_csv=csv_path, + out_path=prev_stage_path, + prev_stage_path=prev_stage_path, + backup_path=backup_out, + ) + subject_index = convert_path_to_index(subject_subdir) + manual_validation.rollback(subject_index) + + +@app.command("segmentation_comparison") +def segmentation_comparison( + subject_subdir: str = typer.Option(..., "--subject-subdir"), +): + from stages.comparison import SegmentationComparisonStage + + csv_path = get_data_csv_filepath(subject_subdir) + prev_stage_path = os.path.join(DATA_DIR, TUMOR_PATH, subject_subdir) + labels_out = os.path.join(WORKSPACE_DIR, LABELS_PATH) + backup_out = os.path.join(labels_out, TUMOR_BACKUP_PATH) + + segment_compare = SegmentationComparisonStage( + data_csv=csv_path, + out_path=labels_out, + prev_stage_path=prev_stage_path, + backup_path=backup_out, + ) + subject_index = convert_path_to_index(subject_subdir) + segment_compare.execute(subject_index) + + +@app.command("calculate_changed_voxels") +def calculate_changed_voxels(): + from stages.confirm import ConfirmStage + + prev_stage_path = os.path.join(DATA_DIR, TUMOR_PATH) + labels_out = os.path.join(WORKSPACE_DIR, LABELS_PATH) + backup_out = os.path.join(labels_out, TUMOR_BACKUP_PATH) + + confirm_stage = ConfirmStage( + out_data_path=DATA_DIR, + out_labels_path=labels_out, + prev_stage_path=prev_stage_path, + backup_path=backup_out, + ) + confirm_stage.execute() + + +@app.command("move_labeled_files") +def move_labeled_files(): + from stages.confirm import ConfirmStage + + prev_stage_path = os.path.join(DATA_DIR, TUMOR_PATH) + labels_out = os.path.join(WORKSPACE_DIR, LABELS_PATH) + backup_out = os.path.join(labels_out, TUMOR_BACKUP_PATH) + + confirm_stage = ConfirmStage( + out_data_path=DATA_DIR, + out_labels_path=labels_out, + prev_stage_path=prev_stage_path, + backup_path=backup_out, + ) + confirm_stage.move_labels() + + +@app.command("consolidation_stage") +def consolidation_stage(keep_files: bool = typer.Option(False, "--keep-files")): + from stages.split import SplitStage + + labels_out = os.path.join(WORKSPACE_DIR, LABELS_PATH) + params_path = os.path.join(WORKSPACE_DIR, "parameters.yaml") + base_finalized_dir = os.path.join(DATA_DIR, TUMOR_PATH, INTERIM_FOLDER) + + if keep_files: + dirs_to_remove = [] + else: + subdirs_to_remove = [ + BRAIN_PATH, + AUX_FILES_PATH, + PREP_PATH, + TUMOR_PATH, + RAW_PATH, + TUMOR_PATH, + VALID_PATH, + MANUAL_REVIEW_PATH, + ] + dirs_to_remove = [ + os.path.join(DATA_DIR, subdir) for subdir in subdirs_to_remove + ] + dirs_to_remove.extend( + [ + os.path.join(WORKSPACE_DIR, ".tmp"), + os.path.join(labels_out, ".tmp"), + os.path.join(labels_out, ".tumor_segmentation_backup"), + ] + ) + + split = SplitStage( + params=params_path, + data_path=DATA_DIR, + labels_path=labels_out, + staging_folders=dirs_to_remove, + base_finalized_dir=base_finalized_dir, + ) + split.execute() + + +@app.command("sanity_check") +def sanity_check_cmdline(): + data_path = DATA_DIR + labels_path = os.path.join(WORKSPACE_DIR, LABELS_PATH) + sanity_check(data_path=data_path, labels_path=labels_path) + + +@app.command("metrics") +def metrics_cmdline(): + splits_path = os.path.join(DATA_DIR, "splits.csv") + invalid_path = os.path.join(WORKSPACE_DIR, METADATA_PATH, ".invalid.txt") + out_file = os.path.join(WORKSPACE_DIR, METADATA_PATH, "statistics.yml") + calculate_statistics(splits_path, invalid_path, out_file) + + +if __name__ == "__main__": + app() diff --git a/examples/RANO/data_preparator/pipeline/project/metrics.py b/examples/RANO/data_preparator/pipeline/project/metrics.py new file mode 100644 index 000000000..9c9b70016 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/metrics.py @@ -0,0 +1,57 @@ +import os +import yaml +import argparse +import pandas as pd + + +def calculate_statistics(splits_path, invalid_path, out_file): + invalid_subjects = [] + if os.path.exists(invalid_path): + with open(invalid_path, "r") as f: + invalid_subjects = f.readlines() + + splits_df = pd.read_csv(splits_path) + + num_train_subjects = len(splits_df[splits_df["Split"] == "Train"]) + num_val_subjects = len(splits_df[splits_df["Split"] == "Val"]) + + num_invalid_subjects = len(invalid_subjects) + + stats = { + "num_train_subjects": num_train_subjects, + "num_val_subjects": num_val_subjects, + "num_invalid_subjects": num_invalid_subjects, + } + + with open(out_file, "w") as f: + yaml.dump(stats, f) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser("MedPerf Statistics Example") + parser.add_argument( + "--data_path", + dest="data", + type=str, + help="directory containing the prepared data", + ) + parser.add_argument( + "--labels_path", + dest="labels", + ) + parser.add_argument( + "--out_file", dest="out_file", type=str, help="file to store statistics" + ) + parser.add_argument( + "--metadata_path", + dest="metadata_path", + type=str, + help="path to the local metadata folder", + ) + + args = parser.parse_args() + + splits_path = os.path.join(args.data, "splits.csv") + invalid_path = os.path.join(args.metadata_path, ".invalid.txt") + + calculate_statistics(splits_path, invalid_path) diff --git a/examples/RANO/data_preparator/pipeline/project/requirements.txt b/examples/RANO/data_preparator/pipeline/project/requirements.txt new file mode 100644 index 000000000..a46e7b08e --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/requirements.txt @@ -0,0 +1,12 @@ +typer==0.9.0 +pandas==1.5.3 +PyYAML==6.0.1 +filelock==3.16.1 +# Include all your requirements here +SimpleITK==2.3.1 +tqdm==4.66.2 +scikit-image==0.21.0 +FigureGenerator==0.0.4 +gandlf==0.0.16 +labelfusion==1.0.14 +nibabel==5.1.0 diff --git a/examples/RANO/data_preparator/pipeline/project/sanity_check.py b/examples/RANO/data_preparator/pipeline/project/sanity_check.py new file mode 100644 index 000000000..d2137e37b --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/sanity_check.py @@ -0,0 +1,45 @@ +import yaml +import argparse +import pandas as pd + +from stages.utils import has_prepared_folder_structure + + +def sanity_check(data_path: str, labels_path: str): + """Runs a few checks to ensure data quality and integrity + + Args: + data_path (str): Path to data. + labels_path (str): Path to labels. + """ + # Here you must add all the checks you consider important regarding the + # state of the data + if not has_prepared_folder_structure(data_path, labels_path): + print("The contents of the labels and data don't resemble a prepared dataset", flush=True) + exit(1) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser("Medperf Model Sanity Check Example") + parser.add_argument( + "--data_path", + dest="data", + type=str, + help="directory containing the prepared data", + ) + parser.add_argument( + "--labels_path", + dest="labels", + type=str, + help="directory containing the prepared labels", + ) + parser.add_argument( + "--metadata_path", + dest="metadata_path", + type=str, + help="path to the local metadata folder", + ) + + args = parser.parse_args() + + sanity_check(args.data, args.labels) diff --git a/examples/RANO/data_preparator/pipeline/project/stages/comparison.py b/examples/RANO/data_preparator/pipeline/project/stages/comparison.py new file mode 100644 index 000000000..9d1b04c85 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/comparison.py @@ -0,0 +1,178 @@ +from typing import Union, Tuple +import os + +import pandas as pd +from pandas import DataFrame +import numpy as np +import nibabel as nib + +from .row_stage import RowStage +from .utils import ( + get_id_tp, + get_changed_voxels_file, + md5_file, + get_manual_approval_finalized_path, +) +from .constants import INTERIM_FOLDER +from .mlcube_constants import ( + COMPARISON_STAGE_STATUS, + GROUND_TRUTH_PATH, + TUMOR_EXTRACTION_REVIEW_PATH, + TUMOR_PATH, +) +from .env_vars import DATA_DIR + + +class SegmentationComparisonStage(RowStage): + def __init__( + self, + data_csv: str, + out_path: str, + prev_stage_path, + backup_path: str, + ): + self.data_csv = data_csv + self.out_path = out_path + self.prev_stage_path = prev_stage_path + self.backup_path = backup_path + + @property + def name(self): + return "Label Segmentation Comparison" + + @property + def status_code(self): + return COMPARISON_STAGE_STATUS + + def __get_input_path(self, index: Union[str, int]) -> str: + id, tp = get_id_tp(index) + path = get_manual_approval_finalized_path(id, tp, TUMOR_EXTRACTION_REVIEW_PATH) + return path + + def __get_backup_path(self, index: Union[str, int]) -> str: + id, tp = get_id_tp(index) + path = os.path.join( + DATA_DIR, TUMOR_PATH, id, tp, INTERIM_FOLDER, id, tp, GROUND_TRUTH_PATH + ) + return path + + def __get_output_path(self, index: Union[str, int]) -> str: + id, tp = get_id_tp(index) + path = os.path.join(self.out_path, id, tp) + return path + + def __get_case_path(self, index: Union[str, int]) -> str: + path = self.__get_input_path(index) + case = os.listdir(path)[0] + + return os.path.join(path, case) + + def __report_gt_not_found( + self, index: Union[str, int], report: pd.DataFrame, reviewed_hash: str + ) -> pd.DataFrame: + case_path = self.__get_case_path(index) + data_path = report.loc[index, "data_path"] + report_data = { + "status": -self.status_code - 0.2, # -6.2 + "data_path": data_path, + "labels_path": case_path, + "segmentation_hash": reviewed_hash, + } + + return report + + def __report_exact_match( + self, index: Union[str, int], report: pd.DataFrame, reviewed_hash: str + ) -> pd.DataFrame: + case_path = self.__get_case_path(index) + data_path = report.loc[index, "data_path"] + report_data = { + "status": -self.status_code - 0.1, # -6.1 + "data_path": data_path, + "labels_path": case_path, + "num_changed_voxels": 0, + "segmentation_hash": reviewed_hash, + } + + return report + + def __report_success( + self, + index: Union[str, int], + report: pd.DataFrame, + num_changed_voxels: int, + reviewed_hash: str, + ) -> pd.DataFrame: + case_path = self.__get_case_path(index) + data_path = report.loc[index, "data_path"] + report_data = { + "status": -self.status_code, # -6 + "data_path": data_path, + "labels_path": case_path, + "num_changed_voxels": num_changed_voxels, + "segmentation_hash": reviewed_hash, + } + update_row_with_dict(report, report_data, index) + return report + + def could_run(self, index: Union[str, int], report: DataFrame) -> bool: + print(f"Checking if {self.name} can run") + # Ensure a single reviewed segmentation file exists + path = self.__get_input_path(index) + gt_path = self.__get_backup_path(index) + + is_valid = True + path_exists = os.path.exists(path) + gt_path_exists = os.path.exists(gt_path) + contains_case = False + reviewed_hash = None + if path_exists: + cases = os.listdir(path) + num_cases = len(cases) + if num_cases: + reviewed_file = os.path.join(path, cases[0]) + reviewed_hash = md5_file(reviewed_file) + contains_case = num_cases == 1 + + prev_hash = report.loc[index]["segmentation_hash"] + hash_changed = prev_hash != reviewed_hash + print( + f"{path_exists=} and {contains_case=} and {gt_path_exists=} and {hash_changed=}" + ) + is_valid = path_exists and contains_case and gt_path_exists and hash_changed + + return is_valid + + def execute(self, index: Union[str, int]) -> Tuple[DataFrame, bool]: + + id, tp = get_id_tp(index) + path = self.__get_input_path(index) + cases = os.listdir(path) + print(f"{path=}") + print(f"{cases=}") + match_output_path = self.__get_output_path(index) + os.makedirs(match_output_path, exist_ok=True) + # Get the necessary files for match check + # We assume reviewed and gt files have the same name + reviewed_file = os.path.join(path, cases[0]) + reviewed_hash = md5_file(reviewed_file) + gt_file = os.path.join(self.__get_backup_path(index), cases[0]) + print(f"{gt_file=}") + if not os.path.exists(gt_file): + print("Ground truth file not found, reviewed file most probably renamed") + report = self.__report_gt_not_found(index, report, reviewed_hash) + raise ValueError("Ground truth file not found") + + reviewed_img = nib.load(reviewed_file) + gt_img = nib.load(gt_file) + + reviewed_voxels = np.array(reviewed_img.dataobj) + gt_voxels = np.array(gt_img.dataobj) + + num_changed_voxels = np.sum(reviewed_voxels != gt_voxels) + print(f"{num_changed_voxels=}") + changed_voxels_file = get_changed_voxels_file(id, tp) + with open(changed_voxels_file, "w") as f: + f.write(str(num_changed_voxels)) + + return True diff --git a/examples/RANO/data_preparator/pipeline/project/stages/confirm.py b/examples/RANO/data_preparator/pipeline/project/stages/confirm.py new file mode 100644 index 000000000..1a02ddb56 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/confirm.py @@ -0,0 +1,178 @@ +from typing import Union, Tuple +import os +import shutil +from time import sleep + +import pandas as pd +from pandas import DataFrame + +from .dset_stage import DatasetStage +from .utils import ( + get_id_tp, + get_subdirectories, + get_manual_approval_finalized_path, + get_changed_voxels_file, + find_finalized_subjects, +) +from .constants import FINAL_FOLDER +from .mlcube_constants import ( + CONFIRM_STAGE_STATUS, + TUMOR_EXTRACTION_REVIEW_PATH, + AUX_FILES_PATH, +) +from .env_vars import DATA_DIR + + +class ConfirmStage(DatasetStage): + def __init__( + self, + out_data_path: str, + out_labels_path: str, + prev_stage_path: str, + backup_path: str, + ): + self.out_data_path = out_data_path + self.out_labels_path = out_labels_path + self.prev_stage_path = prev_stage_path + self.backup_path = backup_path + self.prompt_file = ".prompt.txt" + self.response_file = ".response.txt" + + @property + def name(self): + return "Annotations Confirmation" + + @property + def status_code(self): + return CONFIRM_STAGE_STATUS + + def __get_input_data_path(self, id, tp): + path = os.path.join(self.prev_stage_path, id, tp, FINAL_FOLDER, id, tp) + return path + + def __get_input_label_path(self, id, tp): + path = get_manual_approval_finalized_path(id, tp, TUMOR_EXTRACTION_REVIEW_PATH) + + case = os.listdir(path)[0] + + return os.path.join(path, case) + + def __get_output_data_path(self, id, tp): + path = os.path.join(self.out_data_path, id, tp) + return path + + def __get_output_label_path(self, id, tp): + path = os.path.join(self.out_labels_path, id, tp) + filename = f"{id}_{tp}_final_seg.nii.gz" + return path, filename + + def __confirm(self, exact_match_percent: float) -> bool: + exact_match_percent = round(exact_match_percent * 100, 2) + msg = ( + f"We've identified {exact_match_percent}% of cases have not been modified " + + "with respect to the baseline segmentation. Do you confirm this is intended? " + + "[Y]/n" + ) + + prompt_path = os.path.join(self.out_data_path, self.prompt_file) + response_path = os.path.join(self.out_data_path, self.response_file) + + with open(prompt_path, "w") as f: + f.write(msg) + + while not os.path.exists(response_path): + sleep(1) + + with open(response_path, "r") as f: + user_input = f.readline().strip() + + os.remove(prompt_path) + os.remove(response_path) + + return user_input == "y" or user_input == "" + + def __report_failure(self, report: DataFrame) -> DataFrame: + # For this stage, failure is done when the user doesn't confirm + # This means he probably wants to keep working on the data + # And needs to know which rows are exact matches. + # Because of this, failing this stage keeps the report intact + return report + + def __process_row(self, subject_dict) -> pd.Series: + """process a row by moving the required files + to their respective locations, and removing any extra files + + Args: + report (DataFrame): data preparation report + + Returns: + DataFrame: modified data preparation report + """ + subject_id, timepoint = subject_dict["SubjectID"], subject_dict["Timepoint"] + input_data_path = self.__get_input_data_path(subject_id, timepoint) + input_label_filepath = self.__get_input_label_path(subject_id, timepoint) + output_data_path = self.__get_output_data_path(subject_id, timepoint) + output_label_path, filename = self.__get_output_label_path( + subject_id, timepoint + ) + output_label_filepath = os.path.join(output_label_path, filename) + + shutil.rmtree(output_data_path, ignore_errors=True) + shutil.copytree(input_data_path, output_data_path) + os.makedirs(output_label_path, exist_ok=True) + shutil.copy(input_label_filepath, output_label_filepath) + + def could_run(self, report: DataFrame) -> bool: + print(f"Checking if {self.name} can run") + # could run once all cases have been compared to the ground truth + missing_voxels = report["num_changed_voxels"].isnull().values.any() + prev_path_exists = os.path.exists(self.prev_stage_path) + empty_prev_path = True + if prev_path_exists: + empty_prev_path = len(os.listdir(self.prev_stage_path)) == 0 + + print( + f"{prev_path_exists=} and not {empty_prev_path=} and not {missing_voxels=}" + ) + return prev_path_exists and not empty_prev_path and not missing_voxels + + @staticmethod + def calculate_exact_match_percent(): + """ + This value is equal to the sum of all subjects where no voxels were + changed in the Tumor Segmentation divided by the total number of subjects. + """ + base_aux_dir = os.path.join(DATA_DIR, AUX_FILES_PATH) + num_subjects = 0 + num_unchanged_subjects = 0 + + for subject_id in get_subdirectories(base_aux_dir): + complete_subject_path = os.path.join(base_aux_dir, subject_id) + for timepoint in get_subdirectories(complete_subject_path): + changed_voxels_file = get_changed_voxels_file(subject_id, timepoint) + if not os.path.isfile(changed_voxels_file): + continue + num_subjects += 1 + with open(changed_voxels_file, "r") as f: + changed_voxels = int(f.read()) + + if not changed_voxels: + num_unchanged_subjects += 1 + + return num_unchanged_subjects / num_subjects + + def execute(self) -> Tuple[DataFrame, bool]: + exact_match_percent = self.calculate_exact_match_percent() + + rounded_percent = round(exact_match_percent * 100, 2) + msg_file = os.path.join(DATA_DIR, AUX_FILES_PATH, ".msg") + print(f"{str(rounded_percent)=}") + with open(msg_file, "w") as f: + f.write(str(rounded_percent)) + return + + def move_labels(self): + finalized_subjects = find_finalized_subjects() + for finalized_subject in finalized_subjects: + self.__process_row(finalized_subject) + return True diff --git a/examples/RANO/data_preparator/pipeline/project/stages/dset_stage.py b/examples/RANO/data_preparator/pipeline/project/stages/dset_stage.py new file mode 100644 index 000000000..9792a9e26 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/dset_stage.py @@ -0,0 +1,32 @@ +from abc import ABC, abstractmethod +import pandas as pd +from typing import Tuple + +from .stage import Stage + + +class DatasetStage(Stage, ABC): + @abstractmethod + def could_run(self, report: pd.DataFrame) -> bool: + """Establishes if this step could be executed + + Args: + index (Union[str, int]): case index in the report + report (pd.DataFrame): Dataframe containing the current state of the preparation flow + + Returns: + bool: wether this stage could be executed + """ + + @abstractmethod + def execute(self, report: pd.DataFrame) -> Tuple[pd.DataFrame, bool]: + """Executes the stage + + Args: + index (Union[str, int]): case index in the report + report (pd.DataFrame): DataFrame containing the current state of the preparation flow + + Returns: + pd.DataFrame: Updated report dataframe + bool: Success status + """ diff --git a/examples/RANO/data_preparator/pipeline/project/stages/env_vars.py b/examples/RANO/data_preparator/pipeline/project/stages/env_vars.py new file mode 100644 index 000000000..c9f72e5aa --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/env_vars.py @@ -0,0 +1,7 @@ +import os + + +WORKSPACE_DIR = os.getenv("WORKSPACE_DIRECTORY") +DATA_DIR = os.path.join(WORKSPACE_DIR, "data") +DATA_SUBDIR = os.path.join(*DATA_DIR.split(os.sep)[-2:]) +INPUT_DIR = os.path.join(WORKSPACE_DIR, "input_data") diff --git a/examples/RANO/data_preparator/pipeline/project/stages/extract.py b/examples/RANO/data_preparator/pipeline/project/stages/extract.py new file mode 100644 index 000000000..5c4ed7456 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/extract.py @@ -0,0 +1,152 @@ +from typing import Union, Tuple +from tqdm import tqdm +import pandas as pd +import os +import shutil + +from .row_stage import RowStage +from .PrepareDataset import Preparator +from .utils import get_id_tp +from .constants import FINAL_FOLDER, EXEC_NAME + + +class Extract(RowStage): + def __init__( + self, + data_csv: str, + out_path: str, + subpath: str, + prev_stage_path: str, + prev_subpath: str, + # pbar: tqdm, + func_name: str, + status_code: int, + extra_labels_path=None, + ): + self.data_csv = data_csv + self.out_path = out_path + self.subpath = subpath + self.data_subpath = FINAL_FOLDER + self.prev_path = prev_stage_path + self.prev_subpath = prev_subpath + os.makedirs(self.out_path, exist_ok=True) + self.prep = Preparator(data_csv, out_path, EXEC_NAME) + self.func_name = func_name + self.func = getattr(self.prep, func_name) + self.pbar = tqdm() + self.failed = False + self.exception = None + self.__status_code = status_code + self.extra_labels_path = extra_labels_path or [] + + @property + def name(self) -> str: + return self.func_name.replace("_", " ").capitalize() + + @property + def status_code(self) -> str: + return self.__status_code + + def could_run(self, index: Union[str, int], report: pd.DataFrame) -> bool: + """Determine if case at given index needs to be converted to NIfTI + + Args: + index (Union[str, int]): Case index, as used by the report dataframe + report (pd.DataFrame): Report Dataframe for providing additional context + + Returns: + bool: Wether this stage could be executed for the given case + """ + print(f"Checking if {self.name} can run") + prev_paths = self.__get_paths(index, self.prev_path, self.prev_subpath) + is_valid = all([os.path.exists(path) for path in prev_paths]) + print(f"{is_valid=}") + return is_valid + + def execute( + self, + index: Union[str, int], + ) -> Tuple[pd.DataFrame, bool]: + """Executes the NIfTI transformation stage on the given case + + Args: + index (Union[str, int]): case index, as used by the report + report (pd.DataFrame): DataFrame containing the current state of the preparation flow + + Returns: + pd.DataFrame: Updated report dataframe + """ + self.__prepare_exec() + self.__copy_case(index) + try: + self._process_case(index) + except Exception as e: + del_paths = self.__get_paths(index, self.out_path, self.subpath) + for del_path in del_paths: + shutil.rmtree(del_path, ignore_errors=True) + raise + + success = self.__update_state(index) + self.prep.write() + + return success + + def __prepare_exec(self): + # Reset the file contents for errors + open(self.prep.stderr_log, "w").close() + + # Update the out dataframes to current state + self.prep.read() + + def __get_paths(self, index: Union[str, int], path: str, subpath: str): + id, tp = get_id_tp(index) + data_path = os.path.join(path, self.data_subpath, id, tp) + out_path = os.path.join(path, subpath, id, tp) + return data_path, out_path + + def __copy_case(self, index: Union[str, int]): + prev_paths = self.__get_paths(index, self.prev_path, self.prev_subpath) + copy_paths = self.__get_paths(index, self.out_path, self.prev_subpath) + for prev, copy in zip(prev_paths, copy_paths): + shutil.rmtree(copy, ignore_errors=True) + shutil.copytree(prev, copy, dirs_exist_ok=True) + + def _process_case(self, index: Union[str, int]): + id, tp = get_id_tp(index) + df = self.prep.subjects_df + row_search = df[(df["SubjectID"] == id) & (df["Timepoint"] == tp)] + if len(row_search) > 0: + row = row_search.iloc[0] + else: + # Most probably this case was semi-prepared. Mock a row + row = pd.Series( + { + "SubjectID": id, + "Timepoint": tp, + "T1": "", + "T1GD": "", + "T2": "", + "FLAIR": "", + } + ) + self.func(row, self.pbar) + + def __hide_paths(self, hide_paths): + for path in hide_paths: + dirname = os.path.dirname(path) + hidden_name = f".{os.path.basename(path)}" + hidden_path = os.path.join(dirname, hidden_name) + if os.path.exists(hidden_path): + shutil.rmtree(hidden_path) + shutil.move(path, hidden_path) + + def __update_state(self, index: Union[str, int]) -> bool: + # Backup the paths in case we need to revert to this stage + hide_paths = self.__get_paths(index, self.prev_path, self.prev_subpath) + # Wait a little so that file gets created + # Handle the case where a brain mask doesn't exist + # Due to the subject being semi-prepared + success = True + self.__hide_paths(hide_paths) + + return success diff --git a/examples/RANO/data_preparator/pipeline/project/stages/extract_nnunet.py b/examples/RANO/data_preparator/pipeline/project/stages/extract_nnunet.py new file mode 100644 index 000000000..045ab6551 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/extract_nnunet.py @@ -0,0 +1,232 @@ +from typing import Union +from tqdm import tqdm +import os +import shutil +import time +import SimpleITK as sitk +import subprocess + +from .extract import Extract +from .PrepareDataset import ( + Preparator, + FINAL_FOLDER, + generate_tumor_segmentation_fused_images, + save_screenshot, +) +from .utils import ( + get_id_tp, + get_manual_approval_under_review_path, + get_manual_approval_finalized_path, +) +from .mlcube_constants import ( + GROUND_TRUTH_PATH, + TUMOR_EXTRACTION_REVIEW_PATH, + BRAIN_MASK_REVIEW_PATH, + BRAIN_MASK_FILE, +) +from .constants import INTERIM_FOLDER, FINAL_FOLDER + +MODALITY_MAPPING = { + "t1c": "t1c", + "t1ce": "t1c", + "t1": "t1n", + "t1n": "t1n", + "t2": "t2w", + "t2w": "t2w", + "t2f": "t2f", + "flair": "t2f", +} + +MODALITY_VARIANTS = { + "t1c": "T1GD", + "t1ce": "T1GD", + "t1": "T1", + "t1n": "T1", + "t2": "T2", + "t2w": "T2", + "t2f": "FLAIR", + "flair": "FLAIR", +} + + +class ExtractNnUNet(Extract): + def __init__( + self, + data_csv: str, + out_path: str, + subpath: str, + prev_stage_path: str, + prev_subpath: str, + status_code: int, + extra_labels_path=None, + nnunet_executable: str = "/nnunet_env/bin/nnUNet_predict", + ): + self.data_csv = data_csv + self.out_path = out_path + self.subpath = subpath + self.data_subpath = FINAL_FOLDER + self.prev_path = prev_stage_path + self.prev_subpath = prev_subpath + os.makedirs(self.out_path, exist_ok=True) + self.prep = Preparator(data_csv, out_path, "BraTSPipeline") + self.pbar = tqdm() + self.failed = False + self.exception = None + self.__status_code = status_code + self.extra_labels_path = extra_labels_path or [] + self.nnunet_executable = nnunet_executable + + @property + def name(self) -> str: + return "nnUNet Tumor Extraction" + + @property + def status_code(self) -> str: + return self.__status_code + + def __get_models(self): + models_path = os.path.join(os.environ["RESULTS_FOLDER"], "nnUNet", "3d_fullres") + return os.listdir(models_path) + + def __get_mod_order(self, model): + order_path = os.path.join( + os.environ["RESULTS_FOLDER"], + os.pardir, + "nnUNet_modality_order", + model, + "order", + ) + with open(order_path, "r") as f: + order_str = f.readline() + # remove 'order = ' from the splitted list + modalities = order_str.split()[2:] + modalities = [MODALITY_MAPPING[mod] for mod in modalities] + return modalities + + def __prepare_case(self, path, id, tp, order): + tmp_subject = f"{id}-{tp}" + tmp_path = os.path.join(path, "tmp-data") + tmp_subject_path = os.path.join(tmp_path, tmp_subject) + tmp_out_path = os.path.join(path, "tmp-out", tmp_subject) + shutil.rmtree(tmp_subject_path, ignore_errors=True) + shutil.rmtree(tmp_out_path, ignore_errors=True) + os.makedirs(tmp_subject_path) + os.makedirs(tmp_out_path) + in_modalities_path = os.path.join(path, FINAL_FOLDER, id, tp) + input_modalities = {} + for modality_file in os.listdir(in_modalities_path): + if not modality_file.endswith(".nii.gz"): + continue + modality = modality_file[:-7].split("_")[-1] + norm_mod = MODALITY_MAPPING[modality] + mod_idx = order.index(norm_mod) + mod_idx = str(mod_idx).zfill(4) + + out_modality_file = f"{tmp_subject}_{mod_idx}.nii.gz" + in_file = os.path.join(in_modalities_path, modality_file) + out_file = os.path.join(tmp_subject_path, out_modality_file) + input_modalities[MODALITY_VARIANTS[modality]] = in_file + shutil.copyfile(in_file, out_file) + + return tmp_subject_path, tmp_out_path, input_modalities + + def __run_model(self, model, data_path, out_path): + # models are named Task_..., where is always 3 numbers + task_id = model[4:7] + cmd = f"{self.nnunet_executable} -i {data_path} -o {out_path} -t {task_id}" + print(cmd) + print(os.listdir(data_path)) + start = time.time() + subprocess.call(cmd, shell=True) + end = time.time() + total_time = end - start + print(f"Total time elapsed is {total_time} seconds") + + def __finalize_pred(self, tmp_out_path, out_pred_filepath, *copy_paths): + # We assume there's only one file in out_path + pred = None + for file in os.listdir(tmp_out_path): + if file.endswith(".nii.gz"): + pred = file + + if pred is None: + raise RuntimeError("No tumor segmentation was found") + + pred_filepath = os.path.join(tmp_out_path, pred) + pred_dir = os.path.dirname(pred_filepath) + os.makedirs(pred_dir, exist_ok=True) + shutil.move(pred_filepath, out_pred_filepath) + for copy_path in copy_paths: + copy_dir = os.path.dirname(copy_path) + os.makedirs(copy_dir, exist_ok=True) + shutil.copy(out_pred_filepath, copy_path) + return out_pred_filepath + + def _process_case(self, index: Union[str, int]): + id, tp = get_id_tp(index) + subject_id = f"{id}_{tp}" + + models = self.__get_models() + outputs = [] + images_for_fusion = [] + out_path = os.path.join(self.out_path, INTERIM_FOLDER, id, tp) + out_pred_path = os.path.join(out_path, GROUND_TRUTH_PATH) + finalized_tumor_path = get_manual_approval_finalized_path( + id, tp, TUMOR_EXTRACTION_REVIEW_PATH + ) + under_review_tumor_path = get_manual_approval_under_review_path( + id, tp, TUMOR_EXTRACTION_REVIEW_PATH + ) + finalized_brain_mask_path = get_manual_approval_finalized_path( + id, tp, BRAIN_MASK_REVIEW_PATH + ) + under_review_brain_mask_path = get_manual_approval_under_review_path( + id, tp, BRAIN_MASK_REVIEW_PATH + ) + brain_mask_filepath = os.path.join(out_path, BRAIN_MASK_FILE) + brain_mask_review_filepath = os.path.join( + under_review_brain_mask_path, BRAIN_MASK_FILE + ) + + os.makedirs(out_pred_path, exist_ok=True) + + for i, model in enumerate(models): + order = self.__get_mod_order(model) + tmp_data_path, tmp_out_path, input_modalities = self.__prepare_case( + self.out_path, id, tp, order + ) + filename = f"{id}_{tp}_tumorMask_model_{i}.nii.gz" + out_pred_filepath = os.path.join(out_pred_path, filename) + under_review_filepath = os.path.join(under_review_tumor_path, filename) + self.__run_model(model, tmp_data_path, tmp_out_path) + output = self.__finalize_pred( + tmp_out_path, out_pred_filepath, under_review_filepath + ) + outputs.append(output) + images_for_fusion.append(sitk.ReadImage(output, sitk.sitkUInt8)) + + # cleanup + shutil.rmtree(tmp_data_path, ignore_errors=True) + shutil.rmtree(tmp_out_path, ignore_errors=True) + + fused_outputs = generate_tumor_segmentation_fused_images( + images_for_fusion, out_pred_path, subject_id + ) + outputs += fused_outputs + + for output in outputs: + # save the screenshot + tumor_mask_id = os.path.basename(output).replace(".nii.gz", "") + save_screenshot( + input_modalities, + os.path.join( + out_path, + f"{tumor_mask_id}_summary.png", + ), + output, + ) + + os.makedirs(under_review_brain_mask_path, exist_ok=True) + shutil.copy(brain_mask_filepath, brain_mask_review_filepath) + os.makedirs(finalized_brain_mask_path, exist_ok=True) + os.makedirs(finalized_tumor_path, exist_ok=True) diff --git a/examples/RANO/data_preparator/pipeline/project/stages/generate_report.py b/examples/RANO/data_preparator/pipeline/project/stages/generate_report.py new file mode 100644 index 000000000..a69a368e3 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/generate_report.py @@ -0,0 +1,468 @@ +from .dset_stage import DatasetStage +import pandas as pd +import numpy as np +import os +import re +import shutil +from typing import Tuple +from .utils import has_prepared_folder_structure, md5_dir, get_data_csv_filepath +from .constants import INTERIM_FOLDER, FINAL_FOLDER, TUMOR_MASK_FOLDER +from .mlcube_constants import SETUP_STAGE_STATUS, FINALIZED_PATH + +DICOM_MODALITIES_PREFIX = { + "fl": "t2_Flair", + "t1": "t1_axial-3", + "t1c": "t1_axial_stealth", + "t2": "T2_SAG", +} +NIFTI_MODALITIES = ["t1c", "t1n", "t2f", "t2w"] +BRAIN_SCAN_NAME = "brain_(.*)" +TUMOR_SEG_NAME = "final_seg" +CSV_HEADERS = ["SubjectID", "Timepoint", "T1", "T1GD", "T2", "FLAIR"] + + +def get_index(subject, timepoint): + return f"{subject}|{timepoint}" + + +def has_alternative_folder_structure(subject_tp_path, og_path): + contents = os.listdir(subject_tp_path) + prefixes_presence = {prefix: False for prefix in DICOM_MODALITIES_PREFIX.values()} + for content in contents: + content_path = os.path.join(subject_tp_path, content) + # Search recursively across folders + if os.path.isdir(content_path): + return has_alternative_folder_structure(content_path, og_path) + + # Check if the file is a dicom file with an expected prefix + if not content.endswith(".dcm"): + continue + + for prefix in DICOM_MODALITIES_PREFIX.values(): + if content.startswith(prefix): + prefixes_presence[prefix] = True + + # If all prefixes are found within the current path, then it has the folder structure + if all(prefixes_presence.values()): + return True, subject_tp_path + + # Structure not identified at this tree + return False, og_path + + +def to_expected_folder_structure(subject_tp_path, contents_path): + # Create the modality folders + for modality in DICOM_MODALITIES_PREFIX.keys(): + modality_path = os.path.join(subject_tp_path, modality) + os.mkdir(modality_path) + + # Move the dicoms to the needed location + dicoms = os.listdir(contents_path) + prefix2mod = {prefix: mod for mod, prefix in DICOM_MODALITIES_PREFIX.items()} + for dicom in dicoms: + for prefix in prefix2mod.keys(): + if not dicom.startswith(prefix): + continue + mod = prefix2mod[prefix] + old_path = os.path.join(contents_path, dicom) + new_path = os.path.join(subject_tp_path, mod, dicom) + shutil.move(old_path, new_path) + + # Remove extra folders + desired_folders = set(DICOM_MODALITIES_PREFIX.keys()) + found_folders = set(os.listdir(subject_tp_path)) + extra_folders = found_folders - desired_folders + for folder in extra_folders: + folder_path = os.path.join(subject_tp_path, folder) + shutil.rmtree(folder_path) + + +def has_semiprepared_folder_structure(subject_tp_path, og_path, recursive=True): + contents = os.listdir(subject_tp_path) + suffixes_presence = {suffix: False for suffix in NIFTI_MODALITIES} + for content in contents: + content_path = os.path.join(subject_tp_path, content) + if os.path.isdir(content_path): + if recursive: + return has_semiprepared_folder_structure(content_path, og_path) + else: + continue + + if not content.endswith(".nii.gz"): + continue + + for suffix in NIFTI_MODALITIES: + full_suffix = f"_brain_{suffix}.nii.gz" + if content.endswith(full_suffix): + suffixes_presence[suffix] = True + + if all(suffixes_presence.values()): + return True, subject_tp_path + + return False, og_path + + +def get_timepoints(subject, subject_tp_path): + contents = os.listdir(subject_tp_path) + timepoints = set() + for content in contents: + content_path = os.path.join(subject_tp_path, subject) + if os.path.isdir(content_path): + # Assume any directory at this point represents a timepoint + timepoints.add(content) + continue + + pattern = re.compile( + f"{subject}_(.*)_(?:{BRAIN_SCAN_NAME}|{TUMOR_SEG_NAME})\.nii\.gz" + ) + result = pattern.search(content) + timepoint = result.group(1) + timepoints.add(timepoint) + + return list(timepoints) + + +def get_tumor_segmentation(subject, timepoint, subject_tp_path): + contents = os.listdir(subject_tp_path) + seg_file = f"{subject}_{timepoint}_{TUMOR_SEG_NAME}.nii.gz" + if seg_file in contents: + return seg_file + return None + + +def move_brain_scans(subject, timepoint, in_subject_path, out_data_path): + final_path = os.path.join(out_data_path, FINAL_FOLDER, subject, timepoint) + os.makedirs(final_path, exist_ok=True) + + contents = os.listdir(in_subject_path) + + pattern = re.compile(f"{subject}_{timepoint}_{BRAIN_SCAN_NAME}\.nii\.gz") + brain_scans = [content for content in contents if pattern.match(content)] + + for scan in brain_scans: + in_scan = os.path.join(in_subject_path, scan) + out_scan = os.path.join(final_path, scan) + shutil.copyfile(in_scan, out_scan) + + +def move_tumor_segmentation( + subject, timepoint, seg_file, in_subject_path, out_data_path, out_labels_path +): + interim_path = os.path.join(out_data_path, INTERIM_FOLDER, subject, timepoint) + os.makedirs(interim_path, exist_ok=True) + + in_seg_path = os.path.join(in_subject_path, seg_file) + tumor_mask_path = os.path.join(interim_path, TUMOR_MASK_FOLDER) + under_review_path = os.path.join(tumor_mask_path, "under_review") + finalized_path = os.path.join(tumor_mask_path, FINALIZED_PATH) + os.makedirs(under_review_path, exist_ok=True) + os.makedirs(finalized_path, exist_ok=True) + + seg_root_path = os.path.join(tumor_mask_path, seg_file) + seg_under_review_path = os.path.join(under_review_path, seg_file) + seg_finalized_path = os.path.join(finalized_path, seg_file) + shutil.copyfile(in_seg_path, seg_root_path) + shutil.copyfile(in_seg_path, seg_under_review_path) + shutil.copyfile(in_seg_path, seg_finalized_path) + + # Place the segmentation in the backup folder + backup_path = os.path.join(out_labels_path, ".tumor_segmentation_backup") + subject_tp_backup_path = os.path.join( + backup_path, subject, timepoint, TUMOR_MASK_FOLDER + ) + os.makedirs(subject_tp_backup_path, exist_ok=True) + seg_backup_path = os.path.join(subject_tp_backup_path, seg_file) + shutil.copyfile(in_seg_path, seg_backup_path) + + return in_seg_path, seg_finalized_path + + +def write_partial_csv(csv_path, subject, timepoint): + # Used when cases are semi-prepared, in which case they + # skip the formal csv creation + if csv_path is None: + csv_path = get_data_csv_filepath(os.path.join(subject, timepoint)) + + if os.path.exists(csv_path): + df = pd.read_csv(csv_path) + else: + df = pd.DataFrame(columns=CSV_HEADERS) + + row = pd.Series(index=CSV_HEADERS) + row["SubjectID"] = subject + row["Timepoint"] = timepoint + row.name = get_index(subject, timepoint) + row = row.fillna("") + + # Check for existence of this row + row_search = df[(df["SubjectID"] == subject) & (df["Timepoint"] == timepoint)] + if len(row_search) == 0: + df = df.append(row) + + df.to_csv(csv_path, index=False) + + +class InitialSetup(DatasetStage): + def __init__( + self, + data_csv: str, + input_path: str, + output_path: str, + input_labels_path: str, + output_labels_path, + done_data_out_path: str, + done_status: int, + brain_data_out_path: str, + brain_status: int, + tumor_data_out_path: str, + reviewed_status: int, + ): + self.data_csv = data_csv + self.input_path = input_path + self.output_path = output_path + self.input_labels_path = input_labels_path + self.output_labels_path = output_labels_path + self.done_data_out_path = done_data_out_path + self.done_status_code = done_status + self.brain_data_out_path = brain_data_out_path + self.brain_status = brain_status + self.tumor_data_out_path = tumor_data_out_path + self.reviewed_status = reviewed_status + + @property + def name(self) -> str: + return "Initial Setup" + + @property + def status_code(self) -> int: + return SETUP_STAGE_STATUS + + def _proceed_to_comparison(self, subject, timepoint, in_subject_path, report): + index = get_index(subject, timepoint) + final_path = os.path.join( + self.tumor_data_out_path, FINAL_FOLDER, subject, timepoint + ) + input_hash = md5_dir(in_subject_path) + # Stop if the subject was already present and no input change has happened + if index in report.index: + if input_hash == report.loc[index]["input_hash"]: + return report + + # Move brain scans to its expected location + move_brain_scans(subject, timepoint, in_subject_path, self.tumor_data_out_path) + + # Move tumor segmentation to its expected location + seg_file = f"{subject}_{timepoint}_{TUMOR_SEG_NAME}.nii.gz" + _, seg_finalized_path = move_tumor_segmentation( + subject, + timepoint, + seg_file, + in_subject_path, + self.tumor_data_out_path, + self.output_labels_path, + ) + + # Update the report + data = { + "status": self.reviewed_status, + "data_path": final_path, + "labels_path": seg_finalized_path, + "num_changed_voxels": np.nan, + "brain_mask_hash": "", + "segmentation_hash": "", + "input_hash": input_hash, + } + + subject_series = pd.Series(data) + subject_series.name = index + report = report.append(subject_series) + + write_partial_csv(self.data_csv, subject, timepoint) + + return report + + def _proceed_to_tumor_extraction(self, subject, timepoint, in_subject_path, report): + index = get_index(subject, timepoint) + input_hash = md5_dir(in_subject_path) + # Stop if the subject was already present and no input change has happened + if index in report.index: + if input_hash == report.loc[index]["input_hash"]: + return report + final_path = os.path.join( + self.brain_data_out_path, FINAL_FOLDER, subject, timepoint + ) + labels_path = os.path.join( + self.brain_data_out_path, INTERIM_FOLDER, subject, timepoint + ) + os.makedirs(final_path, exist_ok=True) + os.makedirs(labels_path, exist_ok=True) + + # Move brain scans to its expected location + move_brain_scans(subject, timepoint, in_subject_path, self.brain_data_out_path) + + # Update the report + data = { + "status": self.brain_status, + "data_path": final_path, + "labels_path": labels_path, + "num_changed_voxels": np.nan, + "brain_mask_hash": "", + "segmentation_hash": "", + "input_hash": input_hash, + } + + subject_series = pd.Series(data) + subject_series.name = index + report = report.append(subject_series) + + write_partial_csv(self.data_csv, subject, timepoint) + + return report + + def could_run(self, report: pd.DataFrame): + return True + + def execute(self, report: pd.DataFrame) -> Tuple[pd.DataFrame, bool]: + # Rewrite the report + cols = [ + "status", + "status_name", + "comment", + "data_path", + "labels_path", + "input_hash", + ] + print("Initializing report") + if report is None: + print("No previous report was identified. Creating a new one") + report = pd.DataFrame(columns=cols) + + input_is_prepared = has_prepared_folder_structure( + self.input_path, self.input_labels_path + ) + if input_is_prepared: + # If prepared, store data directly in the data folder + print("Input data looks prepared already. Skipping preprocessing") + self.output_path = self.done_data_out_path + + observed_cases = set() + + for subject in os.listdir(self.input_path): + in_subject_path = os.path.join(self.input_path, subject) + out_subject_path = os.path.join(self.output_path, subject) + in_labels_subject_path = os.path.join(self.input_labels_path, subject) + out_labels_subject_path = os.path.join(self.output_labels_path, subject) + + if not os.path.isdir(in_subject_path): + continue + + has_semiprepared, _ = has_semiprepared_folder_structure( + in_subject_path, in_subject_path, recursive=False + ) + if has_semiprepared: + timepoints = get_timepoints(subject, in_subject_path) + for timepoint in timepoints: + index = get_index(subject, timepoint) + tumor_seg = get_tumor_segmentation( + subject, timepoint, in_subject_path + ) + if tumor_seg is not None: + report = self._proceed_to_comparison( + subject, timepoint, in_subject_path, report + ) + else: + report = self._proceed_to_tumor_extraction( + subject, timepoint, in_subject_path, report + ) + observed_cases.add(index) + continue + + for timepoint in os.listdir(in_subject_path): + in_tp_path = os.path.join(in_subject_path, timepoint) + out_tp_path = os.path.join(out_subject_path, timepoint) + in_labels_tp_path = os.path.join(in_labels_subject_path, timepoint) + out_labels_tp_path = os.path.join(out_labels_subject_path, timepoint) + + if not os.path.isdir(in_tp_path): + continue + + input_hash = md5_dir(in_tp_path) + + index = get_index(subject, timepoint) + + # Keep track of the cases that were found on the input folder + observed_cases.add(index) + + has_semiprepared, in_tp_path = has_semiprepared_folder_structure( + in_tp_path, in_tp_path, recursive=True + ) + if has_semiprepared: + tumor_seg = get_tumor_segmentation(subject, timepoint, in_tp_path) + if tumor_seg is not None: + report = self._proceed_to_comparison( + subject, timepoint, in_tp_path, report + ) + else: + report = self._proceed_to_tumor_extraction( + subject, timepoint, in_tp_path, report + ) + continue + + if index in report.index: + # Case has already been identified, see if input hash is different + # or if status is corrupted + # if so, override the contents and restart the state for that case + case = report.loc[index] + has_not_changed = case["input_hash"] == input_hash + has_a_valid_status = not np.isnan(case["status"]) + if has_not_changed and has_a_valid_status: + continue + + print( + f"Case {index} has either changed ({not has_not_changed}) or has a corrupted status ({not has_a_valid_status}). Starting from scratch" + ) + + shutil.rmtree(out_tp_path, ignore_errors=True) + shutil.copytree(in_tp_path, out_tp_path) + report = report.drop(index) + else: + # New case not identified by the report. Add it + print(f"New case identified: {index}. Adding to report") + shutil.rmtree(out_tp_path, ignore_errors=True) + shutil.copytree(in_tp_path, out_tp_path) + + data = { + "status": self.status_code, + "data_path": out_tp_path, + "labels_path": "", + "num_changed_voxels": np.nan, + "brain_mask_hash": "", + "segmentation_hash": "", + "input_hash": input_hash, + } + + has_alternative, contents_path = has_alternative_folder_structure( + out_tp_path, out_tp_path + ) + if has_alternative: + # Move files around so it has the expected structure + to_expected_folder_structure(out_tp_path, contents_path) + + if input_is_prepared: + data["status_code"] = self.done_status_code + shutil.rmtree(out_labels_tp_path, ignore_errors=True) + shutil.copytree(in_labels_tp_path, out_labels_tp_path) + + subject_series = pd.Series(data) + subject_series.name = index + report = report.append(subject_series) + + reported_cases = set(report.index) + removed_cases = reported_cases - observed_cases + + # Stop reporting removed cases + for case_index in removed_cases: + report = report.drop(case_index) + + report = report.sort_index() + return report diff --git a/examples/RANO/data_preparator/pipeline/project/stages/get_csv.py b/examples/RANO/data_preparator/pipeline/project/stages/get_csv.py new file mode 100644 index 000000000..9bf7deca8 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/get_csv.py @@ -0,0 +1,123 @@ +from .row_stage import RowStage +from .CreateCSVForDICOMs import CSVCreator +from .utils import get_id_tp +import pandas as pd +from typing import Union, Tuple +import os +import shutil +from .mlcube_constants import CSV_STAGE_STATUS + + +class AddToCSV(RowStage): + def __init__( + self, input_dir: str, output_csv: str, out_dir: str, prev_stage_path: str + ): + self.input_dir = input_dir + self.output_csv = output_csv + self.out_dir = out_dir + self.prev_stage_path = prev_stage_path + os.makedirs(self.out_dir, exist_ok=True) + self.csv_processor = CSVCreator(self.input_dir, self.output_csv) + if os.path.exists(self.output_csv): + # Use the updated version of the CSV + self.contents = pd.read_csv(self.output_csv) + self.csv_processor.output_df_for_csv = self.contents + else: + # Use the default, empty version + self.contents = self.csv_processor.output_df_for_csv + + @property + def name(self) -> str: + return "Initial Validation" + + @property + def status_code(self) -> int: + return CSV_STAGE_STATUS + + def could_run(self, index: Union[str, int], report: pd.DataFrame) -> bool: + """Determines if getting a new CSV is necessary. + This is done by checking the existence of the expected file + + Args: + index (Union[str, int]): case index in the report + report (pd.DataFrame): Dataframe containing the current state of the preparation flow + + Returns: + bool: wether this stage could be executed + """ + print(f"Checking if {self.name} can run") + id, tp = get_id_tp(index) + prev_case_path = os.path.join(self.prev_stage_path, id, tp) + is_valid = os.path.exists(prev_case_path) + print(f"{is_valid=}") + return is_valid + + def execute(self, index: Union[str, int]) -> Tuple[pd.DataFrame, bool]: + """Adds valid cases to the data csv that is used for later processing + Invalid cases are flagged in the report + + Args: + index (Union[str, int]): case index in the report + report (pd.DataFrame): DataFrame containing the current state of the preparation flow + + Returns: + pd.DataFrame: Updated report dataframe + """ + id, tp = get_id_tp(index) + subject_path = os.path.join(self.input_dir, id) + tp_path = os.path.join(subject_path, tp) + subject_out_path = os.path.join(self.out_dir, id) + tp_out_path = os.path.join(subject_out_path, tp) + # We will first copy the timepoint to the out folder + # This is so, if successful, the csv will point to the data + # in the next stage, instead of the previous + shutil.rmtree(tp_out_path, ignore_errors=True) + shutil.copytree(tp_path, tp_out_path) + + try: + self.csv_processor.process_timepoint(tp, id, subject_out_path) + report_data = { + "status": self.status_code, + "data_path": tp_out_path, + "labels_path": "", + } + except Exception as e: + report_data = { + "status": -self.status_code - 0.3, + "comment": str(e), + "data_path": tp_path, + "labels_path": "", + } + raise + + missing = self.csv_processor.subject_timepoint_missing_modalities + extra = self.csv_processor.subject_timepoint_extra_modalities + + success = True + report_data["comment"] = "" + for missing_subject, msg in missing: + if f"{id}_{tp}" in missing_subject: + # Differentiate errors by floating point value + status_code = -self.status_code - 0.1 # -1.1 + report_data["status"] = status_code + report_data["data_path"] = tp_path + report_data["comment"] += "\n\n" + msg + success = False + + for extra_subject, msg in extra: + if f"{id}_{tp}" in extra_subject: + # Differentiate errors by floating point value + status_code = -self.status_code - 0.2 # -1.2 + report_data["status"] = status_code + report_data["data_path"] = tp_path + report_data["comment"] += "\n\n" + msg + success = False + + report_data["comment"] = report_data["comment"].strip() + if not success: + shutil.rmtree(tp_out_path, ignore_errors=True) + raise TypeError(report_data["comment"]) + + self.csv_processor.write() + + return tp_out_path diff --git a/examples/RANO/data_preparator/pipeline/project/stages/manual.py b/examples/RANO/data_preparator/pipeline/project/stages/manual.py new file mode 100644 index 000000000..dc2bb562b --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/manual.py @@ -0,0 +1,182 @@ +from typing import Union, Tuple +import pandas as pd +import os +import shutil +import json +from .row_stage import RowStage +from .constants import INTERIM_FOLDER, FINAL_FOLDER +from .env_vars import DATA_DIR +from .mlcube_constants import ( + MANUAL_STAGE_STATUS, + BRAIN_MASK_CHANGED_FILE, + PREP_PATH, + BRAIN_MASK_REVIEW_PATH, + TUMOR_EXTRACTION_REVIEW_PATH, + BRAIN_MASK_FILE, + GROUND_TRUTH_PATH, +) +from .utils import ( + get_id_tp, + set_files_read_only, + copy_files, + get_manual_approval_finalized_path, + get_manual_approval_base_path, + delete_empty_directory, +) + + +class ManualStage(RowStage): + def __init__( + self, + data_csv: str, + out_path: str, + prev_stage_path: str, + backup_path: str, + ): + self.data_csv = data_csv + self.out_path = out_path + self.prev_stage_path = prev_stage_path + self.backup_path = backup_path + + @property + def name(self): + return "Manual review" + + @property + def status_code(self) -> int: + return MANUAL_STAGE_STATUS + + def __get_input_paths(self, index: Union[str, int]): + id, tp = get_id_tp(index) + print(f"{self.prev_stage_path=}") + tumor_mask_path = os.path.join( + self.prev_stage_path, INTERIM_FOLDER, id, tp, GROUND_TRUTH_PATH + ) + brain_mask_dir = get_manual_approval_finalized_path( + id, tp, BRAIN_MASK_REVIEW_PATH + ) + brain_mask_path = os.path.join(brain_mask_dir, BRAIN_MASK_FILE) + return tumor_mask_path, brain_mask_path + + def __get_output_path(self, index: Union[str, int]): + id, tp = get_id_tp(index) + path = get_manual_approval_finalized_path(id, tp, TUMOR_EXTRACTION_REVIEW_PATH) + return path + + def __get_backup_path(self, index: Union[str, int]): + id, tp = get_id_tp(index) + path = os.path.join(self.backup_path, id, tp, GROUND_TRUTH_PATH) + return path + + def __get_rollback_paths(self, index: Union[str, int]): + id, tp = get_id_tp(index) + base_rollback_path = os.path.join(DATA_DIR, PREP_PATH, id, tp) + data_path = os.path.join(base_rollback_path, FINAL_FOLDER, id, tp) + labels_path = os.path.join(base_rollback_path, INTERIM_FOLDER, id, tp) + return data_path, labels_path + + def rollback(self, index): + # Unhide the rollback paths + rollback_paths = self.__get_rollback_paths(index) + for rollback_path in rollback_paths: + rollback_dirname = os.path.dirname(rollback_path) + rollback_basename = os.path.basename(rollback_path) + hidden_rollback_path = os.path.join( + rollback_dirname, f".{rollback_basename}" + ) + + if os.path.exists(hidden_rollback_path): + shutil.move(hidden_rollback_path, rollback_path) + + # Move the modified brain mask to the rollback path + _, rollback_labels_path = rollback_paths + tumor_masks_path, brain_mask_path = self.__get_input_paths(index) + rollback_brain_mask_path = os.path.join(rollback_labels_path, BRAIN_MASK_FILE) + if os.path.exists(rollback_brain_mask_path): + os.remove(rollback_brain_mask_path) + shutil.move(brain_mask_path, rollback_brain_mask_path) + + # Remove the complete subject path + subject_path = os.path.abspath( + os.path.join(tumor_masks_path, "..", "..", "..", "..") + ) + + shutil.rmtree(subject_path) + + # Also remove the manual review directory for this subject/timepoint + id, tp = get_id_tp(index) + for approval_type in [TUMOR_EXTRACTION_REVIEW_PATH, BRAIN_MASK_REVIEW_PATH]: + manual_review_path = get_manual_approval_base_path(id, tp, approval_type) + shutil.rmtree(manual_review_path) + subject_review_path = os.path.abspath( + os.path.join(manual_review_path, "..") + ) + delete_empty_directory(subject_review_path) + + def prepare_directories(self, index: Union[str, int]) -> Tuple[str, str]: + # Generate a hidden copy of the baseline segmentations + in_path, brain_path = self.__get_input_paths(index) + out_path = self.__get_output_path(index) + bak_path = self.__get_backup_path(index) + print(f"{in_path=}") + print(f"{out_path=}") + print(f"{bak_path=}") + if not os.path.exists(bak_path) or not os.listdir(bak_path): + print("Entered if") + copy_files(in_path, bak_path) + set_files_read_only(bak_path) + + return out_path, brain_path + + def could_run(self, index: Union[str, int], report: pd.DataFrame) -> bool: + print(f"Checking if {self.name} can run") + out_path = self.__get_output_path(index) + cases = [] + if os.path.exists(out_path): + cases = os.listdir(out_path) + + in_path, brain_path = self.__get_input_paths(index) + brain_mask_hash = "" + if os.path.exists(brain_path): + brain_mask_hash = md5_file(brain_path) + expected_brain_mask_hash = report.loc[index, "brain_mask_hash"] + + segmentation_exists = os.path.exists(in_path) + annotation_exists = len(cases) == 1 + brain_mask_changed = brain_mask_hash != expected_brain_mask_hash + print( + f"{segmentation_exists=} and (not {annotation_exists=} or {brain_mask_changed=})" + ) + return segmentation_exists and (not annotation_exists or brain_mask_changed) + + def execute( + self, index: Union[str, int], report: pd.DataFrame = None + ) -> Tuple[pd.DataFrame, bool]: + """Manual steps are by definition not doable by an algorithm. Therefore, + execution of this step leads to a failed stage message, indicating that + the manual step has not been done. + + Args: + index (Union[str, int]): current case index + report (pd.DataFrame): data preparation report + + Returns: + pd.DataFrame: _description_ + """ + + # Generate a hidden copy of the baseline segmentations + out_path, brain_path = self.prepare_directories(index) + + if report is None: + report = load_report() + brain_mask_changed, brain_mask_hash = self.check_brain_mask_changed( + index, brain_path, report + ) + + if brain_mask_changed: + # Found brain mask changed + self.rollback(index) + # Label this as able to continue + return self.__report_rollback(index, report, brain_mask_hash), True + + return self.check_finalized_cases(index, report, out_path) diff --git a/examples/RANO/data_preparator/pipeline/project/stages/mlcube_constants.py b/examples/RANO/data_preparator/pipeline/project/stages/mlcube_constants.py new file mode 100644 index 000000000..90c78c807 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/mlcube_constants.py @@ -0,0 +1,38 @@ +RAW_PATH = "raw" +AUX_FILES_PATH = "auxiliary_files" +VALID_PATH = "validated" +PREP_PATH = "prepared" +BRAIN_PATH = "brain_extracted" +TUMOR_PATH = "tumor_extracted" +LABELS_PATH = "labels" +TUMOR_BACKUP_PATH = ".tumor_segmentation_backup" +OUT_CSV = "data.csv" +TRASH_PATH = ".trash" +INVALID_FILE = ".invalid.txt" +REPORT_FILE = "report.yaml" +BRAIN_MASK_FILE = "brainMask_fused.nii.gz" +METADATA_PATH = "metadata" +CHANGED_VOXELS_FILE = ".changed_voxels.txt" + +# Directories used for the Manual Approval steps +MANUAL_REVIEW_PATH = "manual_review" +BRAIN_MASK_REVIEW_PATH = "brain_mask" +TUMOR_EXTRACTION_REVIEW_PATH = "tumor_extraction" +UNDER_REVIEW_PATH = "under_review" +FINALIZED_PATH = "finalized" + +# Backup segmentation in case the user changes the one being used +GROUND_TRUTH_PATH = ".ground_truth" + +# JSON file (just true/false) for evaluating brain mask changes +BRAIN_MASK_CHANGED_FILE = "brain_mask_changed.json" + +SETUP_STAGE_STATUS = 0 +CSV_STAGE_STATUS = 1 +NIFTI_STAGE_STATUS = 2 +BRAIN_STAGE_STATUS = 3 +TUMOR_STAGE_STATUS = 4 +MANUAL_STAGE_STATUS = 5 +COMPARISON_STAGE_STATUS = 6 +CONFIRM_STAGE_STATUS = 7 +DONE_STAGE_STATUS = 8 diff --git a/examples/RANO/data_preparator/pipeline/project/stages/nifti_transform.py b/examples/RANO/data_preparator/pipeline/project/stages/nifti_transform.py new file mode 100644 index 000000000..f5e50f8e9 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/nifti_transform.py @@ -0,0 +1,146 @@ +from typing import Union +from tqdm import tqdm +import pandas as pd +import os +import shutil + +from .row_stage import RowStage +from .PrepareDataset import Preparator +from .utils import get_id_tp +from .mlcube_constants import NIFTI_STAGE_STATUS +from .constants import FINAL_FOLDER, EXEC_NAME + + +class NIfTITransform(RowStage): + def __init__( + self, + data_csv: str, + out_path: str, + prev_stage_path: str, + metadata_path: str, + data_out: str, + ): + self.data_csv = data_csv + self.out_path = out_path + self.data_out = data_out + self.prev_stage_path = prev_stage_path + self.metadata_path = metadata_path + os.makedirs(self.out_path, exist_ok=True) + self.prep = Preparator(data_csv, out_path, EXEC_NAME) + # self.pbar = pbar + self.pbar = tqdm() + + @property + def name(self) -> str: + return "NiFTI Conversion" + + @property + def status_code(self) -> int: + return NIFTI_STAGE_STATUS + + def could_run(self, index: Union[str, int], report: pd.DataFrame) -> bool: + """Determine if case at given index needs to be converted to NIfTI + + Args: + index (Union[str, int]): Case index, as used by the report dataframe + report (pd.DataFrame): Report Dataframe for providing additional context + + Returns: + bool: Wether this stage could be executed for the given case + """ + print(f"Checking if {self.name} can run") + id, tp = get_id_tp(index) + prev_case_path = os.path.join(self.prev_stage_path, id, tp) + if os.path.exists(prev_case_path): + is_valid = len(os.listdir(prev_case_path)) > 0 + print(f"{is_valid}") + return is_valid + return False + + def execute( + self, + index: Union[str, int], + ) -> pd.DataFrame: + """Executes the NIfTI transformation stage on the given case + + Args: + index (Union[str, int]): case index, as used by the report + report (pd.DataFrame): DataFrame containing the current state of the preparation flow + + Returns: + pd.DataFrame: Updated report dataframe + """ + self.__prepare_exec() + self.__process_case(index) + self.__cleanup_artifacts(index) + success = self.__validate_result(index) + self.prep.write() + self.__update_metadata(index) + + return success + + def __cleanup_artifacts(self, index): + unused_artifacts_substrs = ["raw", "to_SRI", ".mat"] + _, out_path = self.__get_output_paths(index) + root_artifacts = os.listdir(out_path) + for artifact in root_artifacts: + if not any([substr in artifact for substr in unused_artifacts_substrs]): + continue + artifact_path = os.path.join(out_path, artifact) + os.remove(artifact_path) + + def __get_output_paths(self, index: Union[str, int]): + id, tp = get_id_tp(index) + fets_path = os.path.join(self.prep.final_output_dir, id, tp) + qc_path = os.path.join(self.prep.interim_output_dir, id, tp) + + return fets_path, qc_path + + def __prepare_exec(self): + # Reset the file contents for errors + open(self.prep.stderr_log, "w").close() + + self.prep.read() + + def __process_case(self, index: Union[str, int]): + id, tp = get_id_tp(index) + df = self.prep.subjects_df + row = df[(df["SubjectID"] == id) & (df["Timepoint"] == tp)].iloc[0] + self.prep.convert_to_dicom(hash(index), row, self.pbar) + + def __undo_current_stage_changes(self, index: Union[str, int]): + fets_path, qc_path = self.__get_output_paths(index) + shutil.rmtree(fets_path, ignore_errors=True) + shutil.rmtree(qc_path, ignore_errors=True) + + def __validate_result(self, index: Union[str, int]) -> pd.DataFrame: + id, tp = get_id_tp(index) + failing = self.prep.failing_subjects + failing_subject = failing[ + (failing["SubjectID"] == id) & (failing["Timepoint"] == tp) + ] + if len(failing_subject): + self.__undo_current_stage_changes(index) + self.__report_failure() + else: + success = True + + return success + + def __update_metadata(self, index): + id, tp = get_id_tp(index) + fets_path = os.path.join(self.out_path, FINAL_FOLDER) + outfile_dir = os.path.join(self.metadata_path, id, tp) + os.makedirs(outfile_dir, exist_ok=True) + for file in os.listdir(fets_path): + filepath = os.path.join(fets_path, file) + out_filepath = os.path.join(self.metadata_path, id, tp, file) + if os.path.isfile(filepath) and filepath.endswith(".yaml"): + shutil.copyfile(filepath, out_filepath) + + def __report_failure(self): + + with open(self.prep.stderr_log, "r") as f: + msg = f.read() + + raise TypeError(msg) diff --git a/examples/RANO/data_preparator/pipeline/project/stages/pipeline.py b/examples/RANO/data_preparator/pipeline/project/stages/pipeline.py new file mode 100644 index 000000000..c709fff25 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/pipeline.py @@ -0,0 +1,285 @@ +from pandas import DataFrame +from typing import Union, List, Tuple +from tqdm import tqdm +import traceback +import os + +from .utils import write_report +from .dset_stage import DatasetStage +from .row_stage import RowStage +from .stage import Stage +from .utils import cleanup_storage +from .mlcube_constants import DONE_STAGE_STATUS + + +class Pipeline: + def __init__( + self, + init_stage: DatasetStage, + stages: List[Union[DatasetStage, RowStage]], + staging_folders: List[str], + trash_folders: List[str], + invalid_subjects_file: str, + ): + self.init_stage = init_stage + self.stages = stages + self.staging_folders = staging_folders + self.trash_folders = trash_folders + self.invalid_subjects_file = invalid_subjects_file + + def __invalid_subjects(self) -> List[str]: + """Retrieve invalid subjects + + Returns: + List[str]: list of invalid subjects + """ + if not os.path.exists(self.invalid_subjects_file): + open(self.invalid_subjects_file, "a").close() + + with open(self.invalid_subjects_file, "r") as f: + invalid_subjects = set([line.strip() for line in f]) + + return invalid_subjects + + def __is_subject_done(self, subject: Union[str, int], report: DataFrame) -> bool: + """Determines if a subject is considered done + + Args: + subject (Union[str, int]): subject index + report (DataFrame): DataFrame containing the state of the processing + + Returns: + bool: wether the subject is done or not + """ + subject_status = report.loc[subject, "status"] + + return subject_status == DONE_STAGE_STATUS + + def __is_done(self, report: DataFrame) -> bool: + """Determines if the preparation is complete + + Args: + report (DataFrame): DataFrame containing the state of the processing + + Returns: + bool: Wether the preparation is complete + """ + return all(report["status"] == DONE_STAGE_STATUS) + + def __get_report_stage_to_run( + self, subject: Union[str, int], report: DataFrame + ) -> Union[DatasetStage, RowStage]: + """Retrieves the stage a subject is in indicated by the report + + Args: + subject (Union[str, int]): Subject index + report (DataFrame): Dataframe containing the state of the processing + + Returns: + Union[DatasetStage, RowStage]: Stage the current subject is in + """ + report_status_code = int(report.loc[subject, "status"]) + if report_status_code < 0: + # Error code, rerun the stage specified in the report + report_status_code = abs(report_status_code) + else: + # Success code, reported stage works so move to the next one + report_status_code += 1 + for stage in self.stages: + if stage.status_code == report_status_code: + return stage + + return None + + def determine_next_stage( + self, subject: Union[str, int], report + ) -> Tuple[List[Union[DatasetStage, RowStage]], bool]: + """Determines what stage to run + First priority goes to a stage if it is the only one that could run. (only one stage can run) + Second priority goes to what the report says should run next. (The report knows what stage can run) + Third priority goes to the first of all possible stages that could run. (Earliest of all possible stages) + + Args: + subject (Union[str, int]): Subject name (SubjectID, Timepoint) + report (pd.DataFrame): report dataframe + + Returns: + Tuple[List[Union[DatasetStage, RowStage]], bool]: Stage to run, and wether it is done or not + """ + could_run_stages = [] + for i, stage in enumerate(self.stages): + could_run = False + if isinstance(stage, RowStage): + could_run = stage.could_run(subject, report) + else: + could_run = stage.could_run(report) + + if could_run: + runnable_stage = self.stages[i] + could_run_stages.append(runnable_stage) + + print(f"Possible next stages: {[stage.name for stage in could_run_stages]}") + + # TODO: split into a function + if len(could_run_stages) == 1: + stage = could_run_stages[0] + is_last_subject = subject == report.index[-1] + if isinstance(stage, DatasetStage) and not is_last_subject: + # Only run dataset stages on the last subject, so all subjects can update + # their state if needed before proceeding + return None, False + return stage, False + + # Handle errors + # Either no stage can be executed (len(could_run_stages == 0)) + # or multiple stages can be executed (len(could_run_stages > 1)) + report_stage = self.__get_report_stage_to_run(subject, report) + if report_stage is not None: + print(f"Reported next stage: {report_stage.name}") + + # TODO: split into a function + if len(could_run_stages) == 0: + # Either the case processing was on-going but it's state is broken + # or the next stage is a dataset stage, which means we're done with this one + # or the case is done and no stage can nor should run + # We can tell this by looking at the report + is_done = self.__is_subject_done(subject, report) + is_dset_stage = isinstance(report_stage, DatasetStage) + if is_done or is_dset_stage: + return None, True + else: + return None, False + # TODO: split into a function + else: + # Multiple stages could run. Remove ambiguity by + # syncing with the report + if report_stage in could_run_stages: + return report_stage, False + + return could_run_stages[0], False + + def run(self, report: DataFrame, report_path: str): + # cleanup the trash at the very beginning + cleanup_storage(self.trash_folders) + + # The init stage always has to be executed + report, _ = self.init_stage.execute(report) + write_report(report, report_path) + + invalid_subjects = self.__invalid_subjects() + + should_loop = True + should_stop = False + while should_loop: + + # Since we could have row and dataset stages interwoven, we want + # to make sure we continue processing subjects until nothing new has happened. + # This means we can resume a given subject and its row stages even after a dataset stage + prev_status = report["status"].copy() + subjects = list(report.index) + subjects_loop = tqdm(subjects) + + for subject in subjects_loop: + report, should_stop = self.process_subject( + subject, report, report_path, subjects_loop + ) + + if should_stop: + break + + # If a new invalid subject is identified, start over + new_invalid_subjects = self.__invalid_subjects() + if invalid_subjects != new_invalid_subjects: + invalid_subjects = new_invalid_subjects + # We're going to restart the subjects loop + break + + # Check for report differences. If there are, rerun the loop + should_loop = any(report["status"] != prev_status) and not should_stop + + if self.__is_done(report): + cleanup_folders = self.staging_folders + self.trash_folders + cleanup_storage(cleanup_folders) + + def process_subject( + self, subject: Union[int, str], report: DataFrame, report_path: str, pbar: tqdm + ): + should_stop = False + while True: + # Check if subject has been invalidated + invalid_subjects = self.__invalid_subjects() + if subject in invalid_subjects: + break + + # Filter out invalid subjects + working_report = report[~report.index.isin(invalid_subjects)].copy() + + print(f"Determining next stage for {subject}", flush=True) + stage, done = self.determine_next_stage(subject, working_report) + if stage is not None: + print(f"Next stage for {subject}: {stage.name}", flush=True) + + if done: + print(f"Subject {subject} is Done", flush=True) + break + + try: + working_report, successful = self.run_stage( + stage, subject, working_report, pbar + ) + except Exception: + # TODO: The superclass could be in charge of catching the error, reporting it and cleaning up + # and raise the exception again to be caught here + working_report = self.__report_unhandled_exception( + stage, subject, working_report + ) + print(traceback.format_exc()) + successful = False + + report.update(working_report) + write_report(report, report_path) + + if not successful: + # Send back a signal that a dset stage failed + if isinstance(stage, DatasetStage): + should_stop = True + break + + return report, should_stop + + def run_stage(self, stage, subject, report, pbar): + successful = False + if isinstance(stage, RowStage): + pbar.set_description(f"{subject} | {stage.name}") + report, successful = stage.execute(subject, report) + elif isinstance(stage, DatasetStage): + pbar.set_description(f"{stage.name}") + report, successful = stage.execute(report) + + return report, successful + + def __report_unhandled_exception( + self, + stage: Stage, + subject: Union[int, str], + report: DataFrame, + ): + # Assign a special status code for unhandled errors, associated + # to the stage status code + status_code = -stage.status_code - 0.101 + name = f"{stage.name.upper().replace(' ', '_')}_UNHANDLED_ERROR" + comment = traceback.format_exc() + data_path = report.loc[subject]["data_path"] + labels_path = report.loc[subject]["labels_path"] + + body = { + "status": status_code, + "status_name": name, + "comment": comment, + "data_path": data_path, + "labels_path": labels_path, + } + + report.loc[subject] = body + + return report diff --git a/examples/RANO/data_preparator/pipeline/project/stages/row_stage.py b/examples/RANO/data_preparator/pipeline/project/stages/row_stage.py new file mode 100644 index 000000000..70701beb0 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/row_stage.py @@ -0,0 +1,34 @@ +from abc import ABC, abstractmethod +from typing import Union, Tuple +import pandas as pd + +from .stage import Stage + + +class RowStage(Stage, ABC): + @abstractmethod + def could_run(self, index: Union[str, int], report: pd.DataFrame) -> bool: + """Establishes if this step could be executed for the given case + + Args: + index (Union[str, int]): case index in the report + report (pd.DataFrame): Dataframe containing the current state of the preparation flow + + Returns: + bool: wether this stage could be executed + """ + + @abstractmethod + def execute( + self, index: Union[str, int], report: pd.DataFrame + ) -> Tuple[pd.DataFrame, bool]: + """Executes the stage on the given case + + Args: + index (Union[str, int]): case index in the report + report (pd.DataFrame): DataFrame containing the current state of the preparation flow + + Returns: + pd.DataFrame: Updated report dataframe + bool: Success status + """ diff --git a/examples/RANO/data_preparator/pipeline/project/stages/split.py b/examples/RANO/data_preparator/pipeline/project/stages/split.py new file mode 100644 index 000000000..a22789a4f --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/split.py @@ -0,0 +1,154 @@ +import os +import yaml +import pandas as pd +from typing import List +import math + +from .dset_stage import DatasetStage +from .utils import ( + get_id_tp, + cleanup_storage, + safe_remove, + find_finalized_subjects, + delete_empty_directory, +) +from .mlcube_constants import DONE_STAGE_STATUS, METADATA_PATH +from .env_vars import WORKSPACE_DIR +from .constants import DICOM_ANON_FILENAME, DICOM_COLLAB_FILENAME + + +def row_to_path(row: pd.Series) -> str: + id = row["SubjectID"] + tp = row["Timepoint"] + return os.path.join(id, tp) + + +class SplitStage(DatasetStage): + def __init__( + self, + params: str, + data_path: str, + labels_path: str, + staging_folders: List[str], + base_finalized_dir: str, + ): + self.params = params + self.data_path = data_path + self.labels_path = labels_path + self.split_csv_path = os.path.join(data_path, "splits.csv") + self.train_csv_path = os.path.join(data_path, "train.csv") + self.val_csv_path = os.path.join(data_path, "val.csv") + self.staging_folders = staging_folders + self.base_finalized_dir = base_finalized_dir + + @property + def name(self) -> str: + return "Generate splits" + + @property + def status_code(self) -> int: + return DONE_STAGE_STATUS + + def could_run(self, report: pd.DataFrame) -> bool: + split_exists = os.path.exists(self.split_csv_path) + if split_exists: + # This stage already ran + return False + + for index in report.index: + id, tp = get_id_tp(index) + case_data_path = os.path.join(self.data_path, id, tp) + case_labels_path = os.path.join(self.labels_path, id, tp) + data_exists = os.path.exists(case_data_path) + labels_exist = os.path.exists(case_labels_path) + + if not data_exists or not labels_exist: + # Some subjects are not ready + return False + + return True + + def consolidate_metadata(self): + base_metadata_dir = os.path.join(WORKSPACE_DIR, METADATA_PATH) + anon_dict = {} + collab_dict = {} + files_to_delete = set() + for subject_id_dir in os.listdir(base_metadata_dir): + try: + subject_complete_dir = os.path.join(base_metadata_dir, subject_id_dir) + + for timepoint_dir in os.listdir(subject_complete_dir): + subject_timepoint_complete_dir = os.path.join( + subject_complete_dir, timepoint_dir + ) + subject_metadata_path = os.path.join(subject_timepoint_complete_dir) + if not os.path.isdir(subject_metadata_path): + continue + + anon_yaml = os.path.join(subject_metadata_path, DICOM_ANON_FILENAME) + collab_yaml = os.path.join( + subject_metadata_path, DICOM_COLLAB_FILENAME + ) + + update_tuples = [(anon_yaml, anon_dict), (collab_yaml, collab_dict)] + for yaml_file, data_dict in update_tuples: + if not os.path.isfile(yaml_file): + continue + + with open(yaml_file, "r") as f: + update_dict = yaml.safe_load(f) + + data_dict.update(**update_dict) + files_to_delete.add(yaml_file) + except OSError: + pass + + final_anon_file = os.path.join(base_metadata_dir, DICOM_ANON_FILENAME) + final_collab_file = os.path.join(base_metadata_dir, DICOM_COLLAB_FILENAME) + + write_tuples = [(final_anon_file, anon_dict), (final_collab_file, collab_dict)] + for file_path, data in write_tuples: + with open(file_path, "w") as f: + yaml.dump(data, f) + + for file in files_to_delete: + safe_remove(file) + + for subdir in os.listdir(base_metadata_dir): + complete_subdir_path = os.path.join(base_metadata_dir, subdir) + delete_empty_directory(complete_subdir_path) + + def execute(self) -> pd.DataFrame: + with open(self.params, "r") as f: + params = yaml.safe_load(f) + + seed = params["seed"] + train_pct = params["train_percent"] + + finalized_subjects = find_finalized_subjects() + split_df = pd.DataFrame(finalized_subjects) + subjects = split_df["SubjectID"].drop_duplicates() + subjects = subjects.sample(frac=1, random_state=seed) + train_size = math.floor(len(subjects) * train_pct) + + train_subjects = subjects.iloc[:train_size] + val_subjects = subjects.iloc[train_size:] + + train_mask = split_df["SubjectID"].isin(train_subjects) + val_mask = split_df["SubjectID"].isin(val_subjects) + + split_df.loc[train_mask, "Split"] = "Train" + split_df.loc[val_mask, "Split"] = "Val" + + split_df.to_csv(self.split_csv_path, index=False) + + # Generate separate splits files with relative path + split_df["path"] = split_df.apply(row_to_path, axis=1) + + split_df.loc[train_mask].to_csv(self.train_csv_path, index=False) + split_df.loc[val_mask].to_csv(self.val_csv_path, index=False) + + self.consolidate_metadata() + cleanup_storage(self.staging_folders) + + return True diff --git a/examples/RANO/data_preparator/pipeline/project/stages/stage.py b/examples/RANO/data_preparator/pipeline/project/stages/stage.py new file mode 100644 index 000000000..ac453bd6d --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/stage.py @@ -0,0 +1,5 @@ +from abc import ABC + +class Stage(ABC): + name: str + status_code: int \ No newline at end of file diff --git a/examples/RANO/data_preparator/pipeline/project/stages/utils.py b/examples/RANO/data_preparator/pipeline/project/stages/utils.py new file mode 100644 index 000000000..f6a2130f4 --- /dev/null +++ b/examples/RANO/data_preparator/pipeline/project/stages/utils.py @@ -0,0 +1,320 @@ +import os +import shutil +from pandas import DataFrame +from tqdm import tqdm +from functools import reduce +from pathlib import Path +import hashlib +import yaml +import pandas as pd + +from .env_vars import DATA_DIR, DATA_SUBDIR +from .mlcube_constants import ( + OUT_CSV, + AUX_FILES_PATH, + FINALIZED_PATH, + MANUAL_REVIEW_PATH, + UNDER_REVIEW_PATH, + TUMOR_EXTRACTION_REVIEW_PATH, + REPORT_FILE, + CHANGED_VOXELS_FILE, +) + + +def convert_path_to_index(path: str): + as_list = path.split(os.sep) + as_index = "|".join(as_list) + return as_index + + +# Taken from https://code.activestate.com/recipes/577879-create-a-nested-dictionary-from-oswalk/ +def get_directory_structure(rootdir): + """ + Creates a nested dictionary that represents the folder structure of rootdir + """ + dir = {} + rootdir = rootdir.rstrip(os.sep) + start = rootdir.rfind(os.sep) + 1 + for path, dirs, files in os.walk(rootdir): + folders = path[start:].split(os.sep) + subdir = dict.fromkeys(files) + parent = reduce(dict.get, folders[:-1], dir) + parent[folders[-1]] = subdir + return dir + + +def get_subdirectories(base_directory: str): + return [ + subdir + for subdir in os.listdir(base_directory) + if os.path.isdir(os.path.join(base_directory, subdir)) + ] + + +def has_prepared_folder_structure(data_path, labels_path) -> bool: + data_struct = list(get_directory_structure(data_path).values())[0] + labels_struct = list(get_directory_structure(labels_path).values())[0] + + expected_data_files = [ + "brain_t1c.nii.gz", + "brain_t1n.nii.gz", + "brain_t2f.nii.gz", + "brain_t2w.nii.gz", + ] + expected_labels_files = ["final_seg.nii.gz"] + + if "splits.csv" not in data_struct: + return False + + for id in data_struct.keys(): + if data_struct[id] is None: + # This is a file, ignore + continue + for tp in data_struct[id].keys(): + expected_subject_data_files = set( + ["_".join([id, tp, file]) for file in expected_data_files] + ) + expected_subject_labels_files = set( + ["_".join([id, tp, file]) for file in expected_labels_files] + ) + + found_data_files = set(data_struct[id][tp].keys()) + found_labels_files = set(labels_struct[id][tp].keys()) + + data_files_diff = len(expected_subject_data_files - found_data_files) + labels_files_diff = len(expected_subject_labels_files - found_labels_files) + if data_files_diff or labels_files_diff: + return False + + # Passed all checks + return True + + +def normalize_path(path: str) -> str: + """Remove mlcube-specific components from the given path + + Args: + path (str): mlcube path + + Returns: + str: normalized path + """ + # for this specific problem, we know that all paths start with `/mlcube_io*` + # and that this pattern won't change, shrink or grow. We can therefore write a + # simple, specific solution + if path.startswith("/mlcube_io"): + return path[12:] + + # In case the path has already been normalized + return path + + +def unnormalize_path(path: str, parent: str) -> str: + """Add back mlcube-specific components to the given path + + Args: + path (str): normalized path + + Returns: + str: mlcube-specific path + """ + if path.startswith(os.path.sep): + path = path[1:] + return os.path.join(parent, path) + + +def load_report(subject_id: str, timepoint: str) -> pd.DataFrame: + report_path = get_report_yaml_filepath(subject_id, timepoint) + + try: + with open(report_path, "r") as f: + report_data = yaml.safe_load(f) + except FileNotFoundError: + report_data = None + + report_df = pd.DataFrame(report_data) + return report_df + + +def normalize_report_paths(report: DataFrame) -> DataFrame: + """Ensures paths are normalized and converts them to relative paths for the local machine + + Args: + report (DataFrame): report to normalize + + Returns: + DataFrame: report with transformed paths + """ + pattern = DATA_SUBDIR + report["data_path"] = report["data_path"].str.split(pattern).str[-1] + report["labels_path"] = report["labels_path"].str.split(pattern).str[-1] + return report + + +def write_report(report: DataFrame, subject_id: str, timepoint: str): + filepath = get_report_yaml_filepath(subject_id, timepoint) + report_dict = report.to_dict() + + # Use a temporary file to avoid quick writes collisions and corruption + temp_path = Path(filepath).parent / ".report.yaml" + with open(temp_path, "w") as f: + yaml.dump(report_dict, f) + os.rename(temp_path, filepath) + + +def get_id_tp(index: str): + return index.split("|") + + +def set_files_read_only(path): + for root, dirs, files in os.walk(path): + for file_name in files: + file_path = os.path.join(root, file_name) + os.chmod(file_path, 0o444) # Set read-only permission for files + + for dir_name in dirs: + dir_path = os.path.join(root, dir_name) + set_files_read_only( + dir_path + ) # Recursively call the function for subdirectories + + +def cleanup_storage(remove_folders): + for folder in remove_folders: + print(f"Deleting directory {folder}...") + shutil.rmtree(folder, ignore_errors=True) + + +def copy_files(src_dir, dest_dir): + # Ensure the destination directory exists + os.makedirs(dest_dir, exist_ok=True) + + # Iterate through the files in the source directory + for filename in os.listdir(src_dir): + src_file = os.path.join(src_dir, filename) + dest_file = os.path.join(dest_dir, filename) + + # Check if the item is a file (not a directory) + if os.path.isfile(src_file): + shutil.copy2(src_file, dest_file) # Copy the file + + +# Taken from https://stackoverflow.com/questions/24937495/how-can-i-calculate-a-hash-for-a-filesystem-directory-using-python +def md5_update_from_dir(directory, hash): + assert Path(directory).is_dir() + for path in sorted(Path(directory).iterdir(), key=lambda p: str(p).lower()): + hash.update(path.name.encode()) + if path.is_file(): + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hash.update(chunk) + elif path.is_dir(): + hash = md5_update_from_dir(path, hash) + return hash + + +def md5_dir(directory): + return md5_update_from_dir(directory, hashlib.md5()).hexdigest() + + +def md5_file(filepath): + return hashlib.md5(open(filepath, "rb").read()).hexdigest() + + +class MockTqdm(tqdm): + def __getattr__(self, attr): + return lambda *args, **kwargs: None + + +def get_aux_files_dir(subject_subdir): + return os.path.join(DATA_DIR, AUX_FILES_PATH, subject_subdir) + + +def get_report_yaml_filepath(subject_id, timepoint): + yaml_dir = os.path.join( + DATA_DIR, AUX_FILES_PATH, os.path.join(subject_id, timepoint) + ) + return os.path.join(yaml_dir, REPORT_FILE) + + +def get_data_csv_filepath(subject_subdir): + csv_dir = get_aux_files_dir(subject_subdir) + return os.path.join(csv_dir, OUT_CSV) + + +def find_finalized_subjects(): + base_finalized_dir = os.path.join( + DATA_DIR, MANUAL_REVIEW_PATH, TUMOR_EXTRACTION_REVIEW_PATH + ) + subject_and_timepoint_list = [] + + candidate_subjects = get_subdirectories(base_finalized_dir) + for candidate_subject in candidate_subjects: + subject_path = os.path.join(base_finalized_dir, candidate_subject) + timepoint_dirs = get_subdirectories(subject_path) + + for timepoint in timepoint_dirs: + timepoint_complete_path = os.path.join(subject_path, timepoint) + finalized_path = os.path.join(timepoint_complete_path, FINALIZED_PATH) + try: + path_exists = os.path.exists(finalized_path) + path_is_dir = os.path.isdir(finalized_path) + only_one_case = len(os.listdir(finalized_path)) == 1 + if path_exists and path_is_dir and only_one_case: + subject_timepoint_dict = { + "SubjectID": candidate_subject, + "Timepoint": timepoint, + } + subject_and_timepoint_list.append(subject_timepoint_dict) + except OSError: + pass + return subject_and_timepoint_list + + +def get_manual_approval_base_path(subject_id, timepoint, approval_type): + manual_approval_base_path = os.path.join( + DATA_DIR, + MANUAL_REVIEW_PATH, + approval_type, + subject_id, + timepoint, + ) + return manual_approval_base_path + + +def get_manual_approval_finalized_path(subject_id, timepoint, approval_type): + base_path = get_manual_approval_base_path(subject_id, timepoint, approval_type) + full_path = os.path.join(base_path, FINALIZED_PATH) + return full_path + + +def get_manual_approval_under_review_path(subject_id, timepoint, approval_type): + base_path = get_manual_approval_base_path(subject_id, timepoint, approval_type) + full_path = os.path.join(base_path, UNDER_REVIEW_PATH) + return full_path + + +def safe_remove(path_to_remove: str): + try: + os.remove(path_to_remove) + except FileNotFoundError: + pass + + +def delete_empty_directory(path_to_directory: str): + if os.path.isdir(path_to_directory): + inside_this_dir = os.listdir(path_to_directory) + for subdir in inside_this_dir: + complete_path = os.path.join(path_to_directory, subdir) + delete_empty_directory(complete_path) + + # List again, could be empty now + inside_this_dir = os.listdir(path_to_directory) + if not inside_this_dir: + shutil.rmtree(path_to_directory) + + +def get_changed_voxels_file(subject_id, timepoint): + return os.path.join( + DATA_DIR, AUX_FILES_PATH, subject_id, timepoint, CHANGED_VOXELS_FILE + ) diff --git a/examples/RANO/data_preparator/workflow.yaml b/examples/RANO/data_preparator/workflow.yaml new file mode 100644 index 000000000..061d18a14 --- /dev/null +++ b/examples/RANO/data_preparator/workflow.yaml @@ -0,0 +1,270 @@ +base_step: &BASE_STEP + - type: container + image: mlcommons/rano-data-prep-workflow:0.0.1 + + +steps: + - id: setup + <<: *BASE_STEP + command: initial_setup + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + next: make_csv + on_error: do_something + per_subject: false + + - id: make_csv + <<: *BASE_STEP + command: make_csv + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + next: nifti_conversion + on_error: do_something + per_subject: true + + - id: nifti_conversion + <<: *BASE_STEP + mounts: + input_volumes: + csv_input: + mount_path: /workspace/data + type: directory + from: + step: make_csv + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + metadata_path: + mount_path: /workspace/metadata + type: directory + command: convert_nifti + next: brain_extraction + on_error: do_something + per_subject: true + + - id: brain_extraction + <<: *BASE_STEP + mounts: + input_volumes: + nifti_input: + mount_path: /workspace/data + type: directory + from: + step: nifti_conversion + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: extract_brain + next: tumor_extraction + on_error: do_something + per_subject: true + limit: 2 + + - id: tumor_extraction + <<: *BASE_STEP + mounts: + input_volumes: + brain_extraction_input: + mount_path: /workspace/data + type: directory + from: + step: brain_extraction + mount: output_path + additional_files: + mount_path: /workspace/additional_files + type: directory + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: extract_tumor + next: prepare_for_manual_review + on_error: do_something + per_subject: true + limit: 2 + + - id: prepare_for_manual_review + <<: *BASE_STEP + mounts: + input_volumes: + tumor_extraction_input: + mount_path: /workspace/data + type: directory + from: + step: tumor_extraction + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: prepare_for_manual_review + next: + if: + - condition: annotation_done + target: segmentation_comparison + - condition: brain_mask_changed + target: rollback_to_brain_extract + else: prepare_for_manual_review + wait: 60 + on_error: do_something + per_subject: true + + - id: rollback_to_brain_extract + <<: *BASE_STEP + mounts: + input_volumes: + review_input: + mount_path: /workspace/data + type: directory + from: + step: prepare_for_manual_review + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: rollback_to_brain_extract + next: brain_extraction + per_subject: true + + - id: segmentation_comparison + <<: *BASE_STEP + mounts: + input_volumes: + review_input: + mount_path: /workspace/data + type: directory + from: + step: prepare_for_manual_review + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: segmentation_comparison + next: calculate_changed_voxels + per_subject: true + + - id: calculate_changed_voxels + <<: *BASE_STEP + mounts: + input_volumes: + segmentation_comparison_input: + mount_path: /workspace/data + type: directory + from: + step: segmentation_comparison + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: calculate_changed_voxels + next: final_confirmation + + - id: final_confirmation + type: manual_approval + next: move_labeled_files + + + - id: move_labeled_files + <<: *BASE_STEP + mounts: + input_volumes: + changed_voxels_input: + mount_path: /workspace/data + type: directory + from: + step: calculate_changed_voxels + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: move_labeled_files + next: consolidation_stage + + + - id: consolidation_stage + <<: *BASE_STEP + mounts: + input_volumes: + move_labeled_files_input: + mount_path: /workspace/data + type: directory + from: + step: move_labeled_files + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + output_labels_path: + mount_path: /workspace/data/labels + type: directory + command: consolidation_stage + next: sanity_check + + - id: sanity_check + <<: *BASE_STEP + mounts: + input_volumes: + consolidation_input: + mount_path: /workspace/data + type: directory + from: + step: consolidation_stage + mount: output_path + command: sanity_check + next: metrics + + - id: metrics + <<: *BASE_STEP + mounts: + input_volumes: + consolidation_input: + mount_path: /workspace/data + type: directory + from: + step: consolidation_stage + mount: output_path + output_volumes: + statistics_file: + mount_path: /workspace/data/statistics.yaml + type: file + output_labels_path: + mount_path: /workspace/data/labels + type: directory + command: metrics + next: null + +conditions: + - id: annotation_done + type: function + function_name: conditions.annotation_done + + - id: brain_mask_changed + type: function + function_name: conditions.brain_mask_changed + +per_subject_def: + type: function + function_name: subject_definition.subject_definition \ No newline at end of file diff --git a/examples/RANO/data_preparator/workspace/parameters.yaml b/examples/RANO/data_preparator/workspace/parameters.yaml new file mode 100644 index 000000000..7755bbbd7 --- /dev/null +++ b/examples/RANO/data_preparator/workspace/parameters.yaml @@ -0,0 +1,21 @@ +seed: 2784 +train_percent: 0.8 +medperf_report_stages: +- "IDENTIFIED" +- "VALIDATED" +- "MISSING_MODALITIES" +- "EXTRA_MODALITIES" +- "VALIDATION_FAILED" +- "CONVERTED_TO_NIfTI" +- "NIfTI_CONVERSION_FAILED" +- "BRAIN_EXTRACT_FINISHED" +- "BRAIN_EXTRACT_FINISHED" +- "TUMOR_EXTRACT_FAILED" +- "MANUAL_REVIEW_COMPLETE" +- "MANUAL_REVIEW_REQUIRED" +- "MULTIPLE_ANNOTATIONS_ERROR" +- "COMPARISON_COMPLETE" +- "EXACT_MATCH_IDENTIFIED" +- "ANNOTATION_COMPARISON_FAILED" +- "ANNOTATION_CONFIRMED" +- "DONE" \ No newline at end of file From 00e99339c1fb5d1e76154e63f233db154b623966 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 16:48:36 -0300 Subject: [PATCH 084/176] Improve parser logic so only a single yaml file is directly sent and read, rather than parsing directory --- .../containers/runners/airflow_runner.py | 2 +- .../components/airflow_component.py | 15 +++---- .../airflow_runner_utils/dags/constants.py | 2 +- .../dags/yaml_parser/yaml_parser.py | 41 +++++-------------- .../airflow_runner_utils/system_runner.py | 11 +++-- 5 files changed, 27 insertions(+), 44 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 52a787ae2..72359519b 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -94,7 +94,7 @@ def run( airflow_home=airflow_home, user=username, dags_folder=self._DAGS_FOLDER, - yaml_dags_dir=additional_files_path, + additional_files_dir=additional_files_path, mounts=medperf_mounts, project_name=self.workflow_name, yaml_parser=self.parser, diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py index 24195dc14..4de52e019 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/airflow_component.py @@ -1,6 +1,6 @@ import os from abc import abstractmethod -from typing import List +from typing import List, Literal from .component import ComponentRunner @@ -8,10 +8,11 @@ class AirflowComponentRunner(ComponentRunner): def __init__( self, - python_executable: str, - airflow_home: str, - container_type: str, - yaml_dags_dir: str, + python_executable: os.PathLike, + airflow_home: os.PathLike, + container_type: Literal["docker", "singularity"], + workflow_yaml_file: os.PathLike, + additional_files_dir: os.PathLike, dags_folder: os.PathLike, ): self._python_exec = python_executable @@ -20,8 +21,8 @@ def __init__( self.airflow_home = airflow_home self._env_vars = { "AIRFLOW_HOME": airflow_home, - "PYTHONPATH": f"{dags_folder}:{user_dags_folder}:{yaml_dags_dir}", - "YAML_DAGS_DIR": yaml_dags_dir, + "PYTHONPATH": f"{dags_folder}:{user_dags_folder}:{additional_files_dir}", + "WORKFLOW_YAML_FILE": workflow_yaml_file, "CONTAINER_TYPE": container_type, } diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py index 28027fb7b..6fae0ad73 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py @@ -6,4 +6,4 @@ ALWAYS_CONDITION = "ALWAYS" YESTERDAY = datetime.today() - timedelta(days=1) FINAL_ASSET = "medperf_airflow_completed_asset" -YAML_DIR = os.getenv("YAML_DAGS_DIR") +WORKFLOW_YAML_FILE = os.getenv("WORKFLOW_YAML_FILE") diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index b97c22729..5621e0c4c 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -1,6 +1,6 @@ -import yaml -import os -from medperf.containers.runners.airflow_runner_utils.dags.constants import YAML_DIR +from medperf.containers.runners.airflow_runner_utils.dags.constants import ( + WORKFLOW_YAML_FILE, +) from typing import Union, Any from medperf.containers.runners.airflow_runner_utils.dags.dag_utils import ( import_external_python_function, @@ -14,7 +14,8 @@ from copy import deepcopy from medperf.enums import ContainerConfigMountKeys from medperf.exceptions import MedperfException - +import os +import yaml valid_mount_keys = [item.value for item in ContainerConfigMountKeys] @@ -39,8 +40,8 @@ def get_dict_value_by_key_prefix( class YamlParser: - def __init__(self, yaml_dir_path: str = None): - self.yaml_dir_path = yaml_dir_path or YAML_DIR + def __init__(self, yaml_file: str = None): + self.yaml_file = yaml_file or WORKFLOW_YAML_FILE yaml_content = self.read_yaml_definition() self.raw_steps = yaml_content["steps"] self._raw_conditions = yaml_content.get("conditions", []) @@ -50,32 +51,12 @@ def __init__(self, yaml_dir_path: str = None): def read_yaml_definition( self, ) -> dict[str, Union[list[dict[str, str]], dict[str, str]]]: - yaml_files = [yaml_file for yaml_file in os.listdir(self.yaml_dir_path)] - yaml_files = [ - os.path.join(self.yaml_dir_path, yaml_file) for yaml_file in yaml_files - ] - yaml_files = [ - yaml_file - for yaml_file in yaml_files - if os.path.isfile(yaml_file) - and (yaml_file.endswith(".yaml") or yaml_file.endswith(".yml")) - ] - - if len(yaml_files) == 0: - raise ValueError("No YAML files found!") - elif len(yaml_files) > 1: - raise ValueError( - "More than one YAML file found! The parser currently only supports parsing a single file!" - ) - - yaml_file = yaml_files[0] try: - with open(yaml_file, "r") as f: + with open(self.yaml_file, "r") as f: raw_content = f.read() - expanded_content = os.path.expandvars(raw_content) - yaml_info = yaml.safe_load(expanded_content) + yaml_info = yaml.safe_load(raw_content) except Exception: - print(f"Unable to load YAML file {yaml_file}. It will be skipped.") + MedperfException(f"Unable to load Workflow YAML file {self.yaml_file}!") return yaml_info @@ -291,8 +272,6 @@ def _make_host_mounts(self, step_id_to_expanded_step: dict): host_mounts=host_mounts, volume_key="output_volumes", ) - if step.get("next") is None: # last step - host_mounts["output_path"] = os.getenv("host_statistics_file") step["host_mounts"] = host_mounts for step_id in look_on_second_pass: diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 8dc085fb7..c96380659 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -10,7 +10,6 @@ from .components.triggerer import AirflowTriggerer from .components.utils import validate_port from .monitor.yaml_dag_monitor import Summarizer -from .yaml_partial_parser import YamlPartialParser from airflow.utils.state import DagRunState import configparser from typing import Union, List @@ -23,6 +22,7 @@ FINAL_ASSET, SUMMARIZER_ID, ) +from medperf.containers.parsers.airflow_parser import AirflowParser from medperf import config import sys @@ -34,8 +34,9 @@ def __init__( user: str, dags_folder: os.PathLike, mounts: dict[str, os.PathLike], - yaml_dags_dir: os.PathLike, + additional_files_dir: os.PathLike, project_name: str, + yaml_parser: AirflowParser, port: Union[str, int] = 8080, postgres_port: Union[str, int] = 5432, airflow_python_executable: os.PathLike = None, @@ -48,7 +49,8 @@ def __init__( self.dags_folder = dags_folder self.extra_configs = extra_airflow_configs self.mounts = mounts - self.yaml_parser = YamlPartialParser(yaml_file_dir=yaml_dags_dir) + self.yaml_parser = yaml_parser + self.additional_files_dir = additional_files_dir self.user = user self._password = SecretStr(secrets.token_urlsafe(16)) self.airflow_config_file = os.path.join(self.airflow_home, "airflow.cfg") @@ -132,7 +134,8 @@ def _initialize_components(self): "python_executable": self._python_exec, "airflow_home": self.airflow_home, "container_type": config.platform, - "yaml_dags_dir": self.yaml_parser.yaml_dir_path, + "additional_files_dir": self.additional_files_dir, + "workflow_yaml_file": self.yaml_parser.config_file_path, "dags_folder": self.dags_folder, } From 521987cbd96c2634c9a8d5aee1e495caba660c30 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 25 Nov 2025 16:55:41 -0300 Subject: [PATCH 085/176] Remove symlinkin workflow yaml file into additional files directory; no longer necessary --- cli/medperf/containers/runners/airflow_runner.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 72359519b..4591268e1 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -82,7 +82,6 @@ def run( dataset_dir = medperf_mounts.pop("dataset_path") airflow_home = os.path.join(dataset_dir, "airflow_home") additional_files_path = medperf_mounts["additional_files"] - self._symlink_yaml_dag_to_additional_files(additional_files_path) logging.debug( f"Starting Airflow runner with the following airflow home directory: {airflow_home}." @@ -102,16 +101,6 @@ def run( system_runner.init_airflow() system_runner.wait_for_dag() - def _symlink_yaml_dag_to_additional_files(self, additional_files_path: str): - yaml_file_name = os.path.basename(self.parser.config_file_path) - os.makedirs(additional_files_path, exist_ok=True) - symlinked_yaml_file_path = os.path.join(additional_files_path, yaml_file_name) - try: - os.unlink(symlinked_yaml_file_path) - except FileNotFoundError: - pass - os.symlink(self.parser.config_file_path, symlinked_yaml_file_path) - @property def is_workflow(self): return True From 164369639914ff2cbc67489f009d80cd86f039d9 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 13:46:02 -0300 Subject: [PATCH 086/176] Remove unused options --- examples/HEMnet/data_preparator/workflow.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/HEMnet/data_preparator/workflow.yaml b/examples/HEMnet/data_preparator/workflow.yaml index 3b03aa90d..e1c593705 100644 --- a/examples/HEMnet/data_preparator/workflow.yaml +++ b/examples/HEMnet/data_preparator/workflow.yaml @@ -78,6 +78,8 @@ steps: command: python bspline_registration.py -v next: generate_masks per_subject: true + cpu_share: 4 + mem_limit: 3g limit: 1 - id: generate_masks @@ -119,6 +121,7 @@ steps: command: python save_tiles.py -v next: consolidate_metrics per_subject: true + cpu_share: 3 limit: 2 - id: consolidate_metrics From af2a58093e0f294124605612cbc61e00c428087b Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 13:46:15 -0300 Subject: [PATCH 087/176] Fix imports --- .../dags/operator_builders/python_sensor_builder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py index 9746d4727..717c0f619 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py @@ -2,10 +2,10 @@ from .operator_builder import OperatorBuilder from airflow.decorators import task from airflow.sensors.base import PokeReturnValue -from pipeline_state import PipelineState -from constants import ALWAYS_CONDITION +from ..pipeline_state import PipelineState +from ..constants import ALWAYS_CONDITION from datetime import timedelta -from dag_utils import import_external_python_function +from ..dag_utils import import_external_python_function DEFAULT_WAIT_TIME = timedelta(seconds=60) From 0a40ff2d0364e0207dc123340981ba507d5be8cd Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 13:46:42 -0300 Subject: [PATCH 088/176] Modify gitignore and add missing additional_files --- examples/RANO/data_preparator/.gitignore | 2 +- .../workspace/additional_files/conditions.py | 62 +++++++++++++++++++ .../additional_files/subject_definition.py | 20 ++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 examples/RANO/data_preparator/workspace/additional_files/conditions.py create mode 100644 examples/RANO/data_preparator/workspace/additional_files/subject_definition.py diff --git a/examples/RANO/data_preparator/.gitignore b/examples/RANO/data_preparator/.gitignore index eae22949b..2a0309e4b 100644 --- a/examples/RANO/data_preparator/.gitignore +++ b/examples/RANO/data_preparator/.gitignore @@ -1,6 +1,6 @@ *data/ constants.py tmpmodel/ -additional_files/ +models/ atlasImage_*.nii.gz container_config.yaml \ No newline at end of file diff --git a/examples/RANO/data_preparator/workspace/additional_files/conditions.py b/examples/RANO/data_preparator/workspace/additional_files/conditions.py new file mode 100644 index 000000000..9d40f7660 --- /dev/null +++ b/examples/RANO/data_preparator/workspace/additional_files/conditions.py @@ -0,0 +1,62 @@ +import os + + +def annotation_done(pipeline_state): + + base_review_dir = os.path.join( + pipeline_state.host_output_data_path, + "manual_review", + "tumor_extraction", + pipeline_state.running_subject, + ) + finalized_dir = os.path.join(base_review_dir, "finalized") + dir_files = os.listdir(finalized_dir) + + if len(dir_files) == 0: + print("Reviewed annotation not Found!") + return False + + elif len(dir_files) > 1: + print( + "More than one annotation found! Please only keep one file in the finalized directory" + ) + return False + + formatted_subject = pipeline_state.running_subject.replace("/", "_") + proper_name = f"{formatted_subject}_tumorMask_model_0.nii.gz" + if dir_files[0] != proper_name: + print( + f"Reviewed file has been renamed! Please make sure the file is named\n{proper_name}\nto ensure the pipeline runs correctly!" + ) + return False + return True + + +def brain_mask_changed(pipeline_state): + + base_review_dir = os.path.join( + pipeline_state.host_output_data_path, + "manual_review", + "brain_mask", + pipeline_state.running_subject, + ) + finalized_dir = os.path.join(base_review_dir, "finalized") + dir_files = os.listdir(finalized_dir) + + if len(dir_files) == 0: + print("No brain mask change detected.") + return False + + elif len(dir_files) > 1: + print( + "More than one brain mask correction found! Please only keep one file in the finalized directory." + ) + return False + + proper_name = f"brainMask_fused.nii.gz" + if dir_files[0] != proper_name: + print( + f"Brain Mask file has been renamed! Please make sure the file is named\n{proper_name}\nto ensure the pipeline runs correctly!" + ) + return False + return True diff --git a/examples/RANO/data_preparator/workspace/additional_files/subject_definition.py b/examples/RANO/data_preparator/workspace/additional_files/subject_definition.py new file mode 100644 index 000000000..6c6681ed4 --- /dev/null +++ b/examples/RANO/data_preparator/workspace/additional_files/subject_definition.py @@ -0,0 +1,20 @@ +import os + + +def subject_definition(pipeline_state): + + input_data_dir = os.getenv("host_data_path") + subject_slash_timepoint_list = [] + + for subject_id_dir in os.listdir(input_data_dir): + subject_complete_dir = os.path.join(input_data_dir, subject_id_dir) + + if not os.path.isdir(subject_complete_dir): + continue + + for timepoint_dir in os.listdir(subject_complete_dir): + subject_slash_timepoint_list.append( + os.path.join(subject_id_dir, timepoint_dir) + ) + + return subject_slash_timepoint_list From 0b1ef19ee0b348410f0cbb69246dc231d331a804 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 13:46:52 -0300 Subject: [PATCH 089/176] Delete proper .tmp directory on cleanup step --- examples/RANO/data_preparator/pipeline/project/direct_stages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/RANO/data_preparator/pipeline/project/direct_stages.py b/examples/RANO/data_preparator/pipeline/project/direct_stages.py index f6d8f3f00..3c80c6994 100644 --- a/examples/RANO/data_preparator/pipeline/project/direct_stages.py +++ b/examples/RANO/data_preparator/pipeline/project/direct_stages.py @@ -280,7 +280,7 @@ def consolidation_stage(keep_files: bool = typer.Option(False, "--keep-files")): ] dirs_to_remove.extend( [ - os.path.join(WORKSPACE_DIR, ".tmp"), + os.path.join(WORKSPACE_DIR, DATA_DIR, ".tmp"), os.path.join(labels_out, ".tmp"), os.path.join(labels_out, ".tumor_segmentation_backup"), ] From 934b7dc7060cae7bea99c97da9a5407ed64ff7c9 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 13:48:29 -0300 Subject: [PATCH 090/176] Update workflow.yaml for RANO --- examples/RANO/data_preparator/workflow.yaml | 82 +++++++++++++++++++-- 1 file changed, 74 insertions(+), 8 deletions(-) diff --git a/examples/RANO/data_preparator/workflow.yaml b/examples/RANO/data_preparator/workflow.yaml index 061d18a14..3f70ed408 100644 --- a/examples/RANO/data_preparator/workflow.yaml +++ b/examples/RANO/data_preparator/workflow.yaml @@ -115,6 +115,9 @@ steps: output_path: mount_path: /workspace/data type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory command: prepare_for_manual_review next: if: @@ -131,16 +134,25 @@ steps: <<: *BASE_STEP mounts: input_volumes: - review_input: + review_input_data: mount_path: /workspace/data type: directory from: step: prepare_for_manual_review mount: output_path + review_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: prepare_for_manual_review + mount: output_labels_path output_volumes: output_path: mount_path: /workspace/data type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory command: rollback_to_brain_extract next: brain_extraction per_subject: true @@ -149,16 +161,25 @@ steps: <<: *BASE_STEP mounts: input_volumes: - review_input: + review_input_data: mount_path: /workspace/data type: directory from: step: prepare_for_manual_review mount: output_path + review_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: prepare_for_manual_review + mount: output_labels_path output_volumes: output_path: mount_path: /workspace/data type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory command: segmentation_comparison next: calculate_changed_voxels per_subject: true @@ -167,16 +188,25 @@ steps: <<: *BASE_STEP mounts: input_volumes: - segmentation_comparison_input: + segmentation_comparison_input_data: mount_path: /workspace/data type: directory from: step: segmentation_comparison mount: output_path + segmentation_comparison_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: segmentation_comparison + mount: output_labels_path output_volumes: output_path: mount_path: /workspace/data type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory command: calculate_changed_voxels next: final_confirmation @@ -189,16 +219,25 @@ steps: <<: *BASE_STEP mounts: input_volumes: - changed_voxels_input: + changed_voxels_input_data: mount_path: /workspace/data type: directory from: step: calculate_changed_voxels mount: output_path + changed_voxels_input_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: calculate_changed_voxels + mount: output_labels_path output_volumes: output_path: mount_path: /workspace/data type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory command: move_labeled_files next: consolidation_stage @@ -207,18 +246,36 @@ steps: <<: *BASE_STEP mounts: input_volumes: - move_labeled_files_input: + parameters_file: + mount_path: /workspace/parameters.yaml + type: file + move_labeled_files_input_data: mount_path: /workspace/data type: directory from: step: move_labeled_files mount: output_path + changed_voxels_input_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: move_labeled_files + mount: output_labels_path + nifti_metadata: + mount_path: /workspace/metadata + type: directory + from: + step: nifti_conversion + mount: metadata_path output_volumes: output_path: mount_path: /workspace/data type: directory output_labels_path: - mount_path: /workspace/data/labels + mount_path: /workspace/labels + type: directory + metadata_path: + mount_path: /workspace/metadata type: directory command: consolidation_stage next: sanity_check @@ -227,12 +284,18 @@ steps: <<: *BASE_STEP mounts: input_volumes: - consolidation_input: + consolidation_input_data: mount_path: /workspace/data type: directory from: step: consolidation_stage mount: output_path + consolidation_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: consolidation_stage + mount: output_labels_path command: sanity_check next: metrics @@ -250,8 +313,11 @@ steps: statistics_file: mount_path: /workspace/data/statistics.yaml type: file + metadata_path: + mount_path: /workspace/metadata + type: directory output_labels_path: - mount_path: /workspace/data/labels + mount_path: /workspace/labels type: directory command: metrics next: null From ac51097d47e2ded5c33d6ce1b79f321424300ac3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 14:31:25 -0300 Subject: [PATCH 091/176] Add link to image on dockerhub --- examples/HEMnet/data_preparator/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/HEMnet/data_preparator/README.md b/examples/HEMnet/data_preparator/README.md index 80a022958..c182cedf9 100644 --- a/examples/HEMnet/data_preparator/README.md +++ b/examples/HEMnet/data_preparator/README.md @@ -1,6 +1,6 @@ # HEMnet pipeline -This pipeline runs the training data preparation procedure from [HEMnet](https://github.com/BiomedicalMachineLearning/HEMnet/tree/master). A modified version of their original [Docker image](https://hub.docker.com/layers/andrewsu1/hemnet/latest/images/sha256-5b371f828cfd41e223b46678cef157ec599847f17f0cf5711a0288908b287d5b) is used here, which splits the processing into separate steps that are chained together via CWL. This modified Docker image is available in DockerHub at [this link](), with the source code available in the `./project`subdirectory. The main modification of this version is splitting the pipeline into separate stages that can be executed by Airflow. +This pipeline runs the training data preparation procedure from [HEMnet](https://github.com/BiomedicalMachineLearning/HEMnet/tree/master). A modified version of their original [Docker image](https://hub.docker.com/layers/andrewsu1/hemnet/latest/images/sha256-5b371f828cfd41e223b46678cef157ec599847f17f0cf5711a0288908b287d5b) is used here, which splits the processing into separate steps that are chained together via CWL. This modified Docker image is available in DockerHub at [this link](https://hub.docker.com/r/mlcommons/hemnet-airflow), with the source code available in the `./project`subdirectory. The main modification of this version is splitting the pipeline into separate stages that can be executed by Airflow. ## 1. Get the HEMnet data From 466495119f959b0486200904f9d5d9fff7893c61 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 15:15:16 -0300 Subject: [PATCH 092/176] Include dev workflow .yaml file --- .../RANO/data_preparator/workflow_dev.yaml | 336 ++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 examples/RANO/data_preparator/workflow_dev.yaml diff --git a/examples/RANO/data_preparator/workflow_dev.yaml b/examples/RANO/data_preparator/workflow_dev.yaml new file mode 100644 index 000000000..ba155788f --- /dev/null +++ b/examples/RANO/data_preparator/workflow_dev.yaml @@ -0,0 +1,336 @@ +base_step: &BASE_STEP + - type: container + image: mlcommons/rano-data-prep-workflow-dev:0.0.1 + + +steps: + - id: setup + <<: *BASE_STEP + command: initial_setup + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + next: make_csv + on_error: do_something + per_subject: false + + - id: make_csv + <<: *BASE_STEP + command: make_csv + mounts: + input_volumes: + data_path: + mount_path: /workspace/input_data + type: directory + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + next: nifti_conversion + on_error: do_something + per_subject: true + + - id: nifti_conversion + <<: *BASE_STEP + mounts: + input_volumes: + csv_input: + mount_path: /workspace/data + type: directory + from: + step: make_csv + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + metadata_path: + mount_path: /workspace/metadata + type: directory + command: convert_nifti + next: brain_extraction + on_error: do_something + per_subject: true + + - id: brain_extraction + <<: *BASE_STEP + mounts: + input_volumes: + nifti_input: + mount_path: /workspace/data + type: directory + from: + step: nifti_conversion + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: extract_brain + next: tumor_extraction + on_error: do_something + per_subject: true + limit: 2 + + - id: tumor_extraction + <<: *BASE_STEP + mounts: + input_volumes: + brain_extraction_input: + mount_path: /workspace/data + type: directory + from: + step: brain_extraction + mount: output_path + additional_files: + mount_path: /workspace/additional_files + type: directory + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + command: extract_tumor + next: prepare_for_manual_review + on_error: do_something + per_subject: true + limit: 2 + + - id: prepare_for_manual_review + <<: *BASE_STEP + mounts: + input_volumes: + tumor_extraction_input: + mount_path: /workspace/data + type: directory + from: + step: tumor_extraction + mount: output_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory + command: prepare_for_manual_review + next: + if: + - condition: annotation_done + target: segmentation_comparison + - condition: brain_mask_changed + target: rollback_to_brain_extract + else: prepare_for_manual_review + wait: 60 + on_error: do_something + per_subject: true + + - id: rollback_to_brain_extract + <<: *BASE_STEP + mounts: + input_volumes: + review_input_data: + mount_path: /workspace/data + type: directory + from: + step: prepare_for_manual_review + mount: output_path + review_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: prepare_for_manual_review + mount: output_labels_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory + command: rollback_to_brain_extract + next: brain_extraction + per_subject: true + + - id: segmentation_comparison + <<: *BASE_STEP + mounts: + input_volumes: + review_input_data: + mount_path: /workspace/data + type: directory + from: + step: prepare_for_manual_review + mount: output_path + review_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: prepare_for_manual_review + mount: output_labels_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory + command: segmentation_comparison + next: calculate_changed_voxels + per_subject: true + + - id: calculate_changed_voxels + <<: *BASE_STEP + mounts: + input_volumes: + segmentation_comparison_input_data: + mount_path: /workspace/data + type: directory + from: + step: segmentation_comparison + mount: output_path + segmentation_comparison_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: segmentation_comparison + mount: output_labels_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory + command: calculate_changed_voxels + next: final_confirmation + + - id: final_confirmation + type: manual_approval + next: move_labeled_files + + + - id: move_labeled_files + <<: *BASE_STEP + mounts: + input_volumes: + changed_voxels_input_data: + mount_path: /workspace/data + type: directory + from: + step: calculate_changed_voxels + mount: output_path + changed_voxels_input_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: calculate_changed_voxels + mount: output_labels_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory + command: move_labeled_files + next: consolidation_stage + + + - id: consolidation_stage + <<: *BASE_STEP + mounts: + input_volumes: + parameters_file: + mount_path: /workspace/parameters.yaml + type: file + move_labeled_files_input_data: + mount_path: /workspace/data + type: directory + from: + step: move_labeled_files + mount: output_path + changed_voxels_input_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: move_labeled_files + mount: output_labels_path + nifti_metadata: + mount_path: /workspace/metadata + type: directory + from: + step: nifti_conversion + mount: metadata_path + output_volumes: + output_path: + mount_path: /workspace/data + type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory + metadata_path: + mount_path: /workspace/metadata + type: directory + command: consolidation_stage + next: sanity_check + + - id: sanity_check + <<: *BASE_STEP + mounts: + input_volumes: + consolidation_input_data: + mount_path: /workspace/data + type: directory + from: + step: consolidation_stage + mount: output_path + consolidation_input_labels: + mount_path: /workspace/labels + type: directory + from: + step: consolidation_stage + mount: output_labels_path + command: sanity_check + next: metrics + + - id: metrics + <<: *BASE_STEP + mounts: + input_volumes: + consolidation_input: + mount_path: /workspace/data + type: directory + from: + step: consolidation_stage + mount: output_path + output_volumes: + statistics_file: + mount_path: /workspace/data/statistics.yaml + type: file + metadata_path: + mount_path: /workspace/metadata + type: directory + output_labels_path: + mount_path: /workspace/labels + type: directory + command: metrics + next: null + +conditions: + - id: annotation_done + type: function + function_name: conditions.annotation_done + + - id: brain_mask_changed + type: function + function_name: conditions.brain_mask_changed + +per_subject_def: + type: function + function_name: subject_definition.subject_definition \ No newline at end of file From f69dabd9ecdf858caec8b80a83112538429f0ed3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 17:38:35 -0300 Subject: [PATCH 093/176] Fiz bug in is_metadata_specified method --- cli/medperf/containers/parsers/airflow_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index 83753a9dc..b36f1e967 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -197,7 +197,7 @@ def has_metadata(self): return self._has_metadata def is_metadata_specified(self): - return self._has_metadata + return self.has_metadata def is_container_encrypted(self): return False From ec48c3a0632547057266256ba5da40e374739055 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 26 Nov 2025 17:38:46 -0300 Subject: [PATCH 094/176] update gitignore --- examples/RANO/data_preparator/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/RANO/data_preparator/.gitignore b/examples/RANO/data_preparator/.gitignore index 2a0309e4b..5365add4c 100644 --- a/examples/RANO/data_preparator/.gitignore +++ b/examples/RANO/data_preparator/.gitignore @@ -3,4 +3,5 @@ constants.py tmpmodel/ models/ atlasImage_*.nii.gz -container_config.yaml \ No newline at end of file +container_config.yaml +dev_models_and_more.tar.gz \ No newline at end of file From 1f48dd66ca1e0046e8951e9b106b54dc9e1ebec8 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 10:12:10 -0300 Subject: [PATCH 095/176] Update migrations after merge --- .../migrations/0004_merge_20251119_1235.py | 14 -------------- ....py => 0005_convert_image_hash_to_json.py} | 19 ++++++++----------- 2 files changed, 8 insertions(+), 25 deletions(-) delete mode 100644 server/mlcube/migrations/0004_merge_20251119_1235.py rename server/mlcube/migrations/{0003_convert_image_hash_to_json.py => 0005_convert_image_hash_to_json.py} (81%) diff --git a/server/mlcube/migrations/0004_merge_20251119_1235.py b/server/mlcube/migrations/0004_merge_20251119_1235.py deleted file mode 100644 index 5a904f5b9..000000000 --- a/server/mlcube/migrations/0004_merge_20251119_1235.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 4.2.23 on 2025-11-19 12:35 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('mlcube', '0003_alter_mlcube_name'), - ('mlcube', '0003_convert_image_hash_to_json'), - ] - - operations = [ - ] diff --git a/server/mlcube/migrations/0003_convert_image_hash_to_json.py b/server/mlcube/migrations/0005_convert_image_hash_to_json.py similarity index 81% rename from server/mlcube/migrations/0003_convert_image_hash_to_json.py rename to server/mlcube/migrations/0005_convert_image_hash_to_json.py index 31cd172ea..d1a032543 100644 --- a/server/mlcube/migrations/0003_convert_image_hash_to_json.py +++ b/server/mlcube/migrations/0005_convert_image_hash_to_json.py @@ -19,14 +19,11 @@ def convert_image_hash_from_json_to_str(apps, schema_editor): class Migration(migrations.Migration): - replaces = [ - ("mlcube", "0003_add_mlcube_hash_tmp"), - ("mlcube", "0004_alter_mlcube_unique_together_mlcube_image_hash_tmp_and_more"), - ("mlcube", "0005_rename_image_hash_tmp_mlcube_image_hash_and_more"), - ] - dependencies = [ - ("mlcube", "0002_alter_mlcube_unique_together"), + ( + "mlcube", + "0004_alter_mlcube_unique_together_mlcube_container_config_and_more", + ), ] operations = [ @@ -51,8 +48,8 @@ class Migration(migrations.Migration): "image_tarball_hash", "image_hash_tmp", "additional_files_tarball_hash", - "mlcube_hash", - "parameters_hash", + "container_config", + "parameters_config", ) }, ), @@ -72,8 +69,8 @@ class Migration(migrations.Migration): "image_tarball_hash", "image_hash", "additional_files_tarball_hash", - "mlcube_hash", - "parameters_hash", + "container_config", + "parameters_config", ) }, ), From e49d1907bf40b93585780ae078a873a4912a1de3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 10:12:23 -0300 Subject: [PATCH 096/176] Fix workflow seeding after merge --- server/seed.py | 8 +- server/seed_utils.py | 220 +++---------------------------------------- 2 files changed, 16 insertions(+), 212 deletions(-) diff --git a/server/seed.py b/server/seed.py index b266bd031..46cb5e67d 100644 --- a/server/seed.py +++ b/server/seed.py @@ -76,7 +76,9 @@ def seed(args): benchmark_owner_token = get_token("testbo@example.com") if args.workflow: benchmark = create_workflow_benchmark( - api_server, benchmark_owner_token, admin_token + api_server, + benchmark_owner_token, + args.containers_assets_path, ) else: benchmark = create_benchmark( @@ -125,9 +127,9 @@ def seed(args): parser.add_argument( "--demo", type=str, - help="Seed for a tutorial: 'benchmark', 'model', or 'data'.", + help="Seed for a tutorial: 'benchmark', 'model', 'data', 'tutorial' or 'workflow'.", default="data", - choices=["benchmark", "model", "data", "tutorial"], + choices=["benchmark", "model", "data", "tutorial", "workflow"], ) parser.add_argument( "--tokens", diff --git a/server/seed_utils.py b/server/seed_utils.py index 92fa3e84c..ded440d4e 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -18,6 +18,10 @@ def _load_asset_content(assets_path: str, file_relative_path: str): return content +def load_workflow_config(assets_path: str, dirname: str): + return _load_asset_content(assets_path, f"{dirname}/workflow.yaml") + + def load_container_config(assets_path: str, dirname: str): return _load_asset_content(assets_path, f"{dirname}/container_config.yaml") @@ -269,217 +273,24 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): return benchmark -def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): - print("##########################BENCHMARK OWNER##########################") - - DATA_PREP_ASSETS_WORKFLOW_URL = ( - "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" - "edd5658a5a6856d44f8b7fa0eb538a5d6a67a0c3/examples/" - "chestxray_tutorial/data_preparator_workflow/" - ) - # Create a Data preprocessor MLCube by Benchmark Owner - data_preprocessor_mlcube = api_server.request( - "/mlcubes/", - "POST", - benchmark_owner_token, - { - "name": "chestxray_wprep", - "git_mlcube_url": (DATA_PREP_ASSETS_WORKFLOW_URL + "workflow.yaml"), - "mlcube_hash": "1bfb153a9ea72ccb36f24264f82a9f003d03472a4e046b9b22422b63f75688e2", - "git_parameters_url": ( - DATA_PREP_ASSETS_WORKFLOW_URL + "workspace/parameters.yaml" - ), - "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", - "image_tarball_url": "", - "image_tarball_hash": "", - "image_hash": { - "mlcommons/chestxray-tutorial-prep:0.0.1": "d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" - }, - "additional_files_tarball_url": "", - "additional_files_tarball_hash": "", - "metadata": { - "digest": "f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" - }, - }, - "id", - ) - print( - "Data Preprocessor MLCube Created(by Benchmark Owner). ID:", - data_preprocessor_mlcube, - ) - - # Update state of the Data preprocessor MLCube to OPERATION - data_preprocessor_mlcube_state = api_server.request( - "/mlcubes/" + str(data_preprocessor_mlcube) + "/", - "PUT", - benchmark_owner_token, - {"state": "OPERATION"}, - "state", - ) - print( - "Data Preprocessor MlCube state updated to", - data_preprocessor_mlcube_state, - "by Benchmark Owner", - ) - - # Create a reference model executor mlcube by Benchmark Owner - reference_model_executor_mlcube = api_server.request( - "/mlcubes/", - "POST", - benchmark_owner_token, - { - "name": "chestxray_cnn", - "git_mlcube_url": (ASSETS_URL + "model_custom_cnn/container_config.yaml"), - "mlcube_hash": "7ffb958bf83841b5f601a2538d004740216c336872c824a2fc3b9b346c6291dc", - "git_parameters_url": ( - ASSETS_URL + "model_custom_cnn/workspace/parameters.yaml" - ), - "parameters_hash": "af0aed4735b5075c198f8b49b3afbf7a0d7eaaaaa2a2b914d5931f0bee51d3f6", - "additional_files_tarball_url": ( - "https://storage.googleapis.com/medperf-storage/" - "chestxray_tutorial/cnn_weights.tar.gz" - ), - "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", - "image_hash": { - "default": "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" - }, - "image_tarball_url": "", - "image_tarball_hash": "", - "metadata": { - "digest": "a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" - }, - }, - "id", - ) - print( - "Reference Model Executor MlCube Created(by Benchmark Owner). ID:", - reference_model_executor_mlcube, - ) - - # Update state of the Reference Model Executor MLCube to OPERATION - reference_model_executor_mlcube_state = api_server.request( - "/mlcubes/" + str(reference_model_executor_mlcube) + "/", - "PUT", - benchmark_owner_token, - {"state": "OPERATION"}, - "state", - ) - print( - "Reference Model Executor MlCube state updated to", - reference_model_executor_mlcube_state, - "by Benchmark Owner", - ) - - # Create a Data evalutor MLCube by Benchmark Owner - data_evaluator_mlcube = api_server.request( - "/mlcubes/", - "POST", - benchmark_owner_token, - { - "name": "chestxray_metrics", - "git_mlcube_url": (ASSETS_URL + "metrics/container_config.yaml"), - "mlcube_hash": "1617c231a9a9cc596664222056e19718ef860552ab8cf99a97f52318e0d566f7", - "git_parameters_url": (ASSETS_URL + "metrics/workspace/parameters.yaml"), - "parameters_hash": "16cad451c54b801a5b50d999330465d7f68ab5f6d30a0674268d2d17c7f26b73", - "image_tarball_url": "", - "image_tarball_hash": "", - "image_hash": { - "default": "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" - }, - "additional_files_tarball_url": "", - "additional_files_tarball_hash": "", - "metadata": { - "digest": "d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" - }, - }, - "id", - ) - print( - "Data Evaluator MlCube Created(by Benchmark Owner). ID:", - data_evaluator_mlcube, - ) - - # Update state of the Data Evaluator MLCube to OPERATION - data_evaluator_mlcube_state = api_server.request( - "/mlcubes/" + str(data_evaluator_mlcube) + "/", - "PUT", - benchmark_owner_token, - {"state": "OPERATION"}, - "state", - ) - print( - "Data Evaluator MlCube state updated to", - data_evaluator_mlcube_state, - "by Benchmark Owner", - ) - - # Create a new benchmark by Benchmark owner - benchmark = api_server.request( - "/benchmarks/", - "POST", - benchmark_owner_token, - { - "name": "chestxray", - "description": "benchmark-sample", - "docs_url": "", - "demo_dataset_tarball_url": "https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz", - "demo_dataset_tarball_hash": "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00", - "demo_dataset_generated_uid": "730d2474d8f22340d9da89fa2eb925fcb95683e0", - "data_preparation_mlcube": data_preprocessor_mlcube, - "reference_model_mlcube": reference_model_executor_mlcube, - "data_evaluator_mlcube": data_evaluator_mlcube, - }, - "id", - ) - print("Benchmark Created(by Benchmark Owner). ID:", benchmark) - - # Update the benchmark state to OPERATION - benchmark_state = api_server.request( - "/benchmarks/" + str(benchmark) + "/", - "PUT", - benchmark_owner_token, - {"state": "OPERATION"}, - "state", - ) - print("Benchmark state updated to", benchmark_state, "by Benchmark owner") - - # Mark the benchmark to be APPROVED - benchmark_status = api_server.request( - "/benchmarks/" + str(benchmark) + "/", - "PUT", - admin_token, - {"approval_status": "APPROVED"}, - "approval_status", - ) - print("Benchmark Id:", benchmark, "is marked", benchmark_status, "(by Admin)") - return benchmark - - -def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): +def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): print("##########################BENCHMARK OWNER##########################") - DATA_PREP_ASSETS_WORKFLOW_URL = ( - "https://raw.githubusercontent.com/RodriguesRBruno/medperf/" - "edd5658a5a6856d44f8b7fa0eb538a5d6a67a0c3/examples/" - "chestxray_tutorial/data_preparator_workflow/" - ) + data_prep_config = load_workflow_config(assets_path, "data_preparator_workflow") + data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( "/mlcubes/", "POST", benchmark_owner_token, { - "name": "chestxray_wprep", - "git_mlcube_url": (DATA_PREP_ASSETS_WORKFLOW_URL + "workflow.yaml"), - "mlcube_hash": "1bfb153a9ea72ccb36f24264f82a9f003d03472a4e046b9b22422b63f75688e2", - "git_parameters_url": ( - DATA_PREP_ASSETS_WORKFLOW_URL + "workspace/parameters.yaml" - ), - "parameters_hash": "1541e05437040745d2489e8d2cf14795d4839eecc15c1ac959c84f6b77c1a5df", + "name": "chestxray_prep", + "container_config": data_prep_config, + "parameters_config": data_prep_params, "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "default": "sha256:d941e09d160bba3cf5c09b48f490e3b9e891597341e560954ff7512478eaef22" + "default": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -623,15 +434,6 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, admin_token): ) print("Benchmark state updated to", benchmark_state, "by Benchmark owner") - # Mark the benchmark to be APPROVED - benchmark_status = api_server.request( - "/benchmarks/" + str(benchmark) + "/", - "PUT", - admin_token, - {"approval_status": "APPROVED"}, - "approval_status", - ) - print("Benchmark Id:", benchmark, "is marked", benchmark_status, "(by Admin)") return benchmark From 30fa917ce11ce37867bd7c6cb23b677321b42697 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 13:16:18 -0300 Subject: [PATCH 097/176] Various adjustements and fixes after merging in the container ID changes --- cli/medperf/containers/parsers/airflow_parser.py | 14 ++++++++++++-- cli/medperf/containers/parsers/factory.py | 11 +++++------ cli/medperf/containers/runners/airflow_runner.py | 9 +-------- cli/medperf/containers/runners/factory.py | 6 ++---- cli/medperf/entities/cube.py | 12 +++++++++--- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index b36f1e967..e7526ffd3 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -1,6 +1,9 @@ from typing import Dict, Union, Literal, Set from medperf.exceptions import InvalidContainerSpec from medperf.containers.parsers.parser import Parser +import os +import yaml +from medperf import config class ContainerForAirflow: @@ -36,11 +39,18 @@ class AirflowParser(Parser): """ def __init__( - self, airflow_config: dict, allowed_runners: list, config_file_path: str + self, + airflow_config: dict, + allowed_runners: list, + container_files_base_path: str, ): self.airflow_config = airflow_config self.allowed_runners = allowed_runners - self.config_file_path = config_file_path + self.config_file_path = os.path.join( + container_files_base_path, config.cube_filename + ) + with open(self.config_file_path, "w") as f: + yaml.safe_dump(self.airflow_config, f, sort_keys=False) # The following variables are set when calling check_schema for the first time self._steps = [] diff --git a/cli/medperf/containers/parsers/factory.py b/cli/medperf/containers/parsers/factory.py index 04212d61f..b706c036d 100644 --- a/cli/medperf/containers/parsers/factory.py +++ b/cli/medperf/containers/parsers/factory.py @@ -20,22 +20,21 @@ def _is_airflow_yaml_file(airflow_config: dict): return "container_type" not in airflow_config and "steps" in airflow_config -def load_parser(container_config: dict) -> Parser: - if container_config is None: - raise InvalidContainerSpec( - f"Empty container config file: {container_config_path}" - ) +def load_parser(container_config: dict, container_files_base_path: str) -> Parser: if _is_airflow_yaml_file(container_config): # TODO add modifications to use container hashes rather than tags for download parser = AirflowParser( airflow_config=container_config, allowed_runners=["docker", "singularity"], - config_file_path=container_config_path, + container_files_base_path=container_files_base_path, ) parser.check_schema() return parser + elif container_config is None: + raise InvalidContainerSpec("Empty container configuration") + elif "container_type" not in container_config: raise InvalidContainerSpec( "Container configuration should contain a 'container_type' field." diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 4591268e1..35902b71c 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -24,11 +24,9 @@ class AirflowRunner(Runner): def __init__( self, airflow_config_parser: AirflowParser, - container_files_base_path, workflow_name, ): self.parser = airflow_config_parser - self.container_dir = container_files_base_path self.workflow_name = workflow_name def download( @@ -49,9 +47,7 @@ def download( computed_image_hash = get_docker_image_hash( container.image, get_hash_timeout ) - check_docker_image_hash( - computed_image_hash, expected_image_hash, alternative_image_hash - ) + check_docker_image_hash(computed_image_hash, expected_image_hash) hashes_dict[container.image] = computed_image_hash elif container.platform == "singularity": expected_image_hash = hashes_dict.get(container.image) @@ -86,9 +82,6 @@ def run( logging.debug( f"Starting Airflow runner with the following airflow home directory: {airflow_home}." ) - logging.debug( - f"Airflow execution based on the following YAML file: {self.parser.config_file_path}" - ) with AirflowSystemRunner( airflow_home=airflow_home, user=username, diff --git a/cli/medperf/containers/runners/factory.py b/cli/medperf/containers/runners/factory.py index b2082c896..bd72865e3 100644 --- a/cli/medperf/containers/runners/factory.py +++ b/cli/medperf/containers/runners/factory.py @@ -7,15 +7,13 @@ import logging -def load_runner(container_config_parser, container_files_base_path, container_name): +def load_runner(container_config_parser, container_name): if config.platform not in container_config_parser.allowed_runners: logging.debug(f"Allowed runners: {container_config_parser.allowed_runners}") raise InvalidArgumentError(f"Cannot run this container using {config.platform}") if isinstance(container_config_parser, AirflowParser): - return AirflowRunner( - container_config_parser, container_files_base_path, container_name - ) + return AirflowRunner(container_config_parser, container_name) if config.platform == "docker": return DockerRunner(container_config_parser) if config.platform == "singularity": diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 470d5f2cf..6fc6c44e3 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -35,7 +35,7 @@ class Cube(Entity, DeployableSchema): parameters_config: Optional[dict] = Field(default_factory=dict) image_tarball_url: Optional[str] = None image_tarball_hash: Optional[str] = None - image_hash: Optional[str] = None + image_hash: Optional[dict] = Field(default_factory=dict) additional_files_tarball_url: Optional[str] = Field(None, alias="tarball_url") additional_files_tarball_hash: Optional[str] = Field(None, alias="tarball_hash") metadata: dict = Field(default_factory=dict) @@ -80,13 +80,13 @@ def __init__(self, *args, **kwargs): @property def parser(self): if self._parser is None: - self._parser = load_parser(self.container_config) + self._parser = load_parser(self.container_config, self.path) return self._parser @property def runner(self): if self._runner is None: - self._runner = load_runner(self.parser, self.path, self.name) + self._runner = load_runner(self.parser, self.name) return self._runner @property @@ -139,6 +139,12 @@ def get( raise InvalidEntityError("The requested container is marked as INVALID.") return cube + def prepare_container_config_file(self): + """Workflow executions need the container config available as a local file so that Airflow can read it""" + with open(self.container_config_path, "w") as f: + yaml.safe_dump(self.container_config, f) + return self.container_config_path + def prepare_parameters_file(self): if self.parameters_config is None: raise MedperfException( From 4d2c47ebd23633543e4ad7af0ffad426ecce24fa Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 14:03:11 -0300 Subject: [PATCH 098/176] Add validator for image_hash --- cli/medperf/entities/cube.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 6fc6c44e3..d6f90f03b 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -1,7 +1,7 @@ import os from typing import List, Optional, Union from medperf.commands.association.utils import get_user_associations -from pydantic import Field +from pydantic import Field, field_validator, ValidationInfo from medperf.entities.interface import Entity from medperf.entities.schemas import DeployableSchema @@ -41,6 +41,24 @@ class Cube(Entity, DeployableSchema): metadata: dict = Field(default_factory=dict) user_metadata: dict = Field(default_factory=dict) + @field_validator("image_hash", mode="before") + def check_data_preparation_mlcube(cls, v: Union[str, dict], info: ValidationInfo): + if isinstance(v, dict): + return v + + elif v in ["", None]: + return {} + + config = info.data.get("container_config") + try: + image_name = config["image"] + except KeyError: + raise MedperfException( + f"No 'image' field found in container_config file to apply hash. Sending hashes is not supported with workflows." + ) + formatted_hash = {image_name: v} + return formatted_hash + @staticmethod def get_type(): return "container" From e5241e00211c8d607c75e7f6052408e26d51125e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 16:53:33 -0300 Subject: [PATCH 099/176] Utility function to get expected hash by image name or "default" key to fallback --- cli/medperf/containers/runners/docker_runner.py | 5 +++-- cli/medperf/containers/runners/singularity_runner.py | 7 ++++--- cli/medperf/containers/runners/utils.py | 5 +++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cli/medperf/containers/runners/docker_runner.py b/cli/medperf/containers/runners/docker_runner.py index 4f69975f1..333d4c9ec 100644 --- a/cli/medperf/containers/runners/docker_runner.py +++ b/cli/medperf/containers/runners/docker_runner.py @@ -8,6 +8,7 @@ add_network_config, add_medperf_tmp_folder, check_docker_image_hash, + get_expected_hash, ) from .runner import Runner import logging @@ -56,7 +57,7 @@ def _download_docker_image( get_hash_timeout: int = None, ) -> Dict[str, str]: docker_image = self.parser.get_setup_args() - expected_image_hash = hashes_dict.get(docker_image) + expected_image_hash = get_expected_hash(hashes_dict, docker_image) command = ["docker", "pull", docker_image] logging.debug("Running pull command") run_command(command, timeout=download_timeout) @@ -71,7 +72,7 @@ def _download_docker_archive( get_hash_timeout: int = None, ): file_url = self.parser.get_setup_args() - expected_image_hash = hashes_dict.get(file_url) + expected_image_hash = get_expected_hash(hashes_dict, file_url) image_path, computed_image_hash = resources.get_cube_image( file_url, expected_image_hash ) # Hash checking happens in resources diff --git a/cli/medperf/containers/runners/singularity_runner.py b/cli/medperf/containers/runners/singularity_runner.py index 4bd2fc23c..1419b60dc 100644 --- a/cli/medperf/containers/runners/singularity_runner.py +++ b/cli/medperf/containers/runners/singularity_runner.py @@ -9,6 +9,7 @@ add_network_config, add_medperf_tmp_folder, check_docker_image_hash, + get_expected_hash, ) from .singularity_utils import ( cleanup_singularity_cache, @@ -89,13 +90,13 @@ def _download_image_file( get_hash_timeout: int = None, ): image_file_url = self.parser.get_setup_args() - expected_image_hash = hashes_dict.get(sif_url) + expected_image_hash = get_expected_hash(hashes_dict, image_file_url) image_file_path, computed_image_hash = resources.get_cube_image( image_file_url, expected_image_hash ) # Hash checking happens in resources self.image_file_path = image_file_path self.image_file_hash = computed_image_hash - return {sif_url: computed_image_hash} + return {image_file_url: computed_image_hash} def _check_docker_image( self, @@ -103,7 +104,7 @@ def _check_docker_image( get_hash_timeout: int = None, ): docker_image = self.parser.get_setup_args() - expected_image_hash = hashes_dict.get(docker_image) + expected_image_hash = get_expected_hash(hashes_dict, docker_image) computed_image_hash = get_docker_image_hash_from_dockerhub( docker_image, get_hash_timeout ) diff --git a/cli/medperf/containers/runners/utils.py b/cli/medperf/containers/runners/utils.py index 5a20ac70a..5209209ef 100644 --- a/cli/medperf/containers/runners/utils.py +++ b/cli/medperf/containers/runners/utils.py @@ -107,3 +107,8 @@ def check_docker_image_hash(computed_image_hash, expected_image_hash=None): raise InvalidContainerSpec( f"Hash mismatch. Expected {expected_image_hash}, found {computed_image_hash}." ) + + +def get_expected_hash(hashes_dict, image_name): + """Gets hash from hashes_dict using image_name as a key, or 'default' if not present""" + return hashes_dict.get(image_name, hashes_dict.get("default")) From ef82700094a8c9a7db71f353c77639f9d9d72ff7 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 16:54:56 -0300 Subject: [PATCH 100/176] Modify migrations and seed_utils to create image hash by image name/tag rather than using "default". "default" only used as a fallback if image name is not found --- .../migrations/0005_convert_image_hash_to_json.py | 3 ++- server/seed_utils.py | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/server/mlcube/migrations/0005_convert_image_hash_to_json.py b/server/mlcube/migrations/0005_convert_image_hash_to_json.py index d1a032543..993eb4dbe 100644 --- a/server/mlcube/migrations/0005_convert_image_hash_to_json.py +++ b/server/mlcube/migrations/0005_convert_image_hash_to_json.py @@ -6,7 +6,8 @@ def convert_image_hash_from_string_to_json(apps, schema_editor): MlCube = apps.get_model("mlcube", "MlCube") for mlcube in MlCube.objects.all(): - mlcube.image_hash_tmp = {"default": mlcube.image_hash} + image_name = mlcube.container_config.get("image", "default") + mlcube.image_hash_tmp = {image_name: mlcube.image_hash} mlcube.save() diff --git a/server/seed_utils.py b/server/seed_utils.py index ded440d4e..a61383542 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -126,7 +126,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "default": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + "mlcommons/chestxray-tutorial-prep:0.0.1": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -172,7 +172,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", "image_hash": { - "default": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5" + "mlcommons/chestxray-tutorial-cnn:0.0.1": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5" }, "image_tarball_url": "", "image_tarball_hash": "", @@ -213,7 +213,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "default": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa" + "mlcommons/chestxray-tutorial-metrics:0.0.1": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -290,7 +290,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "default": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + "mlcommons/chestxray-tutorial-prep:0.0.1": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -336,7 +336,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", "image_hash": { - "default": "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" + "mlcommons/chestxray-tutorial-cnn:0.0.1": "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" }, "image_tarball_url": "", "image_tarball_hash": "", @@ -377,7 +377,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "default": "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" + "mlcommons/chestxray-tutorial-metrics:0.0.1": "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -465,7 +465,7 @@ def create_model( "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "default": "sha256:f27deb052eafd48ad1e350ceef7b0b9600aef0ea3f8cba47baee2b1d17411a83" + "mlcommons/chestxray-tutorial-mobilenetv2:0.0.1": "sha256:f27deb052eafd48ad1e350ceef7b0b9600aef0ea3f8cba47baee2b1d17411a83" }, "metadata": {}, }, From ffd0dd824789d8d78519dc8b1be3c6a9bb780910 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 16:55:16 -0300 Subject: [PATCH 101/176] Remove unused attribute causing error --- cli/medperf/tests/commands/compatibility_test/test_utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/tests/commands/compatibility_test/test_utils.py b/cli/medperf/tests/commands/compatibility_test/test_utils.py index ac1b50592..df349c31a 100644 --- a/cli/medperf/tests/commands/compatibility_test/test_utils.py +++ b/cli/medperf/tests/commands/compatibility_test/test_utils.py @@ -167,7 +167,6 @@ def test_setup_cube_skips_download_with_local_image(self, mocker): def test_setup_cube_stores_decryption_key(self, mocker): # Arrange mock_cube = TestCube(id=5) - mock_cube.identifier = 5 dummy_key_path = "/tmp/somekey.key" stored_key_path = "/tmp/stored_key_path" From f10a9ff3b14fb1b215e8323df1d949e91874501e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 16:55:22 -0300 Subject: [PATCH 102/176] Remove unused method --- cli/medperf/entities/cube.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index d6f90f03b..0a67384bc 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -157,12 +157,6 @@ def get( raise InvalidEntityError("The requested container is marked as INVALID.") return cube - def prepare_container_config_file(self): - """Workflow executions need the container config available as a local file so that Airflow can read it""" - with open(self.container_config_path, "w") as f: - yaml.safe_dump(self.container_config, f) - return self.container_config_path - def prepare_parameters_file(self): if self.parameters_config is None: raise MedperfException( From 05d8e1453ba5e5a8228cb554b7a30b20e06a077a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 16:55:50 -0300 Subject: [PATCH 103/176] Add is_workflow property to override base class property. Base class property would instantiate a parser and runner, interfering with tests --- cli/medperf/tests/mocks/cube.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/medperf/tests/mocks/cube.py b/cli/medperf/tests/mocks/cube.py index f7dfbd092..41178cb1e 100644 --- a/cli/medperf/tests/mocks/cube.py +++ b/cli/medperf/tests/mocks/cube.py @@ -19,3 +19,7 @@ class TestCube(Cube): additional_files_tarball_hash: Optional[str] = EMPTY_FILE_HASH state: str = "OPERATION" is_valid: bool = True + + @property + def is_workflow(self): + return False From 4f55fe14640ae1b1a57880f69ee01a4450e0ea1e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 17:05:28 -0300 Subject: [PATCH 104/176] Remove unnecessary TODO --- cli/medperf/containers/parsers/factory.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/containers/parsers/factory.py b/cli/medperf/containers/parsers/factory.py index b706c036d..3001d4604 100644 --- a/cli/medperf/containers/parsers/factory.py +++ b/cli/medperf/containers/parsers/factory.py @@ -23,7 +23,6 @@ def _is_airflow_yaml_file(airflow_config: dict): def load_parser(container_config: dict, container_files_base_path: str) -> Parser: if _is_airflow_yaml_file(container_config): - # TODO add modifications to use container hashes rather than tags for download parser = AirflowParser( airflow_config=container_config, allowed_runners=["docker", "singularity"], From 609118b679a6b4984fa288a4ed217a4646293ab1 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 1 Dec 2025 17:10:36 -0300 Subject: [PATCH 105/176] Update one wrong hash in seeded model container --- server/seed_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index a61383542..7842209c0 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -172,7 +172,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", "image_hash": { - "mlcommons/chestxray-tutorial-cnn:0.0.1": "877b8df79678215dfdcb63fe6bc1dab58e9c29113437c2c5627442551e3087c5" + "mlcommons/chestxray-tutorial-cnn:0.0.1": "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" }, "image_tarball_url": "", "image_tarball_hash": "", @@ -213,7 +213,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "image_tarball_url": "", "image_tarball_hash": "", "image_hash": { - "mlcommons/chestxray-tutorial-metrics:0.0.1": "c61b4079be59ba3bb31090bdf89f7f603023f77d28ca0475b5320efaa36866aa" + "mlcommons/chestxray-tutorial-metrics:0.0.1": "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", From 8124f7d37d71cc4782c552781faa0a5b1dc8f6e3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 09:38:10 -0300 Subject: [PATCH 106/176] Rename directory to "data_preparator_workflow" for clarity --- .../RANO/{data_preparator => data_preparator_workflow}/.gitignore | 0 .../pipeline/Dockerfile | 0 .../pipeline/Dockerfile.dev | 0 .../pipeline/project/direct_stages.py | 0 .../pipeline/project/metrics.py | 0 .../pipeline/project/requirements.txt | 0 .../pipeline/project/sanity_check.py | 0 .../pipeline/project/stages/comparison.py | 0 .../pipeline/project/stages/confirm.py | 0 .../pipeline/project/stages/dset_stage.py | 0 .../pipeline/project/stages/env_vars.py | 0 .../pipeline/project/stages/extract.py | 0 .../pipeline/project/stages/extract_nnunet.py | 0 .../pipeline/project/stages/generate_report.py | 0 .../pipeline/project/stages/get_csv.py | 0 .../pipeline/project/stages/manual.py | 0 .../pipeline/project/stages/mlcube_constants.py | 0 .../pipeline/project/stages/nifti_transform.py | 0 .../pipeline/project/stages/pipeline.py | 0 .../pipeline/project/stages/row_stage.py | 0 .../pipeline/project/stages/split.py | 0 .../pipeline/project/stages/stage.py | 0 .../pipeline/project/stages/utils.py | 0 .../{data_preparator => data_preparator_workflow}/workflow.yaml | 0 .../workflow_dev.yaml | 0 .../workspace/additional_files/conditions.py | 0 .../workspace/additional_files/subject_definition.py | 0 .../workspace/parameters.yaml | 0 28 files changed, 0 insertions(+), 0 deletions(-) rename examples/RANO/{data_preparator => data_preparator_workflow}/.gitignore (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/Dockerfile (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/Dockerfile.dev (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/direct_stages.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/metrics.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/requirements.txt (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/sanity_check.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/comparison.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/confirm.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/dset_stage.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/env_vars.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/extract.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/extract_nnunet.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/generate_report.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/get_csv.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/manual.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/mlcube_constants.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/nifti_transform.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/pipeline.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/row_stage.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/split.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/stage.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/pipeline/project/stages/utils.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/workflow.yaml (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/workflow_dev.yaml (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/workspace/additional_files/conditions.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/workspace/additional_files/subject_definition.py (100%) rename examples/RANO/{data_preparator => data_preparator_workflow}/workspace/parameters.yaml (100%) diff --git a/examples/RANO/data_preparator/.gitignore b/examples/RANO/data_preparator_workflow/.gitignore similarity index 100% rename from examples/RANO/data_preparator/.gitignore rename to examples/RANO/data_preparator_workflow/.gitignore diff --git a/examples/RANO/data_preparator/pipeline/Dockerfile b/examples/RANO/data_preparator_workflow/pipeline/Dockerfile similarity index 100% rename from examples/RANO/data_preparator/pipeline/Dockerfile rename to examples/RANO/data_preparator_workflow/pipeline/Dockerfile diff --git a/examples/RANO/data_preparator/pipeline/Dockerfile.dev b/examples/RANO/data_preparator_workflow/pipeline/Dockerfile.dev similarity index 100% rename from examples/RANO/data_preparator/pipeline/Dockerfile.dev rename to examples/RANO/data_preparator_workflow/pipeline/Dockerfile.dev diff --git a/examples/RANO/data_preparator/pipeline/project/direct_stages.py b/examples/RANO/data_preparator_workflow/pipeline/project/direct_stages.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/direct_stages.py rename to examples/RANO/data_preparator_workflow/pipeline/project/direct_stages.py diff --git a/examples/RANO/data_preparator/pipeline/project/metrics.py b/examples/RANO/data_preparator_workflow/pipeline/project/metrics.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/metrics.py rename to examples/RANO/data_preparator_workflow/pipeline/project/metrics.py diff --git a/examples/RANO/data_preparator/pipeline/project/requirements.txt b/examples/RANO/data_preparator_workflow/pipeline/project/requirements.txt similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/requirements.txt rename to examples/RANO/data_preparator_workflow/pipeline/project/requirements.txt diff --git a/examples/RANO/data_preparator/pipeline/project/sanity_check.py b/examples/RANO/data_preparator_workflow/pipeline/project/sanity_check.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/sanity_check.py rename to examples/RANO/data_preparator_workflow/pipeline/project/sanity_check.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/comparison.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/comparison.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/comparison.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/comparison.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/confirm.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/confirm.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/confirm.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/confirm.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/dset_stage.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/dset_stage.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/dset_stage.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/dset_stage.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/env_vars.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/env_vars.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/env_vars.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/env_vars.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/extract.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/extract.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/extract.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/extract.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/extract_nnunet.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/extract_nnunet.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/extract_nnunet.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/extract_nnunet.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/generate_report.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/generate_report.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/generate_report.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/generate_report.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/get_csv.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/get_csv.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/get_csv.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/get_csv.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/manual.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/manual.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/manual.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/manual.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/mlcube_constants.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/mlcube_constants.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/mlcube_constants.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/mlcube_constants.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/nifti_transform.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/nifti_transform.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/nifti_transform.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/nifti_transform.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/pipeline.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/pipeline.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/pipeline.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/pipeline.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/row_stage.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/row_stage.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/row_stage.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/row_stage.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/split.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/split.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/split.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/split.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/stage.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/stage.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/stage.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/stage.py diff --git a/examples/RANO/data_preparator/pipeline/project/stages/utils.py b/examples/RANO/data_preparator_workflow/pipeline/project/stages/utils.py similarity index 100% rename from examples/RANO/data_preparator/pipeline/project/stages/utils.py rename to examples/RANO/data_preparator_workflow/pipeline/project/stages/utils.py diff --git a/examples/RANO/data_preparator/workflow.yaml b/examples/RANO/data_preparator_workflow/workflow.yaml similarity index 100% rename from examples/RANO/data_preparator/workflow.yaml rename to examples/RANO/data_preparator_workflow/workflow.yaml diff --git a/examples/RANO/data_preparator/workflow_dev.yaml b/examples/RANO/data_preparator_workflow/workflow_dev.yaml similarity index 100% rename from examples/RANO/data_preparator/workflow_dev.yaml rename to examples/RANO/data_preparator_workflow/workflow_dev.yaml diff --git a/examples/RANO/data_preparator/workspace/additional_files/conditions.py b/examples/RANO/data_preparator_workflow/workspace/additional_files/conditions.py similarity index 100% rename from examples/RANO/data_preparator/workspace/additional_files/conditions.py rename to examples/RANO/data_preparator_workflow/workspace/additional_files/conditions.py diff --git a/examples/RANO/data_preparator/workspace/additional_files/subject_definition.py b/examples/RANO/data_preparator_workflow/workspace/additional_files/subject_definition.py similarity index 100% rename from examples/RANO/data_preparator/workspace/additional_files/subject_definition.py rename to examples/RANO/data_preparator_workflow/workspace/additional_files/subject_definition.py diff --git a/examples/RANO/data_preparator/workspace/parameters.yaml b/examples/RANO/data_preparator_workflow/workspace/parameters.yaml similarity index 100% rename from examples/RANO/data_preparator/workspace/parameters.yaml rename to examples/RANO/data_preparator_workflow/workspace/parameters.yaml From 3ad4a9dd0b6a08ddcf30cfb9125f5646f6c14e9d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 11:11:48 -0300 Subject: [PATCH 107/176] Update report.yaml every 60 seconds rather than every second --- .../containers/runners/airflow_runner_utils/system_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index c96380659..04838ec0f 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -286,7 +286,7 @@ async def _async_wait_for_dag(self): ) summarizer_task = asyncio.create_task( summarizer.summarize_every_x_seconds( - interval_seconds=1, airflow_client=airflow_client + interval_seconds=60, airflow_client=airflow_client ) ) while True: From 162dc586bd67e1db7ab1d4a0c7b698657ac6f09f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 11:12:35 -0300 Subject: [PATCH 108/176] Update seed.py and seed_utils.py with option to seed the RANO Dev workflow --- server/seed.py | 36 +++++++++++++++++-------------- server/seed_utils.py | 51 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 17 deletions(-) diff --git a/server/seed.py b/server/seed.py index 46cb5e67d..5673b7b70 100644 --- a/server/seed.py +++ b/server/seed.py @@ -14,12 +14,19 @@ create_benchmark, create_model, create_workflow_benchmark, + create_rano_workflow_mlcube, ) from auth_provider_token import auth_provider_token import json from pathlib import Path REPO_BASE_DIR = Path(__file__).resolve().parent.parent +default_cert_file = str(REPO_BASE_DIR / "server" / "cert.crt") +default_tokens_file = str(REPO_BASE_DIR / "mock_tokens" / "tokens.json") +default_xray_containers_assets_path = str( + REPO_BASE_DIR / "examples" / "chestxray_tutorial" +) +default_rano_assets_path = str(REPO_BASE_DIR / "examples" / "RANO") def populate_mock_benchmarks(api_server, admin_token): @@ -74,17 +81,26 @@ def seed(args): return # create benchmark benchmark_owner_token = get_token("testbo@example.com") + + if args.demo == "rano": + create_rano_workflow_mlcube( + api_server=api_server, + benchmark_owner_token=benchmark_owner_token, + assets_path=default_rano_assets_path, + ) + return + if args.workflow: benchmark = create_workflow_benchmark( api_server, benchmark_owner_token, - args.containers_assets_path, + default_xray_containers_assets_path, ) else: benchmark = create_benchmark( api_server, benchmark_owner_token, - args.containers_assets_path, + default_xray_containers_assets_path, ) if args.demo == "model": return @@ -100,12 +116,6 @@ def seed(args): if __name__ == "__main__": - default_cert_file = str(REPO_BASE_DIR / "server" / "cert.crt") - default_tokens_file = str(REPO_BASE_DIR / "mock_tokens" / "tokens.json") - default_containers_assets_path = str( - REPO_BASE_DIR / "examples" / "chestxray_tutorial" - ) - parser = argparse.ArgumentParser(description="Seed the db with demo entries") parser.add_argument( "--server", @@ -127,9 +137,9 @@ def seed(args): parser.add_argument( "--demo", type=str, - help="Seed for a tutorial: 'benchmark', 'model', 'data', 'tutorial' or 'workflow'.", + help="Seed for a tutorial: 'benchmark', 'model', 'data', 'tutorial' or 'rano.", default="data", - choices=["benchmark", "model", "data", "tutorial", "workflow"], + choices=["benchmark", "model", "data", "tutorial", "rano"], ) parser.add_argument( "--tokens", @@ -137,12 +147,6 @@ def seed(args): help="Path to local tokens file", default=default_tokens_file, ) - parser.add_argument( - "--containers-assets-path", - type=str, - help="Path to folder containing container asset files for seeding dev database", - default=default_containers_assets_path, - ) parser.add_argument( "-w", "--workflow", diff --git a/server/seed_utils.py b/server/seed_utils.py index 7842209c0..3fd2f019b 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -274,7 +274,9 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): - print("##########################BENCHMARK OWNER##########################") + print( + "##########################BENCHMARK OWNER (WORKFLOW)##########################" + ) data_prep_config = load_workflow_config(assets_path, "data_preparator_workflow") data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") @@ -531,3 +533,50 @@ def create_model( model_executor1_in_benchmark_status, "(by Benchmark Owner)", ) + + +def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): + print( + "##########################BENCHMARK OWNER (RANO WORKFLOW)##########################" + ) + + data_prep_config = load_workflow_config(assets_path, "data_preparator_workflow") + data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") + # Create a Data preprocessor MLCube by Benchmark Owner + data_preprocessor_mlcube = api_server.request( + "/mlcubes/", + "POST", + benchmark_owner_token, + { + "name": "rano_workflow_prep", + "container_config": data_prep_config, + "parameters_config": data_prep_params, + "image_tarball_url": "", + "image_tarball_hash": "", + "image_hash": { + "mlcommons/rano-data-prep-workflow-dev:0.0.1": "sha256:26cf311c51d8423591e710019b1490bc091152d32b26636e4eafa34e42308929" + }, + "additional_files_tarball_url": "https://storage.googleapis.com/medperf-storage/rano_test_assets/dev_models_and_more.tar.gz", + "additional_files_tarball_hash": "808632d9b9fa1da00faa923a752ab47eb0bc19daff037e9c2447b994dd415084", + "metadata": {}, + }, + "id", + ) + print( + "Data Preprocessor MLCube Created(by Benchmark Owner). ID:", + data_preprocessor_mlcube, + ) + + # Update state of the Data preprocessor MLCube to OPERATION + data_preprocessor_mlcube_state = api_server.request( + "/mlcubes/" + str(data_preprocessor_mlcube) + "/", + "PUT", + benchmark_owner_token, + {"state": "OPERATION"}, + "state", + ) + print( + "Data Preprocessor MlCube state updated to", + data_preprocessor_mlcube_state, + "by Benchmark Owner", + ) From b6c5a59324a5e428feac91d97ae790c20f08b85a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 11:12:47 -0300 Subject: [PATCH 109/176] Add a README for the RANO example --- .../RANO/data_preparator_workflow/README.md | 273 ++++++++++++++++++ .../readme_images/airflow_home.png | Bin 0 -> 421497 bytes .../readme_images/airflow_login.png | Bin 0 -> 44573 bytes .../readme_images/dag_list.png | Bin 0 -> 254997 bytes .../mark_as_success_confirmation.png | Bin 0 -> 115695 bytes .../readme_images/mark_state_as_button.png | Bin 0 -> 125991 bytes .../readme_images/pipeline_diagram.png | Bin 0 -> 126888 bytes .../readme_images/task_instances_view.png | Bin 0 -> 281717 bytes .../task_list_filtered_final_confirmation.png | Bin 0 -> 114827 bytes .../readme_images/tasks_manual_review.png | Bin 0 -> 118533 bytes 10 files changed, 273 insertions(+) create mode 100644 examples/RANO/data_preparator_workflow/README.md create mode 100644 examples/RANO/data_preparator_workflow/readme_images/airflow_home.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/airflow_login.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/dag_list.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/mark_as_success_confirmation.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/mark_state_as_button.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/pipeline_diagram.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/task_instances_view.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/task_list_filtered_final_confirmation.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/tasks_manual_review.png diff --git a/examples/RANO/data_preparator_workflow/README.md b/examples/RANO/data_preparator_workflow/README.md new file mode 100644 index 000000000..cecc7f42f --- /dev/null +++ b/examples/RANO/data_preparator_workflow/README.md @@ -0,0 +1,273 @@ +# RANO Data Preparation + +Here, a modified version of the data preparation pipeline used in the RANO study is presented as a use case for the YAML Pipelines in Airflow. The YAML file defining this pipeline is located at `./workflow.yaml`, with auxiliary Python code used to evaluate conditional steps in the pipeline located at `additional_files/conditions.py` and `additional_files/subject_definition.py`. A slightly modified version of the pipeline used for development and testing purposes is located at `./workflow_dev.yaml`. + +[Section 1](#1-preparing-to-run-the-pipeline-with-the-developement-dataset) of this README describes the initial setup to run the development pipeline, while [Section 2](#2-preparing-to-run-the-pipeline-with-real-data) describes how to do the initial setup to run the pipeline on real data. The following sections then describe how to properly execute the pipeline via MedPerf and monitor the pipeline on Airflow, regardless of whether the development or real pipeline is used. + +## 1. Preparing to run the Pipeline with the Developement dataset + +The following steps allow running the development pipeline in a local environment: + +- Ensure you have a valid local MedPerf installation. Detailed instructions are available in the [Official MedPerf Documentation for Installation](https://docs.medperf.org/getting_started/installation/). + +- Start a local MedPerf development server. Detailed instructions are available in the [Official MedPerf Documentation for local server setup](https://docs.medperf.org/getting_started/setup/#install-the-medperf-client). + +- (Optional step) If logged into a real MedPerf user, first logout. +```bash +medperf auth logout +``` + +- Log into the test Benchmark Owner user. +```bash +medperf auth login -e testbo@example.com +``` + +- (Optional step) Reset the local development server databse by execution the following command inside the `server` directory at the roost of this repository: +```bash +sh reset_db.sh +``` + +- Seed the server with the Development RANO Workflow. This can be done by executiong the following command, inside the `server` directory at the root of this repository: +```bash +python seed.py --cert cert.crt --demo rano +``` + +- Confirm the seeding process was succesful by executing the following command in any directory: +```bash +medperf container ls +``` + +The output should be similar to what's shown below: +```text + UID Name State Registered +----- ------------------ --------- ------------ + 1 MedPerf CA OPERATION True + 2 rano_workflow_prep OPERATION True +``` + +Note the `UID` field of the `rano_workflow_prep` workflow. It should be `2` if the local database was reset prior to seeding, but may be a different value if no reset was done. This UID will be used when running the data preparation step. + +- Get the RANO development dataset by downloading and extracting (sha256: 701fbba8b253fc5b2f54660837c493a38dec986df9bdbf3d97f07c8bc276a965): + + +- Extract the `input_data` directory into any directory you like, but keep note of its location. It will be used later. + - The other files and directories inside the tarball may be safely deleted or ignored. + + +## 2. Preparing to run the Pipeline with Real data + +The following steps allow running the development pipeline in a local environment: + +- Ensure you have a valid local MedPerf installation. Detailed instructions are available in the [Official MedPerf Documentation for Installation](https://docs.medperf.org/getting_started/installation/). + +- Start a local MedPerf development server. Detailed instructions are available in the [Official MedPerf Documentation for local server setup](https://docs.medperf.org/getting_started/setup/#install-the-medperf-client). + +- (Optional step) If logged into a real MedPerf user, first logout. +```bash +medperf auth logout +``` + +- Log into the test Benchmark Owner user. +```bash +medperf auth login -e testbo@example.com +``` + +- (Optional step) Reset the local development server databse by execution the following command inside the `server` directory at the roost of this repository: +```bash +sh reset_db.sh +``` + +- Register the real dataset workflow in MedPerf. **Inside the same directory as this README file**, run the following command: +```bash +medperf container submit --name rano_workflow --container-config-file /workflow.yaml --parameters-file ./workspace/parameters.yaml --additional-file https://storage.googleapis.com/medperf-storage/rano_test_assets/dev_models_and_more.tar.gz --operational +``` + +- Confirm the seeding process was succesful by executing the following command in any directory: +```bash +medperf container ls +``` + +The output should be similar to what's shown below: +```text + UID Name State Registered +----- ------------------ --------- ------------ + 1 MedPerf CA OPERATION True + 2 rano_workflow OPERATION True +``` + +Note the `UID` field of the `rano_workflow` workflow. It should be `2` if the local database was reset prior to seeding, but may be a different value if no reset was done. This UID will be used when running the data preparation step. + +- Prepare your input data according to [Section 2.1](#21-structuring-your-data) below. + +### 2.1. Structuring your data + +You may create your `input_data` directory anywhere, but please ensure that it is in a location with relatively fast read/write access and with at least 2x more free disk space than your dataset currently occupies. Inside the `input_data` directory, your data needs to follow a folder hierarchy where images are separated by \/\/\. + +**Please note**: For the RANO study, Series-level folders must use the following abbreviations: t2f (T2-weighted FLAIR), t1n (T1-weighted non-contrast), t1c (T1-weighted with contrast), and t2w (T2-weighted). For more information about the required series, please refer to the FeTS 2.0 manual. PatientID and Timepoint must be unique between and within patients, respectively, and Timepoint should be sortable into chronologic order. + +``` +. +├── input_data +│ ├── AAAC_0 +│ ├── 2008.03.30 +│ │ ├── t2f +│ │ ├── t2_Flair_axial-2_echo1_S0002_I000001.dcm +│ │ │ └── ... +│ │ ├── t1n +│ │ │ ├── t1_axial-3_echo1_S0003_I000001.dcm +│ │ │ └── ... +│ │ ├── t1c +│ │ │ ├── t1_axial_stealth-post-14_echo1_S0014_I000001.dcm +| │ │ │ └── ... +│ │ │ └── t2w +│ │ │ ├── T2_SAG_SPACE-4_echo1_S0004_I000001.dcm +│ │ │ └── ... +``` + +## 3. Registering your dataset +Your dataset must be registered into MedPerf for pipeline execution. The following command my be used to register the dataset on MedPerf +```bash +medperf dataset --name RANODataset --data_path --labels_path --data_prep -y +``` +Make sure to substitute in the proper values for the `--data_path`, `--labels_path` and `--data-prep` arguments according to the setup done in either [Section 1](#1-preparing-to-run-the-pipeline-with-the-developement-dataset) or [Section 2](#2-preparing-to-run-the-pipeline-with-real-data). + +Confirm your dataset's UID by running the command +```bash +medperf dataset ls --mine +``` + +The output should be similar to what is shown below. If a local database reset was run at the start of the tutorial, it should be `UID` `1`. Keep note of the dataset UID, as it will be used in [Section 4](#4-running-the-rano-pipeline-via-medperf) +```text + UID Name Data Preparation Container UID State Status Owner +----- ------ -------------------------------- ----------- -------- ------- + 1 RANO 2 DEVELOPMENT +``` + + +## 4. Running the RANO Pipeline via MedPerf +Once the dataset is registered, the pipeline may be executed by running +```bash +medperf dataset prepare --data_uid -y +``` +Make sure to substitute in the dataset UID seen in [Section 3](#3-registering-your-dataset). MedPerf will then being pulling the necessary Docker iamge and then immediately run Airflow. [Section 5](#5-pipeline-overiew) will give a general view of the pipeline, while [Section 6](#6-monitoring-in-airflow) will go on details of how to monitor the pipeline in Airflow. + +## 5. Pipeline Overiew +A general view of the pipeline is shown in the Figure below. A initial setup creating required directories is performed at first. Then, the pipeline will run NIfTI Conversion for multiple subjects in parallel. For each subject, once NIfTi conversion is completed, the pipeline will automatically run the Brain Extraction and Tumor Extraction stages and then await for manual confirmation (see [Section 5.1](#51-manual-approval-steps) for instructions regarding manual confirmation). The `per subject: true` configuration present in multiple steps of the pipeline signifies that this splitting per subject must be done at these steps. + +![Representation of the whole pipeline](./readme_images/pipeline_diagram.png) + +When the parser converts the YAML file into Airflow, each box in the above Figure is converted into a Directed Acyclic Graph (DAG) in Airflow. This results in the Airflow form of the pipeline being constructed as multiple DAGs, which can be though of as a grouping of one or more data processing steps. + +## 6. Monitoring in Airflow +Airflow’s Web UI can be used to monitor the Pipeline while it is running. The WebUI will be ready for accessing when a message similar to the image below appears in the terminal used to run DataPreparation: +```text +Starting Airflow components +Airflow components successfully started +MedPerf has started executing the Data Pipeline rano_workflow_prep via Airflow. +Execution will continue until the pipeline successfully completes. +The Airflow UI is available at the following link: http://localhost:8080. +Please use the following credentials for interacting with the Airflow WebUI +------------------------------------------------------- +User: SOME_USERNAME_HERE +Password: RANDOM_PASSWORD_HERE +------------------------------------------------------- +Note that the password value will change every time Airflow is restarted via MedPerf. +If this process must be stopped prematurely, please use the Ctrl+C command! +``` + +Keep note of the values that appear in your terminal for `SOME_UERNAME_HERE` and `RANDOM_PASSWORD_HERE`. They will be used to access the Airflow WebUI. The WebUI can be accessed via port 8080 in the Machine where Airflow is running. If running locally, you can simply open http://localhost:8080/ on your Browser to access the UI. Use the `SOME_UERNAME_HERE` and `RANDOM_PASSWORD_HERE` from the terminal output to login. Note that the password will change every time Airflow is started via MedPerf. + +![Airflow login screen](./readme_images/airflow_login.png) + +Once logged in, the Airflow home screen will be displayed, as shown below. You can click on the DAGs button, in red in the figure, to switch to the DAGs view. + +![Airflow home screen](./readme_images/airflow_home.png) + +A list of all currently loaded Airflow DAGs will be displayed, as shown below. The pipeline itself consists of multiple DAGs and each DAG maps to one of the `steps` defind in the YAML version of the Pipeline. Each DAG is the corresponding step name, both in its raw format from the YAML file (`some_step`) and in a more readable format (`Some Step`) and, in case of steps with `per_subject: true`, also by the Subject ID and Timepoint. + +![DAG view in Airflow](./readme_images/dag_list.png) + +A view of Airflow Task Instances, which are the unit of execution used by Airflow, may be displayed by clicking the `Task Instances` button at the top of the screen. In this screen, Task Instances may be filtered by their state. We recommend filtering by `Running`, `Failed`, `Success` and `Up for Reschedule` states. The `Up for Reschedule` state is relevant for the Manual Approval Steps discussed in [Section 5.1](#51-manual-approval-steps). The Figure below shows a view of Task Instances with these filters applied, with the `Task Instances` button showcased in red and the state filters in blue. + +![Task Instances view in Airflow](./readme_images/task_instances_view.png) + +### 5.1 Manual Approval Steps +The automatic Tumor Segmentations must be manually validated before the Pipeline concludes. To help with finding the tasks that are awaiting for Manual Approval, we recomend going into the Task Instance view described previously and filter by `Up for Reschedule` tasks. The pipeline automatically creates the `Conditions Prepare for Manual Review` task to evaluate the `if` fields from the `prepare_for_manual_review` step defined in the YAML file. While awating for approval, these tasks remain in the `Up for Reschedule` state. The Figure below shows a Task Instance list view in this situation, with the Task IDs and State in red: + +![DAGs ready for Manual Review](./readme_images/tasks_manual_review.png) + +In the Figure above, Subjects AAAC_1/2008.03.031 and AAAC_1/2012.01.02 are ready for manual review, signalled by the `State` (in blue) column having the status `Up for Reschedule`. This status means that none of the conditions defined in step `prepare_for_manual_review` of the YAML file (`dags_from_yaml/rano.yaml`) have been met yet, and therefore the pipeline is waiting for their manual completion by a user. The procedure for Manual Review is described in Sections [5.1](#51-manual-approval-steps---tumor-segmentation) and [5.2](#52-brain-mask-correction). Subject AAAC_2/2001.01.01 on the other hand, has a currently running task, signalled by the `Running` state, and therefore is not ready for manual review yet. + +#### 5.1.1 Tumor Segmentation +Once the segmentation for a given subject is ready for review, it will be available at the following path: + +``` +{MEDPERF_DATA_DIR}/{DATASET_UID}/data/manual_review/tumor_extraction/{SUBJECT_ID}/{TIMEPOINT}/under_review/{SUBJECT_ID}_{TIMEPOINT}_tumorMask_model_0.nii.gz +``` + +In this path `{MEDPERF_DATA_DIR}` MedPerf data directory, located at `~/.medperf/data/localhost_8000` if running the local development server. `{DATASET_UID}` is the UID of the registered dataset and shoul be `1` if a server reset was run prior to this tutorial,`{SUBJECT_ID}` and `{TIMEPOINT}` must be substituted for the corresponding SubjectID and Timepoint of each data point. Note that this is in the `under_review` directory, signalling the tumor segmentation has not been reviewed yet. For example, for subject AAAC_2 and timepoint 2001.01.01 the complete path would be: + +``` +{MEDPERF_DATA_DIR}/{DATASET_UID}/data/manual_review/tumor_extraction/AAAC_2/2001.01.01/under_review/AAAC_2_2001.01.01_tumorMask_model_0.nii.gz +``` + +The tumor segmentation can be reviewed with the software of your choice and, if necessary, corrections can be made. Once the review is finished, the file must be moved to the adjacent `finalized` directory. The complete path to the `finalized` file is, then + +``` +{MEDPERF_DATA_DIR}/{DATASET_UID}/data/manual_review/tumor_extraction/{SUBJECT_ID}/{TIMEPOINT}/finalized/{SUBJECT_ID}_{TIMEPOINT}_tumorMask_model_0.nii.gz +``` + +Note that this is in the `finalized` directory, signalling the review has been done. Once the Tumor Segmentation is in the `finalized` directory, the pipeline will automatically detect it and proceed for this subject. ***IMPORTANT!! Do NOT change the filename when moving the file into the finalized directory!*** The pipeline will only detect the reviewed Tumor Segmentation if it keeps the exact same filename. + +Please do this review process for all subjects in the study. If the brain mask itself must be corrected for any subjects, please refer to [Section 5.1.2](#512-brain-mask-correction). Note that modifying the Brain Mask of a Subject will cause the pipeline to rollback to the Brain Extraction step corresponding to that subject to run again, after which the given Tumor Segmentation must be manually approved once ready. + +#### 5.1.2 Brain Mask Correction + +If the automatic brain mask is correct, no action from this section is required. However, it is also possible to make corrections to the automatic brain mask, if necessary. **Note that if the Brain Mask is modified, the pipeline will go back to the Brain Extraction stage for this subject, then run Tumor Extraction and await for manual approval once again oncfe the Tumor Extraction is completed.** Once the pipeline reaches the manual approval step for a given subject/timepoint, the brain mask file will be located at the path below: + +``` +{MEDPERF_DATA_DIR}/{DATASET_UID}/data/manual_review/brain_mask/{SUBJECT_ID}/{TIMEPOINT/under_review/brainMask_fused.nii.gz +``` + +In this path `{MEDPERF_DATA_DIR}` MedPerf data directory, located at `~/.medperf/data/localhost_8000` if running the local development server. `{DATASET_UID}` is the UID of the registered dataset and shoul be `1` if a server reset was run prior to this tutorial, `{SUBJECT_ID}` and `{TIMEPOINT}` must be substituted for the corresponding SubjectID and Timepoint of each data point. Note that this is in the `under_review` directory, signalling the tumor segmentation has not been reviewed yet. + +The brain mask can be reviewed and corrected with the software of your choice and, if necessary, corrections can be made. Once the corrections are finished, the file must be moved to the adjacent `finalized` directory. The complete path to the finalized file is, then: + +``` +{MEDPERF_DATA_DIR}/{DATASET_UID}/datamanual_review/brain_mask/{SUBJECT_ID}/{TIMEPOINT/finalized/brainMask_fused.nii.gz +``` + +***IMPORTANT!! Do NOT change the filename when moving the file into the finalized directory!*** The pipeline will only detect the corrected Brain Mask if it keeps the exact same filename. + +#### 5.2 Final Confirmation +There is also a manual confirmation step towards the end of the pipeline (step ID `final_confirmation`, of type `manual_approval`). When converted into an Airflow task, this step results into a task that always fails and must be manually set as Success by the user. **Before proceeding with this step, *make sure to review and Tumor Segmentations as per [Section 5.1.1](#511-manual-approval-steps---tumor-segmentation) and ensure you approve all of the results, along with necessary corrections to Brain Masks ([Section 5.1.2](#512-brain-mask-correction) if any are necessary.*** + +Once all results are reviewed, log into Airflow's Web UI. Go into the Task Instance View and locate the Task Instance named `Final Confirmation`. A filter by may be used, as shown in the Figure below, in blue. The task state will be `Failed`, as shown in red in the figure. This is normal, as this task is a manual approval step and therefore must be manually changed to success for approval. + +![Filtering DAGs by the Final Confirmation tag.](./readme_images/task_list_filtered_final_confirmation.png) + +***IMPORTANT!!* This task will *NOT* show up if all Manual Reviews are not done yet!** If you are unable to find the `Final Confirmation` task instance, make sure you have completed all the Manual Review steps outlind in [Section 5.1](#51-manual-approval-steps). + +If task is in the `Failed` state, it is ready for review. **If you have already validated all the Tumor Segmentations**, scroll your display all the way to the right, revealing a small drop-down arrow. Click the arrow, then click `Success` to open a confirmation prompt. The `Note` tab may be optionally expanded to add a Note to this task, if desired. Finally click `Confirm` to approve the results. The two figures below illustrate this process. + +![Selecting the Success option in the Mark as Success button](./readme_images/mark_state_as_button.png) + +![Confirmation for setting task as success](./readme_images/mark_as_success_confirmation.png) + +Once this procedure is done, the pipeline will proceed to its final steps and conclusion. + +## 6. Output Data + +The outputs of the pipeline, upon its conclusion, are as follows: + +- The `report.yaml` file, located at `{MEDPERF_DATA_DIR}/{DATASET_UID}/data/report.yaml` which is updated every minute with the completion percentages of each step defined on the Pipeline YAML file (`./workflow.yaml` or `/.workflow_dev.yaml`). Its contents are uploaded to the local MedPerf server. In a real use case, the contents are uploaded to the production MedPerf server and are used for monitoring the progression of data preparation at the different sites running data preparation. Note that the `report.yaml` file contains only a summary of pipeline status and progression completion, not any actual data. + +- The `{MEDPERF_DATA_DIR}/{DATASET_UID}/metadata` directory contains metadata YAML files for each subject, extracted from the initial DICOM data. + +- The `{MEDPERF_DATA_DIR}/{DATASET_UID}/labels` directory contains the final tumor segmentations for each subject. + +- The `{MEDPERF_DATA_DIR}/{DATASET_UID}/data` directory contains two different outputs. + - The NIfTi files obtained for each subject after Brain Extraction, located at `{MEDPERF_DATA_DIR}/{DATASET_UID}/data/{SUBJECT_ID}/{TIMEPOINT}` for each subject/timepoint combination. + - A `splits.csv` file detailing whether each subject was separated into the training or validation data sets. + - A `train.csv` file containing only subjects in the training dataset. + - A `val.csv` file containing only subjects in the validation dataset. diff --git a/examples/RANO/data_preparator_workflow/readme_images/airflow_home.png b/examples/RANO/data_preparator_workflow/readme_images/airflow_home.png new file mode 100644 index 0000000000000000000000000000000000000000..ed873fa9db7ae589773f8446b541bc9342559ee7 GIT binary patch literal 421497 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%0AEf3SgCN}y#fkW-%Gbx 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 `yMKQ%2) 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 literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/airflow_login.png b/examples/RANO/data_preparator_workflow/readme_images/airflow_login.png new file mode 100644 index 0000000000000000000000000000000000000000..c89ff9b55b29c6689c9ac16a21598b7cccdaead8 GIT binary patch literal 44573 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%0A8|T?<)*XEy~8`UE^=hri-u*whuI~B6^n{N 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 ad+Kq!^%A5?^ml2> literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/dag_list.png b/examples/RANO/data_preparator_workflow/readme_images/dag_list.png new file mode 100644 index 0000000000000000000000000000000000000000..f47ea0c060ae111588e640de3501b0ebb4f0e4d5 GIT binary patch literal 254997 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�T4QDVc{IXPw7HG&@r+iR+F%)TT$A5an^e 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 i)!pv;icn~lSa;C? literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/mark_as_success_confirmation.png b/examples/RANO/data_preparator_workflow/readme_images/mark_as_success_confirmation.png new file mode 100644 index 0000000000000000000000000000000000000000..75340d2c142e93c420c63e27bb0d8343be521381 GIT binary patch literal 115695 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

e_TFo+_^lgCd2t_zN%~!u8VkF&SkJ&Io{OISV zblao*!Vb54ZSekS(q6*#b8DNUbO_Fld<=eK;L{dG&9Ow@?>7=44}52V9`wSkJ2zn{!-ZpdDnxbP&z)0q}-5-(%>0{+u(tol41d~Zb3RDYJF2p>D(2lv5q>07a=X@f<#109^Q&cS|?2U#fz z^}D;T4u6;0pK;hVhwT=EDDHm$QL%KP2x^@1;lq}m%o}~IOe`gN(YosSmA@H^O!p!S zp>@@91VF#}ImgFB3FOiVPZlPWm^!&1{$Ay?n*^EiFC9vlUxH90-3IQkOh{mquBUcZ9t zWL}I=Ks4w;UP4v0ngBwR4~vq3eZ!?>Qr+aOQtV#fA7QqI5PmS7w9+b3v9O~M_vtsU z&ILA{la#3=bA7o#zmMEWG)o`1!aMo};byr=a}yRNd>zY}OE}UHnr#0l6GR|H_j5u( zDE}y?6YXB0M^5*0DLmV`9t;eci6cl1jPX5@KzGc5*U;epixHq-+DNP+L=$mwUyKL&;=)$QvQn#U|+wrdoX7vAGT6LJ*v`GjPfuzJ)b#1p5)A2#ZwCi z7=S(3>zAsH50t%~n5rb2Gje~Cr2Bay0=u(wtp3&lAfT>S%;@;u1LENemk42agnhdB zGCJA>BN*cOtl`VNC@qto_*xu}j@oqC&SUAtv&S-iqaY_9bSh|o>$%cJGBv*dsMc#k z>a$Ywi6LgCvu^aA!8L9E`y_e2d~3*=O62%=>kFtU1Xek!I@z@`wbx*G&~}tyW7~^n?25k zazy-e{@weEn2(BuVaS5Ļ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 R77D=Saq!3ij`QgY{{r+BZx{do literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/mark_state_as_button.png b/examples/RANO/data_preparator_workflow/readme_images/mark_state_as_button.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcc500eb98a9c58689e9ec9405d49a958323e27 GIT binary patch literal 125991 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

H52aSA2Qarskbg0$LmM=gnqT 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 literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/pipeline_diagram.png b/examples/RANO/data_preparator_workflow/readme_images/pipeline_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..66e57993a436c64d77905900844e2e3db6de9761 GIT binary patch literal 126888 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

  • ~ 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 literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/task_instances_view.png b/examples/RANO/data_preparator_workflow/readme_images/task_instances_view.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca6fba6ca87800da591fb9ce2363e0001d741a0 GIT binary patch literal 281717 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°(u3;_HAcf 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�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 vYH;NLf6f2)Q~Y;J~tJzMIXrRG%`RX$% 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

    #u*!zN{h)|L`?>)yByCL8m}n--;2$ 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 dADWijP3F6AHAb{Wfajvf$SD+X>6dF-LvGU> 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 Cy=Q;` literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/tasks_manual_review.png b/examples/RANO/data_preparator_workflow/readme_images/tasks_manual_review.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c6abab4a10ee43fb575ff575ba1d76c832b341 GIT binary patch literal 118533 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®iltYWh?ZR2>N+euLy>Y9K|eY3DijDyL(N6$#? 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�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 Date: Tue, 2 Dec 2025 13:25:48 -0300 Subject: [PATCH 110/176] Use dev workflow in rano demo --- server/seed_utils.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/server/seed_utils.py b/server/seed_utils.py index 3fd2f019b..58f7e017f 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -18,8 +18,12 @@ def _load_asset_content(assets_path: str, file_relative_path: str): return content -def load_workflow_config(assets_path: str, dirname: str): - return _load_asset_content(assets_path, f"{dirname}/workflow.yaml") +def load_workflow_config(assets_path: str, dirname: str, dev: bool = False): + if dev: + workflow_file = "workflow_dev.yaml" + else: + workflow_file = "workflow.yaml" + return _load_asset_content(assets_path, f"{dirname}/{workflow_file}") def load_container_config(assets_path: str, dirname: str): @@ -540,7 +544,9 @@ def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): "##########################BENCHMARK OWNER (RANO WORKFLOW)##########################" ) - data_prep_config = load_workflow_config(assets_path, "data_preparator_workflow") + data_prep_config = load_workflow_config( + assets_path, "data_preparator_workflow", dev=True + ) data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( From 77fec7903468ae829399fd365063f8b5b04914ad Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 13:32:51 -0300 Subject: [PATCH 111/176] Update "prepare_manual_review" step to be called simply "manual_review" --- .../RANO/data_preparator_workflow/workflow.yaml | 14 +++++++------- .../data_preparator_workflow/workflow_dev.yaml | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/RANO/data_preparator_workflow/workflow.yaml b/examples/RANO/data_preparator_workflow/workflow.yaml index 3f70ed408..198120852 100644 --- a/examples/RANO/data_preparator_workflow/workflow.yaml +++ b/examples/RANO/data_preparator_workflow/workflow.yaml @@ -96,12 +96,12 @@ steps: mount_path: /workspace/data type: directory command: extract_tumor - next: prepare_for_manual_review + next: manual_review on_error: do_something per_subject: true limit: 2 - - id: prepare_for_manual_review + - id: manual_review <<: *BASE_STEP mounts: input_volumes: @@ -125,7 +125,7 @@ steps: target: segmentation_comparison - condition: brain_mask_changed target: rollback_to_brain_extract - else: prepare_for_manual_review + else: manual_review wait: 60 on_error: do_something per_subject: true @@ -138,13 +138,13 @@ steps: mount_path: /workspace/data type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_path review_input_labels: mount_path: /workspace/labels type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_labels_path output_volumes: output_path: @@ -165,13 +165,13 @@ steps: mount_path: /workspace/data type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_path review_input_labels: mount_path: /workspace/labels type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_labels_path output_volumes: output_path: diff --git a/examples/RANO/data_preparator_workflow/workflow_dev.yaml b/examples/RANO/data_preparator_workflow/workflow_dev.yaml index ba155788f..6cf1ca397 100644 --- a/examples/RANO/data_preparator_workflow/workflow_dev.yaml +++ b/examples/RANO/data_preparator_workflow/workflow_dev.yaml @@ -96,12 +96,12 @@ steps: mount_path: /workspace/data type: directory command: extract_tumor - next: prepare_for_manual_review + next: manual_review on_error: do_something per_subject: true limit: 2 - - id: prepare_for_manual_review + - id: manual_review <<: *BASE_STEP mounts: input_volumes: @@ -125,7 +125,7 @@ steps: target: segmentation_comparison - condition: brain_mask_changed target: rollback_to_brain_extract - else: prepare_for_manual_review + else: manual_review wait: 60 on_error: do_something per_subject: true @@ -138,13 +138,13 @@ steps: mount_path: /workspace/data type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_path review_input_labels: mount_path: /workspace/labels type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_labels_path output_volumes: output_path: @@ -165,13 +165,13 @@ steps: mount_path: /workspace/data type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_path review_input_labels: mount_path: /workspace/labels type: directory from: - step: prepare_for_manual_review + step: manual_review mount: output_labels_path output_volumes: output_path: From 8b2a18f7fbe47595952ce06fe68d6df0e1f8a93e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 14:57:49 -0300 Subject: [PATCH 112/176] Fix bug in seed.py --- server/seed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/seed.py b/server/seed.py index 5673b7b70..e77e343d2 100644 --- a/server/seed.py +++ b/server/seed.py @@ -111,7 +111,7 @@ def seed(args): model_owner_token, benchmark_owner_token, benchmark, - args.containers_assets_path, + default_xray_containers_assets_path, ) From 7d70741e1fa322235db57774bc603b38bd1c9eb8 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 17:18:53 -0300 Subject: [PATCH 113/176] Move rm command outside of private container conditionals --- cli/cli_chestxray_tutorial_test.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cli/cli_chestxray_tutorial_test.sh b/cli/cli_chestxray_tutorial_test.sh index ef0dca2ec..a3a616ead 100755 --- a/cli/cli_chestxray_tutorial_test.sh +++ b/cli/cli_chestxray_tutorial_test.sh @@ -281,15 +281,14 @@ if ${PRIVATE}; then --model_additional_files $MODEL_LOCAL/workspace/additional_files/ checkFailed "offline compatibility test execution step failed - private model" - - print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.tar.gz - print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.pth - ########################################################## echo "\n" fi +print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.tar.gz +print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.pth + ########################################################## echo "=====================================" echo "Logout users" From f200e40a2f030e17d1ccc91db3560aed7b82ec3f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 17:20:14 -0300 Subject: [PATCH 114/176] Tentative additions for first implementation of running singularity containers in Airflow --- cli/medperf/config.py | 2 + .../containers/runners/airflow_runner.py | 60 ++++++++------ .../components/db_component.py | 10 --- .../components/db_postgres_component.py | 75 ++++++++++++++++++ .../components/db_postgres_docker.py | 63 ++------------- .../components/db_postgres_singularity.py | 79 +++++++++++++++++++ .../airflow_runner_utils/system_runner.py | 24 ++++-- 7 files changed, 215 insertions(+), 98 deletions(-) delete mode 100644 cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py create mode 100644 cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py create mode 100644 cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py diff --git a/cli/medperf/config.py b/cli/medperf/config.py index 738736bc9..f259afd83 100644 --- a/cli/medperf/config.py +++ b/cli/medperf/config.py @@ -271,6 +271,8 @@ webui_max_chunk_length = 20 # Max 20 events in a chunk webui_max_chunk_size = 64 * 1024 # Max 64 Bytes as chunk size +# Airflow-related config +airflow_postgres_image = "postgres:14.19" default_profile_name = "default" testauth_profile_name = "testauth" diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 35902b71c..d731be8b7 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -8,13 +8,13 @@ import os from medperf.containers.parsers.airflow_parser import AirflowParser from medperf.account_management import get_medperf_user_data -from .utils import ( - check_docker_image_hash, -) +from .utils import check_docker_image_hash, get_expected_hash +from .singularity_utils import get_docker_image_hash_from_dockerhub from medperf.utils import run_command from medperf.comms.entity_resources import resources import logging from .docker_utils import get_docker_image_hash +from medperf import config class AirflowRunner(Runner): @@ -34,28 +34,42 @@ def download( hashes_dict: Dict[str, str], download_timeout: int = None, get_hash_timeout: int = None, - alternative_image_hash: str = None, - container_base_dir: str = None, ) -> Dict[str, str]: - # TODO currently no support for singularity user environment - # converting a docker image to singularity + # TODO add support for Docker Archives, Encrypted Containers, singularity files + if config.platform == "docker": + self._download_containers_for_docker( + hashes_dict, download_timeout, get_hash_timeout + ) + elif config.platform == "singularity": + self._check_containers_for_singularity(hashes_dict, get_hash_timeout) + + def _download_containers_for_docker( + self, hashes_dict, download_timeout, get_hash_timeout + ): + for container in self.parser.containers: + expected_image_hash = get_expected_hash(hashes_dict, container.image) + command = ["docker", "pull", container.image] + run_command(command, timeout=download_timeout) + computed_image_hash = get_docker_image_hash( + container.image, get_hash_timeout + ) + check_docker_image_hash(computed_image_hash, expected_image_hash) + hashes_dict[container.image] = computed_image_hash + + return hashes_dict + + def _check_containers_for_singularity(self, hashes_dict, get_hash_timeout): + """ + Note: currently assumes image always come from some Docker registry (i.e docker hub) + and then are converted into singularity during run + """ for container in self.parser.containers: - if container.platform == "docker": - expected_image_hash = hashes_dict.get(container.image) - command = ["docker", "pull", container.image] - run_command(command, timeout=download_timeout) - computed_image_hash = get_docker_image_hash( - container.image, get_hash_timeout - ) - check_docker_image_hash(computed_image_hash, expected_image_hash) - hashes_dict[container.image] = computed_image_hash - elif container.platform == "singularity": - expected_image_hash = hashes_dict.get(container.image) - sif_image_path, computed_image_hash = resources.get_cube_image( - container.image, expected_image_hash - ) # Hash checking happens in resources - self.sif_image_path = sif_image_path - hashes_dict[container.image] = computed_image_hash + expected_image_hash = get_expected_hash(hashes_dict, container.image) + computed_image_hash = get_docker_image_hash_from_dockerhub( + container.image, get_hash_timeout + ) + check_docker_image_hash(computed_image_hash, expected_image_hash) + hashes_dict[container.image] = computed_image_hash return hashes_dict diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py deleted file mode 100644 index 9af10b454..000000000 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_component.py +++ /dev/null @@ -1,10 +0,0 @@ -from .component import ComponentRunner -from abc import abstractmethod - - -class DatabaseComponent(ComponentRunner): - - @property - @abstractmethod - def connection_string(self): - pass diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py new file mode 100644 index 000000000..f2251b81b --- /dev/null +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py @@ -0,0 +1,75 @@ +from .component import ComponentRunner +from .utils import validate_port, generate_random_password +from pydantic import SecretStr +from typing import Union + +import os +import random +import string +from abc import abstractmethod + + +class PostgresDatabaseComponent(ComponentRunner): + + START_PERIOD = 2 + INTERVAL = 5 + MAX_TRIES = 5 + TIMEOUT = 30 + + def __init__( + self, + project_name: str, + root_dir: os.PathLike, + postgres_user: str = "postgres", + postgres_password: SecretStr = None, + postgres_db: str = "postgres", + postgres_port: Union[str, int] = 5432, + hostname: str = "localhost", + ): + super().__init__() + self.user = postgres_user + self.db = postgres_db + self.password = postgres_password or generate_random_password() + self.hostname = hostname + self.port = validate_port(postgres_port) + self.data_dir = os.path.join(root_dir, "postgres_data") + self.logs_dir = os.path.join(root_dir, "logs") + self.container_name = self.generate_container_name(project_name) + self.container_id = None + + @property + def component_name(self): + return "PostgreSQL Database for Airflow" + + @property + def logfile(self): + return os.path.join(self.logs_dir, "postgres_db.log") + + @staticmethod + def generate_container_name(project_name): + all_characters = string.ascii_lowercase + string.digits + num_digits = 4 + random_part = "".join(random.choice(all_characters) for _ in range(num_digits)) + complete_name = f"postgres_{project_name}_{random_part}" + return complete_name + + @property + def connection_string(self): + return f"postgresql+psycopg2://{self.user}:{self.password.get_secret_value()}@{self.hostname}:{self.port}/{self.db}" + + @abstractmethod + async def start_logic(self): + """Logic to start the Postgres container goes here""" + pass + + @abstractmethod + def has_successfully_started(self): + """Logic to check if Postgres container has succesfully started goes here""" + + @abstractmethod + def terminate(self): + """Logic to gracefully terminate Postgres container goes here""" + + @abstractmethod + def kill(self): + """ "Logic to forcefully stop Postgres container goes here""" diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py index 7fbb01679..320c5094c 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py @@ -1,58 +1,9 @@ -from .db_component import DatabaseComponent -from .utils import validate_port, generate_random_password -from pydantic import SecretStr -from typing import Union - -import os -import random -import string +from .db_postgres_component import PostgresDatabaseComponent import subprocess +from medperf import config -class PostgresDBDocker(DatabaseComponent): - - POSTGRES_IMAGE = "postgres:14.19" - START_PERIOD = 2 - INTERVAL = 5 - MAX_TRIES = 5 - TIMEOUT = 30 - - def __init__( - self, - project_name: str, - root_dir: os.PathLike, - postgres_user: str = "postgres", - postgres_password: SecretStr = None, - postgres_db: str = "postgres", - postgres_port: Union[str, int] = 5432, - hostname: str = "localhost", - ): - super().__init__() - self.user = postgres_user - self.db = postgres_db - self.password = postgres_password or generate_random_password() - self.hostname = hostname - self.port = validate_port(postgres_port) - self.data_dir = os.path.join(root_dir, "postgres_data") - self.logs_dir = os.path.join(root_dir, "logs") - self.container_name = self.generate_container_name(project_name) - self.container_id = None - - @property - def component_name(self): - return "PostgreSQL Database for Airflow" - - @property - def logfile(self): - return os.path.join(self.logs_dir, "postgres_db.log") - - @staticmethod - def generate_container_name(project_name): - all_characters = string.ascii_lowercase + string.digits - num_digits = 4 - random_part = "".join(random.choice(all_characters) for _ in range(num_digits)) - complete_name = f"postgres_{project_name}_{random_part}" - return complete_name +class PostgresDBDocker(PostgresDatabaseComponent): async def start_logic(self): self.process = subprocess.run( @@ -69,10 +20,10 @@ async def start_logic(self): "-e", f"POSTGRES_DB={self.db}", "-v", - f"{self.data_dir}:/var/lib/postgresql/data", + f"{self.data_dir}:/var/lib/postgresql/data:rw", "-p", f"{self.port}:{self.port}", - f"{self.POSTGRES_IMAGE}", + f"{config.airflow_postgres_image}", ], capture_output=True, text=True, @@ -110,7 +61,3 @@ def kill(self): subprocess.run( ["docker", "rm", "-f", self.container_id], capture_output=True, text=True ) - - @property - def connection_string(self): - return f"postgresql+psycopg2://{self.user}:{self.password.get_secret_value()}@{self.hostname}:{self.port}/{self.db}" diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py new file mode 100644 index 000000000..078148126 --- /dev/null +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py @@ -0,0 +1,79 @@ +from .db_postgres_component import PostgresDatabaseComponent +import subprocess +from medperf import config +from medperf import config +from medperf.containers.runners.singularity_utils import ( + get_singularity_executable_props, +) + + +class PostgresDBSingularity(PostgresDatabaseComponent): + """Note: currently untested!""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + executable, runtime, version = get_singularity_executable_props() + self.executable = executable + self.runtime = runtime + self.version = version + + @property + def instance_name(self): + return f"instance://{self.container_name}" + + async def start_logic(self): + """Notes: + - singularity instance start runs detached (similar to docker run -d) + """ + run_env = { + "SINGULARITYENV_POSTGRES_USER": self.user, + "SINGULARITYENV_POSTGRES_PASSWORD": self.password.get_secret_value(), + "SINGULARITYENV_POSTGRES_DB": self.db, + } + self.process = subprocess.run( + [ + self.executable, + "instance", + "start", + "-eC", + "--bind", + f"{self.data_dir}:/var/lib/postgresql/data:rw", + f"docker://{config.airflow_postgres_image}", + self.container_name, + ], + capture_output=True, + text=True, + env=run_env, + ) + await self.wait_for_start() + + def has_successfully_started(self): + postgres_status: subprocess.CompletedProcess = subprocess.run( + [ + self.executable, + "exec", + self.instance_name, + "pg_isready", + "-U", + self.user, + "-d", + self.db, + ], + capture_output=True, + text=True, + ) + return postgres_status.returncode == 0 + + def terminate(self): + subprocess.run( + [self.executable, "stop", self.instance_name], + capture_output=True, + text=True, + ) + + def kill(self): + subprocess.run( + [self.executable, "stop", "-F", self.instance_name], + capture_output=True, + text=True, + ) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 04838ec0f..980a81aec 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -6,6 +6,7 @@ from .components.airflow_component import AirflowComponentRunner from .components.dag_processor import AirflowDagProcessor from .components.db_postgres_docker import PostgresDBDocker +from .components.db_postgres_singularity import PostgresDBSingularity from .components.scheduler import AirflowScheduler from .components.triggerer import AirflowTriggerer from .components.utils import validate_port @@ -139,13 +140,22 @@ def _initialize_components(self): "dags_folder": self.dags_folder, } - self.db = PostgresDBDocker( - project_name=self.project_name, # TODO Check platform to instantiate singularity version - root_dir=self.airflow_home, - postgres_user="airflow", - postgres_db="airflow", - hostname=self.host, - ) + if config.platform == "singularity": + self.db = PostgresDBSingularity( + project_name=self.project_name, + root_dir=self.airflow_home, + postgres_user="airflow", + postgres_db="airflow", + hostname=self.host, + ) + else: # Default to docker + self.db = PostgresDBDocker( + project_name=self.project_name, + root_dir=self.airflow_home, + postgres_user="airflow", + postgres_db="airflow", + hostname=self.host, + ) self.api_server = AirflowApiServer(**common_args, port=self.port) self.scheduler = AirflowScheduler( **common_args, user=self.user, password=self._password, mounts=self.mounts From 2bc735c2e4302b602d619821975a8fa8b954fa67 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 2 Dec 2025 17:25:18 -0300 Subject: [PATCH 115/176] Fix section numberings in README for RANO example --- examples/RANO/data_preparator_workflow/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/RANO/data_preparator_workflow/README.md b/examples/RANO/data_preparator_workflow/README.md index cecc7f42f..cce79667c 100644 --- a/examples/RANO/data_preparator_workflow/README.md +++ b/examples/RANO/data_preparator_workflow/README.md @@ -198,7 +198,7 @@ The automatic Tumor Segmentations must be manually validated before the Pipeline In the Figure above, Subjects AAAC_1/2008.03.031 and AAAC_1/2012.01.02 are ready for manual review, signalled by the `State` (in blue) column having the status `Up for Reschedule`. This status means that none of the conditions defined in step `prepare_for_manual_review` of the YAML file (`dags_from_yaml/rano.yaml`) have been met yet, and therefore the pipeline is waiting for their manual completion by a user. The procedure for Manual Review is described in Sections [5.1](#51-manual-approval-steps---tumor-segmentation) and [5.2](#52-brain-mask-correction). Subject AAAC_2/2001.01.01 on the other hand, has a currently running task, signalled by the `Running` state, and therefore is not ready for manual review yet. -#### 5.1.1 Tumor Segmentation +#### 6.1.1 Tumor Segmentation Once the segmentation for a given subject is ready for review, it will be available at the following path: ``` @@ -221,7 +221,7 @@ Note that this is in the `finalized` directory, signalling the review has been d Please do this review process for all subjects in the study. If the brain mask itself must be corrected for any subjects, please refer to [Section 5.1.2](#512-brain-mask-correction). Note that modifying the Brain Mask of a Subject will cause the pipeline to rollback to the Brain Extraction step corresponding to that subject to run again, after which the given Tumor Segmentation must be manually approved once ready. -#### 5.1.2 Brain Mask Correction +#### 6.1.2 Brain Mask Correction If the automatic brain mask is correct, no action from this section is required. However, it is also possible to make corrections to the automatic brain mask, if necessary. **Note that if the Brain Mask is modified, the pipeline will go back to the Brain Extraction stage for this subject, then run Tumor Extraction and await for manual approval once again oncfe the Tumor Extraction is completed.** Once the pipeline reaches the manual approval step for a given subject/timepoint, the brain mask file will be located at the path below: @@ -239,8 +239,8 @@ The brain mask can be reviewed and corrected with the software of your choice an ***IMPORTANT!! Do NOT change the filename when moving the file into the finalized directory!*** The pipeline will only detect the corrected Brain Mask if it keeps the exact same filename. -#### 5.2 Final Confirmation -There is also a manual confirmation step towards the end of the pipeline (step ID `final_confirmation`, of type `manual_approval`). When converted into an Airflow task, this step results into a task that always fails and must be manually set as Success by the user. **Before proceeding with this step, *make sure to review and Tumor Segmentations as per [Section 5.1.1](#511-manual-approval-steps---tumor-segmentation) and ensure you approve all of the results, along with necessary corrections to Brain Masks ([Section 5.1.2](#512-brain-mask-correction) if any are necessary.*** +#### 6.2 Final Confirmation +There is also a manual confirmation step towards the end of the pipeline (step ID `final_confirmation`, of type `manual_approval`). When converted into an Airflow task, this step results into a task that always fails and must be manually set as Success by the user. **Before proceeding with this step, *make sure to review and Tumor Segmentations as per [Section 6.1.1](#611-manual-approval-steps---tumor-segmentation) and ensure you approve all of the results, along with necessary corrections to Brain Masks ([Section 6.1.2](#612-brain-mask-correction) if any are necessary.*** Once all results are reviewed, log into Airflow's Web UI. Go into the Task Instance View and locate the Task Instance named `Final Confirmation`. A filter by may be used, as shown in the Figure below, in blue. The task state will be `Failed`, as shown in red in the figure. This is normal, as this task is a manual approval step and therefore must be manually changed to success for approval. @@ -256,7 +256,7 @@ If task is in the `Failed` state, it is ready for review. **If you have already Once this procedure is done, the pipeline will proceed to its final steps and conclusion. -## 6. Output Data +## 7. Output Data The outputs of the pipeline, upon its conclusion, are as follows: From 1652fbf0a1d115feaa5fa9b140bb0e649d2df96c Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 3 Dec 2025 14:01:51 -0300 Subject: [PATCH 116/176] Modify migrations after merging in python update --- ...age_hash_to_json.py => 0006_convert_image_hash_to_json.py} | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename server/mlcube/migrations/{0005_convert_image_hash_to_json.py => 0006_convert_image_hash_to_json.py} (92%) diff --git a/server/mlcube/migrations/0005_convert_image_hash_to_json.py b/server/mlcube/migrations/0006_convert_image_hash_to_json.py similarity index 92% rename from server/mlcube/migrations/0005_convert_image_hash_to_json.py rename to server/mlcube/migrations/0006_convert_image_hash_to_json.py index 993eb4dbe..d99ca0d13 100644 --- a/server/mlcube/migrations/0005_convert_image_hash_to_json.py +++ b/server/mlcube/migrations/0006_convert_image_hash_to_json.py @@ -23,7 +23,7 @@ class Migration(migrations.Migration): dependencies = [ ( "mlcube", - "0004_alter_mlcube_unique_together_mlcube_container_config_and_more", + "0005_alter_mlcube_unique_together_alter_mlcube_image_hash_and_more", ), ] @@ -46,7 +46,6 @@ class Migration(migrations.Migration): name="mlcube", unique_together={ ( - "image_tarball_hash", "image_hash_tmp", "additional_files_tarball_hash", "container_config", @@ -67,7 +66,6 @@ class Migration(migrations.Migration): name="mlcube", unique_together={ ( - "image_tarball_hash", "image_hash", "additional_files_tarball_hash", "container_config", From 6ffdebfe773144f1deebdda7ce9dabe26694480a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 3 Dec 2025 14:06:36 -0300 Subject: [PATCH 117/176] Add logic to auto-restart running interrupted tasks on airflow restarts --- .../airflow_runner_utils/api_client/client.py | 5 ++ .../airflow_runner_utils/system_runner.py | 74 ++++++++++++++----- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py b/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py index d18ef5961..520aff9a8 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py @@ -148,3 +148,8 @@ class AssetOperations(BaseOperations): def get_asset_events(self): return self.client.get("assets/events").json() + + def create_asset_event(self, asset_id): + json_data = {"asset_id": asset_id} + response = self.client.post("assets/events", json=json_data) + return response.json() diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 980a81aec..3de585f8e 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -21,11 +21,11 @@ import asyncio from medperf.containers.runners.airflow_runner_utils.dags.constants import ( FINAL_ASSET, - SUMMARIZER_ID, ) from medperf.containers.parsers.airflow_parser import AirflowParser from medperf import config import sys +from medperf.utils import parse_datetime class AirflowSystemRunner: @@ -55,6 +55,7 @@ def __init__( self.user = user self._password = SecretStr(secrets.token_urlsafe(16)) self.airflow_config_file = os.path.join(self.airflow_home, "airflow.cfg") + self.resuming_from_previous_execution = False self.project_name = project_name self._postgres_password = SecretStr(secrets.token_urlsafe(16)) self._postgres_user = self._postgres_db = "airflow" @@ -109,7 +110,6 @@ def _initial_setup(self): airflow_config.write(f) def init_airflow(self, force_venv_creation: bool = False): - # create_airflow_venv_if_not_exists(force_creation=force_venv_creation) os.makedirs(os.path.join(self.airflow_home, "logs"), exist_ok=True) self._initialize_components() @@ -117,6 +117,8 @@ def init_airflow(self, force_venv_creation: bool = False): asyncio.run(self.db.start()) if not os.path.exists(self.airflow_config_file): self._initial_setup() + else: + self.resuming_from_previous_execution = True # Has old config self._start_airflow_db() self._create_admin_user() @@ -289,6 +291,7 @@ async def _async_wait_for_dag(self): with AirflowAPIClient( username=self.user, password=self._password, api_url=api_url ) as airflow_client: + self._check_resuming_from_previous_execution(airflow_client) try: summarizer = Summarizer( yaml_parser=self.yaml_parser, @@ -316,6 +319,57 @@ async def _async_wait_for_dag(self): "Pipeline Execution finished. Airflow will now be closed and MedPerf will proceed." ) + def _check_resuming_from_previous_execution(self, airflow_client: AirflowAPIClient): + if not self.resuming_from_previous_execution: + # Nothing to do + return + + try: + asset_events = airflow_client.assets.get_asset_events()["asset_events"] + except json.JSONDecodeError: + config.ui.print( + "Could not verify outstanding tasks from previous execution. " + "Please use the Airflow WebUI on next start up to initially resume outstanding tasks." + ) + return + + asset_events = sorted( + asset_events, + key=lambda event: parse_datetime(event["timestamp"]), + reverse=True, + ) + restarted_tasks = [] + seen_asset_uris = set() + for event in asset_events: + if event["uri"] in seen_asset_uris: + continue + seen_asset_uris.add(event["uri"]) + + created_dagruns = event["created_dagruns"] + + try: + last_dagrun = created_dagruns[-1] + except IndexError: + # If no runs started, create fake state to ensure we restart it + last_dagrun = {"state": DagRunState.FAILED} + event["created_dagruns"] = [last_dagrun] + + if last_dagrun["state"] in [DagRunState.SUCCESS, DagRunState.RUNNING]: + continue # Successfully completed or running, nothing do to + + airflow_client.assets.create_asset_event(event["asset_id"]) + restarted_tasks.append(event["name"]) + + if restarted_tasks: + formatted_asset_names = [ + f"- {asset_name}" for asset_name in restarted_tasks + ] + formatted_asset_names_str = "\n".join(formatted_asset_names) + + config.ui.print( + f"Automatically restarting the following uncompleted tasks from last execution:\n{formatted_asset_names_str}" + ) + def _check_completed_asset(self, airflow_client: AirflowAPIClient) -> bool: """Checks if the final asset that marks pipeline completion has been updated""" try: @@ -332,22 +386,6 @@ def _check_completed_asset(self, airflow_client: AirflowAPIClient) -> bool: final_asset = [event for event in asset_events if event["uri"] == FINAL_ASSET] return bool(final_asset) - def _check_ran_summarizer(self, airflow_client: AirflowAPIClient) -> bool: - """Checks if the summarizer has finished running. It is triggered by the final asset.""" - last_summarizer_run = airflow_client.dag_runs.get_most_recent_dag_run( - dag_id=SUMMARIZER_ID - )["dag_runs"] - if not last_summarizer_run: - return False - - last_summarizer_run = last_summarizer_run[0] - run_state = last_summarizer_run["state"] - - if run_state == DagRunState.FAILED: - raise ValueError("Final summarizer run failed!") - - return last_summarizer_run["state"] == DagRunState.SUCCESS - def _stop_airflow(self): logging.debug("Stopping Airflow execution") for component in self._airflow_components: From 97cbe485f17cc70c5b7aa6296fcf3c57f57a4662 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 09:03:42 -0300 Subject: [PATCH 118/176] add option of running data prep without cached results --- cli/medperf/commands/dataset/dataset.py | 19 ++++++++++++--- cli/medperf/commands/dataset/prepare.py | 32 +++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/cli/medperf/commands/dataset/dataset.py b/cli/medperf/commands/dataset/dataset.py index 02bb9898e..7aa5e8576 100644 --- a/cli/medperf/commands/dataset/dataset.py +++ b/cli/medperf/commands/dataset/dataset.py @@ -33,8 +33,12 @@ def list( ), name: str = typer.Option(None, "--name", help="Filter by name"), owner: int = typer.Option(None, "--owner", help="Filter by owner"), - state: str = typer.Option(None, "--state", help="Filter by state (DEVELOPMENT/OPERATION)"), - is_valid: bool = typer.Option(None, "--valid/--invalid", help="Filter by valid status"), + state: str = typer.Option( + None, "--state", help="Filter by state (DEVELOPMENT/OPERATION)" + ), + is_valid: bool = typer.Option( + None, "--valid/--invalid", help="Filter by valid status" + ), ): """List datasets""" EntityList.run( @@ -118,10 +122,19 @@ def prepare( "-y", help="Skip report submission approval step (In this case, it is assumed to be approved)", ), + no_cache: bool = typer.Option( + False, + "-nc", + "--no-cache", + "--no_cache", + help="Start a clean run without previous cached results.", + ), ): """Runs the Data preparation step for a raw dataset""" ui = config.ui - DataPreparation.run(data_uid, approve_sending_reports=approval) + DataPreparation.run( + data_uid, approve_sending_reports=approval, use_cached_results=not no_cache + ) ui.print("✅ Done!") diff --git a/cli/medperf/commands/dataset/prepare.py b/cli/medperf/commands/dataset/prepare.py index 09d3bd9af..67db296ee 100644 --- a/cli/medperf/commands/dataset/prepare.py +++ b/cli/medperf/commands/dataset/prepare.py @@ -4,7 +4,7 @@ from medperf.entities.dataset import Dataset import medperf.config as config from medperf.entities.cube import Cube -from medperf.utils import approval_prompt, dict_pretty_print +from medperf.utils import approval_prompt, dict_pretty_print, remove_path from medperf.exceptions import ( CommunicationError, ExecutionError, @@ -81,8 +81,14 @@ def run( dataset_id: int, approve_sending_reports: bool = False, data_preparation_cube: Cube = None, + use_cached_results: bool = True, ): - preparation = cls(dataset_id, approve_sending_reports, data_preparation_cube) + preparation = cls( + dataset_id, + approve_sending_reports, + data_preparation_cube, + use_cached_results, + ) preparation.get_dataset() preparation.validate() with preparation.ui.interactive(): @@ -111,6 +117,7 @@ def __init__( dataset_id: int, approve_sending_reports: bool, data_preparation_cube: Cube = None, + use_cached_results: bool = True, ): self.comms = config.comms self.ui = config.ui @@ -128,6 +135,7 @@ def __init__( self.report_specified = None self.metadata_specified = None self._lock = Lock() + self.use_cached_results = use_cached_results @property def is_workflow(self): @@ -184,6 +192,9 @@ def run_prepare(self): report_sender = ReportSender(self) report_sender.start() + if not self.use_cached_results: + self._remove_old_results() + prepare_mounts = { "data_path": self.raw_data_path, "labels_path": self.raw_labels_path, @@ -220,6 +231,23 @@ def run_prepare(self): self.ui.print("> Container execution complete") report_sender.stop("finished") + def _remove_old_results(self): + paths_to_remove = [ + self.out_datapath, + self.out_labelspath, + self.out_statistics_path, + self.metadata_path, + self.report_path, + ] + + if self.is_workflow: + airflow_home = os.path.join(self.dataset.path, "airflow_home") + paths_to_remove.append(airflow_home) + + for path_to_remove in paths_to_remove: + if os.path.exists(path_to_remove): + remove_path(path_to_remove) + def run_sanity_check(self): sanity_check_timeout = config.sanity_check_timeout out_datapath = self.out_datapath From 6c0926b69a2c649794c6c21c5ccdc8141591ef5d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 09:08:18 -0300 Subject: [PATCH 119/176] linting --- .../containers/runners/airflow_runner.py | 1 - .../components/db_postgres_singularity.py | 1 - cli/medperf/entities/cube.py | 3 +- server/seed_utils.py | 52 ++++++++++++------- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index d731be8b7..b07f7ccc3 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -11,7 +11,6 @@ from .utils import check_docker_image_hash, get_expected_hash from .singularity_utils import get_docker_image_hash_from_dockerhub from medperf.utils import run_command -from medperf.comms.entity_resources import resources import logging from .docker_utils import get_docker_image_hash from medperf import config diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py index 078148126..835b1486f 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_singularity.py @@ -1,7 +1,6 @@ from .db_postgres_component import PostgresDatabaseComponent import subprocess from medperf import config -from medperf import config from medperf.containers.runners.singularity_utils import ( get_singularity_executable_props, ) diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 4e5b72f04..bff12ac3e 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -52,7 +52,8 @@ def check_data_preparation_mlcube(cls, v: Union[str, dict], info: ValidationInfo image_name = config["image"] except KeyError: raise MedperfException( - f"No 'image' field found in container_config file to apply hash. Sending hashes is not supported with workflows." + "No 'image' field found in container_config file to apply hash. " + "Sending hashes is not supported with workflows." ) formatted_hash = {image_name: v} return formatted_hash diff --git a/server/seed_utils.py b/server/seed_utils.py index ee2cccc46..55b54ecbb 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -118,6 +118,9 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): data_prep_config = load_container_config(assets_path, "data_preparator") data_prep_params = load_parameters_config(assets_path, "data_preparator") + data_prep_hash = ( + "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + ) # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( "/mlcubes/", @@ -127,9 +130,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "name": "chestxray_prep", "container_config": data_prep_config, "parameters_config": data_prep_params, - "image_hash": { - "mlcommons/chestxray-tutorial-prep:0.0.1": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" - }, + "image_hash": {"mlcommons/chestxray-tutorial-prep:0.0.1": data_prep_hash}, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": {}, @@ -159,6 +160,9 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): model_cnn_parameters_config = load_parameters_config( assets_path, "model_custom_cnn" ) + model_hash = ( + "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" + ) # Create a reference model executor mlcube by Benchmark Owner reference_model_executor_mlcube = api_server.request( "/mlcubes/", @@ -173,9 +177,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "chestxray_tutorial/cnn_weights.tar.gz" ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", - "image_hash": { - "mlcommons/chestxray-tutorial-cnn:0.0.1": "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" - }, + "image_hash": {"mlcommons/chestxray-tutorial-cnn:0.0.1": model_hash}, "metadata": {}, }, "id", @@ -201,6 +203,9 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): evaluator_container_config = load_container_config(assets_path, "metrics") evaluator_parameters_config = load_parameters_config(assets_path, "metrics") + evaluator_hash = ( + "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" + ) # Create a Data evalutor MLCube by Benchmark Owner data_evaluator_mlcube = api_server.request( "/mlcubes/", @@ -211,7 +216,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "container_config": evaluator_container_config, "parameters_config": evaluator_parameters_config, "image_hash": { - "mlcommons/chestxray-tutorial-metrics:0.0.1": "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" + "mlcommons/chestxray-tutorial-metrics:0.0.1": evaluator_hash }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -278,6 +283,9 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): data_prep_config = load_workflow_config(assets_path, "data_preparator_workflow") data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") + data_prep_hash = ( + "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + ) # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( "/mlcubes/", @@ -287,9 +295,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "name": "chestxray_prep", "container_config": data_prep_config, "parameters_config": data_prep_params, - "image_hash": { - "mlcommons/chestxray-tutorial-prep:0.0.1": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" - }, + "image_hash": {"mlcommons/chestxray-tutorial-prep:0.0.1": data_prep_hash}, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": {}, @@ -319,6 +325,9 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): model_cnn_parameters_config = load_parameters_config( assets_path, "model_custom_cnn" ) + model_cnn_hash = ( + "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" + ) # Create a reference model executor mlcube by Benchmark Owner reference_model_executor_mlcube = api_server.request( "/mlcubes/", @@ -333,9 +342,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "chestxray_tutorial/cnn_weights.tar.gz" ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", - "image_hash": { - "mlcommons/chestxray-tutorial-cnn:0.0.1": "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" - }, + "image_hash": {"mlcommons/chestxray-tutorial-cnn:0.0.1": model_cnn_hash}, "metadata": {}, }, "id", @@ -361,6 +368,9 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): evaluator_container_config = load_container_config(assets_path, "metrics") evaluator_parameters_config = load_parameters_config(assets_path, "metrics") + evaluator_hash = ( + "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" + ) # Create a Data evalutor MLCube by Benchmark Owner data_evaluator_mlcube = api_server.request( "/mlcubes/", @@ -371,7 +381,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "container_config": evaluator_container_config, "parameters_config": evaluator_parameters_config, "image_hash": { - "mlcommons/chestxray-tutorial-metrics:0.0.1": "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" + "mlcommons/chestxray-tutorial-metrics:0.0.1": evaluator_hash }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -441,7 +451,9 @@ def create_model( mobilenet_parameters_config = load_parameters_config( assets_path, "model_mobilenetv2" ) - + mobilenet_hash = ( + "sha256:f27deb052eafd48ad1e350ceef7b0b9600aef0ea3f8cba47baee2b1d17411a83" + ) # Create a model mlcube by Model Owner model_executor1_mlcube = api_server.request( "/mlcubes/", @@ -457,7 +469,7 @@ def create_model( ), "additional_files_tarball_hash": "771f67bba92a11c83d16a522f0ba1018020ff758e2277d33f49056680c788892", "image_hash": { - "mlcommons/chestxray-tutorial-mobilenetv2:0.0.1": "sha256:f27deb052eafd48ad1e350ceef7b0b9600aef0ea3f8cba47baee2b1d17411a83" + "mlcommons/chestxray-tutorial-mobilenetv2:0.0.1": mobilenet_hash }, "metadata": {}, }, @@ -534,6 +546,10 @@ def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): assets_path, "data_preparator_workflow", dev=True ) data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") + data_prep_hash = ( + "sha256:26cf311c51d8423591e710019b1490bc091152d32b26636e4eafa34e42308929" + ) + additional_files_url = "https://storage.googleapis.com/medperf-storage/rano_test_assets/dev_models_and_more.tar.gz" # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( "/mlcubes/", @@ -544,9 +560,9 @@ def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): "container_config": data_prep_config, "parameters_config": data_prep_params, "image_hash": { - "mlcommons/rano-data-prep-workflow-dev:0.0.1": "sha256:26cf311c51d8423591e710019b1490bc091152d32b26636e4eafa34e42308929" + "mlcommons/rano-data-prep-workflow-dev:0.0.1": data_prep_hash }, - "additional_files_tarball_url": "https://storage.googleapis.com/medperf-storage/rano_test_assets/dev_models_and_more.tar.gz", + "additional_files_tarball_url": additional_files_url, "additional_files_tarball_hash": "808632d9b9fa1da00faa923a752ab47eb0bc19daff037e9c2447b994dd415084", "metadata": {}, }, From 2ff6798ba8abf144bc680fc92322c89de377cd2f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 09:16:15 -0300 Subject: [PATCH 120/176] Fix migration --- .../migrations/0006_convert_image_hash_to_json.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/mlcube/migrations/0006_convert_image_hash_to_json.py b/server/mlcube/migrations/0006_convert_image_hash_to_json.py index d99ca0d13..d0ffc5e6d 100644 --- a/server/mlcube/migrations/0006_convert_image_hash_to_json.py +++ b/server/mlcube/migrations/0006_convert_image_hash_to_json.py @@ -28,6 +28,12 @@ class Migration(migrations.Migration): ] operations = [ + migrations.AddField( + model_name="mlcube", + name="image_hash_tmp", + field=models.JSONField(default=dict), + preserve_default=False, + ), migrations.RunPython( code=convert_image_hash_from_string_to_json, reverse_code=convert_image_hash_from_json_to_str, @@ -36,12 +42,6 @@ class Migration(migrations.Migration): name="mlcube", unique_together=set(), ), - migrations.AddField( - model_name="mlcube", - name="image_hash_tmp", - field=models.JSONField(default=dict), - preserve_default=False, - ), migrations.AlterUniqueTogether( name="mlcube", unique_together={ From 3a4cba7a306af7182bf85baaf0566fad09254b83 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 09:41:39 -0300 Subject: [PATCH 121/176] Remove unusued airflow_requirements variable --- cli/medperf/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/config.py b/cli/medperf/config.py index f259afd83..b60d03e65 100644 --- a/cli/medperf/config.py +++ b/cli/medperf/config.py @@ -228,7 +228,6 @@ executed_flag = ".executed" results_filename = "results.yaml" local_metrics_outputs = "local_outputs" -airflow_requirements_file = "airflow_requirements.txt" # MLCube assets conventions cube_filename = "container_config.yaml" From 522a8bf9cc039f26c3577c80b97a7e79cf115433 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 10:49:21 -0300 Subject: [PATCH 122/176] Remove async_timeout import. No longer needed in Python 3.11 --- .../runners/airflow_runner_utils/components/component.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py index ea3678d37..190415641 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py @@ -3,7 +3,6 @@ from abc import ABC, abstractmethod from typing import List, Dict import asyncio -import async_timeout import logging @@ -61,7 +60,7 @@ async def start_logic(self): async def wait_for_start(self): try: - async with async_timeout.timeout(self.TIMEOUT): + async with asyncio.Timeout(self.TIMEOUT): await self._sync_wait_for_start() except asyncio.TimeoutError: raise TimeoutError(self.fail_message) From 3fae9070807b2cbef7f736fbe89e773f316321b4 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:02:55 -0300 Subject: [PATCH 123/176] Update tests with separate venv for the Medperf server --- .github/workflows/auth-ci.yml | 20 ++++++++++--- .github/workflows/docker-ci.yml | 13 +++++++-- .github/workflows/encrypted-containers-ci.yml | 20 ++++++++++--- .github/workflows/local-ci.yml | 20 ++++++++++--- .github/workflows/train-ci.yml | 20 ++++++++++--- .github/workflows/unittests.yml | 29 +++++++++++++++---- .github/workflows/webui-ci.yml | 20 ++++++++++--- 7 files changed, 114 insertions(+), 28 deletions(-) diff --git a/.github/workflows/auth-ci.yml b/.github/workflows/auth-ci.yml index 61023148c..b6c9ee95a 100644 --- a/.github/workflows/auth-ci.yml +++ b/.github/workflows/auth-ci.yml @@ -26,12 +26,18 @@ jobs: with: python-version: '3.11' - - name: Install dependencies + - name: Install dependencies - Client working-directory: . run: | python -m pip install --upgrade pip pip install -e cli/ pip install -r cli/test-requirements.txt + + - name: Install Dependencies - Server + working-directory: . + run: | + python -m venv .venv_server + source .venv_server/bin/activate pip install -r server/requirements.txt pip install -r server/test-requirements.txt @@ -41,15 +47,21 @@ jobs: - name: Run postgresql server in background working-directory: ./server - run: sh run_dev_postgresql.sh && sleep 6 + run: | + python -m venv .venv_server + sh run_dev_postgresql.sh && sleep 6 - name: Run django server in background with generated certs working-directory: ./server - run: sh setup-dev-server.sh & sleep 6 + run: | + python -m venv .venv_server + sh setup-dev-server.sh & sleep 6 - name: Run server integration tests working-directory: ./server - run: python seed.py --cert cert.crt --auth online + run: | + python -m venv .venv_server + python seed.py --cert cert.crt --auth online - name: Run client integration tests working-directory: . diff --git a/.github/workflows/docker-ci.yml b/.github/workflows/docker-ci.yml index d90419f62..21811963e 100644 --- a/.github/workflows/docker-ci.yml +++ b/.github/workflows/docker-ci.yml @@ -34,22 +34,31 @@ jobs: make sudo make install - - name: Install dependencies + - name: Install dependencies - Client working-directory: . run: | python -m pip install --upgrade pip pip install -e cli/ pip install -r cli/test-requirements.txt + + - name: Install Dependencies - Server + working-directory: . + run: | + python -m venv .venv_server + source .venv_server/bin/activate pip install -r server/requirements.txt pip install -r server/test-requirements.txt + - name: Set server environment vars working-directory: ./server run: cp .env.local.local-auth.sqlite .env - name: Generate SSL certificate working-directory: ./server - run: sh setup-dev-server.sh -c cert.crt -k cert.key -d 0 + run: | + python -m venv .venv_server + sh setup-dev-server.sh -c cert.crt -k cert.key -d 0 - name: Build container image working-directory: ./server diff --git a/.github/workflows/encrypted-containers-ci.yml b/.github/workflows/encrypted-containers-ci.yml index a9d32c4ed..504543168 100644 --- a/.github/workflows/encrypted-containers-ci.yml +++ b/.github/workflows/encrypted-containers-ci.yml @@ -34,12 +34,18 @@ jobs: make sudo make install - - name: Install dependencies + - name: Install dependencies - Client working-directory: . run: | python -m pip install --upgrade pip pip install -e cli/ pip install -r cli/test-requirements.txt + + - name: Install Dependencies - Server + working-directory: . + run: | + python -m venv .venv_server + source .venv_server/bin/activate pip install -r server/requirements.txt pip install -r server/test-requirements.txt @@ -49,15 +55,21 @@ jobs: - name: Run postgresql server in background working-directory: ./server - run: sh run_dev_postgresql.sh && sleep 6 + run: | + source .venv_server/bin/activate + sh run_dev_postgresql.sh && sleep 6 - name: Run django server in background with generated certs working-directory: ./server - run: sh setup-dev-server.sh & sleep 6 + run: | + source .venv_server/bin/activate + sh setup-dev-server.sh & sleep 6 - name: Run server integration tests working-directory: ./server - run: python seed.py --cert cert.crt + run: | + source .venv_server/bin/activate + python seed.py --cert cert.crt - name: Run client integration tests working-directory: . diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 6dfa426ea..5bc9c9d81 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -34,12 +34,18 @@ jobs: make sudo make install - - name: Install dependencies + - name: Install dependencies - Client working-directory: . run: | python -m pip install --upgrade pip pip install -e cli/ pip install -r cli/test-requirements.txt + + - name: Install Dependencies - Server + working-directory: . + run: | + python -m venv .venv_server + source .venv_server/bin/activate pip install -r server/requirements.txt pip install -r server/test-requirements.txt @@ -49,15 +55,21 @@ jobs: - name: Run postgresql server in background working-directory: ./server - run: sh run_dev_postgresql.sh && sleep 6 + run: | + source .venv_server/bin/activate + sh run_dev_postgresql.sh && sleep 6 - name: Run django server in background with generated certs working-directory: ./server - run: sh setup-dev-server.sh & sleep 6 + run: | + source .venv_server/bin/activate + sh setup-dev-server.sh & sleep 6 - name: Run server integration tests working-directory: ./server - run: python seed.py --cert cert.crt + run: | + source .venv_server/bin/activate + python seed.py --cert cert.crt - name: Run chestxray demo including private model working-directory: . diff --git a/.github/workflows/train-ci.yml b/.github/workflows/train-ci.yml index 835f0e2f3..5d33588a9 100644 --- a/.github/workflows/train-ci.yml +++ b/.github/workflows/train-ci.yml @@ -15,12 +15,18 @@ jobs: with: python-version: '3.11' - - name: Install dependencies + - name: Install dependencies - Client working-directory: . run: | python -m pip install --upgrade pip pip install -e cli/ pip install -r cli/test-requirements.txt + + - name: Install Dependencies - Server + working-directory: . + run: | + python -m venv .venv_server + source .venv_server/bin/activate pip install -r server/requirements.txt pip install -r server/test-requirements.txt @@ -30,15 +36,21 @@ jobs: - name: Run postgresql server in background working-directory: ./server - run: sh run_dev_postgresql.sh && sleep 6 + run: | + source .venv_server/bin/activate + sh run_dev_postgresql.sh && sleep 6 - name: Run django server in background with generated certs working-directory: ./server - run: sh setup-dev-server.sh & sleep 6 + run: | + source .venv_server/bin/activate + sh setup-dev-server.sh & sleep 6 - name: Run server integration tests working-directory: ./server - run: python seed.py --cert cert.crt + run: | + source .venv_server/bin/activate + python seed.py --cert cert.crt - name: Run client integration tests working-directory: . diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index 1a215e1df..7cc750391 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -16,14 +16,22 @@ jobs: uses: actions/setup-python@v2 with: python-version: 3.11 - - name: Install dependencies + + - name: Install dependencies - Client + working-directory: . run: | python -m pip install --upgrade pip - pip install flake8 pytest - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - if [ -f cli/requirements.txt ]; then pip install -e cli; fi + pip install -e cli/ + pip install -r cli/test-requirements.txt + + - name: Install Dependencies - Server + working-directory: . + run: | + python -m venv .venv_server + source .venv_server/bin/activate pip install -r server/requirements.txt pip install -r server/test-requirements.txt + - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names @@ -35,19 +43,28 @@ jobs: # Exclude migrations folder as it contains autogenerated code # Ignore E231, as it is raising warnings with auto-generated code. flake8 . --count --max-complexity=10 --max-line-length=127 --ignore F821,W503,E231 --statistics --exclude=examples/,"*/migrations/*",cli/medperf/templates/ + - name: Test with pytest working-directory: ./cli/medperf/tests run: | pytest + - name: Set server environment vars working-directory: ./server run: cp .env.local.local-auth .env + - name: Run postgresql server in background working-directory: ./server run: sh run_dev_postgresql.sh && sleep 6 + - name: Run migrations working-directory: ./server - run: python manage.py migrate + run: | + source .venv_server/bin/activate + python manage.py migrate + - name: Run server unit tests working-directory: ./server - run: python manage.py test --parallel + run: | + source .venv_server/bin/activate + python manage.py test --parallel diff --git a/.github/workflows/webui-ci.yml b/.github/workflows/webui-ci.yml index 4f875360c..ce422db8f 100644 --- a/.github/workflows/webui-ci.yml +++ b/.github/workflows/webui-ci.yml @@ -15,12 +15,18 @@ jobs: with: python-version: '3.11' - - name: Install dependencies + - name: Install dependencies - Client working-directory: . run: | python -m pip install --upgrade pip pip install -e cli/ pip install -r cli/test-requirements.txt + + - name: Install Dependencies - Server + working-directory: . + run: | + python -m venv .venv_server + source .venv_server/bin/activate pip install -r server/requirements.txt pip install -r server/test-requirements.txt @@ -30,15 +36,21 @@ jobs: - name: Run postgresql server in background working-directory: ./server - run: sh run_dev_postgresql.sh && sleep 6 + run: | + source .venv_server/bin/activate + sh run_dev_postgresql.sh && sleep 6 - name: Run django server in background with generated certs working-directory: ./server - run: sh setup-dev-server.sh & sleep 6 + run: | + source .venv_server/bin/activate + sh setup-dev-server.sh & sleep 6 - name: Reset and seed database with tutorial data working-directory: ./server - run: sh reset_db.sh && python seed.py --demo tutorial + run: | + source .venv_server/bin/activate + sh reset_db.sh && python seed.py --demo tutorial - name: Set up tutorial files working-directory: . From 534506d70a897692fb1997220e85f31e53612708 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:09:19 -0300 Subject: [PATCH 124/176] Create server venv in server directory for easily activating when relevant --- .github/workflows/auth-ci.yml | 6 +++--- .github/workflows/docker-ci.yml | 6 +++--- .github/workflows/encrypted-containers-ci.yml | 6 +++--- .github/workflows/local-ci.yml | 6 +++--- .github/workflows/train-ci.yml | 6 +++--- .github/workflows/unittests.yml | 6 +++--- .github/workflows/webui-ci.yml | 6 +++--- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/auth-ci.yml b/.github/workflows/auth-ci.yml index b6c9ee95a..afbd9d1e8 100644 --- a/.github/workflows/auth-ci.yml +++ b/.github/workflows/auth-ci.yml @@ -34,12 +34,12 @@ jobs: pip install -r cli/test-requirements.txt - name: Install Dependencies - Server - working-directory: . + working-directory: ./server run: | python -m venv .venv_server source .venv_server/bin/activate - pip install -r server/requirements.txt - pip install -r server/test-requirements.txt + pip install -r requirements.txt + pip install -r test-requirements.txt - name: Set server environment vars working-directory: ./server diff --git a/.github/workflows/docker-ci.yml b/.github/workflows/docker-ci.yml index 21811963e..841208959 100644 --- a/.github/workflows/docker-ci.yml +++ b/.github/workflows/docker-ci.yml @@ -42,12 +42,12 @@ jobs: pip install -r cli/test-requirements.txt - name: Install Dependencies - Server - working-directory: . + working-directory: ./server run: | python -m venv .venv_server source .venv_server/bin/activate - pip install -r server/requirements.txt - pip install -r server/test-requirements.txt + pip install -r requirements.txt + pip install -r test-requirements.txt - name: Set server environment vars diff --git a/.github/workflows/encrypted-containers-ci.yml b/.github/workflows/encrypted-containers-ci.yml index 504543168..23be0a735 100644 --- a/.github/workflows/encrypted-containers-ci.yml +++ b/.github/workflows/encrypted-containers-ci.yml @@ -42,12 +42,12 @@ jobs: pip install -r cli/test-requirements.txt - name: Install Dependencies - Server - working-directory: . + working-directory: ./server run: | python -m venv .venv_server source .venv_server/bin/activate - pip install -r server/requirements.txt - pip install -r server/test-requirements.txt + pip install -r requirements.txt + pip install -r test-requirements.txt - name: Set server environment vars working-directory: ./server diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 5bc9c9d81..181c80881 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -42,12 +42,12 @@ jobs: pip install -r cli/test-requirements.txt - name: Install Dependencies - Server - working-directory: . + working-directory: ./server run: | python -m venv .venv_server source .venv_server/bin/activate - pip install -r server/requirements.txt - pip install -r server/test-requirements.txt + pip install -r requirements.txt + pip install -r test-requirements.txt - name: Set server environment vars working-directory: ./server diff --git a/.github/workflows/train-ci.yml b/.github/workflows/train-ci.yml index 5d33588a9..e793166e8 100644 --- a/.github/workflows/train-ci.yml +++ b/.github/workflows/train-ci.yml @@ -23,12 +23,12 @@ jobs: pip install -r cli/test-requirements.txt - name: Install Dependencies - Server - working-directory: . + working-directory: ./server run: | python -m venv .venv_server source .venv_server/bin/activate - pip install -r server/requirements.txt - pip install -r server/test-requirements.txt + pip install -r requirements.txt + pip install -r test-requirements.txt - name: Set server environment vars working-directory: ./server diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index 7cc750391..db971d1e9 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -25,12 +25,12 @@ jobs: pip install -r cli/test-requirements.txt - name: Install Dependencies - Server - working-directory: . + working-directory: ./server run: | python -m venv .venv_server source .venv_server/bin/activate - pip install -r server/requirements.txt - pip install -r server/test-requirements.txt + pip install -r requirements.txt + pip install -r test-requirements.txt - name: Lint with flake8 run: | diff --git a/.github/workflows/webui-ci.yml b/.github/workflows/webui-ci.yml index ce422db8f..b963ef138 100644 --- a/.github/workflows/webui-ci.yml +++ b/.github/workflows/webui-ci.yml @@ -23,12 +23,12 @@ jobs: pip install -r cli/test-requirements.txt - name: Install Dependencies - Server - working-directory: . + working-directory: ./server run: | python -m venv .venv_server source .venv_server/bin/activate - pip install -r server/requirements.txt - pip install -r server/test-requirements.txt + pip install -r requirements.txt + pip install -r test-requirements.txt - name: Set server environment vars working-directory: ./server From f289d1b77030a5d49123ab31663d926b36331d20 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:13:52 -0300 Subject: [PATCH 125/176] add back flake8 and pytest installations into this workflow --- .github/workflows/unittests.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index db971d1e9..e7e6e436c 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -21,8 +21,9 @@ jobs: working-directory: . run: | python -m pip install --upgrade pip - pip install -e cli/ - pip install -r cli/test-requirements.txt + pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + if [ -f cli/requirements.txt ]; then pip install -e cli; fi - name: Install Dependencies - Server working-directory: ./server From a5f4ca3b89312d157f31f591ecbeaae999f6897b Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:16:11 -0300 Subject: [PATCH 126/176] Remove CLI argument that is no longer needed --- .github/workflows/docker-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-ci.yml b/.github/workflows/docker-ci.yml index 841208959..af7f6d4ff 100644 --- a/.github/workflows/docker-ci.yml +++ b/.github/workflows/docker-ci.yml @@ -47,7 +47,7 @@ jobs: python -m venv .venv_server source .venv_server/bin/activate pip install -r requirements.txt - pip install -r test-requirements.txt + pip install -r server/test-requirements.txt - name: Set server environment vars @@ -73,7 +73,7 @@ jobs: - name: Run server integration tests working-directory: ./server - run: docker exec medperf_api sh -c "pip install -r test-requirements.txt && python seed.py --server https://127.0.0.1:8080 --cert cert.crt --tokens tokens.json --containers-assets-path chestxray_tutorial" + run: docker exec medperf_api sh -c "pip install -r test-requirements.txt && python seed.py --server https://127.0.0.1:8080 --cert cert.crt --tokens tokens.json" - name: Run chestxray demo working-directory: . From 5b1eacb7c2a5bbcfb9bb5c59d04f4e7773d1b6f3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:28:42 -0300 Subject: [PATCH 127/176] misc test fixes --- .github/workflows/docker-ci.yml | 2 +- .github/workflows/local-ci.yml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-ci.yml b/.github/workflows/docker-ci.yml index af7f6d4ff..703721b1c 100644 --- a/.github/workflows/docker-ci.yml +++ b/.github/workflows/docker-ci.yml @@ -47,7 +47,7 @@ jobs: python -m venv .venv_server source .venv_server/bin/activate pip install -r requirements.txt - pip install -r server/test-requirements.txt + pip install -r test-requirements.txt - name: Set server environment vars diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 181c80881..5b19ddfa6 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -77,7 +77,10 @@ jobs: - name: Refresh DB for Workflow test working-directory: ./server - run: sh reset_db.sh && python seed.py --cert cert.crt -w + run: | + source .venv_server/bin/activate + sh reset_db.sh + python seed.py --cert cert.crt -w - name: Run chestxray demo with workflow (no private model) working-directory: . From 499819eff5732d6d6e6fffa848fad5d6d4592dfb Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:30:54 -0300 Subject: [PATCH 128/176] exclude server venv from flake8 --- .github/workflows/unittests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index e7e6e436c..75f5816d1 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -43,7 +43,7 @@ jobs: # Exclude examples folder as it doesn't contain code related to medperf tools # Exclude migrations folder as it contains autogenerated code # Ignore E231, as it is raising warnings with auto-generated code. - flake8 . --count --max-complexity=10 --max-line-length=127 --ignore F821,W503,E231 --statistics --exclude=examples/,"*/migrations/*",cli/medperf/templates/ + flake8 . --count --max-complexity=10 --max-line-length=127 --ignore F821,W503,E231 --statistics --exclude=examples/,"*/migrations/*",cli/medperf/templates/,server/.venv_server/ - name: Test with pytest working-directory: ./cli/medperf/tests From c31da10a742735bef6f56da6b5609e38621e6da2 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:46:49 -0300 Subject: [PATCH 129/176] Revert "Remove CLI argument that is no longer needed" This reverts commit a5f4ca3b89312d157f31f591ecbeaae999f6897b. --- .github/workflows/docker-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-ci.yml b/.github/workflows/docker-ci.yml index 703721b1c..841208959 100644 --- a/.github/workflows/docker-ci.yml +++ b/.github/workflows/docker-ci.yml @@ -73,7 +73,7 @@ jobs: - name: Run server integration tests working-directory: ./server - run: docker exec medperf_api sh -c "pip install -r test-requirements.txt && python seed.py --server https://127.0.0.1:8080 --cert cert.crt --tokens tokens.json" + run: docker exec medperf_api sh -c "pip install -r test-requirements.txt && python seed.py --server https://127.0.0.1:8080 --cert cert.crt --tokens tokens.json --containers-assets-path chestxray_tutorial" - name: Run chestxray demo working-directory: . From 893f6a7077eb1ce648252fe112a3908117a6a3e2 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:51:45 -0300 Subject: [PATCH 130/176] add back --containers-assets-path option for tests --- server/seed.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/server/seed.py b/server/seed.py index e77e343d2..5a5baaca0 100644 --- a/server/seed.py +++ b/server/seed.py @@ -26,7 +26,7 @@ default_xray_containers_assets_path = str( REPO_BASE_DIR / "examples" / "chestxray_tutorial" ) -default_rano_assets_path = str(REPO_BASE_DIR / "examples" / "RANO") +rano_assets_path = str(REPO_BASE_DIR / "examples" / "RANO") def populate_mock_benchmarks(api_server, admin_token): @@ -86,21 +86,24 @@ def seed(args): create_rano_workflow_mlcube( api_server=api_server, benchmark_owner_token=benchmark_owner_token, - assets_path=default_rano_assets_path, + assets_path=rano_assets_path, ) return + xray_assets_path = ( + args.containers_assets_path or default_xray_containers_assets_path + ) if args.workflow: benchmark = create_workflow_benchmark( api_server, benchmark_owner_token, - default_xray_containers_assets_path, + xray_assets_path, ) else: benchmark = create_benchmark( api_server, benchmark_owner_token, - default_xray_containers_assets_path, + xray_assets_path, ) if args.demo == "model": return @@ -111,7 +114,7 @@ def seed(args): model_owner_token, benchmark_owner_token, benchmark, - default_xray_containers_assets_path, + xray_assets_path, ) @@ -153,6 +156,13 @@ def seed(args): action="store_true", help="Use an Airflow workflow instead of a container for Data Preparation", ) + parser.add_argument( + "-c", + "--containers-assets-path", + type=str, + help="Path to folder containing container asset files for seeding dev database", + default=None, + ) args = parser.parse_args() if args.cert.lower() == "none": args.cert = None From 786857302c259253ad2801e6439fde4db0204a6f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 11:52:01 -0300 Subject: [PATCH 131/176] force reset_db on refresh DB step --- .github/workflows/local-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 5b19ddfa6..110f83d1e 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -79,8 +79,7 @@ jobs: working-directory: ./server run: | source .venv_server/bin/activate - sh reset_db.sh - python seed.py --cert cert.crt -w + sh reset_db.sh && python seed.py --cert cert.crt -w - name: Run chestxray demo with workflow (no private model) working-directory: . From e022d089b028d99f0bb404011ea5af5d91c2a8ed Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 14:21:50 -0300 Subject: [PATCH 132/176] Add serializer to avoid empty image_hash as a JSONField --- server/mlcube/serializers.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/mlcube/serializers.py b/server/mlcube/serializers.py index a34ec64f5..199741215 100644 --- a/server/mlcube/serializers.py +++ b/server/mlcube/serializers.py @@ -16,6 +16,14 @@ def validate_optional_mlcube_components(data): ) +def validate_image_hash(data): + hashes_dict = data.get("image_hash") + if not hashes_dict: + raise serializers.ValidationError( + "Cannot submit Container with empty image_hash!" + ) + + class MlCubeSerializer(serializers.ModelSerializer): class Meta: model = MlCube @@ -24,6 +32,7 @@ class Meta: def validate(self, data): validate_optional_mlcube_components(data) + validate_image_hash(data) return data @@ -58,5 +67,5 @@ def validate(self, data): updated_dict[key] = data.get(key, getattr(self.instance, key)) validate_optional_mlcube_components(updated_dict) - + validate_image_hash(updated_dict) return data From a43c19185bf1878fe990bebfd0c330635d355a3f Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 14:22:00 -0300 Subject: [PATCH 133/176] Update tests --- server/mlcube/tests/test_.py | 4 ++-- server/mlcube/tests/test_pk.py | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/server/mlcube/tests/test_.py b/server/mlcube/tests/test_.py index 25dc02613..f24d54483 100644 --- a/server/mlcube/tests/test_.py +++ b/server/mlcube/tests/test_.py @@ -167,8 +167,8 @@ def test_additional_files_should_have_a_hash(self, url_provided): @parameterized.expand( [ - ("hash", status.HTTP_201_CREATED), - ("", status.HTTP_400_BAD_REQUEST), + ({"image": "hash"}, status.HTTP_201_CREATED), + ({}, status.HTTP_400_BAD_REQUEST), ] ) def test_required_image_hash(self, image_hash, exp_status): diff --git a/server/mlcube/tests/test_pk.py b/server/mlcube/tests/test_pk.py index 2e01555c7..9e2e1b93f 100644 --- a/server/mlcube/tests/test_pk.py +++ b/server/mlcube/tests/test_pk.py @@ -101,9 +101,6 @@ def test_put_modifies_editable_fields_in_development(self): response = self.client.put(url, newtestmlcube, format="json") # Assert - print(f"{response.status_code=}") - print(f"{response.content=}") - print(f"{response.json()=}") self.assertEqual(response.status_code, status.HTTP_200_OK) for k, v in response.data.items(): if k in newtestmlcube: @@ -166,7 +163,6 @@ def test_put_does_not_modify_readonly_fields_in_both_states(self, state): # Act response = self.client.put(url, newtestmlcube, format="json") - # Assert self.assertEqual(response.status_code, status.HTTP_200_OK) for k, v in newtestmlcube.items(): @@ -258,7 +254,7 @@ def test_put_clearing_image_hash(self): testmlcube = self.mock_mlcube(state="DEVELOPMENT") testmlcube = self.create_mlcube(testmlcube).data - put_body = {"image_hash": ""} + put_body = {"image_hash": {}} url = self.url.format(testmlcube["id"]) # Act From 91611162790f61a224320f0b6be9cc6717342afa Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 14:22:19 -0300 Subject: [PATCH 134/176] Separate reseting and reseeding DB so hopefully it works --- .github/workflows/local-ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index 110f83d1e..a2a00aa5d 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -75,11 +75,17 @@ jobs: working-directory: . run: sh cli/cli_chestxray_tutorial_test.sh -f -p - - name: Refresh DB for Workflow test + - name: Reset DB for Workflow test working-directory: ./server run: | source .venv_server/bin/activate - sh reset_db.sh && python seed.py --cert cert.crt -w + sh reset_db.sh + + - name: Seed DB for Workflow test + working-directory: ./server + run: | + source .venv_server/bin/activate + python seed.py --cert cert.crt -w - name: Run chestxray demo with workflow (no private model) working-directory: . From 59bdfa69e8c495c4446de2fc29276dceed8262a0 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 16:05:10 -0300 Subject: [PATCH 135/176] reset postgressql db on tests too --- .github/workflows/local-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml index a2a00aa5d..9213b3179 100644 --- a/.github/workflows/local-ci.yml +++ b/.github/workflows/local-ci.yml @@ -80,6 +80,7 @@ jobs: run: | source .venv_server/bin/activate sh reset_db.sh + sh reset_db_postgresql.sh - name: Seed DB for Workflow test working-directory: ./server From dc16fcaab2136d5b77fb79941a6f07d44349a511 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 18:17:16 -0300 Subject: [PATCH 136/176] Fix usage of asyncio.timeout --- .../runners/airflow_runner_utils/components/component.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py index 190415641..04eeb103f 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py @@ -60,7 +60,7 @@ async def start_logic(self): async def wait_for_start(self): try: - async with asyncio.Timeout(self.TIMEOUT): + async with asyncio.timeout(self.TIMEOUT): await self._sync_wait_for_start() except asyncio.TimeoutError: raise TimeoutError(self.fail_message) From 4b0d66883a45b7e608f8ed0fde3eb3aa044f0e65 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 4 Dec 2025 18:17:39 -0300 Subject: [PATCH 137/176] change default postgresql port to avoid conflicts --- .../airflow_runner_utils/components/db_postgres_docker.py | 2 +- .../runners/airflow_runner_utils/system_runner.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py index 320c5094c..995c0b1e7 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py @@ -22,7 +22,7 @@ async def start_logic(self): "-v", f"{self.data_dir}:/var/lib/postgresql/data:rw", "-p", - f"{self.port}:{self.port}", + f"{self.port}:5432", f"{config.airflow_postgres_image}", ], capture_output=True, diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 3de585f8e..79ff89fdb 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -39,7 +39,9 @@ def __init__( project_name: str, yaml_parser: AirflowParser, port: Union[str, int] = 8080, - postgres_port: Union[str, int] = 5432, + postgres_port: Union[ + str, int + ] = 5423, # Change default postgres port to avoid conflicts airflow_python_executable: os.PathLike = None, **extra_airflow_configs: dict, ): @@ -142,12 +144,14 @@ def _initialize_components(self): "dags_folder": self.dags_folder, } + config.ui.print(f"{self.postgres_port=}") if config.platform == "singularity": self.db = PostgresDBSingularity( project_name=self.project_name, root_dir=self.airflow_home, postgres_user="airflow", postgres_db="airflow", + postgres_port=self.postgres_port, hostname=self.host, ) else: # Default to docker @@ -156,6 +160,7 @@ def _initialize_components(self): root_dir=self.airflow_home, postgres_user="airflow", postgres_db="airflow", + postgres_port=self.postgres_port, hostname=self.host, ) self.api_server = AirflowApiServer(**common_args, port=self.port) From a56d910807bd0da93576b193c50984a2938be4e2 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 5 Dec 2025 10:47:28 -0300 Subject: [PATCH 138/176] Remove logging statement --- .../containers/runners/airflow_runner_utils/system_runner.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 79ff89fdb..dd5b41177 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -144,7 +144,6 @@ def _initialize_components(self): "dags_folder": self.dags_folder, } - config.ui.print(f"{self.postgres_port=}") if config.platform == "singularity": self.db = PostgresDBSingularity( project_name=self.project_name, From cc212fba443cfbf8fc320ad4de34268d06647aa7 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 5 Dec 2025 10:47:49 -0300 Subject: [PATCH 139/176] Add debug logging statements if PostgresDB for airflow does not start --- .../airflow_runner_utils/components/db_postgres_docker.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py index 995c0b1e7..4216c5afc 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py @@ -1,6 +1,7 @@ from .db_postgres_component import PostgresDatabaseComponent import subprocess from medperf import config +import logging class PostgresDBDocker(PostgresDatabaseComponent): @@ -47,6 +48,13 @@ def has_successfully_started(self): capture_output=True, text=True, ) + has_started = postgres_status.returncode == 0 + + if not has_started: + logging.debug("Postgres DB not started yet") + logging.debug(f"stdout=\n{postgres_status.stdout}") + logging.debug(f"stderr=\n{postgres_status.stderr}") + return postgres_status.returncode == 0 def terminate(self): From 57816503571bc71090cfd8cbace49664390ab9ed Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 5 Dec 2025 10:48:36 -0300 Subject: [PATCH 140/176] Loosen requirements for starting Airflow compoments --- .../runners/airflow_runner_utils/components/component.py | 4 ++-- .../airflow_runner_utils/components/db_postgres_component.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py index 04eeb103f..8a5977b31 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py @@ -10,8 +10,8 @@ class ComponentRunner(ABC): START_PERIOD = 5 INTERVAL = 10 - TIMEOUT = 60 - MAX_TRIES = 5 + TIMEOUT = 120 + MAX_TRIES = 120 def __init__(self): self.process = None diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py index f2251b81b..bd09e7993 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py @@ -13,8 +13,8 @@ class PostgresDatabaseComponent(ComponentRunner): START_PERIOD = 2 INTERVAL = 5 - MAX_TRIES = 5 - TIMEOUT = 30 + MAX_TRIES = 12 + TIMEOUT = 60 def __init__( self, From 36321e285e6a1f65e07b85047544b845b7c539c2 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 5 Dec 2025 11:02:21 -0300 Subject: [PATCH 141/176] Revert "Loosen requirements for starting Airflow compoments" This reverts commit 57816503571bc71090cfd8cbace49664390ab9ed. --- .../runners/airflow_runner_utils/components/component.py | 4 ++-- .../airflow_runner_utils/components/db_postgres_component.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py index 8a5977b31..04eeb103f 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/component.py @@ -10,8 +10,8 @@ class ComponentRunner(ABC): START_PERIOD = 5 INTERVAL = 10 - TIMEOUT = 120 - MAX_TRIES = 120 + TIMEOUT = 60 + MAX_TRIES = 5 def __init__(self): self.process = None diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py index bd09e7993..f2251b81b 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_component.py @@ -13,8 +13,8 @@ class PostgresDatabaseComponent(ComponentRunner): START_PERIOD = 2 INTERVAL = 5 - MAX_TRIES = 12 - TIMEOUT = 60 + MAX_TRIES = 5 + TIMEOUT = 30 def __init__( self, From ad51dbfeea01e83ae951d978a3e448857126d02a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 5 Dec 2025 11:07:02 -0300 Subject: [PATCH 142/176] change debugging statements to print so they show up on GHA --- .../airflow_runner_utils/components/db_postgres_docker.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py index 4216c5afc..907e6d09e 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py @@ -51,9 +51,9 @@ def has_successfully_started(self): has_started = postgres_status.returncode == 0 if not has_started: - logging.debug("Postgres DB not started yet") - logging.debug(f"stdout=\n{postgres_status.stdout}") - logging.debug(f"stderr=\n{postgres_status.stderr}") + config.ui.print("Postgres DB not started yet") + config.ui.print(f"stdout=\n{postgres_status.stdout}") + config.ui.print(f"stderr=\n{postgres_status.stderr}") return postgres_status.returncode == 0 From 7ff27580d6b09e2c62dcf0b303d439a4f8df80ee Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 5 Dec 2025 11:36:14 -0300 Subject: [PATCH 143/176] Remove unnecessary -it flag --- .../airflow_runner_utils/components/db_postgres_docker.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py index 907e6d09e..7bffa6032 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py @@ -37,7 +37,6 @@ def has_successfully_started(self): [ "docker", "exec", - "-it", self.container_id, "pg_isready", "-U", From d6ffcfbb37eee7429a32158afc499936438ce55c Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Fri, 5 Dec 2025 11:39:08 -0300 Subject: [PATCH 144/176] Revert "change debugging statements to print so they show up on GHA" This reverts commit ad51dbfeea01e83ae951d978a3e448857126d02a. --- .../airflow_runner_utils/components/db_postgres_docker.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py index 7bffa6032..44e9cb917 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/db_postgres_docker.py @@ -50,9 +50,9 @@ def has_successfully_started(self): has_started = postgres_status.returncode == 0 if not has_started: - config.ui.print("Postgres DB not started yet") - config.ui.print(f"stdout=\n{postgres_status.stdout}") - config.ui.print(f"stderr=\n{postgres_status.stderr}") + logging.debug("Postgres DB not started yet") + logging.debug(f"stdout=\n{postgres_status.stdout}") + logging.debug(f"stderr=\n{postgres_status.stderr}") return postgres_status.returncode == 0 From 770d77f92ba7a8f13fe4e4510624c8ea1a91d56d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 8 Dec 2025 15:27:31 -0300 Subject: [PATCH 145/176] Rename instances of "per_subject" to "partitions" for more general use cases --- .../containers/parsers/airflow_parser.py | 2 +- .../container_operator_builder.py | 3 ++- .../dags/yaml_parser/yaml_parser.py | 12 +++++------ .../yaml_partial_parser.py | 2 +- .../pipeline/project/direct_stages.py | 14 ++++++------- .../data_preparator_workflow/workflow.yaml | 20 +++++++++---------- .../workflow_dev.yaml | 20 +++++++++---------- .../additional_files/subject_definition.py | 2 +- server/seed_utils.py | 4 ++-- 9 files changed, 40 insertions(+), 39 deletions(-) diff --git a/cli/medperf/containers/parsers/airflow_parser.py b/cli/medperf/containers/parsers/airflow_parser.py index e7526ffd3..b626c91c4 100644 --- a/cli/medperf/containers/parsers/airflow_parser.py +++ b/cli/medperf/containers/parsers/airflow_parser.py @@ -137,7 +137,7 @@ def _check_last_step(step: Dict[str, str], error_msg_list: list[str]) -> bool: if is_marked_as_last or inferred_as_last: is_last_step_candidate = True - if step.get("per_subject", False): + if step.get("partition", False): error_msg = f"Step {step['id']} appears to be the final step, but is also part of a partition.\n" error_msg += ( "Please make sure the final step is not part of any partitions. " diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index 897b8bb00..86389c8de 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -80,5 +80,6 @@ def _build_mount_item(self, mount_info: MountInfo): def _get_command(self): command = [*self.base_command] if self.partition: - command = [*command, "--subject-subdir", self.partition] + command = [*command, "--partition", self.partition] + return command diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py index 5621e0c4c..9886942be 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py @@ -45,7 +45,7 @@ def __init__(self, yaml_file: str = None): yaml_content = self.read_yaml_definition() self.raw_steps = yaml_content["steps"] self._raw_conditions = yaml_content.get("conditions", []) - self._raw_subject_definitions = yaml_content.get("per_subject_def", {}) + self._raw_subject_definitions = yaml_content.get("partition_def", {}) self.dag_builders = None def read_yaml_definition( @@ -68,11 +68,11 @@ def read_subject_partitions(self): if not self._raw_subject_definitions: return [] - per_subjection_function_name = self._raw_subject_definitions["function_name"] - per_subject_function_obj = import_external_python_function( - per_subjection_function_name + partition_function_name = self._raw_subject_definitions["function_name"] + partition_function_obj = import_external_python_function( + partition_function_name ) - subject_partition_list = per_subject_function_obj(PipelineState()) + subject_partition_list = partition_function_obj(PipelineState()) return subject_partition_list def _get_next_id_from_expanded_step(self, raw_step): @@ -198,7 +198,7 @@ def _expanded_steps_first_pass( for step in raw_steps: original_id = step["id"] step["conditions_definitions"] = self._raw_conditions - if step.get("per_subject"): + if step.get("partition"): for subject_partition in subject_partitions: partitioned_step = {k: v for k, v in step.items()} partitioned_id = create_legal_dag_id( diff --git a/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py index 53984e147..312697d5b 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py @@ -53,7 +53,7 @@ def _parse_yaml_file(self): is_marked_as_last = step.get("last", False) inferred_as_last = step.get("next") is None if is_marked_as_last or inferred_as_last: - if step.get("per_subject", False): + if step.get("partition", False): msg = f"Step {step['id']} appears to be the final step, but is also part of a partition.\n" msg += "Please make sure the final step is not part of any partitions. " msg += "You may need to add a final dummy step to join all results." diff --git a/examples/RANO/data_preparator_workflow/pipeline/project/direct_stages.py b/examples/RANO/data_preparator_workflow/pipeline/project/direct_stages.py index 3c80c6994..f424c4c99 100644 --- a/examples/RANO/data_preparator_workflow/pipeline/project/direct_stages.py +++ b/examples/RANO/data_preparator_workflow/pipeline/project/direct_stages.py @@ -53,7 +53,7 @@ def initial_setup(): @app.command("make_csv") def prepare( - subject_subdir: str = typer.Option(..., "--subject-subdir"), + subject_subdir: str = typer.Option(..., "--partition"), ): from stages.get_csv import ( AddToCSV, @@ -76,7 +76,7 @@ def prepare( @app.command("convert_nifti") def convert_nifti( - subject_subdir: str = typer.Option(..., "--subject-subdir"), + subject_subdir: str = typer.Option(..., "--partition"), ): from stages.nifti_transform import NIfTITransform @@ -100,7 +100,7 @@ def convert_nifti( @app.command("extract_brain") def extract_brain( - subject_subdir: str = typer.Option(..., "--subject-subdir"), + subject_subdir: str = typer.Option(..., "--partition"), ): from stages.extract import Extract @@ -125,7 +125,7 @@ def extract_brain( @app.command("extract_tumor") def extract_tumor( - subject_subdir: str = typer.Option(..., "--subject-subdir"), + subject_subdir: str = typer.Option(..., "--partition"), ): from stages.extract_nnunet import ExtractNnUNet @@ -159,7 +159,7 @@ def extract_tumor( @app.command("prepare_for_manual_review") def prepare_for_manual_review( - subject_subdir: str = typer.Option(..., "--subject-subdir"), + subject_subdir: str = typer.Option(..., "--partition"), ): from stages.manual import ManualStage @@ -180,7 +180,7 @@ def prepare_for_manual_review( @app.command("rollback_to_brain_extract") def rollback( - subject_subdir: str = typer.Option(..., "--subject-subdir"), + subject_subdir: str = typer.Option(..., "--partition"), ): from stages.manual import ManualStage @@ -201,7 +201,7 @@ def rollback( @app.command("segmentation_comparison") def segmentation_comparison( - subject_subdir: str = typer.Option(..., "--subject-subdir"), + subject_subdir: str = typer.Option(..., "--partition"), ): from stages.comparison import SegmentationComparisonStage diff --git a/examples/RANO/data_preparator_workflow/workflow.yaml b/examples/RANO/data_preparator_workflow/workflow.yaml index 198120852..623c5c856 100644 --- a/examples/RANO/data_preparator_workflow/workflow.yaml +++ b/examples/RANO/data_preparator_workflow/workflow.yaml @@ -1,6 +1,6 @@ base_step: &BASE_STEP - type: container - image: mlcommons/rano-data-prep-workflow:0.0.1 + image: mlcommons/rano-data-prep-workflow:0.0.2 steps: @@ -18,7 +18,7 @@ steps: type: directory next: make_csv on_error: do_something - per_subject: false + partition: false - id: make_csv <<: *BASE_STEP @@ -34,7 +34,7 @@ steps: type: directory next: nifti_conversion on_error: do_something - per_subject: true + partition: true - id: nifti_conversion <<: *BASE_STEP @@ -56,7 +56,7 @@ steps: command: convert_nifti next: brain_extraction on_error: do_something - per_subject: true + partition: true - id: brain_extraction <<: *BASE_STEP @@ -75,7 +75,7 @@ steps: command: extract_brain next: tumor_extraction on_error: do_something - per_subject: true + partition: true limit: 2 - id: tumor_extraction @@ -98,7 +98,7 @@ steps: command: extract_tumor next: manual_review on_error: do_something - per_subject: true + partition: true limit: 2 - id: manual_review @@ -128,7 +128,7 @@ steps: else: manual_review wait: 60 on_error: do_something - per_subject: true + partition: true - id: rollback_to_brain_extract <<: *BASE_STEP @@ -155,7 +155,7 @@ steps: type: directory command: rollback_to_brain_extract next: brain_extraction - per_subject: true + partition: true - id: segmentation_comparison <<: *BASE_STEP @@ -182,7 +182,7 @@ steps: type: directory command: segmentation_comparison next: calculate_changed_voxels - per_subject: true + partition: true - id: calculate_changed_voxels <<: *BASE_STEP @@ -331,6 +331,6 @@ conditions: type: function function_name: conditions.brain_mask_changed -per_subject_def: +partition_def: type: function function_name: subject_definition.subject_definition \ No newline at end of file diff --git a/examples/RANO/data_preparator_workflow/workflow_dev.yaml b/examples/RANO/data_preparator_workflow/workflow_dev.yaml index 6cf1ca397..0206a7da1 100644 --- a/examples/RANO/data_preparator_workflow/workflow_dev.yaml +++ b/examples/RANO/data_preparator_workflow/workflow_dev.yaml @@ -1,6 +1,6 @@ base_step: &BASE_STEP - type: container - image: mlcommons/rano-data-prep-workflow-dev:0.0.1 + image: mlcommons/rano-data-prep-workflow-dev:0.0.2 steps: @@ -18,7 +18,7 @@ steps: type: directory next: make_csv on_error: do_something - per_subject: false + partition: false - id: make_csv <<: *BASE_STEP @@ -34,7 +34,7 @@ steps: type: directory next: nifti_conversion on_error: do_something - per_subject: true + partition: true - id: nifti_conversion <<: *BASE_STEP @@ -56,7 +56,7 @@ steps: command: convert_nifti next: brain_extraction on_error: do_something - per_subject: true + partition: true - id: brain_extraction <<: *BASE_STEP @@ -75,7 +75,7 @@ steps: command: extract_brain next: tumor_extraction on_error: do_something - per_subject: true + partition: true limit: 2 - id: tumor_extraction @@ -98,7 +98,7 @@ steps: command: extract_tumor next: manual_review on_error: do_something - per_subject: true + partition: true limit: 2 - id: manual_review @@ -128,7 +128,7 @@ steps: else: manual_review wait: 60 on_error: do_something - per_subject: true + partition: true - id: rollback_to_brain_extract <<: *BASE_STEP @@ -155,7 +155,7 @@ steps: type: directory command: rollback_to_brain_extract next: brain_extraction - per_subject: true + partition: true - id: segmentation_comparison <<: *BASE_STEP @@ -182,7 +182,7 @@ steps: type: directory command: segmentation_comparison next: calculate_changed_voxels - per_subject: true + partition: true - id: calculate_changed_voxels <<: *BASE_STEP @@ -331,6 +331,6 @@ conditions: type: function function_name: conditions.brain_mask_changed -per_subject_def: +partition_def: type: function function_name: subject_definition.subject_definition \ No newline at end of file diff --git a/examples/RANO/data_preparator_workflow/workspace/additional_files/subject_definition.py b/examples/RANO/data_preparator_workflow/workspace/additional_files/subject_definition.py index 6c6681ed4..b5bb38a4b 100644 --- a/examples/RANO/data_preparator_workflow/workspace/additional_files/subject_definition.py +++ b/examples/RANO/data_preparator_workflow/workspace/additional_files/subject_definition.py @@ -3,7 +3,7 @@ def subject_definition(pipeline_state): - input_data_dir = os.getenv("host_data_path") + input_data_dir = pipeline_state.host_input_data_path subject_slash_timepoint_list = [] for subject_id_dir in os.listdir(input_data_dir): diff --git a/server/seed_utils.py b/server/seed_utils.py index 55b54ecbb..d0f659b60 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -547,7 +547,7 @@ def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): ) data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") data_prep_hash = ( - "sha256:26cf311c51d8423591e710019b1490bc091152d32b26636e4eafa34e42308929" + "sha256:bc9c50d360d5ac2369eb2eaae8146c33c7eef3d0b0506bbdf26692262c786f50" ) additional_files_url = "https://storage.googleapis.com/medperf-storage/rano_test_assets/dev_models_and_more.tar.gz" # Create a Data preprocessor MLCube by Benchmark Owner @@ -560,7 +560,7 @@ def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): "container_config": data_prep_config, "parameters_config": data_prep_params, "image_hash": { - "mlcommons/rano-data-prep-workflow-dev:0.0.1": data_prep_hash + "mlcommons/rano-data-prep-workflow-dev:0.0.2": data_prep_hash }, "additional_files_tarball_url": additional_files_url, "additional_files_tarball_hash": "808632d9b9fa1da00faa923a752ab47eb0bc19daff037e9c2447b994dd415084", From 01ab0a053d2c5a73bae74c8eaa7895c40699df5a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 8 Dec 2025 16:17:30 -0300 Subject: [PATCH 146/176] =?UTF-8?q?Remove=20unused=20fil=C3=A7e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitor/yaml_dag_monitor.py | 6 +- .../yaml_partial_parser.py | 92 ------------------- 2 files changed, 2 insertions(+), 96 deletions(-) delete mode 100644 cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py diff --git a/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py b/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py index d3974d667..9ba3a9878 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py @@ -15,9 +15,7 @@ from medperf.containers.runners.airflow_runner_utils.api_client.client import ( AirflowAPIClient, ) -from medperf.containers.runners.airflow_runner_utils.yaml_partial_parser import ( - YamlPartialParser, -) +from medperf.containers.parsers.airflow_parser import AirflowParser from airflow.utils.state import DagRunState @@ -55,7 +53,7 @@ def write_yaml(self): class Summarizer: - def __init__(self, yaml_parser: YamlPartialParser, report_file: os.PathLike): + def __init__(self, yaml_parser: AirflowParser, report_file: os.PathLike): self.step_ids = yaml_parser.step_ids self.report_file = report_file diff --git a/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py deleted file mode 100644 index 312697d5b..000000000 --- a/cli/medperf/containers/runners/airflow_runner_utils/yaml_partial_parser.py +++ /dev/null @@ -1,92 +0,0 @@ -import yaml -import os -from typing import Dict, Union - - -class YamlPartialParser: - """ - Does the initial partial parsing of the DAG YAML directory. - THe directory should contain a single YAML file and optionally python files to support its execution. - This parsing simply finds which steps require pools and the final step in the DAG. - Complete parsing for DAG generation is delegated to the Parser in the DAGs directory. - """ - - YAML_EXTENSIONS = (".yaml", ".yml") - - def __init__(self, yaml_file_dir: os.PathLike): - self.yaml_dir_path = yaml_file_dir - self.yaml_path = None - self.pools = {} - self.step_ids = [] - self._parse_yaml_dir() - - def _parse_yaml_dir(self): - file_candidates = [ - filename - for filename in os.listdir(self.yaml_dir_path) - if filename.endswith(self.YAML_EXTENSIONS) - ] - - if not file_candidates: - raise ValueError( - f"No YAML file was found in the directory {self.yaml_dir_path}" - ) - - elif len(file_candidates) > 1: - raise ValueError( - f"Multiple YAML files found at directory {self.yaml_dir_path}. Please make sure only one file is supplied!" - ) - - self.yaml_path = os.path.join(self.yaml_dir_path, file_candidates[0]) - self._parse_yaml_file() - - def _parse_yaml_file(self): - final_step_candidates = [] - error_msgs = [] - tmp_pools = {} - - with open(self.yaml_path, "r") as f: - yaml_content = yaml.safe_load(f) - - for step in yaml_content["steps"]: - self.step_ids.append(step["id"]) - is_marked_as_last = step.get("last", False) - inferred_as_last = step.get("next") is None - if is_marked_as_last or inferred_as_last: - if step.get("partition", False): - msg = f"Step {step['id']} appears to be the final step, but is also part of a partition.\n" - msg += "Please make sure the final step is not part of any partitions. " - msg += "You may need to add a final dummy step to join all results." - error_msgs.append(msg) - else: - final_step_candidates.append(step["id"]) - - if "limit" in step.keys() and "id" in step.keys(): - tmp_pools.update(self._create_pool_info(step)) - - if not final_step_candidates: - msg = "The provided YAML DAG file has no clear final step!" - error_msgs.append(msg) - - elif len(final_step_candidates) > 1: - msg = "The provided YAML DAG has multiple potential last steps. Please verify the following steps:\n" - msg += "\n".join(final_step_candidates) - error_msgs.append(msg) - - if error_msgs: - full_msg = "\n\n".join(error_msgs) - raise ValueError(full_msg) - - self.pools = tmp_pools or None - - @staticmethod - def _create_pool_info(step: Dict[str, Union[str, int]]): - return { - f'{step["id"]}_pool': { - "slots": step["limit"], - "include_deferred": False, - "description": f"Pool to limit the execution of " - f'tasks with ID {step["id"]} to {step["limit"]} ' - "parallel executions", - } - } From d346ab477f8604450042f5c02aca682114995f4a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 9 Dec 2025 10:51:29 -0300 Subject: [PATCH 147/176] Send None rather than empty string if no decryption key to avoid being mapped to invalid paths --- cli/medperf/web_ui/containers/routes.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cli/medperf/web_ui/containers/routes.py b/cli/medperf/web_ui/containers/routes.py index 5c9431941..85ed53ede 100644 --- a/cli/medperf/web_ui/containers/routes.py +++ b/cli/medperf/web_ui/containers/routes.py @@ -142,6 +142,9 @@ def register_container( "state": "OPERATION", } container_id = None + if not decryption_file: + decryption_file = None # Avoid mapping to current directory from empty string + try: container_id = SubmitCube.run( container_info, @@ -181,6 +184,8 @@ def test_container( ): initialize_state_task(request, task_name="container_compatibility_test") return_response = {"status": "", "error": "", "results": None} + if not decryption_file: + decryption_file = None # Avoid mapping to current directory from empty string try: _, results = CompatibilityTestExecution.run( benchmark=benchmark, From 456efc9146826e9a5d74ee1017918f29f7350b18 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 9 Dec 2025 13:23:17 -0300 Subject: [PATCH 148/176] Move client.py and airflow_monitor.py up one directory --- .../{api_client/client.py => airflow_api_client.py} | 0 .../{monitor/yaml_dag_monitor.py => airflow_monitor.py} | 2 +- .../containers/runners/airflow_runner_utils/system_runner.py | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename cli/medperf/containers/runners/airflow_runner_utils/{api_client/client.py => airflow_api_client.py} (100%) rename cli/medperf/containers/runners/airflow_runner_utils/{monitor/yaml_dag_monitor.py => airflow_monitor.py} (98%) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py similarity index 100% rename from cli/medperf/containers/runners/airflow_runner_utils/api_client/client.py rename to cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py diff --git a/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_monitor.py similarity index 98% rename from cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py rename to cli/medperf/containers/runners/airflow_runner_utils/airflow_monitor.py index 9ba3a9878..c2bdc0011 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/monitor/yaml_dag_monitor.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/airflow_monitor.py @@ -12,7 +12,7 @@ import asyncio from typing import Any, Literal from collections import defaultdict -from medperf.containers.runners.airflow_runner_utils.api_client.client import ( +from medperf.containers.runners.airflow_runner_utils.airflow_api_client import ( AirflowAPIClient, ) from medperf.containers.parsers.airflow_parser import AirflowParser diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index dd5b41177..0487723dc 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -1,7 +1,7 @@ from __future__ import annotations import subprocess import os -from .api_client.client import AirflowAPIClient +from .airflow_api_client import AirflowAPIClient from .components.api_server import AirflowApiServer from .components.airflow_component import AirflowComponentRunner from .components.dag_processor import AirflowDagProcessor @@ -10,7 +10,7 @@ from .components.scheduler import AirflowScheduler from .components.triggerer import AirflowTriggerer from .components.utils import validate_port -from .monitor.yaml_dag_monitor import Summarizer +from .airflow_monitor import Summarizer from airflow.utils.state import DagRunState import configparser from typing import Union, List From 5014daad4066bbee818afd60385a37f3f0c71a62 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 9 Dec 2025 13:34:46 -0300 Subject: [PATCH 149/176] Remove unnecessary user/pass from airflow scheduler --- .../runners/airflow_runner_utils/components/scheduler.py | 8 ++------ .../runners/airflow_runner_utils/system_runner.py | 4 +--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py index 10596f2f6..45d7fe249 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py @@ -6,14 +6,10 @@ class AirflowScheduler(AirflowComponentRunner): - def __init__(self, user: str, password: SecretStr, mounts: dict, *args, **kwargs): + def __init__(self, mounts: dict, *args, **kwargs): super().__init__(*args, **kwargs) - extra_vars = { - "_AIRFLOW_WWW_USER_USERNAME": user, - "_AIRFLOW_WWW_USER_PASSWORD": password.get_secret_value(), - } formatted_mounts = build_mounts_dict(mounts) - self._env_vars.update(**extra_vars, **formatted_mounts) + self._env_vars.update(**formatted_mounts) @property def logfile(self): diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 0487723dc..df413e4f6 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -163,9 +163,7 @@ def _initialize_components(self): hostname=self.host, ) self.api_server = AirflowApiServer(**common_args, port=self.port) - self.scheduler = AirflowScheduler( - **common_args, user=self.user, password=self._password, mounts=self.mounts - ) + self.scheduler = AirflowScheduler(**common_args, mounts=self.mounts) self.dag_processor = AirflowDagProcessor(**common_args, mounts=self.mounts) self.triggerer = AirflowTriggerer(**common_args) From dc106443eb9b15588f8874cbe8a6e9d2306b3699 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 9 Dec 2025 13:34:55 -0300 Subject: [PATCH 150/176] shorten imports for readability --- .../dags/operator_factory.py | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py index 7005282aa..6c4b05d96 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_factory.py @@ -1,19 +1,9 @@ from __future__ import annotations -from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.singularity_operator_builder import ( - SingularityOperatorBuilder, -) -from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.docker_operator_buider import ( - DockerOperatorBuilder, -) -from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.empty_operator_builder import ( - EmptyOperatorBuilder, -) -from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.manual_approval_buider import ( - ManualApprovalBuilder, -) -from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( - OperatorBuilder, -) +from .operator_builders.singularity_operator_builder import SingularityOperatorBuilder +from .operator_builders.docker_operator_buider import DockerOperatorBuilder +from .operator_builders.empty_operator_builder import EmptyOperatorBuilder +from .operator_builders.manual_approval_buider import ManualApprovalBuilder +from .operator_builders.operator_builder import OperatorBuilder import os container_builder = ( From b9e9a91e039f6e9248d2d75ea62f841b8aa6e238 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 9 Dec 2025 13:42:08 -0300 Subject: [PATCH 151/176] Add auto-approval script to automatically do manual review for testing --- examples/RANO/data_preparator_workflow/README.md | 10 +++++++++- examples/RANO/data_preparator_workflow/auto_approve.sh | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 examples/RANO/data_preparator_workflow/auto_approve.sh diff --git a/examples/RANO/data_preparator_workflow/README.md b/examples/RANO/data_preparator_workflow/README.md index cce79667c..7340b11e9 100644 --- a/examples/RANO/data_preparator_workflow/README.md +++ b/examples/RANO/data_preparator_workflow/README.md @@ -191,7 +191,7 @@ A view of Airflow Task Instances, which are the unit of execution used by Airflo ![Task Instances view in Airflow](./readme_images/task_instances_view.png) -### 5.1 Manual Approval Steps +### 6.1 Manual Approval Steps The automatic Tumor Segmentations must be manually validated before the Pipeline concludes. To help with finding the tasks that are awaiting for Manual Approval, we recomend going into the Task Instance view described previously and filter by `Up for Reschedule` tasks. The pipeline automatically creates the `Conditions Prepare for Manual Review` task to evaluate the `if` fields from the `prepare_for_manual_review` step defined in the YAML file. While awating for approval, these tasks remain in the `Up for Reschedule` state. The Figure below shows a Task Instance list view in this situation, with the Task IDs and State in red: ![DAGs ready for Manual Review](./readme_images/tasks_manual_review.png) @@ -239,6 +239,14 @@ The brain mask can be reviewed and corrected with the software of your choice an ***IMPORTANT!! Do NOT change the filename when moving the file into the finalized directory!*** The pipeline will only detect the corrected Brain Mask if it keeps the exact same filename. +#### 6.1.3 Auto-approval script + +For testing and debugging purposes, a script is available in this directory to automatically approve the generated tumor segmentations of the development dataset. If desired, this script may be run by executing the following command inside the same directory as this README file. + +```shell +sh auto_approve.sh +``` + #### 6.2 Final Confirmation There is also a manual confirmation step towards the end of the pipeline (step ID `final_confirmation`, of type `manual_approval`). When converted into an Airflow task, this step results into a task that always fails and must be manually set as Success by the user. **Before proceeding with this step, *make sure to review and Tumor Segmentations as per [Section 6.1.1](#611-manual-approval-steps---tumor-segmentation) and ensure you approve all of the results, along with necessary corrections to Brain Masks ([Section 6.1.2](#612-brain-mask-correction) if any are necessary.*** diff --git a/examples/RANO/data_preparator_workflow/auto_approve.sh b/examples/RANO/data_preparator_workflow/auto_approve.sh new file mode 100644 index 000000000..85a2bcc7a --- /dev/null +++ b/examples/RANO/data_preparator_workflow/auto_approve.sh @@ -0,0 +1,4 @@ +BASE_DIR=~/.medperf/data/localhost_8000/1/data/manual_review/tumor_extraction +cp $BASE_DIR/AAAC_1/2012.01.02/under_review/AAAC_1_2012.01.02_tumorMask_model_0.nii.gz $BASE_DIR/AAAC_1/2012.01.02/finalized/AAAC_1_2012.01.02_tumorMask_model_0.nii.gz +cp $BASE_DIR/AAAC_1/2008.03.31/under_review/AAAC_1_2008.03.31_tumorMask_model_0.nii.gz $BASE_DIR/AAAC_1/2008.03.31/finalized/AAAC_1_2008.03.31_tumorMask_model_0.nii.gz +cp $BASE_DIR/AAAC_2/2001.01.01/under_review/AAAC_2_2001.01.01_tumorMask_model_0.nii.gz $BASE_DIR/AAAC_2/2001.01.01/finalized/AAAC_2_2001.01.01_tumorMask_model_0.nii.gz \ No newline at end of file From 33af3435931b386115ae5441dfa97e9392c8a758 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 9 Dec 2025 15:26:36 -0300 Subject: [PATCH 152/176] refactoring --- .../runners/airflow_runner_utils/dags/constants.py | 2 -- .../runners/airflow_runner_utils/dags/dag_from_yaml.py | 2 +- .../branch_from_sensor_operator_builder.py | 8 ++++++-- .../dags/operator_builders/python_sensor_builder.py | 8 +++++--- .../dags/{yaml_parser => }/yaml_parser.py | 7 +++---- 5 files changed, 15 insertions(+), 12 deletions(-) rename cli/medperf/containers/runners/airflow_runner_utils/dags/{yaml_parser => }/yaml_parser.py (99%) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py index 6fae0ad73..e21d55cdc 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/constants.py @@ -1,8 +1,6 @@ from datetime import datetime, timedelta import os -SUMMARIZER_ID = "pipeline_summarizer" -SUMMARIZER_TAG = "Pipeline Summarizer" ALWAYS_CONDITION = "ALWAYS" YESTERDAY = datetime.today() - timedelta(days=1) FINAL_ASSET = "medperf_airflow_completed_asset" diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py index c6300593a..52f73d859 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/dag_from_yaml.py @@ -1,5 +1,5 @@ from __future__ import annotations -from yaml_parser.yaml_parser import YamlParser +from yaml_parser import YamlParser # We need to import DAG so that airflow recognizes the auto-generated DAGs from airflow.sdk import DAG # noqa: F401 diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py index c17b1d072..7ab6cac34 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py @@ -5,6 +5,11 @@ class BranchFromSensorOperatorBuilder(OperatorBuilder): + """ + BranchOperators are used together with Sensors to to automatically create branching behavior. + Once any condition in the sensor is met, it pushes the ID of the corresponding task as an Airflow XCom. + This BranchOperator then reads this XCom and branches accordingly. + """ def __init__( self, @@ -25,8 +30,7 @@ def _define_base_operator(self): def branching(task_instance: TaskInstance): """Read next task from the Sensor XCom (which detected any of the branching conditions) and branch into that""" - print(f"{self.next_ids=}") xcom_data = task_instance.xcom_pull(task_ids=self.sensor_task_id) - return [xcom_data] + return [xcom_data] # This corresponds to the ID of the next task return branching() diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py index 717c0f619..8120d26d7 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py @@ -32,9 +32,6 @@ def __init__( def evaluate_external_condition(condition: Condition, pipeline_state: PipelineState): - # TODO implement properly! Should call the external python files and define a - # pipeline object from airflow_kwargs that is sent to the Python callable. - # For this first proof of concept, hardcode functions just to validate functionality. if condition.condition_id == ALWAYS_CONDITION: return True @@ -52,6 +49,11 @@ def evaluate_external_condition(condition: Condition, pipeline_state: PipelineSt class PythonSensorBuilder(OperatorBuilder): + """ + Sensors are used together with BranchOperators to automatically create branching behavior. + Once any condition in the sensor is met, the ID of the corresponding task to that condition is pushed + as an Airflow XCom. The BranchOperator then reads this XCom and branches accordingly. + """ def __init__( self, diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser.py similarity index 99% rename from cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py rename to cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser.py index 9886942be..251341805 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser/yaml_parser.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/yaml_parser.py @@ -16,6 +16,9 @@ from medperf.exceptions import MedperfException import os import yaml +from medperf.containers.runners.airflow_runner_utils.dags.pipeline_state import ( + PipelineState, +) valid_mount_keys = [item.value for item in ContainerConfigMountKeys] @@ -61,10 +64,6 @@ def read_yaml_definition( return yaml_info def read_subject_partitions(self): - from medperf.containers.runners.airflow_runner_utils.dags.pipeline_state import ( - PipelineState, - ) - if not self._raw_subject_definitions: return [] From 0019709f391739bf9ddee6d8eda99ee64487dc79 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 10 Dec 2025 10:56:00 -0300 Subject: [PATCH 153/176] Refactor download method so that Docker/singularity runner can take in hashes as strings rather than dicts --- .../containers/runners/airflow_runner.py | 8 ++++--- .../containers/runners/docker_runner.py | 20 +++++++--------- cli/medperf/containers/runners/runner.py | 6 ++--- .../containers/runners/singularity_runner.py | 24 ++++++++----------- cli/medperf/entities/cube.py | 18 ++++++++++++-- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index b07f7ccc3..06ed6448d 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -30,17 +30,19 @@ def __init__( def download( self, - hashes_dict: Dict[str, str], + expected_image_hash: Dict[str, str], download_timeout: int = None, get_hash_timeout: int = None, ) -> Dict[str, str]: # TODO add support for Docker Archives, Encrypted Containers, singularity files if config.platform == "docker": self._download_containers_for_docker( - hashes_dict, download_timeout, get_hash_timeout + expected_image_hash, download_timeout, get_hash_timeout ) elif config.platform == "singularity": - self._check_containers_for_singularity(hashes_dict, get_hash_timeout) + self._check_containers_for_singularity( + expected_image_hash, get_hash_timeout + ) def _download_containers_for_docker( self, hashes_dict, download_timeout, get_hash_timeout diff --git a/cli/medperf/containers/runners/docker_runner.py b/cli/medperf/containers/runners/docker_runner.py index 333d4c9ec..99d57366b 100644 --- a/cli/medperf/containers/runners/docker_runner.py +++ b/cli/medperf/containers/runners/docker_runner.py @@ -8,7 +8,6 @@ add_network_config, add_medperf_tmp_folder, check_docker_image_hash, - get_expected_hash, ) from .runner import Runner import logging @@ -21,7 +20,6 @@ ) from medperf.encryption import decrypt_gpg_file, check_gpg from medperf.utils import remove_path, run_command, tmp_path_for_file_decryption -from typing import Dict class DockerRunner(Runner): @@ -33,51 +31,49 @@ def __init__(self, container_config_parser): def download( self, - hashes_dict: Dict[str, str], + expected_image_hash: str, download_timeout: int = None, get_hash_timeout: int = None, ): if self.parser.is_docker_archive(): logging.debug("Downloading Docker archive") return self._download_docker_archive( - hashes_dict, + expected_image_hash, download_timeout, get_hash_timeout, ) else: logging.debug("Downloading Docker image") return self._download_docker_image( - hashes_dict, download_timeout, get_hash_timeout + expected_image_hash, download_timeout, get_hash_timeout ) def _download_docker_image( self, - hashes_dict: Dict[str, str], + expected_image_hash, download_timeout: int = None, get_hash_timeout: int = None, - ) -> Dict[str, str]: + ) -> str: docker_image = self.parser.get_setup_args() - expected_image_hash = get_expected_hash(hashes_dict, docker_image) command = ["docker", "pull", docker_image] logging.debug("Running pull command") run_command(command, timeout=download_timeout) computed_image_hash = get_docker_image_hash(docker_image, get_hash_timeout) check_docker_image_hash(computed_image_hash, expected_image_hash) - return {docker_image: computed_image_hash} + return computed_image_hash def _download_docker_archive( self, - hashes_dict, + expected_image_hash, download_timeout: int = None, get_hash_timeout: int = None, ): file_url = self.parser.get_setup_args() - expected_image_hash = get_expected_hash(hashes_dict, file_url) image_path, computed_image_hash = resources.get_cube_image( file_url, expected_image_hash ) # Hash checking happens in resources self.image_archive_path = image_path - return {file_url: computed_image_hash} + return computed_image_hash def run( self, diff --git a/cli/medperf/containers/runners/runner.py b/cli/medperf/containers/runners/runner.py index f9a4b3137..5d5fb3c8d 100644 --- a/cli/medperf/containers/runners/runner.py +++ b/cli/medperf/containers/runners/runner.py @@ -1,15 +1,15 @@ from abc import ABC, abstractmethod -from typing import Dict +from typing import Union, Dict class Runner(ABC): @abstractmethod def download( self, - hashes_dict: Dict[str, str], + expected_image_hash: Union[str, Dict[str, str]], download_timeout: int = None, get_hash_timeout: int = None, - ) -> Dict[str, str]: + ) -> Union[str, Dict[str, str]]: pass @abstractmethod diff --git a/cli/medperf/containers/runners/singularity_runner.py b/cli/medperf/containers/runners/singularity_runner.py index 1419b60dc..6a36b55ba 100644 --- a/cli/medperf/containers/runners/singularity_runner.py +++ b/cli/medperf/containers/runners/singularity_runner.py @@ -9,7 +9,6 @@ add_network_config, add_medperf_tmp_folder, check_docker_image_hash, - get_expected_hash, ) from .singularity_utils import ( cleanup_singularity_cache, @@ -25,7 +24,6 @@ import semver from .runner import Runner import logging -from typing import Dict class SingularityRunner(Runner): @@ -64,14 +62,14 @@ def _supports_nvccli(self): def download( self, - hashes_dict: Dict[str, str], + expected_image_hash: str, download_timeout: int = None, get_hash_timeout: int = None, - ) -> Dict[str, str]: + ) -> str: if self.parser.is_docker_archive() or self.parser.is_singularity_file(): logging.debug("Downloading image file") return self._download_image_file( - hashes_dict, + expected_image_hash, download_timeout, get_hash_timeout, ) @@ -79,38 +77,36 @@ def download( logging.debug("Docker image: checking without download.") # No download; conversion happens during run return self._check_docker_image( - hashes_dict, + expected_image_hash, get_hash_timeout, ) def _download_image_file( self, - hashes_dict: Dict[str, str], + expected_image_hash: str, download_timeout: int = None, get_hash_timeout: int = None, - ): + ) -> str: image_file_url = self.parser.get_setup_args() - expected_image_hash = get_expected_hash(hashes_dict, image_file_url) image_file_path, computed_image_hash = resources.get_cube_image( image_file_url, expected_image_hash ) # Hash checking happens in resources self.image_file_path = image_file_path self.image_file_hash = computed_image_hash - return {image_file_url: computed_image_hash} + return computed_image_hash def _check_docker_image( self, - hashes_dict: Dict[str, str], + expected_image_hash: str, get_hash_timeout: int = None, - ): + ) -> str: docker_image = self.parser.get_setup_args() - expected_image_hash = get_expected_hash(hashes_dict, docker_image) computed_image_hash = get_docker_image_hash_from_dockerhub( docker_image, get_hash_timeout ) check_docker_image_hash(computed_image_hash, expected_image_hash) self.docker_image_hash = computed_image_hash.replace(":", "_") - return {docker_image: computed_image_hash} + return computed_image_hash def run( self, diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index bff12ac3e..3c45d5090 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -17,6 +17,7 @@ remove_path, get_decryption_key_path, ) +from medperf.containers.runners.utils import get_expected_hash from medperf.entities.encrypted_key import EncryptedKey import logging @@ -182,11 +183,24 @@ def download_run_files(self): raise InvalidEntityError(f"Container {self.name} additional files: {e}") try: - self.image_hash = self.runner.download( - hashes_dict=self.image_hash, + if self.is_workflow: + expected_hash = self.image_hash + else: + image_name = self.container_config.get("image", "default") + expected_hash = get_expected_hash( + hashes_dict=self.image_hash, image_name=image_name + ) + + image_hash = self.runner.download( + expected_image_hash=expected_hash, download_timeout=config.mlcube_configure_timeout, get_hash_timeout=config.mlcube_inspect_timeout, ) + if isinstance(image_hash, str): + image_hash = {self.container_config.get("image", "default"): image_hash} + + self.image_hash.update(**image_hash) + except InvalidEntityError as e: raise InvalidEntityError(f"Container {self.name} image: {e}") From 3af7e5c738ed26ff471ed6353bc4000c10fe58f2 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Wed, 10 Dec 2025 10:56:43 -0300 Subject: [PATCH 154/176] linting --- .../runners/airflow_runner_utils/components/scheduler.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py index 45d7fe249..49c3eaeea 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/scheduler.py @@ -1,7 +1,6 @@ from medperf.containers.runners.airflow_runner_utils.components.airflow_component import ( AirflowComponentRunner, ) -from pydantic import SecretStr from .utils import run_healthcheck, build_mounts_dict From abe808f46f1d9925389a9092e1cd0f0bd05d9ecd Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 10:18:29 -0300 Subject: [PATCH 155/176] Return hashes on AirflowRunner --- cli/medperf/containers/runners/airflow_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 06ed6448d..4c8397406 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -36,11 +36,11 @@ def download( ) -> Dict[str, str]: # TODO add support for Docker Archives, Encrypted Containers, singularity files if config.platform == "docker": - self._download_containers_for_docker( + return self._download_containers_for_docker( expected_image_hash, download_timeout, get_hash_timeout ) elif config.platform == "singularity": - self._check_containers_for_singularity( + return self._check_containers_for_singularity( expected_image_hash, get_hash_timeout ) From 64ebf1daec14ba5373043123e73ee3fb62ba114d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 10:18:54 -0300 Subject: [PATCH 156/176] Use "default" key always for hashes in simple containers --- cli/medperf/entities/cube.py | 5 ++- .../0006_convert_image_hash_to_json.py | 3 +- server/seed_utils.py | 35 +++++++------------ 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index 3c45d5090..b87b76996 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -186,9 +186,8 @@ def download_run_files(self): if self.is_workflow: expected_hash = self.image_hash else: - image_name = self.container_config.get("image", "default") expected_hash = get_expected_hash( - hashes_dict=self.image_hash, image_name=image_name + hashes_dict=self.image_hash, image_name="default" ) image_hash = self.runner.download( @@ -197,7 +196,7 @@ def download_run_files(self): get_hash_timeout=config.mlcube_inspect_timeout, ) if isinstance(image_hash, str): - image_hash = {self.container_config.get("image", "default"): image_hash} + image_hash = {"default": image_hash} self.image_hash.update(**image_hash) diff --git a/server/mlcube/migrations/0006_convert_image_hash_to_json.py b/server/mlcube/migrations/0006_convert_image_hash_to_json.py index d0ffc5e6d..e03fa2e46 100644 --- a/server/mlcube/migrations/0006_convert_image_hash_to_json.py +++ b/server/mlcube/migrations/0006_convert_image_hash_to_json.py @@ -6,8 +6,7 @@ def convert_image_hash_from_string_to_json(apps, schema_editor): MlCube = apps.get_model("mlcube", "MlCube") for mlcube in MlCube.objects.all(): - image_name = mlcube.container_config.get("image", "default") - mlcube.image_hash_tmp = {image_name: mlcube.image_hash} + mlcube.image_hash_tmp = {"default": mlcube.image_hash} mlcube.save() diff --git a/server/seed_utils.py b/server/seed_utils.py index d0f659b60..24f263967 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -130,7 +130,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "name": "chestxray_prep", "container_config": data_prep_config, "parameters_config": data_prep_params, - "image_hash": {"mlcommons/chestxray-tutorial-prep:0.0.1": data_prep_hash}, + "image_hash": {"default": data_prep_hash}, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": {}, @@ -160,9 +160,6 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): model_cnn_parameters_config = load_parameters_config( assets_path, "model_custom_cnn" ) - model_hash = ( - "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" - ) # Create a reference model executor mlcube by Benchmark Owner reference_model_executor_mlcube = api_server.request( "/mlcubes/", @@ -177,7 +174,9 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "chestxray_tutorial/cnn_weights.tar.gz" ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", - "image_hash": {"mlcommons/chestxray-tutorial-cnn:0.0.1": model_hash}, + "image_hash": { + "default": "sha256:a1bdddce05b9d156df359dd570de8031fdd1ea5a858f755139bed4a95fad19d1" + }, "metadata": {}, }, "id", @@ -203,9 +202,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): evaluator_container_config = load_container_config(assets_path, "metrics") evaluator_parameters_config = load_parameters_config(assets_path, "metrics") - evaluator_hash = ( - "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" - ) + # Create a Data evalutor MLCube by Benchmark Owner data_evaluator_mlcube = api_server.request( "/mlcubes/", @@ -216,7 +213,7 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "container_config": evaluator_container_config, "parameters_config": evaluator_parameters_config, "image_hash": { - "mlcommons/chestxray-tutorial-metrics:0.0.1": evaluator_hash + "default": "sha256:d33904c1104d0a3df314f29c603901a8584fec01e58b90d7ae54c8d74d32986c" }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", @@ -295,7 +292,9 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "name": "chestxray_prep", "container_config": data_prep_config, "parameters_config": data_prep_params, - "image_hash": {"mlcommons/chestxray-tutorial-prep:0.0.1": data_prep_hash}, + "image_hash": { + "default": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": {}, @@ -342,7 +341,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "chestxray_tutorial/cnn_weights.tar.gz" ), "additional_files_tarball_hash": "bff003e244759c3d7c8b9784af0819c7f252da8626745671ccf7f46b8f19a0ca", - "image_hash": {"mlcommons/chestxray-tutorial-cnn:0.0.1": model_cnn_hash}, + "image_hash": {"default": model_cnn_hash}, "metadata": {}, }, "id", @@ -380,9 +379,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): "name": "chestxray_metrics", "container_config": evaluator_container_config, "parameters_config": evaluator_parameters_config, - "image_hash": { - "mlcommons/chestxray-tutorial-metrics:0.0.1": evaluator_hash - }, + "image_hash": {"default": evaluator_hash}, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": {}, @@ -451,9 +448,6 @@ def create_model( mobilenet_parameters_config = load_parameters_config( assets_path, "model_mobilenetv2" ) - mobilenet_hash = ( - "sha256:f27deb052eafd48ad1e350ceef7b0b9600aef0ea3f8cba47baee2b1d17411a83" - ) # Create a model mlcube by Model Owner model_executor1_mlcube = api_server.request( "/mlcubes/", @@ -469,7 +463,7 @@ def create_model( ), "additional_files_tarball_hash": "771f67bba92a11c83d16a522f0ba1018020ff758e2277d33f49056680c788892", "image_hash": { - "mlcommons/chestxray-tutorial-mobilenetv2:0.0.1": mobilenet_hash + "default": "sha256:f27deb052eafd48ad1e350ceef7b0b9600aef0ea3f8cba47baee2b1d17411a83" }, "metadata": {}, }, @@ -546,9 +540,6 @@ def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): assets_path, "data_preparator_workflow", dev=True ) data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") - data_prep_hash = ( - "sha256:bc9c50d360d5ac2369eb2eaae8146c33c7eef3d0b0506bbdf26692262c786f50" - ) additional_files_url = "https://storage.googleapis.com/medperf-storage/rano_test_assets/dev_models_and_more.tar.gz" # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( @@ -560,7 +551,7 @@ def create_rano_workflow_mlcube(api_server, benchmark_owner_token, assets_path): "container_config": data_prep_config, "parameters_config": data_prep_params, "image_hash": { - "mlcommons/rano-data-prep-workflow-dev:0.0.2": data_prep_hash + "default": "sha256:bc9c50d360d5ac2369eb2eaae8146c33c7eef3d0b0506bbdf26692262c786f50" }, "additional_files_tarball_url": additional_files_url, "additional_files_tarball_hash": "808632d9b9fa1da00faa923a752ab47eb0bc19daff037e9c2447b994dd415084", From 63a60c5c8e3f78584323ea35c163df19d36dd3c9 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 11:32:05 -0300 Subject: [PATCH 157/176] Refactor private model code paths into separate file for maintainability --- cli/cli_chestxray_tutorial_test.sh | 130 +-------------- ...i_chestxray_tutorial_test_private_model.sh | 153 ++++++++++++++++++ 2 files changed, 156 insertions(+), 127 deletions(-) create mode 100644 cli/cli_chestxray_tutorial_test_private_model.sh diff --git a/cli/cli_chestxray_tutorial_test.sh b/cli/cli_chestxray_tutorial_test.sh index a3a616ead..816c08eaf 100755 --- a/cli/cli_chestxray_tutorial_test.sh +++ b/cli/cli_chestxray_tutorial_test.sh @@ -29,10 +29,6 @@ checkFailed "testdata profile creation failed" print_eval medperf profile create -n noserver checkFailed "noserver profile creation failed" -if ${PRIVATE}; then - print_eval medperf profile create -n testprivate - checkFailed "testprivate profile creation failed" -fi print_eval medperf profile set --server https://example.com checkFailed "setting mock server failed" @@ -51,17 +47,9 @@ checkFailed "testdata profile activation failed" print_eval medperf auth login -e $DATAOWNER checkFailed "testdata login failed" -if ${PRIVATE}; then - print_eval medperf profile activate testprivate - checkFailed "testprivate profile activation failed" - - print_eval medperf auth login -e $PRIVATEMODELOWNER - checkFailed "testprivate login failed" -fi - ########################################################## echo "=====================================" -echo ""Activate benchmarkowner profile"" +echo "Activate benchmarkowner profile" echo "=====================================" # Log in as the benchmark owner print_eval medperf profile activate testbenchmark @@ -72,7 +60,7 @@ echo "\n" ########################################################## echo "=====================================" -echo ""Change association approval policy to auto approve always"" +echo "Change association approval policy to auto approve always" echo "=====================================" # Log in as the benchmark owner print_eval medperf benchmark update_associations_policy -b 1 \ @@ -134,81 +122,6 @@ checkFailed "Data association step failed" echo "\n" -if ${PRIVATE}; then - ########################################################## - echo "=============================================" - echo "Getting a certificate" - echo "=============================================" - print_eval medperf certificate get_client_certificate --overwrite - checkFailed "Failed to obtain Data Owner Certificate" - ########################################################## - - echo "\n" - - ########################################################## - echo "=============================================" - echo "Submitting the certificate" - echo "=============================================" - print_eval medperf certificate submit_client_certificate -y - checkFailed "Failed to submit Data Owner Certificate" - ########################################################## - - echo "\n" - - ########################################################## - echo "=====================================" - echo "Activate Private Model Owner Profile" - echo "=====================================" - print_eval medperf profile activate testprivate - checkFailed "testprivate profile activation failed" - ########################################################## - - echo "\n" - - ########################################################## - echo "=====================================" - echo "Submit a private model" - echo "=====================================" - print_eval medperf container submit --name privmodel \ - -m $CHESTXRAY_ENCRYPTED_MODEL -p $CHESTXRAY_ENCRYPTED_MODEL_PARAMS \ - -a $CHESTXRAY_ENCRYPTED_MODEL_ADD --decryption_key $PRIVATE_MODEL_LOCAL/key.bin --operational - checkFailed "private container submission failed" - PMODEL_UID=$(medperf container ls | grep privmodel | head -n 1 | tr -s ' ' | cut -d ' ' -f 2) - ########################################################## - - echo "\n" - - ########################################################## - echo "=====================================" - echo "Running private model association" - echo "=====================================" - print_eval medperf container associate -m $PMODEL_UID -b 1 -y - checkFailed "private model association failed" - ########################################################## - - echo "\n" - - ########################################################## - echo "=====================================" - echo "Give Access to Private Model" - echo "=====================================" - print_eval medperf container grant_access --model-id $PMODEL_UID --benchmark-id 1 -y - checkFailed "Failed to Give Model Access to Data owner" - ########################################################## - - echo "\n" -fi - -########################################################## -echo "=====================================" -echo "Activate Data Owner profile" -echo "=====================================" -print_eval medperf profile activate testdata -checkFailed "testdata profile activation failed" -########################################################## - -echo "\n" - ########################################################## echo "=====================================" echo "Running benchmark execution step - Public" @@ -220,19 +133,6 @@ checkFailed "Benchmark execution step failed (public)" echo "\n" -if ${PRIVATE}; then - ########################################################## - echo "=====================================" - echo "Running benchmark execution step - Private" - echo "=====================================" - # Create results - print_eval medperf run -b 1 -d $DSET_UID -m $PMODEL_UID -y - checkFailed "Benchmark execution step failed (private)" - ########################################################## - - echo "\n" -fi - ########################################################## echo "=====================================" echo " Offline Compatibility Test - Public " @@ -264,26 +164,7 @@ checkFailed "offline compatibility test execution step failed - public model" echo "\n" if ${PRIVATE}; then - ########################################################## - echo "=====================================" - echo " Offline Compatibility Test - Private " - echo "=====================================" - print_eval medperf test run --offline --no-cache \ - --demo_dataset_url https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz \ - --demo_dataset_hash "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00" \ - -p $PREP_LOCAL/container_config.yaml \ - -m $PRIVATE_MODEL_LOCAL/container_config.yaml \ - -e $METRIC_LOCAL/container_config.yaml \ - -d $PRIVATE_MODEL_LOCAL/key.bin \ - --data_preparator_parameters $PREP_LOCAL/workspace/parameters.yaml \ - --model_parameters $MODEL_LOCAL/workspace/parameters.yaml \ - --evaluator_parameters $METRIC_LOCAL/workspace/parameters.yaml \ - --model_additional_files $MODEL_LOCAL/workspace/additional_files/ - - checkFailed "offline compatibility test execution step failed - private model" - ########################################################## - - echo "\n" + . "$(dirname $(realpath "$0"))/cli_chestxray_tutorial_test_private_model.sh" fi print_eval rm $MODEL_LOCAL/workspace/additional_files/cnn_weights.tar.gz @@ -324,11 +205,6 @@ checkFailed "Profile deletion failed" print_eval medperf profile delete noserver checkFailed "Profile deletion failed" -if ${PRIVATE}; then - print_eval medperf profile delete testprivate - checkFailed "Profile deletion failed" -fi - if ${CLEANUP}; then clean fi diff --git a/cli/cli_chestxray_tutorial_test_private_model.sh b/cli/cli_chestxray_tutorial_test_private_model.sh new file mode 100644 index 000000000..bcbe62808 --- /dev/null +++ b/cli/cli_chestxray_tutorial_test_private_model.sh @@ -0,0 +1,153 @@ +# This script is meant to be called as part of cli_chestxray_tutorial_test.sh + + +########################################################## +echo "=====================================" +echo "Activate dataowner profile" +echo "=====================================" +print_eval medperf profile activate testdata +checkFailed "testdata profile activation failed" +########################################################## + +echo "\n" +########################################################## +echo "=============================================" +echo "Getting a certificate" +echo "=============================================" +print_eval medperf certificate get_client_certificate --overwrite +checkFailed "Failed to obtain Data Owner Certificate" +########################################################## + +echo "\n" + +########################################################## +echo "=============================================" +echo "Submitting the certificate" +echo "=============================================" +print_eval medperf certificate submit_client_certificate -y +checkFailed "Failed to submit Data Owner Certificate" +########################################################## + +echo "\n" + +########################################################## +echo "==========================================" +echo "Creating test profile for private model owner" +echo "==========================================" +print_eval medperf profile create -n testprivate +checkFailed "testprivate profile creation failed" +########################################################## + +echo "\n" + +########################################################## +echo "==========================================" +echo "Login Private Model Owner" +echo "==========================================" + +print_eval medperf profile activate testprivate +checkFailed "testprivate profile activation failed" + +print_eval medperf auth logout +checkFailed "logout failed" + +print_eval medperf auth login -e $PRIVATEMODELOWNER +checkFailed "testprivate login failed" +########################################################## + +echo "\n" + +########################################################## +echo "=====================================" +echo "Submit a private model" +echo "=====================================" +print_eval medperf container submit --name privmodel \ +-m $CHESTXRAY_ENCRYPTED_MODEL -p $CHESTXRAY_ENCRYPTED_MODEL_PARAMS \ +-a $CHESTXRAY_ENCRYPTED_MODEL_ADD --decryption_key $PRIVATE_MODEL_LOCAL/key.bin --operational +checkFailed "private container submission failed" +PMODEL_UID=$(medperf container ls | grep privmodel | head -n 1 | tr -s ' ' | cut -d ' ' -f 2) +########################################################## + +echo "\n" + +########################################################## +echo "=====================================" +echo "Running private model association" +echo "=====================================" +print_eval medperf container associate -m $PMODEL_UID -b 1 -y +checkFailed "private model association failed" +########################################################## + +echo "\n" + +########################################################## +echo "=====================================" +echo "Give Access to Private Model" +echo "=====================================" +print_eval medperf container grant_access --model-id $PMODEL_UID --benchmark-id 1 -y +checkFailed "Failed to Give Model Access to Data owner" +########################################################## + +echo "\n" + +########################################################## +echo "=====================================" +echo "Activate dataowner profile" +echo "=====================================" +print_eval medperf profile activate testdata +checkFailed "testdata profile activation failed" + +print_eval medperf auth logout + +print_eval medperf auth login -e $DATAOWNER +checkFailed "testdata login failed" +########################################################## + +echo "\n" + +########################################################## +echo "=====================================" +echo "Running benchmark execution step - Private" +echo "=====================================" +# Create results +print_eval medperf run -b 1 -d $DSET_UID -m $PMODEL_UID -y +checkFailed "Benchmark execution step failed (private)" +########################################################## + +echo "\n" + +########################################################## +echo "=====================================" +echo " Offline Compatibility Test - Private " +echo "=====================================" + +## Change the server and logout just to make sure this command will work without connecting to a server +print_eval medperf profile activate noserver +checkFailed "noserver profile activation failed" + +print_eval medperf test run --offline --no-cache \ +--demo_dataset_url https://storage.googleapis.com/medperf-storage/chestxray_tutorial/demo_data.tar.gz \ +--demo_dataset_hash "71faabd59139bee698010a0ae3a69e16d97bc4f2dde799d9e187b94ff9157c00" \ +-p $PREP_LOCAL/container_config.yaml \ +-m $PRIVATE_MODEL_LOCAL/container_config.yaml \ +-e $METRIC_LOCAL/container_config.yaml \ +-d $PRIVATE_MODEL_LOCAL/key.bin \ +--data_preparator_parameters $PREP_LOCAL/workspace/parameters.yaml \ +--model_parameters $MODEL_LOCAL/workspace/parameters.yaml \ +--evaluator_parameters $METRIC_LOCAL/workspace/parameters.yaml \ +--model_additional_files $MODEL_LOCAL/workspace/additional_files/ + +checkFailed "offline compatibility test execution step failed - private model" +########################################################## + +echo "\n" + +########################################################## +echo "=====================================" +echo "Delete test Private Model Owner profile" +echo "=====================================" +print_eval medperf profile delete testprivate +checkFailed "Profile deletion failed" +########################################################## + +echo "\n" \ No newline at end of file From 2192f53d12dd475d92c7af675aced3956a474eb1 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 14:48:01 -0300 Subject: [PATCH 158/176] Simplify BearerAuth --- .../runners/airflow_runner_utils/airflow_api_client.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py index 520aff9a8..25c0456fa 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py @@ -24,13 +24,9 @@ def __init__( ): if expires_at is None: twenty_four_hours = 60 * 60 * 24 # Default duration from airflow - token_duration = os.getenv( - "AIRFLOW__API_AUTH__JWT_EXPIRATION_TIME", twenty_four_hours - ) - leeway_seconds = leeway_seconds or 30 now = time.time() - expires_at = now + token_duration + leeway_seconds + expires_at = now + twenty_four_hours + leeway_seconds self.expires_at = expires_at super().__init__(token=token) From 48e21ec8b033f5f9faba77721fe2683ed08cd63e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 15:06:12 -0300 Subject: [PATCH 159/176] Refactor download functionality for both Docker and Singularity so it can be reused for airflow --- .../containers/runners/airflow_runner.py | 24 +++++++++---------- .../containers/runners/docker_runner.py | 24 +++++++++---------- .../containers/runners/docker_utils.py | 15 ++++++++++++ .../containers/runners/singularity_runner.py | 16 +++++-------- .../containers/runners/singularity_utils.py | 11 +++++++++ cli/medperf/containers/runners/utils.py | 8 +++++++ 6 files changed, 63 insertions(+), 35 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index 4c8397406..f31e72447 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -8,11 +8,10 @@ import os from medperf.containers.parsers.airflow_parser import AirflowParser from medperf.account_management import get_medperf_user_data -from .utils import check_docker_image_hash, get_expected_hash -from .singularity_utils import get_docker_image_hash_from_dockerhub -from medperf.utils import run_command +from .utils import get_expected_hash +from .singularity_utils import check_docker_image_by_name import logging -from .docker_utils import get_docker_image_hash +from .docker_utils import download_docker_image from medperf import config @@ -49,12 +48,12 @@ def _download_containers_for_docker( ): for container in self.parser.containers: expected_image_hash = get_expected_hash(hashes_dict, container.image) - command = ["docker", "pull", container.image] - run_command(command, timeout=download_timeout) - computed_image_hash = get_docker_image_hash( - container.image, get_hash_timeout + computed_image_hash = download_docker_image( + docker_image=container.image, + expected_image_hash=expected_image_hash, + download_timeout=download_timeout, + get_hash_timeout=get_hash_timeout, ) - check_docker_image_hash(computed_image_hash, expected_image_hash) hashes_dict[container.image] = computed_image_hash return hashes_dict @@ -66,10 +65,11 @@ def _check_containers_for_singularity(self, hashes_dict, get_hash_timeout): """ for container in self.parser.containers: expected_image_hash = get_expected_hash(hashes_dict, container.image) - computed_image_hash = get_docker_image_hash_from_dockerhub( - container.image, get_hash_timeout + computed_image_hash = check_docker_image_by_name( + docker_image=container.image, + expected_image_hash=expected_image_hash, + get_hash_timeout=get_hash_timeout, ) - check_docker_image_hash(computed_image_hash, expected_image_hash) hashes_dict[container.image] = computed_image_hash return hashes_dict diff --git a/cli/medperf/containers/runners/docker_runner.py b/cli/medperf/containers/runners/docker_runner.py index 99d57366b..862b6df1d 100644 --- a/cli/medperf/containers/runners/docker_runner.py +++ b/cli/medperf/containers/runners/docker_runner.py @@ -1,4 +1,3 @@ -from medperf.comms.entity_resources import resources from medperf.exceptions import MedperfException from .utils import ( check_allowed_run_args, @@ -7,16 +6,16 @@ add_medperf_environment_variables, add_network_config, add_medperf_tmp_folder, - check_docker_image_hash, + download_image_file, ) from .runner import Runner import logging from .docker_utils import ( craft_docker_run_command, - get_docker_image_hash, get_repo_tags_from_archive, load_image, delete_images, + download_docker_image, ) from medperf.encryption import decrypt_gpg_file, check_gpg from medperf.utils import remove_path, run_command, tmp_path_for_file_decryption @@ -55,23 +54,22 @@ def _download_docker_image( get_hash_timeout: int = None, ) -> str: docker_image = self.parser.get_setup_args() - command = ["docker", "pull", docker_image] - logging.debug("Running pull command") - run_command(command, timeout=download_timeout) - computed_image_hash = get_docker_image_hash(docker_image, get_hash_timeout) - check_docker_image_hash(computed_image_hash, expected_image_hash) + computed_image_hash = download_docker_image( + docker_image=docker_image, + expected_image_hash=expected_image_hash, + download_timeout=download_timeout, + get_hash_timeout=get_hash_timeout, + ) return computed_image_hash def _download_docker_archive( self, expected_image_hash, - download_timeout: int = None, - get_hash_timeout: int = None, ): file_url = self.parser.get_setup_args() - image_path, computed_image_hash = resources.get_cube_image( - file_url, expected_image_hash - ) # Hash checking happens in resources + image_path, computed_image_hash = download_image_file( + image_url=file_url, expected_image_hash=expected_image_hash + ) self.image_archive_path = image_path return computed_image_hash diff --git a/cli/medperf/containers/runners/docker_utils.py b/cli/medperf/containers/runners/docker_utils.py index 38367e217..0fd758f9a 100644 --- a/cli/medperf/containers/runners/docker_utils.py +++ b/cli/medperf/containers/runners/docker_utils.py @@ -8,6 +8,7 @@ import json import tarfile import logging +from .utils import check_docker_image_hash def get_docker_image_hash(docker_image, timeout: int = None): @@ -177,3 +178,17 @@ def delete_images(images): run_command(delete_image_cmd) except ExecutionError: config.ui.print_warning("WARNING: Failed to delete docker images.") + + +def download_docker_image( + docker_image: str, + expected_image_hash: str, + download_timeout: int = None, + get_hash_timeout: int = None, +) -> str: + command = ["docker", "pull", docker_image] + logging.debug("Running pull command") + run_command(command, timeout=download_timeout) + computed_image_hash = get_docker_image_hash(docker_image, get_hash_timeout) + check_docker_image_hash(computed_image_hash, expected_image_hash) + return computed_image_hash diff --git a/cli/medperf/containers/runners/singularity_runner.py b/cli/medperf/containers/runners/singularity_runner.py index 6a36b55ba..09846f395 100644 --- a/cli/medperf/containers/runners/singularity_runner.py +++ b/cli/medperf/containers/runners/singularity_runner.py @@ -1,4 +1,3 @@ -from medperf.comms.entity_resources import resources from medperf.exceptions import InvalidArgumentError, MedperfException from medperf.utils import remove_path, run_command, tmp_path_for_file_decryption from .utils import ( @@ -8,14 +7,14 @@ add_medperf_environment_variables, add_network_config, add_medperf_tmp_folder, - check_docker_image_hash, + download_image_file, ) from .singularity_utils import ( cleanup_singularity_cache, - get_docker_image_hash_from_dockerhub, get_singularity_executable_props, craft_singularity_run_command, convert_docker_image_to_sif, + check_docker_image_by_name, ) from medperf.encryption import decrypt_gpg_file, check_gpg @@ -88,9 +87,9 @@ def _download_image_file( get_hash_timeout: int = None, ) -> str: image_file_url = self.parser.get_setup_args() - image_file_path, computed_image_hash = resources.get_cube_image( - image_file_url, expected_image_hash - ) # Hash checking happens in resources + image_file_path, computed_image_hash = download_image_file( + image_url=image_file_url, expected_image_hash=expected_image_hash + ) self.image_file_path = image_file_path self.image_file_hash = computed_image_hash return computed_image_hash @@ -101,10 +100,7 @@ def _check_docker_image( get_hash_timeout: int = None, ) -> str: docker_image = self.parser.get_setup_args() - computed_image_hash = get_docker_image_hash_from_dockerhub( - docker_image, get_hash_timeout - ) - check_docker_image_hash(computed_image_hash, expected_image_hash) + computed_image_hash = check_docker_image_by_name(docker_image, get_hash_timeout) self.docker_image_hash = computed_image_hash.replace(":", "_") return computed_image_hash diff --git a/cli/medperf/containers/runners/singularity_utils.py b/cli/medperf/containers/runners/singularity_utils.py index 88831dee5..93ca3efa7 100644 --- a/cli/medperf/containers/runners/singularity_utils.py +++ b/cli/medperf/containers/runners/singularity_utils.py @@ -8,6 +8,7 @@ import shlex from medperf.utils import run_command import logging +from .utils import check_docker_image_hash def get_docker_image_hash_from_dockerhub(docker_image, timeout: int = None): @@ -192,3 +193,13 @@ def cleanup_singularity_cache(singularity_executable): run_command(command) except ExecutionError: config.ui.print_warning("WARNING: Failed to clean singularity cache.") + + +def check_docker_image_by_name( + docker_image: str, expected_image_hash: str, get_hash_timeout: int = None +) -> str: + computed_image_hash = get_docker_image_hash_from_dockerhub( + docker_image, get_hash_timeout + ) + check_docker_image_hash(computed_image_hash, expected_image_hash) + return computed_image_hash diff --git a/cli/medperf/containers/runners/utils.py b/cli/medperf/containers/runners/utils.py index 5209209ef..bd731bc4a 100644 --- a/cli/medperf/containers/runners/utils.py +++ b/cli/medperf/containers/runners/utils.py @@ -1,4 +1,5 @@ from typing import Optional +from cli.medperf.comms.entity_resources import resources from medperf.exceptions import InvalidContainerSpec, MedperfException from medperf import config import os @@ -112,3 +113,10 @@ def check_docker_image_hash(computed_image_hash, expected_image_hash=None): def get_expected_hash(hashes_dict, image_name): """Gets hash from hashes_dict using image_name as a key, or 'default' if not present""" return hashes_dict.get(image_name, hashes_dict.get("default")) + + +def download_image_file(image_url: str, expected_image_hash: str): + image_path, computed_image_hash = resources.get_cube_image( + image_url, expected_image_hash + ) # Hash checking happens in resources + return image_path, computed_image_hash From dfbc64576fe1f81855977ecb5d6bd8e6d470e25e Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 15:06:30 -0300 Subject: [PATCH 160/176] Remove unused import --- .../runners/airflow_runner_utils/airflow_api_client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py index 25c0456fa..41b15e889 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py @@ -1,5 +1,4 @@ from __future__ import annotations -import os from airflow.sdk.api.client import BearerAuth as AirflowBearerAuth from typing import Optional from methodtools import lru_cache From 958e97e0a377012d5baa1131e54129aef560d6d3 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 15:07:10 -0300 Subject: [PATCH 161/176] fix import --- cli/medperf/containers/runners/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/utils.py b/cli/medperf/containers/runners/utils.py index bd731bc4a..0df482021 100644 --- a/cli/medperf/containers/runners/utils.py +++ b/cli/medperf/containers/runners/utils.py @@ -1,5 +1,5 @@ from typing import Optional -from cli.medperf.comms.entity_resources import resources +from medperf.comms.entity_resources import resources from medperf.exceptions import InvalidContainerSpec, MedperfException from medperf import config import os From 6196f9839e39e6cb80cf8ca63cd01608e495c3e2 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 16:37:24 -0300 Subject: [PATCH 162/176] Fix method call --- cli/medperf/containers/runners/docker_runner.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cli/medperf/containers/runners/docker_runner.py b/cli/medperf/containers/runners/docker_runner.py index 862b6df1d..84ff9ea82 100644 --- a/cli/medperf/containers/runners/docker_runner.py +++ b/cli/medperf/containers/runners/docker_runner.py @@ -38,8 +38,6 @@ def download( logging.debug("Downloading Docker archive") return self._download_docker_archive( expected_image_hash, - download_timeout, - get_hash_timeout, ) else: logging.debug("Downloading Docker image") From e8d5cb2604bfd6c35d055b599efa9326d048e138 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 16:37:59 -0300 Subject: [PATCH 163/176] Remove image_hash validator from Cube class. Convert string hashes into dicts on SubmitCube.run --- cli/medperf/commands/mlcube/submit.py | 15 +++++++++++++++ cli/medperf/entities/cube.py | 19 ------------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/cli/medperf/commands/mlcube/submit.py b/cli/medperf/commands/mlcube/submit.py index f56cace25..453fad6df 100644 --- a/cli/medperf/commands/mlcube/submit.py +++ b/cli/medperf/commands/mlcube/submit.py @@ -28,6 +28,7 @@ def run( submit_info, container_config, parameters_config, decryption_key ) submission.read_config_files() + submission.validate_hash_format() submission.create_cube_object() with ui.interactive(): @@ -151,3 +152,17 @@ def store_decryption_key(self): return logging.debug(f"Decryption key provided: {self.decryption_key}") store_decryption_key(self.cube.id, self.decryption_key) + + def validate_hash_format(self): + """ + Changes a string hash (i.e sent from the command line) into a dict + Also removes a None hash (so it can be generated properly as an empty dict) + """ + tentative_hash = self.submit_info.pop("image_hash", None) + + if tentative_hash is None: + return + elif isinstance(tentative_hash, str): + tentative_hash = {"default": tentative_hash} + + self.submit_info["image_hash"] = tentative_hash diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index b87b76996..a945b1d69 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -40,25 +40,6 @@ class Cube(Entity, DeployableSchema): metadata: dict = Field(default_factory=dict) user_metadata: dict = Field(default_factory=dict) - @field_validator("image_hash", mode="before") - def check_data_preparation_mlcube(cls, v: Union[str, dict], info: ValidationInfo): - if isinstance(v, dict): - return v - - elif v in ["", None]: - return {} - - config = info.data.get("container_config") - try: - image_name = config["image"] - except KeyError: - raise MedperfException( - "No 'image' field found in container_config file to apply hash. " - "Sending hashes is not supported with workflows." - ) - formatted_hash = {image_name: v} - return formatted_hash - @staticmethod def get_type(): return "container" From dd32afb2824a0ae22a664663000de9ba46d5b315 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 11 Dec 2025 17:38:27 -0300 Subject: [PATCH 164/176] linting --- cli/medperf/entities/cube.py | 2 +- server/seed_utils.py | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/cli/medperf/entities/cube.py b/cli/medperf/entities/cube.py index a945b1d69..abe200069 100644 --- a/cli/medperf/entities/cube.py +++ b/cli/medperf/entities/cube.py @@ -1,7 +1,7 @@ import os from typing import List, Optional, Union from medperf.commands.association.utils import get_user_associations -from pydantic import Field, field_validator, ValidationInfo +from pydantic import Field from medperf.entities.interface import Entity from medperf.entities.schemas import DeployableSchema diff --git a/server/seed_utils.py b/server/seed_utils.py index 24f263967..8a828151d 100644 --- a/server/seed_utils.py +++ b/server/seed_utils.py @@ -118,9 +118,6 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): data_prep_config = load_container_config(assets_path, "data_preparator") data_prep_params = load_parameters_config(assets_path, "data_preparator") - data_prep_hash = ( - "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" - ) # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( "/mlcubes/", @@ -130,7 +127,9 @@ def create_benchmark(api_server, benchmark_owner_token, assets_path): "name": "chestxray_prep", "container_config": data_prep_config, "parameters_config": data_prep_params, - "image_hash": {"default": data_prep_hash}, + "image_hash": { + "default": "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" + }, "additional_files_tarball_url": "", "additional_files_tarball_hash": "", "metadata": {}, @@ -280,9 +279,7 @@ def create_workflow_benchmark(api_server, benchmark_owner_token, assets_path): data_prep_config = load_workflow_config(assets_path, "data_preparator_workflow") data_prep_params = load_parameters_config(assets_path, "data_preparator_workflow") - data_prep_hash = ( - "sha256:f8697dc1c646395ad1ac54b8c0373195dbcfde0c4ef5913d4330a5fe481ae9a4" - ) + # Create a Data preprocessor MLCube by Benchmark Owner data_preprocessor_mlcube = api_server.request( "/mlcubes/", From fef44b3d38d888aa95d7307424d3b86a6002c5e9 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 15 Dec 2025 10:25:21 -0300 Subject: [PATCH 165/176] Refactor AirflowClient. Make get_token public and allow it to be called without a base url --- .../airflow_runner_utils/airflow_api_client.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py index 41b15e889..2200b6a97 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py @@ -5,6 +5,7 @@ import time import httpx from pydantic import SecretStr +from typing import Union """ The AirflowAPIClient defined in this Module if structured similarly to the internal @@ -40,20 +41,23 @@ class AirflowAPIClient(httpx.Client): def __init__( self, username: str, - password: SecretStr, + password: Union[str, SecretStr], api_url: str, **kwargs, ): self.username = username self.password = password - token = self._get_token(api_url) + if isinstance(self.password, str): + self.password = SecretStr(self.password) + + token = self.get_token(api_url) auth = BearerAuth(token) - event_hooks = {"request": [self.renew_token]} + event_hooks = {"request": [self._renew_token]} super().__init__(base_url=api_url, auth=auth, event_hooks=event_hooks, **kwargs) - def _get_token(self, base_url): + def get_token(self, base_url=None): if base_url is None: - return "" + base_url = str(self.base_url) base_for_auth = base_url.split("/api")[0] headers = {"Content-Type": "application/json"} @@ -67,9 +71,9 @@ def _get_token(self, base_url): jwt_token = response.json().get("access_token") return jwt_token - def renew_token(self, request: httpx.Request): + def _renew_token(self, request: httpx.Request): if not self.auth.is_valid(): - new_token = self._get_token(str(self.base_url)) + new_token = self.get_token() self.auth.token = new_token request.headers["Authorization"] = "Bearer " + self.auth.token From 240e6a540baf855075baae95889917204f0c33fb Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 15 Dec 2025 10:25:53 -0300 Subject: [PATCH 166/176] Create auto-login plugin and make the link generated by SystemRunner point to that endpoint, so users can login with a single click --- .../containers/runners/airflow_runner.py | 3 ++ .../plugins/auto_login.py | 44 +++++++++++++++++++ .../airflow_runner_utils/system_runner.py | 35 ++++++++------- 3 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index f31e72447..aa522b07a 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -5,6 +5,7 @@ ) from pathlib import Path from .airflow_runner_utils.dags import constants +from .airflow_runner_utils.plugins import auto_login import os from medperf.containers.parsers.airflow_parser import AirflowParser from medperf.account_management import get_medperf_user_data @@ -18,6 +19,7 @@ class AirflowRunner(Runner): _DAGS_FOLDER = str(Path(constants.__file__).parent.resolve()) + _PLUGINS_FOLDER = str(Path(auto_login.__file__).parent.resolve()) def __init__( self, @@ -101,6 +103,7 @@ def run( airflow_home=airflow_home, user=username, dags_folder=self._DAGS_FOLDER, + plugins_folder=self._PLUGINS_FOLDER, additional_files_dir=additional_files_path, mounts=medperf_mounts, project_name=self.workflow_name, diff --git a/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py b/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py new file mode 100644 index 000000000..864ba90b9 --- /dev/null +++ b/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py @@ -0,0 +1,44 @@ +from airflow.plugins_manager import AirflowPlugin +from fastapi import FastAPI, Query, Request, status +from fastapi.responses import RedirectResponse +from airflow.api_fastapi.auth.managers.base_auth_manager import COOKIE_NAME_JWT_TOKEN +from medperf.containers.runners.airflow_runner_utils.airflow_api_client import ( + AirflowAPIClient, +) +from airflow.configuration import conf + +app = FastAPI() + + +@app.get("/auto_login", status_code=status.HTTP_302_FOUND) +async def root( + request: Request, user: str = Query(...), password: str = Query(...) +) -> RedirectResponse: + host = conf.get("api", "host") + port = conf.get("api", "port") + homepage_url = f"http://{host}:{port}" + api_url = f"{homepage_url}/api/v2" + with AirflowAPIClient(username=user, password=password, api_url=api_url) as client: + token = client.get_token() + + response = RedirectResponse(url=homepage_url, status_code=status.HTTP_302_FOUND) + + response.set_cookie( + key=COOKIE_NAME_JWT_TOKEN, + value=token, + path="/", + ) + + return response + + +app_with_metadata = { + "app": app, + "url_prefix": "/medperf", + "name": "Auto Login for MedPerf", +} + + +class AutoLoginPlugin(AirflowPlugin): + name = "auto_login" + fastapi_apps = [app_with_metadata] diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index df413e4f6..4ce2b8052 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -15,6 +15,7 @@ import configparser from typing import Union, List import secrets +import urllib.parse from pydantic import SecretStr import json import logging @@ -34,6 +35,7 @@ def __init__( airflow_home: os.PathLike, user: str, dags_folder: os.PathLike, + plugins_folder: os.PathLike, mounts: dict[str, os.PathLike], additional_files_dir: os.PathLike, project_name: str, @@ -50,6 +52,7 @@ def __init__( # TODO windows self.port = validate_port(port) self.dags_folder = dags_folder + self.plugins_folder = plugins_folder self.extra_configs = extra_airflow_configs self.mounts = mounts self.yaml_parser = yaml_parser @@ -97,6 +100,7 @@ def _initial_setup(self): airflow_config["core"].update( { "dags_folder": self.dags_folder, + "plugins_folder": self.plugins_folder, "executor": "LocalExecutor", "auth_manager": "airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager", "load_examples": "false", @@ -106,7 +110,9 @@ def _initial_setup(self): {"sql_alchemy_conn": self.db.connection_string} ) airflow_config["scheduler"].update({"enable_health_check": "true"}) - + airflow_config["api"].update( + {"host": self.host, "port": self.port, "instance_name": "MedPerf"} + ) logging.debug(f"Saving Airflow configuration to {self.airflow_config_file}") with open(self.airflow_config_file, "w") as f: airflow_config.write(f) @@ -264,26 +270,25 @@ def _create_pools(self): def wait_for_dag(self): asyncio.run(self._async_wait_for_dag()) + def _generate_auto_login_link(self) -> SecretStr: + user_and_pass = urllib.parse.urlencode( + {"user": self.user, "password": self._password.get_secret_value()} + ) + full_link = SecretStr( + f"{self._complete_link}/medperf/auto_login?{user_and_pass}" + ) + return full_link + async def _async_wait_for_dag(self): + auto_login_link = self._generate_auto_login_link() msg = [ f"MedPerf has started executing the Data Pipeline {self.project_name} via Airflow." ] msg.append("Execution will continue until the pipeline successfully completes.") + msg.append("Please use the following link to access the Airflow WebUI:\n") + msg.append(auto_login_link.get_secret_value()) msg.append( - f"The Airflow UI is available at the following link: {self._complete_link}." - ) - msg.append( - "Please use the following credentials for interacting with the Airflow WebUI" - ) - msg.append("-------------------------------------------------------") - msg.append(f"User: {self.user}") - msg.append(f"Password: {self._password.get_secret_value()}") - msg.append("-------------------------------------------------------") - msg.append( - "Note that the password value will change every time Airflow is restarted via MedPerf." - ) - msg.append( - "If this process must be stopped prematurely, please use the Ctrl+C command!" + "\nIf this process must be stopped prematurely, please use the Ctrl+C command!" ) wait_interval = 10 # seconds From c0c3dede4cd14942899507c1aaf1e6d867f34ec8 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 15 Dec 2025 17:50:53 -0300 Subject: [PATCH 167/176] Upgrade airflow version --- .../branch_from_sensor_operator_builder.py | 8 ++++++-- .../container_operator_builder.py | 4 +++- .../docker_operator_buider.py | 5 ++++- .../empty_operator_builder.py | 4 +++- .../manual_approval_buider.py | 4 +++- .../operator_builders/python_sensor_builder.py | 18 +++++++++++++----- .../singularity_operator_builder.py | 5 ++++- cli/requirements.txt | 14 +++++++------- 8 files changed, 43 insertions(+), 19 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py index 7ab6cac34..e5567069f 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/branch_from_sensor_operator_builder.py @@ -1,5 +1,9 @@ -from .python_sensor_builder import PythonSensorBuilder -from .operator_builder import OperatorBuilder +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.python_sensor_builder import ( + PythonSensorBuilder, +) +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( + OperatorBuilder, +) from airflow.decorators import task from airflow.models.taskinstance import TaskInstance diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py index 86389c8de..cad4124e6 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/container_operator_builder.py @@ -1,5 +1,7 @@ from __future__ import annotations -from .operator_builder import OperatorBuilder +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( + OperatorBuilder, +) from abc import abstractmethod import os from medperf.exceptions import MedperfException diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py index f9cce5016..fdb84a8d8 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/docker_operator_buider.py @@ -1,4 +1,7 @@ -from .container_operator_builder import ContainerOperatorBuilder, MountInfo +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.container_operator_builder import ( + ContainerOperatorBuilder, + MountInfo, +) from airflow.providers.docker.operators.docker import DockerOperator from docker.types import Mount import os diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/empty_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/empty_operator_builder.py index 4a9e521ef..835ee7293 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/empty_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/empty_operator_builder.py @@ -1,4 +1,6 @@ -from .operator_builder import OperatorBuilder +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( + OperatorBuilder, +) from airflow.providers.standard.operators.empty import EmptyOperator diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py index 36f9af0d3..b948d50c9 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py @@ -1,4 +1,6 @@ -from .operator_builder import OperatorBuilder +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( + OperatorBuilder, +) from airflow.sdk import task from airflow.exceptions import AirflowException diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py index 8120d26d7..41d5208c5 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/python_sensor_builder.py @@ -1,11 +1,19 @@ from __future__ import annotations -from .operator_builder import OperatorBuilder +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( + OperatorBuilder, +) from airflow.decorators import task -from airflow.sensors.base import PokeReturnValue -from ..pipeline_state import PipelineState -from ..constants import ALWAYS_CONDITION +from airflow.sdk import PokeReturnValue +from medperf.containers.runners.airflow_runner_utils.dags.pipeline_state import ( + PipelineState, +) +from medperf.containers.runners.airflow_runner_utils.dags.constants import ( + ALWAYS_CONDITION, +) from datetime import timedelta -from ..dag_utils import import_external_python_function +from medperf.containers.runners.airflow_runner_utils.dags.dag_utils import ( + import_external_python_function, +) DEFAULT_WAIT_TIME = timedelta(seconds=60) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py index 34f46a189..a4936e335 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/singularity_operator_builder.py @@ -1,4 +1,7 @@ -from .container_operator_builder import ContainerOperatorBuilder, MountInfo +from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.container_operator_builder import ( + ContainerOperatorBuilder, + MountInfo, +) from airflow.providers.singularity.operators.singularity import SingularityOperator diff --git a/cli/requirements.txt b/cli/requirements.txt index ddda8e69f..43acfb281 100644 --- a/cli/requirements.txt +++ b/cli/requirements.txt @@ -2,7 +2,7 @@ typer~=0.15.0 rich~=13.7.0 PyYAML==6.0.1 requests>=2.26.0 -pydantic==2.11.0 +pydantic==2.12.5 yaspin==3.3.0 tabulate==0.9.0 pexpect==4.8.0 @@ -22,7 +22,7 @@ GitPython==3.1.41 dill==0.4.0 semver==3.0.4 cookiecutter==2.1.1 -uvicorn==0.30.1 +uvicorn==0.37.0 fastapi==0.116.1 fastapi-login==1.10.2 cryptography==46.0.3 @@ -30,11 +30,11 @@ methodtools==0.4.7 click==8.1.8 synapseclient @ git+https://github.com/Sage-Bionetworks/synapsePythonClient@develop methodtools==0.4.7 -apache-airflow==3.0.1 -apache-airflow-task-sdk==1.0.1 -apache-airflow-providers-singularity==3.8.0 -apache-airflow-providers-docker==4.4.0 -apache-airflow-providers-fab==2.0.2 +apache-airflow==3.1.5 +apache-airflow-task-sdk==1.1.5 +apache-airflow-providers-singularity==3.9.1 +apache-airflow-providers-docker==4.5.1 +apache-airflow-providers-fab==3.1.0 psycopg2-binary==2.9.9 asyncpg==0.30.0 From 9273e2e35083f4df6dc3a3819d090c06197cb51a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 15 Dec 2025 17:51:06 -0300 Subject: [PATCH 168/176] Use self.port on healthcheck url --- .../runners/airflow_runner_utils/components/api_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/components/api_server.py b/cli/medperf/containers/runners/airflow_runner_utils/components/api_server.py index 36fb26ab7..2e1b56c88 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/components/api_server.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/components/api_server.py @@ -27,4 +27,4 @@ def initialize_command(self): return ["airflow", "api-server", "--port", self.port] def has_successfully_started(self): - return run_healthcheck("http://localhost:8080/api/v2/version") + return run_healthcheck(f"http://localhost:{self.port}/api/v2/version") From 5464aac5af44387c15abae286c424d24b927e4be Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 15 Dec 2025 17:51:38 -0300 Subject: [PATCH 169/176] Update auto-login plugin for airflow 3.1.15 --- .../airflow_api_client.py | 15 ++++++++++ .../plugins/auto_login.py | 15 ++++++---- .../airflow_runner_utils/system_runner.py | 28 +++++++++++-------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py index 2200b6a97..1066d1aa7 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py @@ -6,6 +6,7 @@ import httpx from pydantic import SecretStr from typing import Union +import asyncio """ The AirflowAPIClient defined in this Module if structured similarly to the internal @@ -15,6 +16,20 @@ """ +async def get_token_async(base_url: str, username: str, password: SecretStr): + headers = {"Content-Type": "application/json"} + data = {"username": username, "password": password.get_secret_value()} + + auth_url = f"{base_url}/auth/token" + async with httpx.AsyncClient() as client: + response = await client.post(auth_url, headers=headers, json=data) + + if response.status_code != 201: + print("Failed to get token:", response.status_code, response.text) + jwt_token = response.json().get("access_token") + return jwt_token + + class BearerAuth(AirflowBearerAuth): def __init__( self, diff --git a/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py b/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py index 864ba90b9..cd6f84c7d 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py @@ -2,25 +2,28 @@ from fastapi import FastAPI, Query, Request, status from fastapi.responses import RedirectResponse from airflow.api_fastapi.auth.managers.base_auth_manager import COOKIE_NAME_JWT_TOKEN +from airflow.configuration import conf from medperf.containers.runners.airflow_runner_utils.airflow_api_client import ( - AirflowAPIClient, + get_token_async, ) -from airflow.configuration import conf +from pydantic import SecretStr app = FastAPI() @app.get("/auto_login", status_code=status.HTTP_302_FOUND) async def root( - request: Request, user: str = Query(...), password: str = Query(...) + request: Request, + username: str = Query(...), + password: str = Query(...), ) -> RedirectResponse: host = conf.get("api", "host") port = conf.get("api", "port") homepage_url = f"http://{host}:{port}" - api_url = f"{homepage_url}/api/v2" - with AirflowAPIClient(username=user, password=password, api_url=api_url) as client: - token = client.get_token() + token = await get_token_async( + base_url=homepage_url, username=username, password=SecretStr(password) + ) response = RedirectResponse(url=homepage_url, status_code=status.HTTP_302_FOUND) response.set_cookie( diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index 4ce2b8052..fdefdfc75 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -262,7 +262,7 @@ def _create_pools(self): env=self._run_env, ) - if create_pools.stderr: + if create_pools.returncode != 0: raise ValueError( f"Error when attempting to create pools:\n{create_pools.stderr}" ) @@ -270,34 +270,38 @@ def _create_pools(self): def wait_for_dag(self): asyncio.run(self._async_wait_for_dag()) - def _generate_auto_login_link(self) -> SecretStr: - user_and_pass = urllib.parse.urlencode( - {"user": self.user, "password": self._password.get_secret_value()} - ) - full_link = SecretStr( - f"{self._complete_link}/medperf/auto_login?{user_and_pass}" + def _print_login_link(self, airflow_client: AirflowAPIClient): + + token = airflow_client.get_token() + # token = urllib.parse.urlencode({"token": token}) + token = urllib.parse.urlencode( + {"username": self.user, "password": self._password.get_secret_value()} ) - return full_link + full_link = SecretStr(f"{self._complete_link}/medperf/auto_login?{token}") - async def _async_wait_for_dag(self): - auto_login_link = self._generate_auto_login_link() msg = [ f"MedPerf has started executing the Data Pipeline {self.project_name} via Airflow." ] msg.append("Execution will continue until the pipeline successfully completes.") msg.append("Please use the following link to access the Airflow WebUI:\n") - msg.append(auto_login_link.get_secret_value()) + msg.append(full_link.get_secret_value()) msg.append( "\nIf this process must be stopped prematurely, please use the Ctrl+C command!" ) - wait_interval = 10 # seconds for line in msg: config.ui.print(line) + + async def _async_wait_for_dag(self): + + wait_interval = 10 # seconds + api_url = f"{self._complete_link}/api/v2" with AirflowAPIClient( username=self.user, password=self._password, api_url=api_url ) as airflow_client: + + self._print_login_link(airflow_client) self._check_resuming_from_previous_execution(airflow_client) try: summarizer = Summarizer( From 858d0e92dac0cb108944af08131832bf47c4670a Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Mon, 15 Dec 2025 17:56:55 -0300 Subject: [PATCH 170/176] linting --- .../runners/airflow_runner_utils/airflow_api_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py index 1066d1aa7..0016997c6 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py @@ -6,7 +6,7 @@ import httpx from pydantic import SecretStr from typing import Union -import asyncio + """ The AirflowAPIClient defined in this Module if structured similarly to the internal From dff1aa309c6d2473b6df45c3d40cbce12971b9e6 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 16 Dec 2025 10:10:07 -0300 Subject: [PATCH 171/176] Add small documentation about get_token_async --- .../runners/airflow_runner_utils/airflow_api_client.py | 3 +++ .../runners/airflow_runner_utils/plugins/auto_login.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py index 0016997c6..3a2dea1a8 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/airflow_api_client.py @@ -17,6 +17,9 @@ async def get_token_async(base_url: str, username: str, password: SecretStr): + """ + This is used by the auto-login plugin. It needs an async request to not lock itself up. + """ headers = {"Content-Type": "application/json"} data = {"username": username, "password": password.get_secret_value()} diff --git a/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py b/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py index cd6f84c7d..dbba37215 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/plugins/auto_login.py @@ -21,6 +21,8 @@ async def root( port = conf.get("api", "port") homepage_url = f"http://{host}:{port}" + # Needs to be async to not lock itself up. + # Seems like the plugin also runs in the API server that takes the request. token = await get_token_async( base_url=homepage_url, username=username, password=SecretStr(password) ) From 520aa67711b29264865e58d7cc556c410e9b5b17 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 16 Dec 2025 10:10:16 -0300 Subject: [PATCH 172/176] Update RANO README.md with auto_login --- .../RANO/data_preparator_workflow/README.md | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/examples/RANO/data_preparator_workflow/README.md b/examples/RANO/data_preparator_workflow/README.md index 7340b11e9..e26881695 100644 --- a/examples/RANO/data_preparator_workflow/README.md +++ b/examples/RANO/data_preparator_workflow/README.md @@ -165,25 +165,17 @@ Starting Airflow components Airflow components successfully started MedPerf has started executing the Data Pipeline rano_workflow_prep via Airflow. Execution will continue until the pipeline successfully completes. -The Airflow UI is available at the following link: http://localhost:8080. -Please use the following credentials for interacting with the Airflow WebUI -------------------------------------------------------- -User: SOME_USERNAME_HERE -Password: RANDOM_PASSWORD_HERE -------------------------------------------------------- -Note that the password value will change every time Airflow is restarted via MedPerf. -If this process must be stopped prematurely, please use the Ctrl+C command! -``` - -Keep note of the values that appear in your terminal for `SOME_UERNAME_HERE` and `RANDOM_PASSWORD_HERE`. They will be used to access the Airflow WebUI. The WebUI can be accessed via port 8080 in the Machine where Airflow is running. If running locally, you can simply open http://localhost:8080/ on your Browser to access the UI. Use the `SOME_UERNAME_HERE` and `RANDOM_PASSWORD_HERE` from the terminal output to login. Note that the password will change every time Airflow is started via MedPerf. +Please use the following link to access the Airflow WebUI: -![Airflow login screen](./readme_images/airflow_login.png) +http://localhost:8080/medperf/auto_login?username=SOME_USERNAME&password=RANDOMLY_GENERATED_PASSWORD -Once logged in, the Airflow home screen will be displayed, as shown below. You can click on the DAGs button, in red in the figure, to switch to the DAGs view. +If this process must be stopped prematurely, please use the Ctrl+C command! +``` +The auto-generated link can be clicked to automatically login in the Airflow WebUI. By clicking the link, the Airflow home screen will be displayed in your web browser, as shown below. ![Airflow home screen](./readme_images/airflow_home.png) -A list of all currently loaded Airflow DAGs will be displayed, as shown below. The pipeline itself consists of multiple DAGs and each DAG maps to one of the `steps` defind in the YAML version of the Pipeline. Each DAG is the corresponding step name, both in its raw format from the YAML file (`some_step`) and in a more readable format (`Some Step`) and, in case of steps with `per_subject: true`, also by the Subject ID and Timepoint. +You can click on the DAGs button, in red in the figure, to switch to the DAGs view. A list of all currently loaded Airflow DAGs will be displayed, as shown below. The pipeline itself consists of multiple DAGs and each DAG maps to one of the `steps` defind in the YAML version of the Pipeline. Each DAG is the corresponding step name, both in its raw format from the YAML file (`some_step`) and in a more readable format (`Some Step`) and, in case of steps with `per_subject: true`, also by the Subject ID and Timepoint. ![DAG view in Airflow](./readme_images/dag_list.png) From 824a7e1a68b6180fcefc1ca8b16d5ea17fd6cb9d Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Tue, 16 Dec 2025 12:06:28 -0300 Subject: [PATCH 173/176] Modify instance name --- .../runners/airflow_runner_utils/system_runner.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index fdefdfc75..f23e8150f 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -111,7 +111,11 @@ def _initial_setup(self): ) airflow_config["scheduler"].update({"enable_health_check": "true"}) airflow_config["api"].update( - {"host": self.host, "port": self.port, "instance_name": "MedPerf"} + { + "host": self.host, + "port": self.port, + "instance_name": f"MedPerf Workflow - {self.project_name}", + } ) logging.debug(f"Saving Airflow configuration to {self.airflow_config_file}") with open(self.airflow_config_file, "w") as f: From 916e91de1f4d092d9d99912fe19d5cc10e508694 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 18 Dec 2025 10:15:21 -0300 Subject: [PATCH 174/176] Fix errors in HEMnet README.md --- examples/HEMnet/data_preparator/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/HEMnet/data_preparator/README.md b/examples/HEMnet/data_preparator/README.md index c182cedf9..7965b76be 100644 --- a/examples/HEMnet/data_preparator/README.md +++ b/examples/HEMnet/data_preparator/README.md @@ -61,7 +61,7 @@ svs ## Appendix. Build the customized Docker image From the directory of this README file, run the following commands ```shell -cd customized_image -docker build . -t local/hemnet:0.0.9 +cd project +docker build . -t local/hemnet:0.0.2 ``` -*NOTE!* If a different image tag is used, the CWL steps located at `./cwl/indivivdual_steps` must have their Docker requirements modified to match the name used. \ No newline at end of file +*NOTE!* If a different image tag is used, the `image` field of the workflow file located at `./workflow.yaml` must be modified to match the name used. \ No newline at end of file From 3db6eec63f0c633cac0d1b830a80214131c662f8 Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 18 Dec 2025 10:29:27 -0300 Subject: [PATCH 175/176] Send correct email into airflow configuration --- cli/medperf/containers/runners/airflow_runner.py | 1 + .../containers/runners/airflow_runner_utils/system_runner.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cli/medperf/containers/runners/airflow_runner.py b/cli/medperf/containers/runners/airflow_runner.py index aa522b07a..dabd450f9 100644 --- a/cli/medperf/containers/runners/airflow_runner.py +++ b/cli/medperf/containers/runners/airflow_runner.py @@ -102,6 +102,7 @@ def run( with AirflowSystemRunner( airflow_home=airflow_home, user=username, + email=email, dags_folder=self._DAGS_FOLDER, plugins_folder=self._PLUGINS_FOLDER, additional_files_dir=additional_files_path, diff --git a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py index f23e8150f..08defc4da 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/system_runner.py @@ -34,6 +34,7 @@ def __init__( self, airflow_home: os.PathLike, user: str, + email: str, dags_folder: os.PathLike, plugins_folder: os.PathLike, mounts: dict[str, os.PathLike], @@ -58,6 +59,7 @@ def __init__( self.yaml_parser = yaml_parser self.additional_files_dir = additional_files_dir self.user = user + self.email = email self._password = SecretStr(secrets.token_urlsafe(16)) self.airflow_config_file = os.path.join(self.airflow_home, "airflow.cfg") self.resuming_from_previous_execution = False @@ -238,7 +240,7 @@ def _create_admin_user(self): "--lastname", "admin", "--email", - "admin@admin.com", + self.email, ], capture_output=True, text=True, From 6e900532432d50f0706bd9c9e05371d13b2c698c Mon Sep 17 00:00:00 2001 From: Bruno Rodrigues Date: Thu, 18 Dec 2025 12:11:40 -0300 Subject: [PATCH 176/176] Use the new ApprovalOperator for ManualApproval steps. Update RANO README.md with this new implementation. --- .../manual_approval_buider.py | 47 ++---------------- .../RANO/data_preparator_workflow/README.md | 20 +++++--- .../filter_by_required_actions.png | Bin 0 -> 193746 bytes .../final_confirmation_approve_button.png | Bin 0 -> 130432 bytes .../readme_images/final_confirmation_dag.png | Bin 0 -> 156328 bytes .../mark_as_success_confirmation.png | Bin 115695 -> 0 bytes .../readme_images/mark_state_as_button.png | Bin 125991 -> 0 bytes .../readme_images/required_actions_dag.png | Bin 0 -> 132290 bytes 8 files changed, 17 insertions(+), 50 deletions(-) create mode 100644 examples/RANO/data_preparator_workflow/readme_images/filter_by_required_actions.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/final_confirmation_approve_button.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/final_confirmation_dag.png delete mode 100644 examples/RANO/data_preparator_workflow/readme_images/mark_as_success_confirmation.png delete mode 100644 examples/RANO/data_preparator_workflow/readme_images/mark_state_as_button.png create mode 100644 examples/RANO/data_preparator_workflow/readme_images/required_actions_dag.png diff --git a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py index b948d50c9..77203a54a 100644 --- a/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py +++ b/cli/medperf/containers/runners/airflow_runner_utils/dags/operator_builders/manual_approval_buider.py @@ -1,52 +1,15 @@ from medperf.containers.runners.airflow_runner_utils.dags.operator_builders.operator_builder import ( OperatorBuilder, ) -from airflow.sdk import task -from airflow.exceptions import AirflowException +from airflow.providers.standard.operators.hitl import ApprovalOperator class ManualApprovalBuilder(OperatorBuilder): def _define_base_operator(self): - @task( + return ApprovalOperator( task_id=self.operator_id, - task_display_name=self.display_name, - outlets=self.outlets, + subject="Manual Approval Task", + fail_on_reject=True, + body="Please confirm all generated results before approving the workflow.", ) - def auto_fail(): - raise AirflowException("This task must be approved manually!") - - task_instance = auto_fail() - return task_instance - - @classmethod - def build_operator_list(cls, **kwargs): - """ - An Empty Operator must be added after this operator so that the downstream - Asset triggers properly after manually setting this task as Success. - If necessary, it is added here. - """ - from .empty_operator_builder import EmptyOperatorBuilder - - initial_operator_list = super().build_operator_list(**kwargs) - if len(initial_operator_list) > 1: - return initial_operator_list - - original_approval_operator = initial_operator_list[0] - - empty_id = f"empty_{original_approval_operator.operator_id}" - empty_operator_builder = EmptyOperatorBuilder( - operator_id=empty_id, - raw_id=f"empty_{original_approval_operator.raw_id}", - next_ids=kwargs.get("next_ids", kwargs.get("next", [])), - make_outlet=True, - from_yaml=False, - ) - new_approval_operator = ManualApprovalBuilder( - operator_id=original_approval_operator.operator_id, - raw_id=original_approval_operator.raw_id, - next_ids=[empty_id], - make_outlet=False, - ) - - return [new_approval_operator, empty_operator_builder] diff --git a/examples/RANO/data_preparator_workflow/README.md b/examples/RANO/data_preparator_workflow/README.md index e26881695..fcdf904e4 100644 --- a/examples/RANO/data_preparator_workflow/README.md +++ b/examples/RANO/data_preparator_workflow/README.md @@ -240,21 +240,25 @@ sh auto_approve.sh ``` #### 6.2 Final Confirmation -There is also a manual confirmation step towards the end of the pipeline (step ID `final_confirmation`, of type `manual_approval`). When converted into an Airflow task, this step results into a task that always fails and must be manually set as Success by the user. **Before proceeding with this step, *make sure to review and Tumor Segmentations as per [Section 6.1.1](#611-manual-approval-steps---tumor-segmentation) and ensure you approve all of the results, along with necessary corrections to Brain Masks ([Section 6.1.2](#612-brain-mask-correction) if any are necessary.*** +There is also a manual confirmation step towards the end of the pipeline (step ID `final_confirmation`, of type `manual_approval`). When converted into an Airflow task, this step results into an Approval Task requires manual approval by the user. This task may be easily found by enabling the `Required Actions` in the Airflow UI, as shown in the figure below. If final approval is not yet required, the UI will instead display no DAGs once the filter is selected. -Once all results are reviewed, log into Airflow's Web UI. Go into the Task Instance View and locate the Task Instance named `Final Confirmation`. A filter by may be used, as shown in the Figure below, in blue. The task state will be `Failed`, as shown in red in the figure. This is normal, as this task is a manual approval step and therefore must be manually changed to success for approval. - -![Filtering DAGs by the Final Confirmation tag.](./readme_images/task_list_filtered_final_confirmation.png) +![Filtering DAGs by Required Actions](./readme_images/filter_by_required_actions.png) ***IMPORTANT!!* This task will *NOT* show up if all Manual Reviews are not done yet!** If you are unable to find the `Final Confirmation` task instance, make sure you have completed all the Manual Review steps outlind in [Section 5.1](#51-manual-approval-steps). -If task is in the `Failed` state, it is ready for review. **If you have already validated all the Tumor Segmentations**, scroll your display all the way to the right, revealing a small drop-down arrow. Click the arrow, then click `Success` to open a confirmation prompt. The `Note` tab may be optionally expanded to add a Note to this task, if desired. Finally click `Confirm` to approve the results. The two figures below illustrate this process. +Once the `Final Confirmation` task is available, click on the Task Name as shown in the Airflow WebUI. Once the task name is clicked, the window should display a view similar to the figure below. + +![Final Confirmation DAG View](./readme_images/final_confirmation_dag.png) + +In this view, click the `Required Actions (1)` button. The view will then change into a view similar to the Figure below. + +![Required Actions view](./readme_images/required_actions_dag.png) -![Selecting the Success option in the Mark as Success button](./readme_images/mark_state_as_button.png) +Here, click the `Manual Approval Task` text to display the final confirmation view shown below. -![Confirmation for setting task as success](./readme_images/mark_as_success_confirmation.png) +![Final confirmation button](./readme_images/final_confirmation_approve_button.png) -Once this procedure is done, the pipeline will proceed to its final steps and conclusion. +**Before proceeding with this step, *make sure to review and Tumor Segmentations as per [Section 6.1.1](#611-manual-approval-steps---tumor-segmentation) and ensure you approve all of the results, along with necessary corrections to Brain Masks ([Section 6.1.2](#612-brain-mask-correction)) if any are necessary.*** If all generated images are to your liking, click the `Approve` button to confirm the generated images. Airflow will then automatically proceed with executing the remainder of the Pipeline. ## 7. Output Data diff --git a/examples/RANO/data_preparator_workflow/readme_images/filter_by_required_actions.png b/examples/RANO/data_preparator_workflow/readme_images/filter_by_required_actions.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc0a71414e19aab340374895c94b1ef1ba87bf9 GIT binary patch literal 193746 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≧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 literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/final_confirmation_approve_button.png b/examples/RANO/data_preparator_workflow/readme_images/final_confirmation_approve_button.png new file mode 100644 index 0000000000000000000000000000000000000000..f02e7788dd40ab541b029f31d60b7079a3675366 GIT binary patch literal 130432 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 `R$203F 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 GhnNkv2j@q4N*A(XN4|2m_79y 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 Or=p~BGw-_Tv;PAvO%Is> literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/final_confirmation_dag.png b/examples/RANO/data_preparator_workflow/readme_images/final_confirmation_dag.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7b36e99a82e84a243e665776cf61f849a178e1 GIT binary patch literal 156328 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 literal 0 HcmV?d00001 diff --git a/examples/RANO/data_preparator_workflow/readme_images/mark_as_success_confirmation.png b/examples/RANO/data_preparator_workflow/readme_images/mark_as_success_confirmation.png deleted file mode 100644 index 75340d2c142e93c420c63e27bb0d8343be521381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115695 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

    e_TFo+_^lgCd2t_zN%~!u8VkF&SkJ&Io{OISV zblao*!Vb54ZSekS(q6*#b8DNUbO_Fld<=eK;L{dG&9Ow@?>7=44}52V9`wSkJ2zn{!-ZpdDnxbP&z)0q}-5-(%>0{+u(tol41d~Zb3RDYJF2p>D(2lv5q>07a=X@f<#109^Q&cS|?2U#fz z^}D;T4u6;0pK;hVhwT=EDDHm$QL%KP2x^@1;lq}m%o}~IOe`gN(YosSmA@H^O!p!S zp>@@91VF#}ImgFB3FOiVPZlPWm^!&1{$Ay?n*^EiFC9vlUxH90-3IQkOh{mquBUcZ9t zWL}I=Ks4w;UP4v0ngBwR4~vq3eZ!?>Qr+aOQtV#fA7QqI5PmS7w9+b3v9O~M_vtsU z&ILA{la#3=bA7o#zmMEWG)o`1!aMo};byr=a}yRNd>zY}OE}UHnr#0l6GR|H_j5u( zDE}y?6YXB0M^5*0DLmV`9t;eci6cl1jPX5@KzGc5*U;epixHq-+DNP+L=$mwUyKL&;=)$QvQn#U|+wrdoX7vAGT6LJ*v`GjPfuzJ)b#1p5)A2#ZwCi z7=S(3>zAsH50t%~n5rb2Gje~Cr2Bay0=u(wtp3&lAfT>S%;@;u1LENemk42agnhdB zGCJA>BN*cOtl`VNC@qto_*xu}j@oqC&SUAtv&S-iqaY_9bSh|o>$%cJGBv*dsMc#k z>a$Ywi6LgCvu^aA!8L9E`y_e2d~3*=O62%=>kFtU1Xek!I@z@`wbx*G&~}tyW7~^n?25k zazy-e{@weEn2(BuVaS5Ļ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 R77D=Saq!3ij`QgY{{r+BZx{do diff --git a/examples/RANO/data_preparator_workflow/readme_images/mark_state_as_button.png b/examples/RANO/data_preparator_workflow/readme_images/mark_state_as_button.png deleted file mode 100644 index 7fcc500eb98a9c58689e9ec9405d49a958323e27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125991 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

    H52aSA2Qarskbg0$LmM=gnqT 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 diff --git a/examples/RANO/data_preparator_workflow/readme_images/required_actions_dag.png b/examples/RANO/data_preparator_workflow/readme_images/required_actions_dag.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb6e734b59fce2cc651e19b892c322bf3fb83a1 GIT binary patch literal 132290 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%0D57>yevri9*~8p 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 literal 0 HcmV?d00001