parsl 2024.3.11__py3-none-any.whl → 2025.1.13__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 +29 -7
- parsl/app/app.py +7 -8
- parsl/app/bash.py +15 -8
- parsl/app/errors.py +10 -13
- parsl/app/futures.py +8 -10
- parsl/app/python.py +2 -1
- parsl/benchmark/perf.py +2 -1
- parsl/concurrent/__init__.py +2 -2
- parsl/config.py +57 -10
- parsl/configs/ASPIRE1.py +6 -5
- parsl/configs/Azure.py +9 -8
- parsl/configs/bridges.py +6 -4
- parsl/configs/cc_in2p3.py +3 -3
- parsl/configs/ec2.py +3 -1
- parsl/configs/expanse.py +4 -3
- parsl/configs/frontera.py +3 -4
- parsl/configs/htex_local.py +3 -4
- parsl/configs/illinoiscluster.py +3 -1
- parsl/configs/improv.py +34 -0
- parsl/configs/kubernetes.py +4 -3
- parsl/configs/local_threads.py +5 -1
- parsl/configs/midway.py +5 -3
- parsl/configs/osg.py +4 -2
- parsl/configs/polaris.py +4 -2
- parsl/configs/stampede2.py +6 -5
- parsl/configs/summit.py +3 -3
- parsl/configs/toss3_llnl.py +4 -3
- parsl/configs/vineex_local.py +6 -4
- parsl/configs/wqex_local.py +5 -3
- parsl/curvezmq.py +4 -0
- parsl/data_provider/data_manager.py +4 -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 +135 -0
- parsl/dataflow/dependency_resolvers.py +115 -0
- parsl/dataflow/dflow.py +262 -224
- parsl/dataflow/errors.py +3 -5
- parsl/dataflow/futures.py +27 -14
- parsl/dataflow/memoization.py +5 -5
- parsl/dataflow/rundirs.py +5 -6
- parsl/dataflow/taskrecord.py +4 -5
- parsl/executors/__init__.py +4 -2
- parsl/executors/base.py +45 -15
- parsl/executors/errors.py +13 -0
- parsl/executors/execute_task.py +37 -0
- parsl/executors/flux/execute_parsl_task.py +3 -3
- parsl/executors/flux/executor.py +18 -19
- parsl/executors/flux/flux_instance_manager.py +26 -27
- parsl/executors/high_throughput/errors.py +43 -3
- parsl/executors/high_throughput/executor.py +316 -282
- parsl/executors/high_throughput/interchange.py +158 -167
- parsl/executors/high_throughput/manager_record.py +5 -0
- parsl/executors/high_throughput/manager_selector.py +55 -0
- parsl/executors/high_throughput/monitoring_info.py +2 -1
- parsl/executors/high_throughput/mpi_executor.py +113 -0
- parsl/executors/high_throughput/mpi_prefix_composer.py +10 -11
- parsl/executors/high_throughput/mpi_resource_management.py +6 -17
- parsl/executors/high_throughput/probe.py +9 -7
- parsl/executors/high_throughput/process_worker_pool.py +115 -77
- parsl/executors/high_throughput/zmq_pipes.py +81 -23
- parsl/executors/radical/executor.py +130 -79
- parsl/executors/radical/rpex_resources.py +17 -15
- parsl/executors/radical/rpex_worker.py +4 -3
- parsl/executors/status_handling.py +157 -51
- 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 +41 -57
- parsl/executors/taskvine/factory.py +1 -1
- parsl/executors/taskvine/factory_config.py +1 -1
- parsl/executors/taskvine/manager.py +18 -13
- parsl/executors/taskvine/manager_config.py +9 -5
- parsl/executors/threads.py +6 -6
- parsl/executors/workqueue/errors.py +1 -1
- parsl/executors/workqueue/exec_parsl_function.py +6 -5
- parsl/executors/workqueue/executor.py +64 -63
- parsl/executors/workqueue/parsl_coprocess.py +1 -1
- parsl/jobs/error_handlers.py +2 -2
- parsl/jobs/job_status_poller.py +30 -113
- parsl/jobs/states.py +7 -2
- parsl/jobs/strategy.py +43 -31
- parsl/launchers/__init__.py +12 -3
- parsl/launchers/errors.py +1 -1
- parsl/launchers/launchers.py +6 -12
- parsl/log_utils.py +9 -6
- parsl/monitoring/db_manager.py +59 -95
- parsl/monitoring/errors.py +6 -0
- parsl/monitoring/monitoring.py +87 -356
- parsl/monitoring/queries/pandas.py +1 -2
- parsl/monitoring/radios/base.py +13 -0
- parsl/monitoring/radios/filesystem.py +52 -0
- parsl/monitoring/radios/htex.py +57 -0
- parsl/monitoring/radios/multiprocessing.py +17 -0
- parsl/monitoring/radios/udp.py +56 -0
- parsl/monitoring/radios/zmq.py +17 -0
- parsl/monitoring/remote.py +33 -37
- parsl/monitoring/router.py +212 -0
- parsl/monitoring/types.py +5 -6
- parsl/monitoring/visualization/app.py +4 -2
- parsl/monitoring/visualization/models.py +0 -1
- parsl/monitoring/visualization/plots/default/workflow_plots.py +11 -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 -8
- parsl/multiprocessing.py +0 -1
- parsl/process_loggers.py +1 -2
- parsl/providers/__init__.py +8 -17
- parsl/providers/aws/aws.py +2 -3
- parsl/providers/azure/azure.py +4 -5
- parsl/providers/base.py +2 -18
- parsl/providers/cluster_provider.py +4 -12
- parsl/providers/condor/condor.py +7 -17
- parsl/providers/errors.py +2 -2
- parsl/providers/googlecloud/googlecloud.py +2 -1
- parsl/providers/grid_engine/grid_engine.py +5 -14
- parsl/providers/kubernetes/kube.py +80 -40
- parsl/providers/local/local.py +13 -26
- parsl/providers/lsf/lsf.py +5 -23
- parsl/providers/pbspro/pbspro.py +5 -17
- parsl/providers/slurm/slurm.py +81 -39
- parsl/providers/torque/torque.py +3 -14
- parsl/serialize/__init__.py +8 -3
- parsl/serialize/base.py +1 -2
- parsl/serialize/concretes.py +5 -4
- parsl/serialize/facade.py +3 -3
- parsl/serialize/proxystore.py +3 -2
- parsl/tests/__init__.py +1 -1
- parsl/tests/configs/azure_single_node.py +4 -5
- parsl/tests/configs/bridges.py +3 -2
- parsl/tests/configs/cc_in2p3.py +1 -3
- 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/flux_local.py +11 -0
- parsl/tests/configs/frontera.py +2 -3
- parsl/tests/configs/htex_local.py +3 -5
- parsl/tests/configs/htex_local_alternate.py +11 -15
- parsl/tests/configs/htex_local_intask_staging.py +5 -9
- parsl/tests/configs/htex_local_rsync_staging.py +4 -8
- parsl/tests/configs/local_radical.py +1 -3
- parsl/tests/configs/local_radical_mpi.py +2 -2
- parsl/tests/configs/local_threads_checkpoint_periodic.py +8 -10
- parsl/tests/configs/local_threads_monitoring.py +0 -1
- 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/slurm_local.py +24 -0
- parsl/tests/configs/summit.py +1 -0
- parsl/tests/configs/taskvine_ex.py +4 -7
- parsl/tests/configs/user_opts.py +2 -8
- parsl/tests/configs/workqueue_ex.py +4 -6
- parsl/tests/conftest.py +27 -13
- 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 -6
- parsl/tests/manual_tests/test_basic.py +1 -0
- parsl/tests/manual_tests/test_log_filter.py +3 -1
- parsl/tests/manual_tests/test_memory_limits.py +6 -8
- parsl/tests/manual_tests/test_regression_220.py +2 -1
- parsl/tests/manual_tests/test_udp_simple.py +4 -4
- parsl/tests/manual_tests/test_worker_count.py +3 -2
- parsl/tests/scaling_tests/htex_local.py +2 -4
- 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/site_config_selector.py +1 -6
- parsl/tests/site_tests/test_provider.py +4 -2
- parsl/tests/site_tests/test_site.py +2 -0
- parsl/tests/sites/test_affinity.py +7 -7
- parsl/tests/sites/test_dynamic_executor.py +3 -4
- parsl/tests/sites/test_ec2.py +3 -2
- parsl/tests/sites/test_worker_info.py +4 -5
- parsl/tests/test_aalst_patterns.py +0 -1
- parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
- parsl/tests/test_bash_apps/test_basic.py +10 -4
- parsl/tests/test_bash_apps/test_error_codes.py +5 -7
- parsl/tests/test_bash_apps/test_inputs_default.py +25 -0
- parsl/tests/test_bash_apps/test_kwarg_storage.py +1 -1
- parsl/tests/test_bash_apps/test_memoize.py +2 -8
- parsl/tests/test_bash_apps/test_memoize_ignore_args.py +9 -14
- parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +9 -14
- parsl/tests/test_bash_apps/test_multiline.py +1 -1
- parsl/tests/test_bash_apps/test_pipeline.py +1 -1
- parsl/tests/test_bash_apps/test_std_uri.py +123 -0
- parsl/tests/test_bash_apps/test_stdout.py +33 -8
- parsl/tests/test_callables.py +2 -2
- parsl/tests/test_checkpointing/test_periodic.py +21 -39
- parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
- parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -2
- parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -1
- parsl/tests/test_checkpointing/test_regression_239.py +1 -1
- parsl/tests/test_checkpointing/test_task_exit.py +2 -3
- parsl/tests/test_docs/test_from_slides.py +5 -2
- parsl/tests/test_docs/test_kwargs.py +4 -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 +10 -12
- parsl/tests/test_error_handling/test_retries.py +6 -16
- 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_execute_task.py +29 -0
- parsl/tests/test_flux.py +1 -1
- parsl/tests/test_htex/test_basic.py +2 -3
- parsl/tests/test_htex/test_block_manager_selector_unit.py +20 -0
- parsl/tests/test_htex/test_command_client_timeout.py +66 -0
- parsl/tests/test_htex/test_connected_blocks.py +3 -2
- parsl/tests/test_htex/test_cpu_affinity_explicit.py +6 -10
- parsl/tests/test_htex/test_disconnected_blocks.py +6 -5
- parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +71 -0
- parsl/tests/test_htex/test_drain.py +79 -0
- parsl/tests/test_htex/test_htex.py +51 -25
- parsl/tests/test_htex/test_manager_failure.py +0 -1
- parsl/tests/test_htex/test_manager_selector_by_block.py +51 -0
- parsl/tests/test_htex/test_managers_command.py +36 -0
- parsl/tests/test_htex/test_missing_worker.py +2 -12
- parsl/tests/test_htex/test_multiple_disconnected_blocks.py +9 -9
- parsl/tests/test_htex/test_resource_spec_validation.py +45 -0
- parsl/tests/test_htex/test_zmq_binding.py +29 -8
- parsl/tests/test_monitoring/test_app_names.py +86 -0
- parsl/tests/test_monitoring/test_basic.py +73 -25
- parsl/tests/test_monitoring/test_db_locks.py +6 -4
- parsl/tests/test_monitoring/test_fuzz_zmq.py +19 -8
- parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +80 -0
- parsl/tests/test_monitoring/test_incomplete_futures.py +5 -4
- parsl/tests/test_monitoring/test_memoization_representation.py +4 -2
- parsl/tests/test_monitoring/test_stdouterr.py +134 -0
- parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
- parsl/tests/test_mpi_apps/test_bad_mpi_config.py +33 -26
- parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +28 -11
- 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 +64 -0
- parsl/tests/test_mpi_apps/test_resource_spec.py +42 -49
- parsl/tests/test_providers/test_kubernetes_provider.py +102 -0
- parsl/tests/test_providers/test_local_provider.py +3 -132
- parsl/tests/test_providers/test_pbspro_template.py +2 -3
- parsl/tests/test_providers/test_slurm_template.py +2 -3
- parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
- parsl/tests/test_python_apps/test_context_manager.py +128 -0
- parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
- parsl/tests/test_python_apps/test_dependencies_deep.py +59 -0
- parsl/tests/test_python_apps/test_fail.py +0 -25
- parsl/tests/test_python_apps/test_futures.py +2 -1
- parsl/tests/test_python_apps/test_inputs_default.py +22 -0
- parsl/tests/test_python_apps/test_join.py +0 -1
- parsl/tests/test_python_apps/test_lifted.py +11 -7
- parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
- parsl/tests/test_python_apps/test_outputs.py +1 -1
- parsl/tests/test_python_apps/test_pluggable_future_resolution.py +161 -0
- parsl/tests/test_radical/test_mpi_funcs.py +1 -2
- parsl/tests/test_regression/test_1480.py +2 -1
- parsl/tests/test_regression/test_1653.py +2 -1
- parsl/tests/test_regression/test_226.py +1 -0
- 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_regression_1621.py +11 -15
- parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +84 -0
- parsl/tests/test_scaling/test_regression_3696_oscillation.py +103 -0
- parsl/tests/test_scaling/test_scale_down.py +2 -5
- parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +6 -18
- parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +71 -0
- parsl/tests/test_scaling/test_shutdown_scalein.py +73 -0
- parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +90 -0
- parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
- parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +47 -0
- 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 -6
- parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
- parsl/tests/test_shutdown/test_kill_monitoring.py +64 -0
- parsl/tests/test_staging/staging_provider.py +2 -2
- parsl/tests/test_staging/test_1316.py +3 -4
- parsl/tests/test_staging/test_docs_1.py +2 -1
- parsl/tests/test_staging/test_docs_2.py +2 -1
- parsl/tests/test_staging/test_elaborate_noop_file.py +2 -3
- parsl/tests/{test_data → test_staging}/test_file.py +6 -6
- parsl/tests/{test_data → test_staging}/test_output_chain_filenames.py +3 -0
- parsl/tests/test_staging/test_staging_ftp.py +1 -0
- parsl/tests/test_staging/test_staging_https.py +5 -2
- parsl/tests/test_staging/test_staging_stdout.py +64 -0
- parsl/tests/test_staging/test_zip_in.py +39 -0
- parsl/tests/test_staging/test_zip_out.py +110 -0
- parsl/tests/test_staging/test_zip_to_zip.py +41 -0
- parsl/tests/test_summary.py +2 -2
- parsl/tests/test_thread_parallelism.py +0 -1
- parsl/tests/test_threads/test_configs.py +1 -2
- parsl/tests/test_threads/test_lazy_errors.py +2 -2
- parsl/tests/test_utils/test_execute_wait.py +35 -0
- parsl/tests/test_utils/test_sanitize_dns.py +76 -0
- parsl/tests/unit/test_address.py +20 -0
- parsl/tests/unit/test_file.py +99 -0
- parsl/tests/unit/test_usage_tracking.py +66 -0
- parsl/usage_tracking/api.py +65 -0
- parsl/usage_tracking/levels.py +6 -0
- parsl/usage_tracking/usage.py +104 -62
- parsl/utils.py +139 -6
- parsl/version.py +1 -1
- {parsl-2024.3.11.data → parsl-2025.1.13.data}/scripts/exec_parsl_function.py +6 -5
- parsl-2025.1.13.data/scripts/interchange.py +649 -0
- {parsl-2024.3.11.data → parsl-2025.1.13.data}/scripts/process_worker_pool.py +115 -77
- parsl-2025.1.13.dist-info/METADATA +96 -0
- parsl-2025.1.13.dist-info/RECORD +462 -0
- {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/WHEEL +1 -1
- parsl/channels/__init__.py +0 -7
- parsl/channels/base.py +0 -141
- parsl/channels/errors.py +0 -113
- parsl/channels/local/local.py +0 -164
- parsl/channels/oauth_ssh/oauth_ssh.py +0 -110
- parsl/channels/ssh/ssh.py +0 -276
- parsl/channels/ssh_il/__init__.py +0 -0
- parsl/channels/ssh_il/ssh_il.py +0 -74
- parsl/configs/ad_hoc.py +0 -35
- parsl/executors/radical/rpex_master.py +0 -42
- parsl/monitoring/radios.py +0 -175
- parsl/providers/ad_hoc/__init__.py +0 -0
- parsl/providers/ad_hoc/ad_hoc.py +0 -248
- parsl/providers/cobalt/__init__.py +0 -0
- parsl/providers/cobalt/cobalt.py +0 -236
- parsl/providers/cobalt/template.py +0 -17
- parsl/tests/configs/ad_hoc_cluster_htex.py +0 -35
- parsl/tests/configs/cooley_htex.py +0 -37
- parsl/tests/configs/htex_ad_hoc_cluster.py +0 -28
- parsl/tests/configs/local_adhoc.py +0 -18
- parsl/tests/configs/swan_htex.py +0 -43
- parsl/tests/configs/theta.py +0 -37
- parsl/tests/integration/test_channels/__init__.py +0 -0
- parsl/tests/integration/test_channels/test_channels.py +0 -17
- parsl/tests/integration/test_channels/test_local_channel.py +0 -42
- parsl/tests/integration/test_channels/test_scp_1.py +0 -45
- parsl/tests/integration/test_channels/test_ssh_1.py +0 -40
- parsl/tests/integration/test_channels/test_ssh_errors.py +0 -46
- parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -41
- parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -24
- parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -48
- parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -88
- parsl/tests/manual_tests/test_oauth_ssh.py +0 -13
- parsl/tests/sites/test_local_adhoc.py +0 -61
- parsl/tests/test_channels/__init__.py +0 -0
- parsl/tests/test_channels/test_large_output.py +0 -22
- parsl/tests/test_data/__init__.py +0 -0
- parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -51
- parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -16
- parsl-2024.3.11.dist-info/METADATA +0 -98
- parsl-2024.3.11.dist-info/RECORD +0 -447
- parsl/{channels/local → monitoring/radios}/__init__.py +0 -0
- parsl/{channels/oauth_ssh → tests/test_shutdown}/__init__.py +0 -0
- parsl/tests/{test_data → test_staging}/test_file_apps.py +0 -0
- parsl/tests/{test_data → test_staging}/test_file_staging.py +0 -0
- parsl/{channels/ssh → tests/unit}/__init__.py +0 -0
- {parsl-2024.3.11.data → parsl-2025.1.13.data}/scripts/parsl_coprocess.py +1 -1
- {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/LICENSE +0 -0
- {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/entry_points.txt +0 -0
- {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/top_level.txt +0 -0
parsl/__init__.py
CHANGED
@@ -15,24 +15,23 @@ AUTO_LOGNAME
|
|
15
15
|
|
16
16
|
"""
|
17
17
|
import logging
|
18
|
+
import multiprocessing as _multiprocessing
|
18
19
|
import os
|
19
20
|
import platform
|
20
21
|
|
21
|
-
from parsl.version import VERSION
|
22
22
|
from parsl.app.app import bash_app, join_app, python_app
|
23
23
|
from parsl.config import Config
|
24
|
-
from parsl.executors import ThreadPoolExecutor
|
25
|
-
from parsl.executors import HighThroughputExecutor
|
26
|
-
from parsl.executors import WorkQueueExecutor
|
27
|
-
from parsl.log_utils import set_stream_logger
|
28
|
-
from parsl.log_utils import set_file_logger
|
29
|
-
from parsl.monitoring import MonitoringHub
|
30
|
-
|
31
24
|
from parsl.data_provider.files import File
|
32
|
-
|
33
25
|
from parsl.dataflow.dflow import DataFlowKernel, DataFlowKernelLoader
|
26
|
+
from parsl.executors import (
|
27
|
+
HighThroughputExecutor,
|
28
|
+
ThreadPoolExecutor,
|
29
|
+
WorkQueueExecutor,
|
30
|
+
)
|
31
|
+
from parsl.log_utils import set_file_logger, set_stream_logger
|
32
|
+
from parsl.monitoring import MonitoringHub
|
33
|
+
from parsl.version import VERSION
|
34
34
|
|
35
|
-
import multiprocessing as _multiprocessing
|
36
35
|
if platform.system() == 'Darwin':
|
37
36
|
_multiprocessing.set_start_method('fork', force=True)
|
38
37
|
|
parsl/addresses.py
CHANGED
@@ -6,19 +6,22 @@ The helper to use depends on the network environment around the submitter,
|
|
6
6
|
so some experimentation will probably be needed to choose the correct one.
|
7
7
|
"""
|
8
8
|
|
9
|
+
import ipaddress
|
9
10
|
import logging
|
10
11
|
import platform
|
11
|
-
import requests
|
12
12
|
import socket
|
13
|
+
|
14
|
+
import requests
|
15
|
+
|
13
16
|
try:
|
14
17
|
import fcntl
|
15
18
|
except ImportError:
|
16
19
|
fcntl = None # type: ignore[assignment]
|
17
20
|
import struct
|
18
|
-
import
|
19
|
-
import psutil
|
21
|
+
from typing import Callable, List, Set, Union
|
20
22
|
|
21
|
-
|
23
|
+
import psutil
|
24
|
+
import typeguard
|
22
25
|
|
23
26
|
logger = logging.getLogger(__name__)
|
24
27
|
|
@@ -81,7 +84,9 @@ def address_by_hostname() -> str:
|
|
81
84
|
def address_by_interface(ifname: str) -> str:
|
82
85
|
"""Returns the IP address of the given interface name, e.g. 'eth0'
|
83
86
|
|
84
|
-
This is from a Stack Overflow answer:
|
87
|
+
This is taken from a Stack Overflow answer:
|
88
|
+
https://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-of-eth0-in-python#24196955
|
89
|
+
|
85
90
|
|
86
91
|
Parameters
|
87
92
|
----------
|
@@ -111,7 +116,7 @@ def get_all_addresses() -> Set[str]:
|
|
111
116
|
try:
|
112
117
|
s_addresses.add(address_by_interface(interface))
|
113
118
|
except Exception:
|
114
|
-
logger.
|
119
|
+
logger.debug("Ignoring failure to fetch address from interface {}".format(interface))
|
115
120
|
|
116
121
|
resolution_functions: List[Callable[[], str]]
|
117
122
|
resolution_functions = [address_by_hostname, address_by_route, address_by_query]
|
@@ -119,7 +124,7 @@ def get_all_addresses() -> Set[str]:
|
|
119
124
|
try:
|
120
125
|
s_addresses.add(f())
|
121
126
|
except Exception:
|
122
|
-
logger.
|
127
|
+
logger.debug("Ignoring an address finder exception")
|
123
128
|
|
124
129
|
return s_addresses
|
125
130
|
|
@@ -152,3 +157,20 @@ def get_any_address() -> str:
|
|
152
157
|
if addr == '':
|
153
158
|
raise Exception('Cannot find address of the local machine.')
|
154
159
|
return addr
|
160
|
+
|
161
|
+
|
162
|
+
def tcp_url(address: str, port: Union[str, int, None] = None) -> str:
|
163
|
+
"""Construct a tcp url safe for IPv4 and IPv6"""
|
164
|
+
if address == "*":
|
165
|
+
return "tcp://*"
|
166
|
+
|
167
|
+
ip_addr = ipaddress.ip_address(address)
|
168
|
+
|
169
|
+
port_suffix = f":{port}" if port else ""
|
170
|
+
|
171
|
+
if ip_addr.version == 6 and port_suffix:
|
172
|
+
url = f"tcp://[{address}]{port_suffix}"
|
173
|
+
else:
|
174
|
+
url = f"tcp://{address}{port_suffix}"
|
175
|
+
|
176
|
+
return url
|
parsl/app/app.py
CHANGED
@@ -3,19 +3,16 @@
|
|
3
3
|
The App class encapsulates a generic leaf task that can be executed asynchronously.
|
4
4
|
"""
|
5
5
|
import logging
|
6
|
-
import typeguard
|
7
6
|
from abc import ABCMeta, abstractmethod
|
8
7
|
from inspect import signature
|
9
|
-
from typing import List, Optional, Sequence, Union
|
8
|
+
from typing import Any, Callable, Dict, List, Optional, Sequence, Union
|
9
|
+
|
10
|
+
import typeguard
|
10
11
|
from typing_extensions import Literal
|
11
12
|
|
12
13
|
from parsl.dataflow.dflow import DataFlowKernel
|
13
|
-
|
14
|
-
from typing import Any, Callable, Dict
|
15
|
-
|
16
14
|
from parsl.dataflow.futures import AppFuture
|
17
15
|
|
18
|
-
|
19
16
|
logger = logging.getLogger(__name__)
|
20
17
|
|
21
18
|
|
@@ -69,8 +66,10 @@ class AppBase(metaclass=ABCMeta):
|
|
69
66
|
self.kwargs['walltime'] = params['walltime'].default
|
70
67
|
if 'parsl_resource_specification' in params:
|
71
68
|
self.kwargs['parsl_resource_specification'] = params['parsl_resource_specification'].default
|
72
|
-
|
73
|
-
|
69
|
+
if 'outputs' in params:
|
70
|
+
self.kwargs['outputs'] = params['outputs'].default
|
71
|
+
if 'inputs' in params:
|
72
|
+
self.kwargs['inputs'] = params['inputs'].default
|
74
73
|
|
75
74
|
@abstractmethod
|
76
75
|
def __call__(self, *args: Any, **kwargs: Any) -> AppFuture:
|
parsl/app/bash.py
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
from functools import update_wrapper
|
2
|
-
from functools import partial
|
3
|
-
from inspect import signature, Parameter
|
4
1
|
import logging
|
2
|
+
from functools import partial
|
3
|
+
from inspect import Parameter, signature
|
5
4
|
|
6
|
-
from parsl.app.errors import wrap_error
|
7
5
|
from parsl.app.app import AppBase
|
6
|
+
from parsl.app.errors import wrap_error
|
7
|
+
from parsl.data_provider.files import File
|
8
8
|
from parsl.dataflow.dflow import DataFlowKernelLoader
|
9
9
|
|
10
10
|
logger = logging.getLogger(__name__)
|
@@ -16,6 +16,7 @@ def remote_side_bash_executor(func, *args, **kwargs):
|
|
16
16
|
"""
|
17
17
|
import os
|
18
18
|
import subprocess
|
19
|
+
|
19
20
|
import parsl.app.errors as pe
|
20
21
|
from parsl.utils import get_std_fname_mode
|
21
22
|
|
@@ -54,13 +55,20 @@ def remote_side_bash_executor(func, *args, **kwargs):
|
|
54
55
|
if stdfspec is None:
|
55
56
|
return None
|
56
57
|
|
57
|
-
|
58
|
+
if isinstance(stdfspec, File):
|
59
|
+
# a File is an os.PathLike and so we can use it directly for
|
60
|
+
# the subsequent file operations
|
61
|
+
fname = stdfspec
|
62
|
+
mode = "w"
|
63
|
+
else:
|
64
|
+
fname, mode = get_std_fname_mode(fdname, stdfspec)
|
65
|
+
|
58
66
|
try:
|
59
67
|
if os.path.dirname(fname):
|
60
68
|
os.makedirs(os.path.dirname(fname), exist_ok=True)
|
61
69
|
fd = open(fname, mode)
|
62
70
|
except Exception as e:
|
63
|
-
raise pe.BadStdStreamFile(fname
|
71
|
+
raise pe.BadStdStreamFile(str(fname)) from e
|
64
72
|
return fd
|
65
73
|
|
66
74
|
std_out = open_std_fd('stdout')
|
@@ -115,11 +123,10 @@ class BashApp(AppBase):
|
|
115
123
|
if sig.parameters[s].default is not Parameter.empty:
|
116
124
|
self.kwargs[s] = sig.parameters[s].default
|
117
125
|
|
118
|
-
# update_wrapper allows remote_side_bash_executor to masquerade as self.func
|
119
126
|
# partial is used to attach the first arg the "func" to the remote_side_bash_executor
|
120
127
|
# this is done to avoid passing a function type in the args which parsl.serializer
|
121
128
|
# doesn't support
|
122
|
-
remote_fn = partial(
|
129
|
+
remote_fn = partial(remote_side_bash_executor, self.func)
|
123
130
|
remote_fn.__name__ = self.func.__name__
|
124
131
|
self.wrapped_remote_function = wrap_error(remote_fn)
|
125
132
|
|
parsl/app/errors.py
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
"""Exceptions raised by Apps."""
|
2
|
+
import logging
|
2
3
|
from functools import wraps
|
3
|
-
from typing import Callable, List, Optional, TypeVar, Union
|
4
|
-
from typing_extensions import ParamSpec
|
5
4
|
from types import TracebackType
|
6
|
-
import
|
5
|
+
from typing import Callable, List, Optional, TypeVar, Union
|
6
|
+
|
7
7
|
from tblib import Traceback
|
8
|
+
from typing_extensions import ParamSpec
|
8
9
|
|
9
10
|
from parsl.data_provider.files import File
|
10
11
|
from parsl.errors import ParslError
|
@@ -69,8 +70,8 @@ class MissingOutputs(ParslError):
|
|
69
70
|
self.reason = reason
|
70
71
|
self.outputs = outputs
|
71
72
|
|
72
|
-
def
|
73
|
-
return "Missing Outputs: {0}, Reason:{1}".format(self.outputs, self.reason)
|
73
|
+
def __str__(self) -> str:
|
74
|
+
return "Missing Outputs: {0}, Reason: {1}".format(self.outputs, self.reason)
|
74
75
|
|
75
76
|
|
76
77
|
class BadStdStreamFile(ParslError):
|
@@ -78,19 +79,14 @@ class BadStdStreamFile(ParslError):
|
|
78
79
|
|
79
80
|
Contains:
|
80
81
|
reason(string)
|
81
|
-
exception object
|
82
82
|
"""
|
83
83
|
|
84
|
-
def __init__(self, reason: str
|
85
|
-
super().__init__(reason
|
84
|
+
def __init__(self, reason: str) -> None:
|
85
|
+
super().__init__(reason)
|
86
86
|
self._reason = reason
|
87
|
-
self._exception = exception
|
88
|
-
|
89
|
-
def __repr__(self) -> str:
|
90
|
-
return "Bad Stream File: {} Exception: {}".format(self._reason, self._exception)
|
91
87
|
|
92
88
|
def __str__(self) -> str:
|
93
|
-
return self.
|
89
|
+
return "Bad Stream File: {}".format(self._reason)
|
94
90
|
|
95
91
|
|
96
92
|
class RemoteExceptionWrapper:
|
@@ -136,6 +132,7 @@ def wrap_error(func: Callable[P, R]) -> Callable[P, Union[R, RemoteExceptionWrap
|
|
136
132
|
@wraps(func)
|
137
133
|
def wrapper(*args: P.args, **kwargs: P.kwargs) -> Union[R, RemoteExceptionWrapper]:
|
138
134
|
import sys
|
135
|
+
|
139
136
|
from parsl.app.errors import RemoteExceptionWrapper
|
140
137
|
try:
|
141
138
|
return func(*args, **kwargs)
|
parsl/app/futures.py
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
"""This module implements DataFutures.
|
2
2
|
"""
|
3
3
|
import logging
|
4
|
-
import typeguard
|
5
4
|
from concurrent.futures import Future
|
6
5
|
|
7
|
-
|
6
|
+
import typeguard
|
8
7
|
|
9
|
-
from
|
8
|
+
from parsl.data_provider.files import File
|
10
9
|
|
11
10
|
logger = logging.getLogger(__name__)
|
12
11
|
|
@@ -39,24 +38,23 @@ class DataFuture(Future):
|
|
39
38
|
self.set_result(self.file_obj)
|
40
39
|
|
41
40
|
@typeguard.typechecked
|
42
|
-
def __init__(self, fut: Future, file_obj: File, tid:
|
41
|
+
def __init__(self, fut: Future, file_obj: File, tid: int) -> None:
|
43
42
|
"""Construct the DataFuture object.
|
44
43
|
|
45
44
|
If the file_obj is a string convert to a File.
|
46
45
|
|
47
46
|
Args:
|
48
|
-
- fut (
|
49
|
-
|
47
|
+
- fut (Future) : Future that this DataFuture will track.
|
48
|
+
Completion of ``fut`` indicates that the data is
|
49
|
+
ready.
|
50
|
+
- file_obj (File) : File that this DataFuture represents the availability of
|
50
51
|
|
51
52
|
Kwargs:
|
52
53
|
- tid (task_id) : Task id that this DataFuture tracks
|
53
54
|
"""
|
54
55
|
super().__init__()
|
55
56
|
self._tid = tid
|
56
|
-
|
57
|
-
self.file_obj = file_obj
|
58
|
-
else:
|
59
|
-
raise ValueError("DataFuture must be initialized with a File, not {}".format(type(file_obj)))
|
57
|
+
self.file_obj = file_obj
|
60
58
|
self.parent = fut
|
61
59
|
|
62
60
|
self.parent.add_done_callback(self.parent_callback)
|
parsl/app/python.py
CHANGED
@@ -2,6 +2,7 @@ import logging
|
|
2
2
|
import threading
|
3
3
|
|
4
4
|
import tblib.pickling_support
|
5
|
+
|
5
6
|
tblib.pickling_support.install()
|
6
7
|
|
7
8
|
from functools import wraps
|
@@ -11,7 +12,6 @@ from parsl.app.errors import wrap_error
|
|
11
12
|
from parsl.dataflow.dflow import DataFlowKernelLoader
|
12
13
|
from parsl.utils import AutoCancelTimer
|
13
14
|
|
14
|
-
|
15
15
|
logger = logging.getLogger(__name__)
|
16
16
|
|
17
17
|
|
@@ -19,6 +19,7 @@ def timeout(f, seconds: float):
|
|
19
19
|
@wraps(f)
|
20
20
|
def wrapper(*args, **kwargs):
|
21
21
|
import ctypes
|
22
|
+
|
22
23
|
import parsl.app.errors
|
23
24
|
|
24
25
|
def inject_exception(thread):
|
parsl/benchmark/perf.py
CHANGED
parsl/concurrent/__init__.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
"""Interfaces modeled after Python's `concurrent library <https://docs.python.org/3/library/concurrent.html>`_"""
|
2
|
-
|
2
|
+
import time
|
3
3
|
from concurrent.futures import Executor
|
4
|
+
from typing import Callable, Dict, Iterable, Iterator, Optional
|
4
5
|
from warnings import warn
|
5
|
-
import time
|
6
6
|
|
7
7
|
from parsl import Config, DataFlowKernel
|
8
8
|
from parsl.app.python import PythonApp
|
parsl/config.py
CHANGED
@@ -1,20 +1,24 @@
|
|
1
1
|
import logging
|
2
|
-
import typeguard
|
3
|
-
|
4
2
|
from typing import Callable, Iterable, Optional, Sequence, Union
|
3
|
+
|
4
|
+
import typeguard
|
5
5
|
from typing_extensions import Literal
|
6
6
|
|
7
|
-
from parsl.
|
7
|
+
from parsl.dataflow.dependency_resolvers import DependencyResolver
|
8
|
+
from parsl.dataflow.taskrecord import TaskRecord
|
9
|
+
from parsl.errors import ConfigurationError
|
8
10
|
from parsl.executors.base import ParslExecutor
|
9
11
|
from parsl.executors.threads import ThreadPoolExecutor
|
10
|
-
from parsl.errors import ConfigurationError
|
11
|
-
from parsl.dataflow.taskrecord import TaskRecord
|
12
12
|
from parsl.monitoring import MonitoringHub
|
13
|
+
from parsl.usage_tracking.api import UsageInformation
|
14
|
+
from parsl.usage_tracking.levels import DISABLED as USAGE_TRACKING_DISABLED
|
15
|
+
from parsl.usage_tracking.levels import LEVEL_3 as USAGE_TRACKING_LEVEL_3
|
16
|
+
from parsl.utils import RepresentationMixin
|
13
17
|
|
14
18
|
logger = logging.getLogger(__name__)
|
15
19
|
|
16
20
|
|
17
|
-
class Config(RepresentationMixin):
|
21
|
+
class Config(RepresentationMixin, UsageInformation):
|
18
22
|
"""
|
19
23
|
Specification of Parsl configuration options.
|
20
24
|
|
@@ -34,6 +38,17 @@ class Config(RepresentationMixin):
|
|
34
38
|
checkpoint_period : str, optional
|
35
39
|
Time interval (in "HH:MM:SS") at which to checkpoint completed tasks. Only has an effect if
|
36
40
|
``checkpoint_mode='periodic'``.
|
41
|
+
dependency_resolver: plugin point for custom dependency resolvers. Default: only resolve Futures,
|
42
|
+
using the `SHALLOW_DEPENDENCY_RESOLVER`.
|
43
|
+
exit_mode: str, optional
|
44
|
+
When Parsl is used as a context manager (using ``with parsl.load`` syntax) then this parameter
|
45
|
+
controls what will happen to running tasks and exceptions at exit. The options are:
|
46
|
+
|
47
|
+
* ``cleanup``: cleanup the DFK on exit without waiting for any tasks
|
48
|
+
* ``skip``: skip all shutdown behaviour when exiting the context manager
|
49
|
+
* ``wait``: wait for all tasks to complete when exiting normally, but exit immediately when exiting due to an exception.
|
50
|
+
|
51
|
+
Default is ``cleanup``.
|
37
52
|
garbage_collect : bool. optional.
|
38
53
|
Delete task records from DFK when tasks have completed. Default: True
|
39
54
|
internal_tasks_max_threads : int, optional
|
@@ -50,16 +65,27 @@ class Config(RepresentationMixin):
|
|
50
65
|
of 1.
|
51
66
|
run_dir : str, optional
|
52
67
|
Path to run directory. Default is 'runinfo'.
|
68
|
+
std_autopath : function, optional
|
69
|
+
Sets the function used to generate stdout/stderr specifications when parsl.AUTO_LOGPATH is used. If no function
|
70
|
+
is specified, generates paths that look like: ``rundir/NNN/task_logs/X/task_{id}_{name}{label}.{out/err}``
|
53
71
|
strategy : str, optional
|
54
72
|
Strategy to use for scaling blocks according to workflow needs. Can be 'simple', 'htex_auto_scale', 'none'
|
55
73
|
or `None`.
|
56
74
|
If 'none' or `None`, dynamic scaling will be disabled. Default is 'simple'. The literal value `None` is
|
57
75
|
deprecated.
|
76
|
+
strategy_period : float or int, optional
|
77
|
+
How often the scaling strategy should be executed. Default is 5 seconds.
|
58
78
|
max_idletime : float, optional
|
59
79
|
The maximum idle time allowed for an executor before strategy could shut down unused blocks. Default is 120.0 seconds.
|
60
|
-
usage_tracking :
|
61
|
-
Set this field to
|
62
|
-
|
80
|
+
usage_tracking : int, optional
|
81
|
+
Set this field to 1, 2, or 3 to opt-in to Parsl's usage tracking system.
|
82
|
+
The value represents the level of usage tracking detail to be collected.
|
83
|
+
Setting this field to 0 will disable usage tracking. Default (this field is not set): usage tracking is not enabled.
|
84
|
+
Parsl only collects minimal, non personally-identifiable,
|
85
|
+
information used for reporting to our funding agencies.
|
86
|
+
project_name: str, optional
|
87
|
+
Option to deanonymize usage tracking data.
|
88
|
+
If set, this value will be used as the project name in the usage tracking data and placed on the leaderboard.
|
63
89
|
initialize_logging : bool, optional
|
64
90
|
Make DFK optionally not initialize any logging. Log messages
|
65
91
|
will still be passed into the python logging system under the
|
@@ -82,15 +108,20 @@ class Config(RepresentationMixin):
|
|
82
108
|
Literal['dfk_exit'],
|
83
109
|
Literal['manual']] = None,
|
84
110
|
checkpoint_period: Optional[str] = None,
|
111
|
+
dependency_resolver: Optional[DependencyResolver] = None,
|
112
|
+
exit_mode: Literal['cleanup', 'skip', 'wait'] = 'cleanup',
|
85
113
|
garbage_collect: bool = True,
|
86
114
|
internal_tasks_max_threads: int = 10,
|
87
115
|
retries: int = 0,
|
88
116
|
retry_handler: Optional[Callable[[Exception, TaskRecord], float]] = None,
|
89
117
|
run_dir: str = 'runinfo',
|
118
|
+
std_autopath: Optional[Callable] = None,
|
90
119
|
strategy: Optional[str] = 'simple',
|
120
|
+
strategy_period: Union[float, int] = 5,
|
91
121
|
max_idletime: float = 120.0,
|
92
122
|
monitoring: Optional[MonitoringHub] = None,
|
93
|
-
usage_tracking:
|
123
|
+
usage_tracking: int = 0,
|
124
|
+
project_name: Optional[str] = None,
|
94
125
|
initialize_logging: bool = True) -> None:
|
95
126
|
|
96
127
|
executors = tuple(executors or [])
|
@@ -115,16 +146,22 @@ class Config(RepresentationMixin):
|
|
115
146
|
if checkpoint_mode == 'periodic' and checkpoint_period is None:
|
116
147
|
checkpoint_period = "00:30:00"
|
117
148
|
self.checkpoint_period = checkpoint_period
|
149
|
+
self.dependency_resolver = dependency_resolver
|
150
|
+
self.exit_mode = exit_mode
|
118
151
|
self.garbage_collect = garbage_collect
|
119
152
|
self.internal_tasks_max_threads = internal_tasks_max_threads
|
120
153
|
self.retries = retries
|
121
154
|
self.retry_handler = retry_handler
|
122
155
|
self.run_dir = run_dir
|
123
156
|
self.strategy = strategy
|
157
|
+
self.strategy_period = strategy_period
|
124
158
|
self.max_idletime = max_idletime
|
159
|
+
self.validate_usage_tracking(usage_tracking)
|
125
160
|
self.usage_tracking = usage_tracking
|
161
|
+
self.project_name = project_name
|
126
162
|
self.initialize_logging = initialize_logging
|
127
163
|
self.monitoring = monitoring
|
164
|
+
self.std_autopath: Optional[Callable] = std_autopath
|
128
165
|
|
129
166
|
@property
|
130
167
|
def executors(self) -> Sequence[ParslExecutor]:
|
@@ -140,3 +177,13 @@ class Config(RepresentationMixin):
|
|
140
177
|
if len(duplicates) > 0:
|
141
178
|
raise ConfigurationError('Executors must have unique labels ({})'.format(
|
142
179
|
', '.join(['label={}'.format(repr(d)) for d in duplicates])))
|
180
|
+
|
181
|
+
def validate_usage_tracking(self, level: int) -> None:
|
182
|
+
if not USAGE_TRACKING_DISABLED <= level <= USAGE_TRACKING_LEVEL_3:
|
183
|
+
raise ConfigurationError(
|
184
|
+
f"Usage Tracking values must be 0, 1, 2, or 3 and not {level}"
|
185
|
+
)
|
186
|
+
|
187
|
+
def get_usage_information(self):
|
188
|
+
return {"executors_len": len(self.executors),
|
189
|
+
"dependency_resolver": self.dependency_resolver is not None}
|
parsl/configs/ASPIRE1.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
from parsl.
|
2
|
-
from parsl.launchers import MpiRunLauncher
|
1
|
+
from parsl.addresses import address_by_interface
|
3
2
|
from parsl.config import Config
|
4
3
|
from parsl.executors import HighThroughputExecutor
|
5
|
-
from parsl.
|
4
|
+
from parsl.launchers import MpiRunLauncher
|
6
5
|
from parsl.monitoring.monitoring import MonitoringHub
|
6
|
+
from parsl.providers import PBSProProvider
|
7
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
7
8
|
|
8
9
|
config = Config(
|
9
10
|
executors=[
|
@@ -33,11 +34,11 @@ config = Config(
|
|
33
34
|
],
|
34
35
|
monitoring=MonitoringHub(
|
35
36
|
hub_address=address_by_interface('ib0'),
|
36
|
-
hub_port=55055,
|
37
37
|
resource_monitoring_interval=10,
|
38
38
|
),
|
39
39
|
strategy='simple',
|
40
40
|
retries=3,
|
41
41
|
app_cache=True,
|
42
|
-
checkpoint_mode='task_exit'
|
42
|
+
checkpoint_mode='task_exit',
|
43
|
+
usage_tracking=LEVEL_1,
|
43
44
|
)
|
parsl/configs/Azure.py
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
"""Config for Azure"""
|
2
|
-
|
2
|
+
import getpass
|
3
3
|
|
4
|
-
from parsl.
|
5
|
-
from parsl.
|
6
|
-
from parsl.data_provider.http import HTTPInTaskStaging
|
4
|
+
from parsl.addresses import address_by_query
|
5
|
+
from parsl.config import Config
|
7
6
|
from parsl.data_provider.ftp import FTPInTaskStaging
|
7
|
+
from parsl.data_provider.http import HTTPInTaskStaging
|
8
8
|
from parsl.data_provider.rsync import RSyncStaging
|
9
|
-
from parsl.
|
10
|
-
|
11
|
-
import
|
9
|
+
from parsl.executors import HighThroughputExecutor
|
10
|
+
from parsl.providers import AzureProvider
|
11
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
12
12
|
|
13
13
|
vm_reference = {
|
14
14
|
# All fields below are required
|
@@ -34,5 +34,6 @@ config = Config(
|
|
34
34
|
FTPInTaskStaging(),
|
35
35
|
RSyncStaging(getpass.getuser() + "@" + address_by_query())],
|
36
36
|
)
|
37
|
-
]
|
37
|
+
],
|
38
|
+
usage_tracking=LEVEL_1,
|
38
39
|
)
|
parsl/configs/bridges.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
from parsl.addresses import address_by_interface
|
1
2
|
from parsl.config import Config
|
2
|
-
from parsl.providers import SlurmProvider
|
3
|
-
from parsl.launchers import SrunLauncher
|
4
3
|
from parsl.executors import HighThroughputExecutor
|
5
|
-
from parsl.
|
4
|
+
from parsl.launchers import SrunLauncher
|
5
|
+
from parsl.providers import SlurmProvider
|
6
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
6
7
|
|
7
8
|
""" This config assumes that it is used to launch parsl tasks from the login nodes
|
8
9
|
of Bridges at PSC. Each job submitted to the scheduler will request 2 nodes for 10 minutes.
|
@@ -34,5 +35,6 @@ config = Config(
|
|
34
35
|
cmd_timeout=120,
|
35
36
|
),
|
36
37
|
)
|
37
|
-
]
|
38
|
+
],
|
39
|
+
usage_tracking=LEVEL_1,
|
38
40
|
)
|
parsl/configs/cc_in2p3.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
from parsl.config import Config
|
2
|
-
from parsl.channels import LocalChannel
|
3
|
-
from parsl.providers import GridEngineProvider
|
4
2
|
from parsl.executors import HighThroughputExecutor
|
3
|
+
from parsl.providers import GridEngineProvider
|
4
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
5
5
|
|
6
6
|
config = Config(
|
7
7
|
executors=[
|
@@ -9,7 +9,6 @@ config = Config(
|
|
9
9
|
label='cc_in2p3_htex',
|
10
10
|
max_workers_per_node=2,
|
11
11
|
provider=GridEngineProvider(
|
12
|
-
channel=LocalChannel(),
|
13
12
|
nodes_per_block=1,
|
14
13
|
init_blocks=2,
|
15
14
|
max_blocks=2,
|
@@ -19,4 +18,5 @@ config = Config(
|
|
19
18
|
),
|
20
19
|
)
|
21
20
|
],
|
21
|
+
usage_tracking=LEVEL_1,
|
22
22
|
)
|
parsl/configs/ec2.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
from parsl.config import Config
|
2
|
-
from parsl.providers import AWSProvider
|
3
2
|
from parsl.executors import HighThroughputExecutor
|
3
|
+
from parsl.providers import AWSProvider
|
4
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
4
5
|
|
5
6
|
config = Config(
|
6
7
|
executors=[
|
@@ -25,4 +26,5 @@ config = Config(
|
|
25
26
|
),
|
26
27
|
)
|
27
28
|
],
|
29
|
+
usage_tracking=LEVEL_1,
|
28
30
|
)
|
parsl/configs/expanse.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
from parsl.config import Config
|
2
|
+
from parsl.executors import HighThroughputExecutor
|
2
3
|
from parsl.launchers import SrunLauncher
|
3
4
|
from parsl.providers import SlurmProvider
|
4
|
-
from parsl.
|
5
|
-
|
5
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
6
6
|
|
7
7
|
config = Config(
|
8
8
|
executors=[
|
@@ -25,5 +25,6 @@ config = Config(
|
|
25
25
|
nodes_per_block=2,
|
26
26
|
),
|
27
27
|
)
|
28
|
-
]
|
28
|
+
],
|
29
|
+
usage_tracking=LEVEL_1,
|
29
30
|
)
|
parsl/configs/frontera.py
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
from parsl.config import Config
|
2
|
-
from parsl.channels import LocalChannel
|
3
|
-
from parsl.providers import SlurmProvider
|
4
2
|
from parsl.executors import HighThroughputExecutor
|
5
3
|
from parsl.launchers import SrunLauncher
|
6
|
-
|
4
|
+
from parsl.providers import SlurmProvider
|
5
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
7
6
|
|
8
7
|
""" This config assumes that it is used to launch parsl tasks from the login nodes
|
9
8
|
of Frontera at TACC. Each job submitted to the scheduler will request 2 nodes for 10 minutes.
|
@@ -15,7 +14,6 @@ config = Config(
|
|
15
14
|
max_workers_per_node=1, # Set number of workers per node
|
16
15
|
provider=SlurmProvider(
|
17
16
|
cmd_timeout=60, # Add extra time for slow scheduler responses
|
18
|
-
channel=LocalChannel(),
|
19
17
|
nodes_per_block=2,
|
20
18
|
init_blocks=1,
|
21
19
|
min_blocks=1,
|
@@ -33,4 +31,5 @@ config = Config(
|
|
33
31
|
),
|
34
32
|
)
|
35
33
|
],
|
34
|
+
usage_tracking=LEVEL_1,
|
36
35
|
)
|