parsl 2024.5.27__py3-none-any.whl → 2024.6.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- parsl/__init__.py +9 -10
- parsl/addresses.py +6 -4
- parsl/app/app.py +3 -6
- parsl/app/bash.py +4 -4
- parsl/app/errors.py +5 -3
- parsl/app/futures.py +3 -3
- parsl/app/python.py +2 -1
- parsl/benchmark/perf.py +2 -1
- parsl/channels/__init__.py +2 -2
- parsl/channels/base.py +0 -1
- parsl/channels/errors.py +2 -1
- parsl/channels/oauth_ssh/oauth_ssh.py +4 -3
- parsl/channels/ssh/ssh.py +9 -1
- parsl/channels/ssh_il/ssh_il.py +1 -0
- parsl/concurrent/__init__.py +2 -2
- parsl/config.py +5 -5
- parsl/configs/ASPIRE1.py +3 -3
- parsl/configs/Azure.py +6 -7
- parsl/configs/ad_hoc.py +4 -3
- parsl/configs/bridges.py +3 -3
- parsl/configs/cc_in2p3.py +2 -2
- parsl/configs/ec2.py +1 -1
- parsl/configs/expanse.py +1 -2
- parsl/configs/frontera.py +2 -3
- parsl/configs/htex_local.py +1 -2
- parsl/configs/illinoiscluster.py +1 -1
- parsl/configs/kubernetes.py +1 -2
- parsl/configs/midway.py +3 -3
- parsl/configs/osg.py +1 -1
- parsl/configs/polaris.py +1 -1
- parsl/configs/stampede2.py +4 -5
- parsl/configs/summit.py +1 -3
- parsl/configs/toss3_llnl.py +1 -2
- parsl/configs/vineex_local.py +3 -3
- parsl/configs/wqex_local.py +2 -2
- parsl/data_provider/data_manager.py +3 -3
- parsl/data_provider/file_noop.py +1 -2
- parsl/data_provider/files.py +3 -3
- parsl/data_provider/ftp.py +1 -3
- parsl/data_provider/globus.py +7 -6
- parsl/data_provider/http.py +2 -2
- parsl/data_provider/rsync.py +1 -1
- parsl/data_provider/staging.py +2 -2
- parsl/data_provider/zip.py +4 -5
- parsl/dataflow/dflow.py +21 -16
- parsl/dataflow/errors.py +2 -1
- parsl/dataflow/futures.py +1 -2
- parsl/dataflow/memoization.py +5 -5
- parsl/dataflow/rundirs.py +1 -1
- parsl/dataflow/taskrecord.py +4 -5
- parsl/executors/__init__.py +3 -3
- parsl/executors/base.py +1 -0
- parsl/executors/flux/execute_parsl_task.py +2 -2
- parsl/executors/flux/executor.py +11 -12
- parsl/executors/flux/flux_instance_manager.py +3 -3
- parsl/executors/high_throughput/executor.py +29 -35
- parsl/executors/high_throughput/interchange.py +16 -18
- parsl/executors/high_throughput/manager_record.py +1 -0
- parsl/executors/high_throughput/monitoring_info.py +2 -1
- parsl/executors/high_throughput/mpi_executor.py +5 -2
- parsl/executors/high_throughput/mpi_prefix_composer.py +1 -1
- parsl/executors/high_throughput/mpi_resource_management.py +1 -2
- parsl/executors/high_throughput/probe.py +6 -4
- parsl/executors/high_throughput/process_worker_pool.py +31 -20
- parsl/executors/high_throughput/zmq_pipes.py +28 -14
- parsl/executors/radical/executor.py +15 -15
- parsl/executors/radical/rpex_master.py +1 -2
- parsl/executors/radical/rpex_resources.py +1 -2
- parsl/executors/radical/rpex_worker.py +2 -1
- parsl/executors/status_handling.py +5 -4
- parsl/executors/taskvine/__init__.py +1 -1
- parsl/executors/taskvine/errors.py +1 -1
- parsl/executors/taskvine/exec_parsl_function.py +2 -2
- parsl/executors/taskvine/executor.py +23 -24
- parsl/executors/taskvine/factory.py +1 -1
- parsl/executors/taskvine/manager.py +11 -13
- parsl/executors/threads.py +4 -5
- parsl/executors/workqueue/errors.py +1 -1
- parsl/executors/workqueue/exec_parsl_function.py +5 -4
- parsl/executors/workqueue/executor.py +26 -27
- parsl/executors/workqueue/parsl_coprocess.py +1 -1
- parsl/jobs/error_handlers.py +1 -1
- parsl/jobs/job_status_poller.py +2 -5
- parsl/jobs/states.py +1 -1
- parsl/jobs/strategy.py +2 -2
- parsl/launchers/__init__.py +12 -3
- parsl/launchers/errors.py +1 -1
- parsl/log_utils.py +1 -2
- parsl/monitoring/db_manager.py +16 -10
- parsl/monitoring/monitoring.py +11 -15
- parsl/monitoring/queries/pandas.py +1 -2
- parsl/monitoring/radios.py +2 -4
- parsl/monitoring/remote.py +13 -8
- parsl/monitoring/router.py +8 -11
- parsl/monitoring/types.py +2 -0
- parsl/monitoring/visualization/app.py +4 -2
- parsl/monitoring/visualization/models.py +0 -1
- parsl/monitoring/visualization/plots/default/workflow_plots.py +8 -4
- parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +1 -0
- parsl/monitoring/visualization/utils.py +0 -1
- parsl/monitoring/visualization/views.py +16 -9
- parsl/multiprocessing.py +0 -1
- parsl/process_loggers.py +1 -2
- parsl/providers/__init__.py +9 -12
- parsl/providers/ad_hoc/ad_hoc.py +1 -1
- parsl/providers/aws/aws.py +2 -3
- parsl/providers/azure/azure.py +4 -5
- parsl/providers/base.py +1 -1
- parsl/providers/cluster_provider.py +1 -1
- parsl/providers/cobalt/cobalt.py +3 -3
- parsl/providers/condor/condor.py +4 -2
- parsl/providers/errors.py +2 -2
- parsl/providers/googlecloud/googlecloud.py +2 -1
- parsl/providers/grid_engine/grid_engine.py +2 -2
- parsl/providers/kubernetes/kube.py +5 -3
- parsl/providers/local/local.py +5 -1
- parsl/providers/lsf/lsf.py +2 -2
- parsl/providers/pbspro/pbspro.py +1 -1
- parsl/providers/slurm/slurm.py +5 -5
- parsl/providers/torque/torque.py +1 -1
- parsl/serialize/__init__.py +8 -3
- parsl/serialize/base.py +1 -2
- parsl/serialize/concretes.py +5 -4
- parsl/serialize/proxystore.py +3 -2
- parsl/tests/__init__.py +1 -1
- parsl/tests/configs/ad_hoc_cluster_htex.py +4 -4
- parsl/tests/configs/azure_single_node.py +4 -5
- parsl/tests/configs/bridges.py +3 -2
- parsl/tests/configs/cc_in2p3.py +2 -2
- parsl/tests/configs/comet.py +2 -1
- parsl/tests/configs/ec2_single_node.py +1 -2
- parsl/tests/configs/ec2_spot.py +1 -2
- parsl/tests/configs/frontera.py +3 -2
- parsl/tests/configs/htex_ad_hoc_cluster.py +2 -4
- parsl/tests/configs/htex_local.py +2 -3
- parsl/tests/configs/htex_local_alternate.py +8 -11
- parsl/tests/configs/htex_local_intask_staging.py +5 -7
- parsl/tests/configs/htex_local_rsync_staging.py +4 -6
- parsl/tests/configs/local_adhoc.py +1 -1
- parsl/tests/configs/local_radical.py +1 -3
- parsl/tests/configs/local_radical_mpi.py +2 -2
- parsl/tests/configs/midway.py +2 -2
- parsl/tests/configs/nscc_singapore.py +3 -3
- parsl/tests/configs/osg_htex.py +1 -1
- parsl/tests/configs/petrelkube.py +3 -2
- parsl/tests/configs/summit.py +1 -0
- parsl/tests/configs/swan_htex.py +2 -2
- parsl/tests/configs/taskvine_ex.py +3 -5
- parsl/tests/configs/theta.py +2 -2
- parsl/tests/configs/workqueue_ex.py +3 -4
- parsl/tests/conftest.py +4 -4
- parsl/tests/integration/test_channels/test_ssh_errors.py +1 -1
- parsl/tests/integration/test_stress/test_python_simple.py +3 -4
- parsl/tests/integration/test_stress/test_python_threads.py +3 -5
- parsl/tests/manual_tests/htex_local.py +4 -4
- parsl/tests/manual_tests/test_ad_hoc_htex.py +2 -1
- parsl/tests/manual_tests/test_basic.py +1 -0
- parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +4 -4
- parsl/tests/manual_tests/test_log_filter.py +3 -1
- parsl/tests/manual_tests/test_memory_limits.py +6 -6
- parsl/tests/manual_tests/test_regression_220.py +2 -1
- parsl/tests/manual_tests/test_udp_simple.py +4 -3
- parsl/tests/manual_tests/test_worker_count.py +3 -2
- parsl/tests/scaling_tests/htex_local.py +2 -2
- parsl/tests/scaling_tests/test_scale.py +0 -9
- parsl/tests/scaling_tests/vineex_condor.py +1 -2
- parsl/tests/scaling_tests/vineex_local.py +1 -2
- parsl/tests/site_tests/test_provider.py +3 -1
- parsl/tests/site_tests/test_site.py +2 -0
- parsl/tests/sites/test_affinity.py +7 -5
- parsl/tests/sites/test_dynamic_executor.py +3 -3
- parsl/tests/sites/test_ec2.py +3 -2
- parsl/tests/sites/test_local_adhoc.py +2 -1
- parsl/tests/sites/test_worker_info.py +4 -3
- parsl/tests/test_aalst_patterns.py +0 -1
- parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
- parsl/tests/test_bash_apps/test_error_codes.py +1 -4
- parsl/tests/test_bash_apps/test_memoize_ignore_args.py +1 -0
- parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +2 -2
- parsl/tests/test_bash_apps/test_pipeline.py +1 -1
- parsl/tests/test_bash_apps/test_std_uri.py +4 -3
- parsl/tests/test_callables.py +2 -2
- parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
- parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -1
- parsl/tests/test_checkpointing/test_regression_239.py +1 -1
- parsl/tests/test_checkpointing/test_task_exit.py +1 -1
- parsl/tests/test_docs/test_from_slides.py +2 -2
- parsl/tests/test_docs/test_kwargs.py +1 -1
- parsl/tests/test_docs/test_tutorial_1.py +1 -2
- parsl/tests/test_docs/test_workflow1.py +2 -2
- parsl/tests/test_docs/test_workflow2.py +0 -1
- parsl/tests/test_error_handling/test_rand_fail.py +2 -2
- parsl/tests/test_error_handling/test_resource_spec.py +4 -2
- parsl/tests/test_error_handling/test_retries.py +2 -1
- parsl/tests/test_error_handling/test_retry_handler.py +1 -0
- parsl/tests/test_error_handling/test_retry_handler_failure.py +2 -1
- parsl/tests/test_error_handling/test_serialization_fail.py +1 -1
- parsl/tests/test_error_handling/test_wrap_with_logs.py +1 -0
- parsl/tests/test_flux.py +1 -1
- parsl/tests/test_htex/test_command_client_timeout.py +9 -12
- parsl/tests/test_htex/test_connected_blocks.py +3 -2
- parsl/tests/test_htex/test_cpu_affinity_explicit.py +5 -2
- parsl/tests/test_htex/test_disconnected_blocks.py +6 -4
- parsl/tests/test_htex/test_drain.py +5 -5
- parsl/tests/test_htex/test_htex.py +1 -2
- parsl/tests/test_htex/test_managers_command.py +3 -2
- parsl/tests/test_htex/test_multiple_disconnected_blocks.py +6 -4
- parsl/tests/test_monitoring/test_app_names.py +3 -2
- parsl/tests/test_monitoring/test_basic.py +4 -4
- parsl/tests/test_monitoring/test_db_locks.py +6 -3
- parsl/tests/test_monitoring/test_fuzz_zmq.py +6 -3
- parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +5 -5
- parsl/tests/test_monitoring/test_incomplete_futures.py +5 -3
- parsl/tests/test_monitoring/test_memoization_representation.py +4 -1
- parsl/tests/test_monitoring/test_stdouterr.py +4 -4
- parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
- parsl/tests/test_mpi_apps/test_bad_mpi_config.py +1 -1
- parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +2 -0
- parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +7 -5
- parsl/tests/test_mpi_apps/test_mpi_prefix.py +4 -4
- parsl/tests/test_mpi_apps/test_mpi_scheduler.py +7 -2
- parsl/tests/test_mpi_apps/test_mpiex.py +4 -3
- parsl/tests/test_mpi_apps/test_resource_spec.py +9 -10
- parsl/tests/test_providers/test_cobalt_deprecation_warning.py +2 -0
- parsl/tests/test_providers/test_local_provider.py +2 -1
- parsl/tests/test_providers/test_pbspro_template.py +1 -1
- parsl/tests/test_providers/test_slurm_template.py +1 -1
- parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
- parsl/tests/test_python_apps/test_context_manager.py +4 -3
- parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
- parsl/tests/test_python_apps/test_futures.py +2 -1
- parsl/tests/test_python_apps/test_join.py +0 -1
- parsl/tests/test_python_apps/test_lifted.py +3 -3
- parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
- parsl/tests/test_python_apps/test_pluggable_future_resolution.py +1 -1
- parsl/tests/test_radical/test_mpi_funcs.py +1 -1
- parsl/tests/test_regression/test_1480.py +2 -1
- parsl/tests/test_regression/test_1653.py +2 -1
- parsl/tests/test_regression/test_2652.py +1 -0
- parsl/tests/test_regression/test_69a.py +0 -1
- parsl/tests/test_regression/test_854.py +4 -2
- parsl/tests/test_regression/test_97_parallelism_0.py +1 -2
- parsl/tests/test_regression/test_98.py +0 -1
- parsl/tests/test_scaling/test_block_error_handler.py +9 -4
- parsl/tests/test_scaling/test_scale_down.py +2 -3
- parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +4 -5
- parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +3 -4
- parsl/tests/test_scaling/test_shutdown_scalein.py +1 -2
- parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
- parsl/tests/test_serialization/test_basic.py +2 -1
- parsl/tests/test_serialization/test_htex_code_cache.py +3 -4
- parsl/tests/test_serialization/test_pack_resource_spec.py +2 -1
- parsl/tests/test_serialization/test_proxystore_configured.py +10 -5
- parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
- parsl/tests/test_shutdown/test_kill_monitoring.py +3 -2
- parsl/tests/test_staging/staging_provider.py +2 -2
- parsl/tests/test_staging/test_1316.py +3 -2
- parsl/tests/test_staging/test_docs_1.py +1 -1
- parsl/tests/test_staging/test_docs_2.py +2 -1
- parsl/tests/test_staging/test_elaborate_noop_file.py +2 -2
- parsl/tests/test_staging/test_staging_https.py +2 -2
- parsl/tests/test_staging/test_staging_stdout.py +4 -3
- parsl/tests/test_staging/test_zip_in.py +6 -8
- parsl/tests/test_staging/test_zip_out.py +7 -9
- parsl/tests/test_staging/test_zip_to_zip.py +6 -8
- parsl/tests/test_summary.py +2 -1
- parsl/tests/test_thread_parallelism.py +0 -1
- parsl/tests/test_threads/test_configs.py +1 -1
- parsl/tests/test_threads/test_lazy_errors.py +2 -1
- parsl/usage_tracking/api.py +2 -3
- parsl/usage_tracking/usage.py +8 -18
- parsl/utils.py +13 -2
- parsl/version.py +1 -1
- {parsl-2024.5.27.data → parsl-2024.6.3.data}/scripts/exec_parsl_function.py +5 -4
- {parsl-2024.5.27.data → parsl-2024.6.3.data}/scripts/process_worker_pool.py +31 -20
- {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/METADATA +2 -2
- parsl-2024.6.3.dist-info/RECORD +471 -0
- parsl-2024.5.27.dist-info/RECORD +0 -471
- {parsl-2024.5.27.data → parsl-2024.6.3.data}/scripts/parsl_coprocess.py +1 -1
- {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/LICENSE +0 -0
- {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/WHEEL +0 -0
- {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/entry_points.txt +0 -0
- {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/top_level.txt +0 -0
parsl/data_provider/zip.py
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
import filelock
|
2
1
|
import logging
|
3
2
|
import os
|
4
|
-
import parsl
|
5
3
|
import zipfile
|
6
|
-
|
7
4
|
from typing import Tuple
|
8
5
|
|
9
|
-
|
6
|
+
import filelock
|
7
|
+
|
8
|
+
import parsl
|
10
9
|
from parsl.data_provider.files import File
|
10
|
+
from parsl.data_provider.staging import Staging
|
11
11
|
from parsl.errors import ParslError
|
12
12
|
|
13
|
-
|
14
13
|
logger = logging.getLogger(__name__)
|
15
14
|
|
16
15
|
|
parsl/dataflow/dflow.py
CHANGED
@@ -1,23 +1,25 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
+
|
2
3
|
import atexit
|
4
|
+
import datetime
|
5
|
+
import inspect
|
3
6
|
import logging
|
4
7
|
import os
|
5
8
|
import pathlib
|
6
9
|
import pickle
|
7
10
|
import random
|
8
|
-
import time
|
9
|
-
import typeguard
|
10
|
-
import inspect
|
11
|
-
import threading
|
12
11
|
import sys
|
13
|
-
import
|
12
|
+
import threading
|
13
|
+
import time
|
14
|
+
from concurrent.futures import Future
|
15
|
+
from functools import partial
|
14
16
|
from getpass import getuser
|
15
|
-
from
|
17
|
+
from socket import gethostname
|
16
18
|
from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
|
17
19
|
from uuid import uuid4
|
18
|
-
|
19
|
-
|
20
|
-
from
|
20
|
+
|
21
|
+
import typeguard
|
22
|
+
from typeguard import typechecked
|
21
23
|
|
22
24
|
import parsl
|
23
25
|
from parsl.app.errors import RemoteExceptionWrapper
|
@@ -31,21 +33,24 @@ from parsl.dataflow.errors import BadCheckpoint, DependencyError, JoinError
|
|
31
33
|
from parsl.dataflow.futures import AppFuture
|
32
34
|
from parsl.dataflow.memoization import Memoizer
|
33
35
|
from parsl.dataflow.rundirs import make_rundir
|
34
|
-
from parsl.dataflow.states import
|
36
|
+
from parsl.dataflow.states import FINAL_FAILURE_STATES, FINAL_STATES, States
|
35
37
|
from parsl.dataflow.taskrecord import TaskRecord
|
36
|
-
from parsl.errors import
|
37
|
-
|
38
|
-
|
38
|
+
from parsl.errors import (
|
39
|
+
ConfigurationError,
|
40
|
+
InternalConsistencyError,
|
41
|
+
NoDataFlowKernelError,
|
42
|
+
)
|
39
43
|
from parsl.executors.base import ParslExecutor
|
40
44
|
from parsl.executors.status_handling import BlockProviderExecutor
|
41
45
|
from parsl.executors.threads import ThreadPoolExecutor
|
46
|
+
from parsl.jobs.job_status_poller import JobStatusPoller
|
42
47
|
from parsl.monitoring import MonitoringHub
|
48
|
+
from parsl.monitoring.message_type import MessageType
|
43
49
|
from parsl.monitoring.remote import monitor_wrapper
|
44
50
|
from parsl.process_loggers import wrap_with_logs
|
45
51
|
from parsl.providers.base import ExecutionProvider
|
46
|
-
from parsl.
|
47
|
-
|
48
|
-
from parsl.monitoring.message_type import MessageType
|
52
|
+
from parsl.usage_tracking.usage import UsageTracker
|
53
|
+
from parsl.utils import Timer, get_all_checkpoints, get_std_fname_mode, get_version
|
49
54
|
|
50
55
|
logger = logging.getLogger(__name__)
|
51
56
|
|
parsl/dataflow/errors.py
CHANGED
parsl/dataflow/futures.py
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from concurrent.futures import Future
|
4
3
|
import logging
|
5
4
|
import threading
|
5
|
+
from concurrent.futures import Future
|
6
6
|
from typing import Any, Optional, Sequence, Union
|
7
7
|
|
8
8
|
import parsl.app.app as app
|
9
|
-
|
10
9
|
from parsl.app.futures import DataFuture
|
11
10
|
from parsl.dataflow.taskrecord import TaskRecord
|
12
11
|
|
parsl/dataflow/memoization.py
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
+
|
2
3
|
import hashlib
|
3
|
-
from functools import lru_cache, singledispatch
|
4
4
|
import logging
|
5
5
|
import pickle
|
6
|
-
from
|
6
|
+
from functools import lru_cache, singledispatch
|
7
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
7
8
|
|
8
|
-
from
|
9
|
+
from parsl.dataflow.taskrecord import TaskRecord
|
9
10
|
|
10
11
|
if TYPE_CHECKING:
|
11
12
|
from parsl import DataFlowKernel # import loop at runtime - needed for typechecking - TODO turn into "if typing:"
|
12
13
|
|
13
|
-
from concurrent.futures import Future
|
14
|
-
|
15
14
|
import types
|
15
|
+
from concurrent.futures import Future
|
16
16
|
|
17
17
|
logger = logging.getLogger(__name__)
|
18
18
|
|
parsl/dataflow/rundirs.py
CHANGED
parsl/dataflow/taskrecord.py
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
import threading
|
4
3
|
import datetime
|
5
|
-
|
4
|
+
import threading
|
6
5
|
from concurrent.futures import Future
|
7
6
|
|
8
|
-
|
9
7
|
# only for type checking:
|
10
|
-
from typing import Any, Callable, Dict,
|
8
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Sequence, Union
|
9
|
+
|
10
|
+
from typing_extensions import TypedDict
|
11
11
|
|
12
12
|
if TYPE_CHECKING:
|
13
13
|
from parsl.dataflow.futures import AppFuture
|
14
14
|
|
15
15
|
import parsl.dataflow.dflow as dflow
|
16
|
-
|
17
16
|
from parsl.dataflow.states import States
|
18
17
|
|
19
18
|
|
parsl/executors/__init__.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
from parsl.executors.
|
2
|
-
from parsl.executors.workqueue.executor import WorkQueueExecutor
|
1
|
+
from parsl.executors.flux.executor import FluxExecutor
|
3
2
|
from parsl.executors.high_throughput.executor import HighThroughputExecutor
|
4
3
|
from parsl.executors.high_throughput.mpi_executor import MPIExecutor
|
5
|
-
from parsl.executors.
|
4
|
+
from parsl.executors.threads import ThreadPoolExecutor
|
5
|
+
from parsl.executors.workqueue.executor import WorkQueueExecutor
|
6
6
|
|
7
7
|
__all__ = ['ThreadPoolExecutor',
|
8
8
|
'HighThroughputExecutor',
|
parsl/executors/base.py
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
"""Script for executing tasks inside of Flux jobs."""
|
2
2
|
|
3
3
|
import argparse
|
4
|
-
import os
|
5
4
|
import logging
|
5
|
+
import os
|
6
6
|
|
7
|
+
from parsl.executors.flux import TaskResult
|
7
8
|
from parsl.executors.high_throughput.process_worker_pool import execute_task
|
8
9
|
from parsl.serialize import serialize
|
9
|
-
from parsl.executors.flux import TaskResult
|
10
10
|
|
11
11
|
|
12
12
|
def main():
|
parsl/executors/flux/executor.py
CHANGED
@@ -1,33 +1,32 @@
|
|
1
1
|
"""Defines the FluxExecutor class."""
|
2
2
|
|
3
|
+
import collections
|
3
4
|
import concurrent.futures as cf
|
4
5
|
import functools
|
6
|
+
import itertools
|
5
7
|
import os
|
8
|
+
import queue
|
9
|
+
import shutil
|
6
10
|
import sys
|
7
|
-
import uuid
|
8
11
|
import threading
|
9
|
-
import
|
10
|
-
import shutil
|
11
|
-
import queue
|
12
|
-
from socket import gethostname
|
13
|
-
import collections
|
14
|
-
from collections.abc import Mapping, Callable
|
15
|
-
from typing import Optional, Any, Dict
|
12
|
+
import uuid
|
16
13
|
import weakref
|
14
|
+
from collections.abc import Callable, Mapping
|
15
|
+
from socket import gethostname
|
16
|
+
from typing import Any, Dict, Optional
|
17
17
|
|
18
18
|
import zmq
|
19
19
|
|
20
|
-
from parsl.
|
20
|
+
from parsl.app.errors import AppException
|
21
21
|
from parsl.executors.base import ParslExecutor
|
22
|
+
from parsl.executors.errors import ScalingFailed
|
22
23
|
from parsl.executors.flux.execute_parsl_task import __file__ as _WORKER_PATH
|
23
24
|
from parsl.executors.flux.flux_instance_manager import __file__ as _MANAGER_PATH
|
24
|
-
from parsl.executors.errors import ScalingFailed
|
25
25
|
from parsl.providers import LocalProvider
|
26
26
|
from parsl.providers.base import ExecutionProvider
|
27
27
|
from parsl.serialize import deserialize, pack_res_spec_apply_message
|
28
28
|
from parsl.serialize.errors import SerializationError
|
29
|
-
from parsl.
|
30
|
-
|
29
|
+
from parsl.utils import RepresentationMixin
|
31
30
|
|
32
31
|
_WORKER_PATH = os.path.realpath(_WORKER_PATH)
|
33
32
|
_MANAGER_PATH = os.path.realpath(_MANAGER_PATH)
|
@@ -1,10 +1,10 @@
|
|
1
1
|
"""Script meant to be the initial program of a Flux instance."""
|
2
2
|
|
3
3
|
import argparse
|
4
|
+
import logging
|
4
5
|
import os
|
5
6
|
from os.path import dirname
|
6
|
-
import
|
7
|
-
from socket import gethostname, gethostbyname
|
7
|
+
from socket import gethostbyname, gethostname
|
8
8
|
|
9
9
|
import zmq
|
10
10
|
|
@@ -16,8 +16,8 @@ def main():
|
|
16
16
|
encapsulating Flux instance.
|
17
17
|
"""
|
18
18
|
# flux imports only available when launched under Flux instance
|
19
|
-
import flux.job
|
20
19
|
import flux
|
20
|
+
import flux.job
|
21
21
|
|
22
22
|
logging.basicConfig(
|
23
23
|
level=logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s"
|
@@ -1,44 +1,39 @@
|
|
1
|
+
import logging
|
2
|
+
import math
|
3
|
+
import pickle
|
4
|
+
import threading
|
1
5
|
import typing
|
6
|
+
import warnings
|
2
7
|
from collections import defaultdict
|
3
8
|
from concurrent.futures import Future
|
4
|
-
import typeguard
|
5
|
-
import logging
|
6
|
-
import threading
|
7
|
-
import queue
|
8
|
-
import pickle
|
9
9
|
from dataclasses import dataclass
|
10
|
-
from multiprocessing import Process
|
11
|
-
from typing import Dict, Sequence
|
12
|
-
|
13
|
-
import
|
14
|
-
import warnings
|
10
|
+
from multiprocessing import Process
|
11
|
+
from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
|
12
|
+
|
13
|
+
import typeguard
|
15
14
|
|
16
15
|
import parsl.launchers
|
17
|
-
from parsl
|
18
|
-
from parsl.
|
19
|
-
from parsl.serialize.errors import SerializationError, DeserializationError
|
16
|
+
from parsl import curvezmq
|
17
|
+
from parsl.addresses import get_all_addresses
|
20
18
|
from parsl.app.errors import RemoteExceptionWrapper
|
21
|
-
from parsl.
|
22
|
-
from parsl.executors.
|
23
|
-
from parsl.executors.high_throughput import interchange
|
24
|
-
from parsl.executors.errors import
|
25
|
-
BadMessage, ScalingFailed,
|
26
|
-
)
|
19
|
+
from parsl.data_provider.staging import Staging
|
20
|
+
from parsl.executors.errors import BadMessage, ScalingFailed
|
21
|
+
from parsl.executors.high_throughput import interchange, zmq_pipes
|
22
|
+
from parsl.executors.high_throughput.errors import CommandClientTimeoutError
|
27
23
|
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
28
24
|
VALID_LAUNCHERS,
|
29
|
-
validate_resource_spec
|
25
|
+
validate_resource_spec,
|
30
26
|
)
|
31
|
-
|
32
|
-
from parsl import curvezmq
|
33
27
|
from parsl.executors.status_handling import BlockProviderExecutor
|
34
|
-
from parsl.
|
35
|
-
from parsl.data_provider.staging import Staging
|
36
|
-
from parsl.addresses import get_all_addresses
|
37
|
-
from parsl.process_loggers import wrap_with_logs
|
38
|
-
|
28
|
+
from parsl.jobs.states import TERMINAL_STATES, JobState, JobStatus
|
39
29
|
from parsl.multiprocessing import ForkProcess
|
40
|
-
from parsl.
|
30
|
+
from parsl.process_loggers import wrap_with_logs
|
41
31
|
from parsl.providers import LocalProvider
|
32
|
+
from parsl.providers.base import ExecutionProvider
|
33
|
+
from parsl.serialize import deserialize, pack_res_spec_apply_message
|
34
|
+
from parsl.serialize.errors import DeserializationError, SerializationError
|
35
|
+
from parsl.usage_tracking.api import UsageInformation
|
36
|
+
from parsl.utils import RepresentationMixin
|
42
37
|
|
43
38
|
logger = logging.getLogger(__name__)
|
44
39
|
|
@@ -415,13 +410,13 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
415
410
|
)
|
416
411
|
|
417
412
|
self.outgoing_q = zmq_pipes.TasksOutgoing(
|
418
|
-
|
413
|
+
"127.0.0.1", self.interchange_port_range, self.cert_dir
|
419
414
|
)
|
420
415
|
self.incoming_q = zmq_pipes.ResultsIncoming(
|
421
|
-
|
416
|
+
"127.0.0.1", self.interchange_port_range, self.cert_dir
|
422
417
|
)
|
423
418
|
self.command_client = zmq_pipes.CommandClient(
|
424
|
-
|
419
|
+
"127.0.0.1", self.interchange_port_range, self.cert_dir
|
425
420
|
)
|
426
421
|
|
427
422
|
self._queue_management_thread = None
|
@@ -531,9 +526,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
531
526
|
Starts the interchange process locally and uses an internal command queue to
|
532
527
|
get the worker task and result ports that the interchange has bound to.
|
533
528
|
"""
|
534
|
-
comm_q = Queue(maxsize=10)
|
535
529
|
self.interchange_proc = ForkProcess(target=interchange.starter,
|
536
|
-
args=(comm_q,),
|
537
530
|
kwargs={"client_ports": (self.outgoing_q.port,
|
538
531
|
self.incoming_q.port,
|
539
532
|
self.command_client.port),
|
@@ -552,9 +545,10 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
552
545
|
name="HTEX-Interchange"
|
553
546
|
)
|
554
547
|
self.interchange_proc.start()
|
548
|
+
|
555
549
|
try:
|
556
|
-
(self.worker_task_port, self.worker_result_port) =
|
557
|
-
except
|
550
|
+
(self.worker_task_port, self.worker_result_port) = self.command_client.run("WORKER_PORTS", timeout_s=120)
|
551
|
+
except CommandClientTimeoutError:
|
558
552
|
logger.error("Interchange has not completed initialization in 120s. Aborting")
|
559
553
|
raise Exception("Interchange failed to start")
|
560
554
|
|
@@ -1,31 +1,28 @@
|
|
1
1
|
#!/usr/bin/env python
|
2
|
-
import
|
3
|
-
import
|
2
|
+
import datetime
|
3
|
+
import json
|
4
|
+
import logging
|
4
5
|
import os
|
5
|
-
import
|
6
|
+
import pickle
|
6
7
|
import platform
|
8
|
+
import queue
|
7
9
|
import random
|
8
|
-
import time
|
9
|
-
import datetime
|
10
|
-
import pickle
|
11
10
|
import signal
|
12
|
-
import
|
13
|
-
import queue
|
11
|
+
import sys
|
14
12
|
import threading
|
15
|
-
import
|
13
|
+
import time
|
14
|
+
from typing import Any, Dict, List, NoReturn, Optional, Sequence, Set, Tuple, cast
|
16
15
|
|
17
|
-
|
16
|
+
import zmq
|
18
17
|
|
19
18
|
from parsl import curvezmq
|
20
|
-
from parsl.utils import setproctitle
|
21
|
-
from parsl.version import VERSION as PARSL_VERSION
|
22
|
-
from parsl.serialize import serialize as serialize_object
|
23
|
-
|
24
19
|
from parsl.app.errors import RemoteExceptionWrapper
|
25
20
|
from parsl.executors.high_throughput.manager_record import ManagerRecord
|
26
21
|
from parsl.monitoring.message_type import MessageType
|
27
22
|
from parsl.process_loggers import wrap_with_logs
|
28
|
-
|
23
|
+
from parsl.serialize import serialize as serialize_object
|
24
|
+
from parsl.utils import setproctitle
|
25
|
+
from parsl.version import VERSION as PARSL_VERSION
|
29
26
|
|
30
27
|
PKL_HEARTBEAT_CODE = pickle.dumps((2 ** 32) - 1)
|
31
28
|
PKL_DRAINED_CODE = pickle.dumps((2 ** 32) - 2)
|
@@ -328,6 +325,9 @@ class Interchange:
|
|
328
325
|
|
329
326
|
reply = None
|
330
327
|
|
328
|
+
elif command_req == "WORKER_PORTS":
|
329
|
+
reply = (self.worker_task_port, self.worker_result_port)
|
330
|
+
|
331
331
|
else:
|
332
332
|
logger.error(f"Received unknown command: {command_req}")
|
333
333
|
reply = None
|
@@ -672,7 +672,7 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
|
|
672
672
|
|
673
673
|
|
674
674
|
@wrap_with_logs(target="interchange")
|
675
|
-
def starter(
|
675
|
+
def starter(*args: Any, **kwargs: Any) -> None:
|
676
676
|
"""Start the interchange process
|
677
677
|
|
678
678
|
The executor is expected to call this function. The args, kwargs match that of the Interchange.__init__
|
@@ -680,6 +680,4 @@ def starter(comm_q: multiprocessing.Queue, *args: Any, **kwargs: Any) -> None:
|
|
680
680
|
setproctitle("parsl: HTEX interchange")
|
681
681
|
# logger = multiprocessing.get_logger()
|
682
682
|
ic = Interchange(*args, **kwargs)
|
683
|
-
comm_q.put((ic.worker_task_port,
|
684
|
-
ic.worker_result_port))
|
685
683
|
ic.start()
|
@@ -1,10 +1,13 @@
|
|
1
1
|
"""A simplified interface for HTEx when running in MPI mode"""
|
2
|
-
from typing import
|
2
|
+
from typing import Callable, Dict, List, Optional, Tuple, Union
|
3
3
|
|
4
4
|
import typeguard
|
5
5
|
|
6
6
|
from parsl.data_provider.staging import Staging
|
7
|
-
from parsl.executors.high_throughput.executor import
|
7
|
+
from parsl.executors.high_throughput.executor import (
|
8
|
+
GENERAL_HTEX_PARAM_DOCS,
|
9
|
+
HighThroughputExecutor,
|
10
|
+
)
|
8
11
|
from parsl.executors.status_handling import BlockProviderExecutor
|
9
12
|
from parsl.jobs.states import JobStatus
|
10
13
|
from parsl.providers import LocalProvider
|
@@ -8,8 +8,7 @@ from enum import Enum
|
|
8
8
|
from typing import Dict, List
|
9
9
|
|
10
10
|
from parsl.multiprocessing import SpawnContext
|
11
|
-
from parsl.serialize import
|
12
|
-
unpack_res_spec_apply_message)
|
11
|
+
from parsl.serialize import pack_res_spec_apply_message, unpack_res_spec_apply_message
|
13
12
|
|
14
13
|
logger = logging.getLogger(__name__)
|
15
14
|
|
@@ -1,11 +1,13 @@
|
|
1
|
-
import zmq
|
2
1
|
import argparse
|
3
|
-
import uuid
|
4
|
-
import time
|
5
2
|
import logging
|
6
|
-
|
3
|
+
import time
|
4
|
+
import uuid
|
5
|
+
|
6
|
+
import zmq
|
7
7
|
from zmq.utils.monitor import recv_monitor_message
|
8
8
|
|
9
|
+
from parsl.addresses import get_all_addresses
|
10
|
+
|
9
11
|
logger = logging.getLogger(__name__)
|
10
12
|
|
11
13
|
|
@@ -1,39 +1,41 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
|
3
3
|
import argparse
|
4
|
+
import json
|
4
5
|
import logging
|
6
|
+
import math
|
7
|
+
import multiprocessing
|
5
8
|
import os
|
6
|
-
import
|
9
|
+
import pickle
|
7
10
|
import platform
|
11
|
+
import queue
|
12
|
+
import sys
|
8
13
|
import threading
|
9
|
-
import pickle
|
10
14
|
import time
|
11
|
-
import queue
|
12
15
|
import uuid
|
13
|
-
from typing import Sequence, Optional, Dict, List
|
14
|
-
|
15
|
-
import zmq
|
16
|
-
import math
|
17
|
-
import json
|
18
|
-
import psutil
|
19
|
-
import multiprocessing
|
20
16
|
from multiprocessing.managers import DictProxy
|
21
17
|
from multiprocessing.sharedctypes import Synchronized
|
18
|
+
from typing import Dict, List, Optional, Sequence
|
19
|
+
|
20
|
+
import psutil
|
21
|
+
import zmq
|
22
22
|
|
23
23
|
from parsl import curvezmq
|
24
|
-
from parsl.process_loggers import wrap_with_logs
|
25
|
-
from parsl.version import VERSION as PARSL_VERSION
|
26
24
|
from parsl.app.errors import RemoteExceptionWrapper
|
27
25
|
from parsl.executors.high_throughput.errors import WorkerLost
|
28
|
-
from parsl.executors.high_throughput.
|
29
|
-
|
30
|
-
|
26
|
+
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
27
|
+
VALID_LAUNCHERS,
|
28
|
+
compose_all,
|
29
|
+
)
|
31
30
|
from parsl.executors.high_throughput.mpi_resource_management import (
|
31
|
+
MPITaskScheduler,
|
32
32
|
TaskScheduler,
|
33
|
-
MPITaskScheduler
|
34
33
|
)
|
35
|
-
|
36
|
-
from parsl.
|
34
|
+
from parsl.executors.high_throughput.probe import probe_addresses
|
35
|
+
from parsl.multiprocessing import SpawnContext
|
36
|
+
from parsl.process_loggers import wrap_with_logs
|
37
|
+
from parsl.serialize import serialize, unpack_res_spec_apply_message
|
38
|
+
from parsl.version import VERSION as PARSL_VERSION
|
37
39
|
|
38
40
|
HEARTBEAT_CODE = (2 ** 32) - 1
|
39
41
|
DRAINED_CODE = (2 ** 32) - 2
|
@@ -677,7 +679,8 @@ def worker(
|
|
677
679
|
# If desired, set process affinity
|
678
680
|
if cpu_affinity != "none":
|
679
681
|
# Count the number of cores per worker
|
680
|
-
|
682
|
+
# OSX does not implement os.sched_getaffinity
|
683
|
+
avail_cores = sorted(os.sched_getaffinity(0)) # type: ignore[attr-defined, unused-ignore]
|
681
684
|
cores_per_worker = len(avail_cores) // pool_size
|
682
685
|
assert cores_per_worker > 0, "Affinity does not work if there are more workers than cores"
|
683
686
|
|
@@ -717,7 +720,15 @@ def worker(
|
|
717
720
|
os.environ["KMP_AFFINITY"] = f"explicit,proclist=[{proc_list}]" # For Intel OpenMP
|
718
721
|
|
719
722
|
# Set the affinity for this worker
|
720
|
-
os.sched_setaffinity
|
723
|
+
# OSX does not implement os.sched_setaffinity so type checking
|
724
|
+
# is ignored here in two ways:
|
725
|
+
# On a platform without sched_setaffinity, that attribute will not
|
726
|
+
# be defined, so ignore[attr-defined] will tell mypy to ignore this
|
727
|
+
# incorrect-for-OS X attribute access.
|
728
|
+
# On a platform with sched_setaffinity, that type: ignore message
|
729
|
+
# will be redundant, and ignore[unused-ignore] tells mypy to ignore
|
730
|
+
# that this ignore is unneeded.
|
731
|
+
os.sched_setaffinity(0, my_cores) # type: ignore[attr-defined, unused-ignore]
|
721
732
|
logger.info("Set worker CPU affinity to {}".format(my_cores))
|
722
733
|
|
723
734
|
# If desired, pin to accelerator
|