From 670ac7a6a4a602f27955da88300b8933e3a14316 Mon Sep 17 00:00:00 2001 From: David Abramov Date: Mon, 18 May 2026 13:17:16 -0700 Subject: [PATCH 1/7] Adding leaf segmentation to configs --- config.yml | 23 +++++++++++++++++++++++ orchestration/flows/bl832/config.py | 1 + 2 files changed, 24 insertions(+) diff --git a/config.yml b/config.yml index ea576b54..3a14a320 100644 --- a/config.yml +++ b/config.yml @@ -284,3 +284,26 @@ hpc_submission_settings832: conda_env_path: /global/cfs/cdirs/als/data_mover/8.3.2/envs/dino_demo seg_scripts_dir: /global/cfs/cdirs/als/data_mover/8.3.2/tomography_segmentation_scripts/moon_seg/forge_feb_seg_model_demo/ dino_checkpoint_path: /global/cfs/cdirs/als/data_mover/8.3.2/tomography_segmentation_scripts/dino/best_moon.ckpt + + # ── LEAF SEGMENTATION SETTINGS ─────────────────────────────────────────── + nersc_segmentation_dinov3_leaf: + # ── SLURM resource allocation ───────────────────────────────────────────── + qos: regular + account: als + constraint: gpu + reservation: "" + num_nodes: 4 + ntasks-per-node: 1 + nproc_per_node: 4 + gpus-per-node: 4 + cpus-per-task: 128 + walltime: "00:59:00" + # ── Inference parameters ────────────────────────────────────────────────── + script_name: "src.inference_dino_v3" + project: "leaf" + batch_size: 4 + # ── Paths ───────────────────────────────────────────────────────────────── + cfs_path: /global/cfs/cdirs/als/data_mover/8.3.2 + conda_env_path: /global/cfs/cdirs/als/data_mover/8.3.2/envs/dino_demo + seg_scripts_dir: /global/cfs/cdirs/als/data_mover/8.3.2/tomography_segmentation_scripts/leaf_seg/forge_feb_seg_model_demo/ + dino_checkpoint_path: /global/cfs/cdirs/als/data_mover/8.3.2/tomography_segmentation_scripts/dino/best_leaf.ckpt diff --git a/orchestration/flows/bl832/config.py b/orchestration/flows/bl832/config.py index 8bbbf78c..92e241ac 100644 --- a/orchestration/flows/bl832/config.py +++ b/orchestration/flows/bl832/config.py @@ -39,3 +39,4 @@ def _beam_specific_config(self) -> None: self.nersc_segment_dinov3_settings = self.config["hpc_submission_settings832"]["nersc_segmentation_dinov3"] self.nersc_combine_segmentation_settings = self.config["hpc_submission_settings832"]["nersc_combine_segmentations"] self.nersc_segment_dinov3_moon_settings = self.config["hpc_submission_settings832"]["nersc_segmentation_dinov3_moon"] + self.nersc_segment_dinov3_leaf_settings = self.config["hpc_submission_settings832"]["nersc_segmentation_dinov3_leaf"] From b65801c2697de0404eff30212fd38ee4143878fb Mon Sep 17 00:00:00 2001 From: David Abramov Date: Mon, 18 May 2026 13:17:40 -0700 Subject: [PATCH 2/7] Adding leaf segmentation model ingestion into register_mlflow.py --- orchestration/flows/bl832/register_mlflow.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/orchestration/flows/bl832/register_mlflow.py b/orchestration/flows/bl832/register_mlflow.py index 31fa3760..cdebd2f9 100644 --- a/orchestration/flows/bl832/register_mlflow.py +++ b/orchestration/flows/bl832/register_mlflow.py @@ -77,6 +77,22 @@ def register_mlflow_checkpoints(): }, ) + register_checkpoint( + model_name="dinov3-leaf", + nersc_path="/global/cfs/cdirs/als/data_mover/8.3.2/tomography_segmentation_scripts/dino/best_leaf.ckpt", + alcf_path="/eagle/IRIBeta/als/seg_models/dino/best_leaf.ckpt", + config=config, + alias="production", + description="DINOv3 fine-tuned on leaf micro-CT data.", + inference_params={ + "conda_env_path": "/global/cfs/cdirs/als/data_mover/8.3.2/envs/dino_demo", + "seg_scripts_dir": f"{scripts_dir}leaf_seg/forge_feb_seg_model_demo/", + "script_name": "src.inference_dino_v2", + "batch_size": 4, + "nproc_per_node": 4, + }, + ) + def retrieve_mlflow_params_test() -> bool: """Test that _load_job_options correctly pulls inference params from the MLflow registry. From 631ab418855f92fab1969f28a381e821f4f3cc82 Mon Sep 17 00:00:00 2001 From: David Abramov Date: Mon, 18 May 2026 13:18:05 -0700 Subject: [PATCH 3/7] Adding nersc_leaf_segment_flow to nersc.py --- orchestration/flows/bl832/nersc.py | 209 ++++++++++++++++++++++++++++- 1 file changed, 206 insertions(+), 3 deletions(-) diff --git a/orchestration/flows/bl832/nersc.py b/orchestration/flows/bl832/nersc.py index f4ffc9fb..0241a57e 100644 --- a/orchestration/flows/bl832/nersc.py +++ b/orchestration/flows/bl832/nersc.py @@ -211,13 +211,19 @@ def _get_segmentation_spec(self, model: str, project: str) -> SegmentationModelS mlflow_checkpoint_key="dino_checkpoint_path", extra_cli_flags={"--project": "moon"}, ), + ("dinov3", "leaf"): SegmentationModelSpec( + variable_name="nersc-dinov3-leaf-seg-options", + settings=self.config.nersc_segment_dinov3_leaf_settings, + mlflow_model_name="dinov3-leaf", + mlflow_checkpoint_key="dino_checkpoint_path", + extra_cli_flags={"--project": "leaf"}, + ), ("sam3", "petiole"): SegmentationModelSpec( variable_name="nersc-segmentation-options", settings=self.config.nersc_segment_sam3_settings, mlflow_model_name="sam3-petiole", mlflow_checkpoint_key="finetuned_checkpoint_path", ), - # future: ("sam3", "moon"): SegmentationModelSpec(...), } key = (model, project) if key not in registry: @@ -2193,6 +2199,203 @@ def nersc_moon_segment_flow( return False +@flow(name="nersc_leaf_segment_flow", flow_run_name="nersc_leaf_seg-{file_path}") +def nersc_leaf_segment_flow( + file_path: str, + config: Config832 | None = None, + num_nodes: int | None = None, +) -> bool: + """Reconstruct a leaf scan and run DINOv3-leaf segmentation. + + Runs reconstruction then DINOv3-leaf (leaf-specific). No SAM3 or + combine step — those are petiole-specific. Transfer and pruning follow the + same pattern as nersc_petiole_segment_flow. + + :param file_path: Path to the raw .h5 file to be processed. + :param config: Configuration object for the flow. + :param num_nodes: Number of nodes for reconstruction. + :return: True if reconstruction and segmentation both succeeded. + """ + logger = get_run_logger() + + if config is None: + logger.info("Initializing Config") + config = Config832() + + path = Path(file_path) + folder_name = path.parent.name + file_name = path.stem + scratch_path_tiff = f"{folder_name}/rec{file_name}" + scratch_path_segment = f"{folder_name}/seg{file_name}" + + logger.info(f"Starting NERSC reconstruction + DINOv3-leaf flow for {file_path=}") + + controller = get_controller(hpc_type=HPC.NERSC, config=config) + + if num_nodes is None: + num_nodes = config.nersc_recon_settings.get("num_nodes", 4) + logger.info(f"Configured to use {num_nodes} nodes for reconstruction") + + # ── STEP 1: Reconstruction ──────────────────────────────────────────────── + recon_result = controller.reconstruct(file_path=file_path, num_nodes=num_nodes) + + if isinstance(recon_result, dict): + nersc_reconstruction_success = recon_result.get("success", False) + timing = recon_result.get("timing") + if timing: + logger.info("=" * 50) + logger.info("TIMING BREAKDOWN") + logger.info("=" * 50) + logger.info(f" Total job time: {timing.get('total', 'N/A')}s") + logger.info(f" Container pull: {timing.get('container_pull', 'N/A')}s") + logger.info( + f" File copy: {timing.get('file_copy', 'N/A')}s " + f"(skipped: {timing.get('copy_skipped', 'N/A')})" + ) + logger.info(f" Metadata detection: {timing.get('metadata', 'N/A')}s") + logger.info(f" RECONSTRUCTION: {timing.get('reconstruction', 'N/A')}s <-- actual recon time") + logger.info(f" Num slices: {timing.get('num_slices', 'N/A')}") + logger.info("=" * 50) + if all(k in timing for k in ["total", "reconstruction"]): + overhead = timing["total"] - timing["reconstruction"] + logger.info(f" Overhead: {overhead}s") + logger.info(f" Reconstruction %: {100 * timing['reconstruction'] / timing['total']:.1f}%") + logger.info("=" * 50) + else: + nersc_reconstruction_success = recon_result + + logger.info(f"NERSC reconstruction success: {nersc_reconstruction_success}") + + if not nersc_reconstruction_success: + logger.error("Reconstruction failed — aborting leaf segmentation flow.") + raise ValueError("Reconstruction at NERSC failed") + + # ── STEP 2: Transfer TIFFs to data832 ──────────────────────────────────── + data832_tiff_future = None + try: + data832_tiff_future = globus_transfer_task.submit( + file_path=scratch_path_tiff, + source=config.nersc832_alsdev_pscratch_scratch, + destination=config.data832_scratch, + config=config, + ) + logger.info("TIFF transfer to data832 submitted.") + except Exception as e: + logger.error(f"Failed to submit TIFF transfer to data832: {e}") + + # ── STEP 3: DINOv3-leaf segmentation ───────────────────────────────────── + logger.info("Submitting DINOv3-leaf segmentation task.") + leaf_future = nersc_segmentation_dinov3_task.submit( + recon_folder_path=scratch_path_tiff, config=config, project="leaf" + ) + + leaf_success = leaf_future.result() + logger.info(f"DINOv3-leaf segmentation result: {leaf_success}") + + # ── STEP 4: Transfer segmentation outputs to data832 ───────────────────── + data832_leaf_future = None + if leaf_success: + leaf_segment_path = f"{folder_name}/seg{file_name}/dino" + try: + data832_leaf_future = globus_transfer_task.submit( + file_path=leaf_segment_path, + source=config.nersc832_alsdev_pscratch_scratch, + destination=config.data832_scratch, + config=config, + ) + logger.info("DINOv3-leaf transfer to data832 submitted.") + except Exception as e: + logger.error(f"Failed to submit DINOv3-leaf transfer to data832: {e}") + + # ── STEP 5: Copy to NERSC CFS ───────────────────────────────────────────── + for cfs_path in [scratch_path_tiff, scratch_path_segment]: + try: + globus_transfer_task.submit( + file_path=cfs_path, + source=config.nersc832_alsdev_pscratch_scratch, + destination=config.nersc832_alsdev_scratch, + config=config, + ) + logger.info(f"CFS transfer submitted: {cfs_path}") + except Exception as e: + logger.error(f"Failed to copy {cfs_path} to NERSC CFS: {e}") + + # ── Resolve futures before pruning ──────────────────────────────────────── + data832_tiff_transfer_success = data832_tiff_future.result() if data832_tiff_future else False + data832_leaf_transfer_success = data832_leaf_future.result() if data832_leaf_future else False + + logger.info( + f"Transfer results — tiff: {data832_tiff_transfer_success}, " + f"leaf: {data832_leaf_transfer_success}" + ) + + # ── STEP 6: Pruning ─────────────────────────────────────────────────────── + logger.info("Scheduling file pruning tasks.") + prune_controller = get_prune_controller(prune_type=PruneMethod.GLOBUS, config=config) + + try: + prune_controller.prune( + file_path=f"{folder_name}/{path.name}", + source_endpoint=config.nersc832_alsdev_pscratch_raw, + check_endpoint=None, + days_from_now=1.0, + ) + except Exception as e: + logger.warning(f"Failed to schedule raw data pruning: {e}") + + try: + prune_controller.prune( + file_path=scratch_path_tiff, + source_endpoint=config.nersc832_alsdev_pscratch_scratch, + check_endpoint=config.data832_scratch if data832_tiff_transfer_success else None, + days_from_now=1.0, + ) + except Exception as e: + logger.warning(f"Failed to schedule reconstruction data pruning: {e}") + + if leaf_success: + try: + prune_controller.prune( + file_path=scratch_path_segment, + source_endpoint=config.nersc832_alsdev_pscratch_scratch, + check_endpoint=config.data832_scratch if data832_leaf_transfer_success else None, + days_from_now=1.0, + ) + except Exception as e: + logger.warning(f"Failed to schedule segmentation data pruning: {e}") + + if data832_tiff_transfer_success: + try: + prune_controller.prune( + file_path=scratch_path_tiff, + source_endpoint=config.data832_scratch, + check_endpoint=None, + days_from_now=30.0, + ) + except Exception as e: + logger.warning(f"Failed to schedule data832 tiff pruning: {e}") + + if data832_leaf_transfer_success: + try: + prune_controller.prune( + file_path=scratch_path_segment, + source_endpoint=config.data832_scratch, + check_endpoint=None, + days_from_now=30.0, + ) + except Exception as e: + logger.warning(f"Failed to schedule data832 leaf segment pruning: {e}") + + if nersc_reconstruction_success and leaf_success: + logger.info("NERSC reconstruction + DINOv3-leaf flow completed successfully.") + return True + else: + logger.warning( + f"Flow completed with issues: recon={nersc_reconstruction_success}, leaf={leaf_success}" + ) + return False + + @flow(name="nersc_streaming_flow", on_cancellation=[cancellation_hook]) def nersc_streaming_flow( walltime: datetime.timedelta = datetime.timedelta(minutes=5), @@ -2402,7 +2605,7 @@ def nersc_segmentation_sam3_integration_test() -> bool: if __name__ == "__main__": nersc_segmentation_dinov3_task( - recon_folder_path='dabramov/recmoon/', + recon_folder_path='dabramov/recleaf/', config=Config832(), - project="moon" + project="leaf" ) From f6cd08bf385a7bb3c3a2212a8d077f46013458db Mon Sep 17 00:00:00 2001 From: David Abramov Date: Mon, 18 May 2026 13:19:55 -0700 Subject: [PATCH 4/7] Adding leaf segmentation to dispatcher.py --- orchestration/flows/bl832/dispatcher.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/orchestration/flows/bl832/dispatcher.py b/orchestration/flows/bl832/dispatcher.py index d28a02eb..77b34efb 100644 --- a/orchestration/flows/bl832/dispatcher.py +++ b/orchestration/flows/bl832/dispatcher.py @@ -32,6 +32,10 @@ class FlowParameterMapper: "num_nodes", "config"], "nersc_moon_segment_flow/nersc_moon_segment_flow": [ + "file_path", + "num_nodes", + "config"], + "nersc_leaf_segment_flow/nersc_leaf_segment_flow": [ "file_path", "num_nodes", "config"] @@ -70,6 +74,7 @@ def setup_decision_settings( nersc_recon: bool, nersc_petiole_segment: bool, nersc_moon_segment: bool, + nersc_leaf_segment: bool, new_file_832: bool ) -> dict: """ @@ -88,6 +93,7 @@ def setup_decision_settings( f"nersc_recon={nersc_recon}, " f"nersc_petiole_segment={nersc_petiole_segment}, " f"nersc_moon_segment={nersc_moon_segment}, " + f"nersc_leaf_segment={nersc_leaf_segment}, " f"new_file_832={new_file_832}") # Define which flows to run based on the input settings settings = { @@ -95,6 +101,7 @@ def setup_decision_settings( "nersc_recon_flow/nersc_recon_flow": nersc_recon, "nersc_petiole_segment_flow/nersc_petiole_segment_flow": nersc_petiole_segment, "nersc_moon_segment_flow/nersc_moon_segment_flow": nersc_moon_segment, + "nersc_leaf_segment_flow/nersc_leaf_segment_flow": nersc_leaf_segment, "new_832_file_flow/new_file_832": new_file_832 } # Save the settings in a JSON block for later retrieval by other flows @@ -186,6 +193,12 @@ async def dispatcher( ) tasks.append(run_recon_flow_async("nersc_moon_segment_flow/nersc_moon_segment_flow", moon_params)) + if decision_settings.get("nersc_leaf_segment_flow/nersc_leaf_segment_flow"): + leaf_params = FlowParameterMapper.get_flow_parameters( + "nersc_leaf_segment_flow/nersc_leaf_segment_flow", available_params + ) + tasks.append(run_recon_flow_async("nersc_leaf_segment_flow/nersc_leaf_segment_flow", leaf_params)) + # Run ALCF and NERSC flows in parallel, if any if tasks: try: From a688c6d68c231debdc3b373f051e76b50ba7cdb0 Mon Sep 17 00:00:00 2001 From: David Abramov Date: Mon, 18 May 2026 13:29:12 -0700 Subject: [PATCH 5/7] updating pytest to include leaf segmentation --- orchestration/_tests/test_bl832/test_nersc.py | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/orchestration/_tests/test_bl832/test_nersc.py b/orchestration/_tests/test_bl832/test_nersc.py index 8d7056a8..cb916ffc 100644 --- a/orchestration/_tests/test_bl832/test_nersc.py +++ b/orchestration/_tests/test_bl832/test_nersc.py @@ -145,6 +145,23 @@ def mock_config832(mocker): "conda_env_path": "/mock/conda/combine", "seg_scripts_dir": "/mock/seg_scripts/combine", } + mock_config.nersc_segment_dinov3_leaf_settings = { + "qos": "regular", + "account": "mock_account", + "constraint": "gpu", + "reservation": "", + "num_nodes": 4, + "ntasks-per-node": 1, + "nproc_per_node": 4, + "gpus-per-node": 4, + "cpus-per-task": 128, + "walltime": "00:59:00", + "batch_size": 4, + "cfs_path": "/mock/cfs", + "conda_env_path": "/mock/conda/dino_leaf", + "seg_scripts_dir": "/mock/seg_scripts/dino_leaf", + "dino_checkpoint_path": "/mock/dino_leaf.ckpt", + } mocker.patch("orchestration.flows.bl832.nersc.Config832", return_value=mock_config) return mock_config @@ -794,3 +811,123 @@ def test_moon_segment_flow_no_sam3_no_combine(mocker, mock_config832, mock_recon mock_sam3_task.submit.assert_not_called() mock_combine_task.submit.assert_not_called() + + +# ────────────────────────────────────────────────────────────────────────────── +# segmentation_dinov3 with project="leaf" (controller level) +# ────────────────────────────────────────────────────────────────────────────── + +def test_segmentation_dinov3_leaf_success(mocker, mock_sfapi_client, mock_config832): + from orchestration.flows.bl832.nersc import NERSCTomographyHPCController + from sfapi_client.compute import Machine + + mocker.patch("orchestration.flows.bl832.nersc.time.sleep") + mocker.patch("orchestration.flows.bl832.nersc.Variable.get", return_value={"defaults": True}) + controller = NERSCTomographyHPCController(client=mock_sfapi_client, config=mock_config832) + + result = controller.segmentation_dinov3(recon_folder_path="folder/recfile", project="leaf") + + mock_sfapi_client.compute.assert_called_with(Machine.perlmutter) + mock_sfapi_client.compute.return_value.submit_job.assert_called_once() + assert result is True + + +def test_segmentation_dinov3_leaf_submission_failure(mocker, mock_sfapi_client, mock_config832): + from orchestration.flows.bl832.nersc import NERSCTomographyHPCController + + mocker.patch("orchestration.flows.bl832.nersc.time.sleep") + mocker.patch("orchestration.flows.bl832.nersc.Variable.get", return_value={"defaults": True}) + mock_sfapi_client.compute.return_value.submit_job.side_effect = Exception("No GPU nodes") + controller = NERSCTomographyHPCController(client=mock_sfapi_client, config=mock_config832) + + result = controller.segmentation_dinov3(recon_folder_path="folder/recfile", project="leaf") + + assert result is False + + +# ────────────────────────────────────────────────────────────────────────────── +# nersc_leaf_segment_flow (recon + DINOv3-leaf only, no SAM3, no combine) +# ────────────────────────────────────────────────────────────────────────────── + +def test_leaf_segment_flow_succeeds(mocker, mock_config832, mock_recon_success): + """Recon + DINOv3-leaf both succeed → flow returns True.""" + from orchestration.flows.bl832.nersc import nersc_leaf_segment_flow + + mock_controller = mocker.MagicMock() + mock_controller.reconstruct.return_value = mock_recon_success + mocker.patch("orchestration.flows.bl832.nersc.get_controller", return_value=mock_controller) + + mock_globus_transfer = mocker.patch("orchestration.flows.bl832.nersc.globus_transfer_task") + mock_globus_transfer.submit.return_value = _make_future(mocker, True) + + mocker.patch("orchestration.flows.bl832.nersc.get_prune_controller", return_value=mocker.MagicMock()) + + mock_dinov3_task = mocker.patch("orchestration.flows.bl832.nersc.nersc_segmentation_dinov3_task") + mock_dinov3_task.submit.return_value = _make_future(mocker, True) + + result = nersc_leaf_segment_flow(file_path="folder/file.h5", num_nodes=4, config=None) + + assert result is True + mock_controller.reconstruct.assert_called_once() + mock_dinov3_task.submit.assert_called_once_with( + recon_folder_path="folder/recfile", config=mock_config832, project="leaf" + ) + + +def test_leaf_segment_flow_seg_failure(mocker, mock_config832, mock_recon_success): + """Recon succeeds but DINOv3-leaf fails → flow returns False.""" + from orchestration.flows.bl832.nersc import nersc_leaf_segment_flow + + mock_controller = mocker.MagicMock() + mock_controller.reconstruct.return_value = mock_recon_success + mocker.patch("orchestration.flows.bl832.nersc.get_controller", return_value=mock_controller) + + mock_globus_transfer = mocker.patch("orchestration.flows.bl832.nersc.globus_transfer_task") + mock_globus_transfer.submit.return_value = _make_future(mocker, False) + + mocker.patch("orchestration.flows.bl832.nersc.get_prune_controller", return_value=mocker.MagicMock()) + + mock_dinov3_task = mocker.patch("orchestration.flows.bl832.nersc.nersc_segmentation_dinov3_task") + mock_dinov3_task.submit.return_value = _make_future(mocker, False) + + result = nersc_leaf_segment_flow(file_path="folder/file.h5", num_nodes=4, config=None) + + assert result is False + + +def test_leaf_segment_flow_recon_failure(mocker, mock_config832): + """Recon failure should raise ValueError immediately.""" + from orchestration.flows.bl832.nersc import nersc_leaf_segment_flow + + mock_controller = mocker.MagicMock() + mock_controller.reconstruct.return_value = {"success": False, "job_id": None, "timing": None} + mocker.patch("orchestration.flows.bl832.nersc.get_controller", return_value=mock_controller) + mocker.patch("orchestration.flows.bl832.nersc.globus_transfer_task") + mocker.patch("orchestration.flows.bl832.nersc.get_prune_controller", return_value=mocker.MagicMock()) + + with pytest.raises(ValueError, match="Reconstruction at NERSC failed"): + nersc_leaf_segment_flow(file_path="folder/file.h5", num_nodes=4, config=None) + + +def test_leaf_segment_flow_no_sam3_no_combine(mocker, mock_config832, mock_recon_success): + """SAM3 and combine tasks should never be called in the leaf flow.""" + from orchestration.flows.bl832.nersc import nersc_leaf_segment_flow + + mock_controller = mocker.MagicMock() + mock_controller.reconstruct.return_value = mock_recon_success + mocker.patch("orchestration.flows.bl832.nersc.get_controller", return_value=mock_controller) + + mock_globus_transfer = mocker.patch("orchestration.flows.bl832.nersc.globus_transfer_task") + mock_globus_transfer.submit.return_value = _make_future(mocker, True) + + mocker.patch("orchestration.flows.bl832.nersc.get_prune_controller", return_value=mocker.MagicMock()) + + mock_sam3_task = mocker.patch("orchestration.flows.bl832.nersc.nersc_segmentation_sam3_task") + mock_combine_task = mocker.patch("orchestration.flows.bl832.nersc.nersc_combine_segmentations_task") + mock_dinov3_task = mocker.patch("orchestration.flows.bl832.nersc.nersc_segmentation_dinov3_task") + mock_dinov3_task.submit.return_value = _make_future(mocker, True) + + nersc_leaf_segment_flow(file_path="folder/file.h5", num_nodes=4, config=None) + + mock_sam3_task.submit.assert_not_called() + mock_combine_task.submit.assert_not_called() From caa2c2d057a4a4acc35ccd4dd54ef73f7abafa86 Mon Sep 17 00:00:00 2001 From: David Abramov Date: Tue, 19 May 2026 10:47:42 -0700 Subject: [PATCH 6/7] adding leaf segmentation flow to prefect.yaml --- orchestration/flows/bl832/prefect.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/orchestration/flows/bl832/prefect.yaml b/orchestration/flows/bl832/prefect.yaml index aa9ed2c2..5ac8cd13 100644 --- a/orchestration/flows/bl832/prefect.yaml +++ b/orchestration/flows/bl832/prefect.yaml @@ -55,6 +55,12 @@ deployments: name: nersc_recon_flow_pool work_queue_name: nersc_moon_segment_flow_queue +- name: nersc_leaf_segment_flow + entrypoint: orchestration/flows/bl832/nersc.py:nersc_leaf_segment_flow + work_pool: + name: nersc_recon_flow_pool + work_queue_name: nersc_leaf_segment_flow_queue + - name: nersc_streaming_flow entrypoint: orchestration/flows/bl832/nersc.py:nersc_streaming_flow work_pool: From 427799988f0e3eeb1a8f8466b996707cad2cc529 Mon Sep 17 00:00:00 2001 From: David Abramov Date: Tue, 19 May 2026 11:02:06 -0700 Subject: [PATCH 7/7] changing leaf seg queue to realtime --- config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.yml b/config.yml index 3a14a320..181a2887 100644 --- a/config.yml +++ b/config.yml @@ -288,7 +288,7 @@ hpc_submission_settings832: # ── LEAF SEGMENTATION SETTINGS ─────────────────────────────────────────── nersc_segmentation_dinov3_leaf: # ── SLURM resource allocation ───────────────────────────────────────────── - qos: regular + qos: realtime account: als constraint: gpu reservation: ""