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/providers/lsf/lsf.py
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
import os
|
2
|
-
import time
|
3
1
|
import logging
|
4
2
|
import math
|
3
|
+
import os
|
4
|
+
import time
|
5
5
|
|
6
|
-
from parsl.channels import LocalChannel
|
7
6
|
from parsl.jobs.states import JobState, JobStatus
|
8
7
|
from parsl.launchers import SingleNodeLauncher
|
9
8
|
from parsl.providers.cluster_provider import ClusterProvider
|
@@ -32,11 +31,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
|
|
32
31
|
|
33
32
|
Parameters
|
34
33
|
----------
|
35
|
-
channel : Channel
|
36
|
-
Channel for accessing this provider. Possible channels include
|
37
|
-
:class:`~parsl.channels.LocalChannel` (the default),
|
38
|
-
:class:`~parsl.channels.SSHChannel`, or
|
39
|
-
:class:`~parsl.channels.SSHInteractiveLoginChannel`.
|
40
34
|
nodes_per_block : int
|
41
35
|
Nodes to provision per block.
|
42
36
|
When request_by_nodes is False, it is computed by cores_per_block / cores_per_node.
|
@@ -71,7 +65,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
|
|
71
65
|
:class:`~parsl.launchers.SingleNodeLauncher` (the default),
|
72
66
|
:class:`~parsl.launchers.SrunLauncher`, or
|
73
67
|
:class:`~parsl.launchers.AprunLauncher`
|
74
|
-
move_files : Optional[Bool]: should files be moved? by default, Parsl will try to move files.
|
75
68
|
bsub_redirection: Bool
|
76
69
|
Should a redirection symbol "<" be included when submitting jobs, i.e., Bsub < job_script.
|
77
70
|
request_by_nodes: Bool
|
@@ -81,7 +74,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
|
|
81
74
|
"""
|
82
75
|
|
83
76
|
def __init__(self,
|
84
|
-
channel=LocalChannel(),
|
85
77
|
nodes_per_block=1,
|
86
78
|
cores_per_block=None,
|
87
79
|
cores_per_node=None,
|
@@ -95,13 +87,11 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
|
|
95
87
|
project=None,
|
96
88
|
queue=None,
|
97
89
|
cmd_timeout=120,
|
98
|
-
move_files=True,
|
99
90
|
bsub_redirection=False,
|
100
91
|
request_by_nodes=True,
|
101
92
|
launcher=SingleNodeLauncher()):
|
102
93
|
label = 'LSF'
|
103
94
|
super().__init__(label,
|
104
|
-
channel,
|
105
95
|
nodes_per_block,
|
106
96
|
init_blocks,
|
107
97
|
min_blocks,
|
@@ -115,7 +105,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
|
|
115
105
|
self.queue = queue
|
116
106
|
self.cores_per_block = cores_per_block
|
117
107
|
self.cores_per_node = cores_per_node
|
118
|
-
self.move_files = move_files
|
119
108
|
self.bsub_redirection = bsub_redirection
|
120
109
|
self.request_by_nodes = request_by_nodes
|
121
110
|
|
@@ -217,7 +206,7 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
|
|
217
206
|
logger.debug("Requesting one block with {} nodes".format(self.nodes_per_block))
|
218
207
|
|
219
208
|
job_config = {}
|
220
|
-
job_config["submit_script_dir"] = self.
|
209
|
+
job_config["submit_script_dir"] = self.script_dir
|
221
210
|
job_config["nodes"] = self.nodes_per_block
|
222
211
|
job_config["tasks_per_node"] = tasks_per_node
|
223
212
|
job_config["walltime"] = wtime_to_minutes(self.walltime)
|
@@ -233,17 +222,10 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
|
|
233
222
|
logger.debug("Writing submit script")
|
234
223
|
self._write_submit_script(template_string, script_path, job_name, job_config)
|
235
224
|
|
236
|
-
if self.move_files:
|
237
|
-
logger.debug("moving files")
|
238
|
-
channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
|
239
|
-
else:
|
240
|
-
logger.debug("not moving files")
|
241
|
-
channel_script_path = script_path
|
242
|
-
|
243
225
|
if self.bsub_redirection:
|
244
|
-
cmd = "bsub < {0}".format(
|
226
|
+
cmd = "bsub < {0}".format(script_path)
|
245
227
|
else:
|
246
|
-
cmd = "bsub {0}".format(
|
228
|
+
cmd = "bsub {0}".format(script_path)
|
247
229
|
retcode, stdout, stderr = super().execute_wait(cmd)
|
248
230
|
|
249
231
|
job_id = None
|
parsl/providers/pbspro/pbspro.py
CHANGED
@@ -1,15 +1,12 @@
|
|
1
|
+
import json
|
1
2
|
import logging
|
2
3
|
import os
|
3
4
|
import time
|
4
|
-
import json
|
5
5
|
|
6
|
-
from parsl.channels import LocalChannel
|
7
6
|
from parsl.jobs.states import JobState, JobStatus
|
8
7
|
from parsl.launchers import SingleNodeLauncher
|
9
8
|
from parsl.providers.pbspro.template import template_string
|
10
|
-
from parsl.providers import TorqueProvider
|
11
|
-
|
12
|
-
from parsl.providers.torque.torque import translate_table
|
9
|
+
from parsl.providers.torque.torque import TorqueProvider, translate_table
|
13
10
|
|
14
11
|
logger = logging.getLogger(__name__)
|
15
12
|
|
@@ -19,11 +16,6 @@ class PBSProProvider(TorqueProvider):
|
|
19
16
|
|
20
17
|
Parameters
|
21
18
|
----------
|
22
|
-
channel : Channel
|
23
|
-
Channel for accessing this provider. Possible channels include
|
24
|
-
:class:`~parsl.channels.LocalChannel` (the default),
|
25
|
-
:class:`~parsl.channels.SSHChannel`, or
|
26
|
-
:class:`~parsl.channels.SSHInteractiveLoginChannel`.
|
27
19
|
account : str
|
28
20
|
Account the job will be charged against.
|
29
21
|
queue : str
|
@@ -56,7 +48,6 @@ class PBSProProvider(TorqueProvider):
|
|
56
48
|
:class:`~parsl.launchers.SingleNodeLauncher`.
|
57
49
|
"""
|
58
50
|
def __init__(self,
|
59
|
-
channel=LocalChannel(),
|
60
51
|
account=None,
|
61
52
|
queue=None,
|
62
53
|
scheduler_options='',
|
@@ -71,8 +62,7 @@ class PBSProProvider(TorqueProvider):
|
|
71
62
|
launcher=SingleNodeLauncher(),
|
72
63
|
walltime="00:20:00",
|
73
64
|
cmd_timeout=120):
|
74
|
-
super().__init__(
|
75
|
-
account,
|
65
|
+
super().__init__(account,
|
76
66
|
queue,
|
77
67
|
scheduler_options,
|
78
68
|
worker_init,
|
@@ -164,7 +154,7 @@ class PBSProProvider(TorqueProvider):
|
|
164
154
|
)
|
165
155
|
|
166
156
|
job_config = {}
|
167
|
-
job_config["submit_script_dir"] = self.
|
157
|
+
job_config["submit_script_dir"] = self.script_dir
|
168
158
|
job_config["nodes_per_block"] = self.nodes_per_block
|
169
159
|
job_config["ncpus"] = self.cpus_per_node
|
170
160
|
job_config["walltime"] = self.walltime
|
@@ -188,15 +178,13 @@ class PBSProProvider(TorqueProvider):
|
|
188
178
|
logger.debug("Writing submit script")
|
189
179
|
self._write_submit_script(self.template_string, script_path, job_name, job_config)
|
190
180
|
|
191
|
-
channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
|
192
|
-
|
193
181
|
submit_options = ''
|
194
182
|
if self.queue is not None:
|
195
183
|
submit_options = '{0} -q {1}'.format(submit_options, self.queue)
|
196
184
|
if self.account is not None:
|
197
185
|
submit_options = '{0} -A {1}'.format(submit_options, self.account)
|
198
186
|
|
199
|
-
launch_cmd = "qsub {0} {1}".format(submit_options,
|
187
|
+
launch_cmd = "qsub {0} {1}".format(submit_options, script_path)
|
200
188
|
retcode, stdout, stderr = self.execute_wait(launch_cmd)
|
201
189
|
|
202
190
|
job_id = None
|
parsl/providers/slurm/slurm.py
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
import os
|
2
|
-
import math
|
3
|
-
import time
|
4
1
|
import logging
|
2
|
+
import math
|
3
|
+
import os
|
5
4
|
import re
|
6
|
-
import
|
5
|
+
import time
|
6
|
+
from typing import Any, Dict, Optional
|
7
7
|
|
8
|
-
|
8
|
+
import typeguard
|
9
9
|
|
10
|
-
from parsl.channels import LocalChannel
|
11
|
-
from parsl.channels.base import Channel
|
12
10
|
from parsl.jobs.states import JobState, JobStatus
|
13
11
|
from parsl.launchers import SingleNodeLauncher
|
14
12
|
from parsl.launchers.base import Launcher
|
@@ -19,7 +17,25 @@ from parsl.utils import RepresentationMixin, wtime_to_minutes
|
|
19
17
|
|
20
18
|
logger = logging.getLogger(__name__)
|
21
19
|
|
22
|
-
|
20
|
+
# From https://slurm.schedmd.com/sacct.html#SECTION_JOB-STATE-CODES
|
21
|
+
sacct_translate_table = {
|
22
|
+
'PENDING': JobState.PENDING,
|
23
|
+
'RUNNING': JobState.RUNNING,
|
24
|
+
'CANCELLED': JobState.CANCELLED,
|
25
|
+
'COMPLETED': JobState.COMPLETED,
|
26
|
+
'FAILED': JobState.FAILED,
|
27
|
+
'NODE_FAIL': JobState.FAILED,
|
28
|
+
'BOOT_FAIL': JobState.FAILED,
|
29
|
+
'DEADLINE': JobState.TIMEOUT,
|
30
|
+
'TIMEOUT': JobState.TIMEOUT,
|
31
|
+
'REVOKED': JobState.FAILED,
|
32
|
+
'OUT_OF_MEMORY': JobState.FAILED,
|
33
|
+
'SUSPENDED': JobState.HELD,
|
34
|
+
'PREEMPTED': JobState.TIMEOUT,
|
35
|
+
'REQUEUED': JobState.PENDING
|
36
|
+
}
|
37
|
+
|
38
|
+
squeue_translate_table = {
|
23
39
|
'PD': JobState.PENDING,
|
24
40
|
'R': JobState.RUNNING,
|
25
41
|
'CA': JobState.CANCELLED,
|
@@ -37,7 +53,7 @@ translate_table = {
|
|
37
53
|
class SlurmProvider(ClusterProvider, RepresentationMixin):
|
38
54
|
"""Slurm Execution Provider
|
39
55
|
|
40
|
-
This provider uses sbatch to submit,
|
56
|
+
This provider uses sbatch to submit, sacct for status and scancel to cancel
|
41
57
|
jobs. The sbatch script to be used is created from a template file in this
|
42
58
|
same module.
|
43
59
|
|
@@ -52,11 +68,9 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
52
68
|
Slurm queue to place job in. If unspecified or ``None``, no queue slurm directive will be specified.
|
53
69
|
constraint : str
|
54
70
|
Slurm job constraint, often used to choose cpu or gpu type. If unspecified or ``None``, no constraint slurm directive will be added.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
:class:`~parsl.channels.SSHChannel`, or
|
59
|
-
:class:`~parsl.channels.SSHInteractiveLoginChannel`.
|
71
|
+
clusters : str
|
72
|
+
Slurm cluster name, or comma seperated cluster list, used to choose between different clusters in a federated Slurm instance.
|
73
|
+
If unspecified or ``None``, no slurm directive for clusters will be added.
|
60
74
|
nodes_per_block : int
|
61
75
|
Nodes to provision per block.
|
62
76
|
cores_per_node : int
|
@@ -92,7 +106,6 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
92
106
|
:class:`~parsl.launchers.SingleNodeLauncher` (the default),
|
93
107
|
:class:`~parsl.launchers.SrunLauncher`, or
|
94
108
|
:class:`~parsl.launchers.AprunLauncher`
|
95
|
-
move_files : Optional[Bool]: should files be moved? by default, Parsl will try to move files.
|
96
109
|
"""
|
97
110
|
|
98
111
|
@typeguard.typechecked
|
@@ -101,7 +114,7 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
101
114
|
account: Optional[str] = None,
|
102
115
|
qos: Optional[str] = None,
|
103
116
|
constraint: Optional[str] = None,
|
104
|
-
|
117
|
+
clusters: Optional[str] = None,
|
105
118
|
nodes_per_block: int = 1,
|
106
119
|
cores_per_node: Optional[int] = None,
|
107
120
|
mem_per_node: Optional[int] = None,
|
@@ -115,11 +128,9 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
115
128
|
worker_init: str = '',
|
116
129
|
cmd_timeout: int = 10,
|
117
130
|
exclusive: bool = True,
|
118
|
-
move_files: bool = True,
|
119
131
|
launcher: Launcher = SingleNodeLauncher()):
|
120
132
|
label = 'slurm'
|
121
133
|
super().__init__(label,
|
122
|
-
channel,
|
123
134
|
nodes_per_block,
|
124
135
|
init_blocks,
|
125
136
|
min_blocks,
|
@@ -133,10 +144,10 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
133
144
|
self.cores_per_node = cores_per_node
|
134
145
|
self.mem_per_node = mem_per_node
|
135
146
|
self.exclusive = exclusive
|
136
|
-
self.move_files = move_files
|
137
147
|
self.account = account
|
138
148
|
self.qos = qos
|
139
149
|
self.constraint = constraint
|
150
|
+
self.clusters = clusters
|
140
151
|
self.scheduler_options = scheduler_options + '\n'
|
141
152
|
if exclusive:
|
142
153
|
self.scheduler_options += "#SBATCH --exclusive\n"
|
@@ -148,9 +159,36 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
148
159
|
self.scheduler_options += "#SBATCH --qos={}\n".format(qos)
|
149
160
|
if constraint:
|
150
161
|
self.scheduler_options += "#SBATCH --constraint={}\n".format(constraint)
|
162
|
+
if clusters:
|
163
|
+
self.scheduler_options += "#SBATCH --clusters={}\n".format(clusters)
|
151
164
|
|
152
165
|
self.regex_job_id = regex_job_id
|
153
166
|
self.worker_init = worker_init + '\n'
|
167
|
+
# Check if sacct works and if not fall back to squeue
|
168
|
+
cmd = "sacct -X"
|
169
|
+
logger.debug("Executing %s", cmd)
|
170
|
+
retcode, stdout, stderr = self.execute_wait(cmd)
|
171
|
+
# If sacct fails it should return retcode=1 stderr="Slurm accounting storage is disabled"
|
172
|
+
logger.debug(f"sacct returned retcode={retcode} stderr={stderr}")
|
173
|
+
if retcode == 0:
|
174
|
+
logger.debug("using sacct to get job status")
|
175
|
+
_cmd = "sacct"
|
176
|
+
# Add clusters option to sacct if provided
|
177
|
+
if self.clusters:
|
178
|
+
_cmd += f" --clusters={self.clusters}"
|
179
|
+
# Using state%20 to get enough characters to not truncate output
|
180
|
+
# of the state. Without output can look like "<job_id> CANCELLED+"
|
181
|
+
self._cmd = _cmd + " -X --noheader --format=jobid,state%20 --job '{0}'"
|
182
|
+
self._translate_table = sacct_translate_table
|
183
|
+
else:
|
184
|
+
logger.debug(f"sacct failed with retcode={retcode}")
|
185
|
+
logger.debug("falling back to using squeue to get job status")
|
186
|
+
_cmd = "squeue"
|
187
|
+
# Add clusters option to squeue if provided
|
188
|
+
if self.clusters:
|
189
|
+
_cmd += f" --clusters={self.clusters}"
|
190
|
+
self._cmd = _cmd + " --noheader --format='%i %t' --job '{0}'"
|
191
|
+
self._translate_table = squeue_translate_table
|
154
192
|
|
155
193
|
def _status(self):
|
156
194
|
'''Returns the status list for a list of job_ids
|
@@ -168,14 +206,14 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
168
206
|
logger.debug('No active jobs, skipping status update')
|
169
207
|
return
|
170
208
|
|
171
|
-
cmd =
|
209
|
+
cmd = self._cmd.format(job_id_list)
|
172
210
|
logger.debug("Executing %s", cmd)
|
173
211
|
retcode, stdout, stderr = self.execute_wait(cmd)
|
174
|
-
logger.debug("squeue returned %s %s", stdout, stderr)
|
212
|
+
logger.debug("sacct/squeue returned %s %s", stdout, stderr)
|
175
213
|
|
176
214
|
# Execute_wait failed. Do no update
|
177
215
|
if retcode != 0:
|
178
|
-
logger.warning("squeue failed with non-zero exit code {}".format(retcode))
|
216
|
+
logger.warning("sacct/squeue failed with non-zero exit code {}".format(retcode))
|
179
217
|
return
|
180
218
|
|
181
219
|
jobs_missing = set(self.resources.keys())
|
@@ -183,23 +221,27 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
183
221
|
if not line:
|
184
222
|
# Blank line
|
185
223
|
continue
|
186
|
-
|
187
|
-
|
224
|
+
# Sacct includes extra information in some outputs
|
225
|
+
# For example "<job_id> CANCELLED by <user_id>"
|
226
|
+
# This splits and ignores anything past the first two unpacked values
|
227
|
+
job_id, slurm_state, *ignore = line.split()
|
228
|
+
if slurm_state not in self._translate_table:
|
188
229
|
logger.warning(f"Slurm status {slurm_state} is not recognized")
|
189
|
-
status =
|
230
|
+
status = self._translate_table.get(slurm_state, JobState.UNKNOWN)
|
190
231
|
logger.debug("Updating job {} with slurm status {} to parsl state {!s}".format(job_id, slurm_state, status))
|
191
232
|
self.resources[job_id]['status'] = JobStatus(status,
|
192
233
|
stdout_path=self.resources[job_id]['job_stdout_path'],
|
193
234
|
stderr_path=self.resources[job_id]['job_stderr_path'])
|
194
235
|
jobs_missing.remove(job_id)
|
195
236
|
|
237
|
+
# sacct can get job info after jobs have completed so this path shouldn't be hit
|
196
238
|
# squeue does not report on jobs that are not running. So we are filling in the
|
197
239
|
# blanks for missing jobs, we might lose some information about why the jobs failed.
|
198
240
|
for missing_job in jobs_missing:
|
199
241
|
logger.debug("Updating missing job {} to completed status".format(missing_job))
|
200
|
-
self.resources[missing_job]['status'] = JobStatus(
|
201
|
-
|
202
|
-
|
242
|
+
self.resources[missing_job]['status'] = JobStatus(
|
243
|
+
JobState.COMPLETED, stdout_path=self.resources[missing_job]['job_stdout_path'],
|
244
|
+
stderr_path=self.resources[missing_job]['job_stderr_path'])
|
203
245
|
|
204
246
|
def submit(self, command: str, tasks_per_node: int, job_name="parsl.slurm") -> str:
|
205
247
|
"""Submit the command as a slurm job.
|
@@ -238,8 +280,8 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
238
280
|
|
239
281
|
logger.debug("Requesting one block with {} nodes".format(self.nodes_per_block))
|
240
282
|
|
241
|
-
job_config = {}
|
242
|
-
job_config["submit_script_dir"] = self.
|
283
|
+
job_config: Dict[str, Any] = {}
|
284
|
+
job_config["submit_script_dir"] = self.script_dir
|
243
285
|
job_config["nodes"] = self.nodes_per_block
|
244
286
|
job_config["tasks_per_node"] = tasks_per_node
|
245
287
|
job_config["walltime"] = wtime_to_minutes(self.walltime)
|
@@ -257,14 +299,7 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
257
299
|
logger.debug("Writing submit script")
|
258
300
|
self._write_submit_script(template_string, script_path, job_name, job_config)
|
259
301
|
|
260
|
-
|
261
|
-
logger.debug("moving files")
|
262
|
-
channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
|
263
|
-
else:
|
264
|
-
logger.debug("not moving files")
|
265
|
-
channel_script_path = script_path
|
266
|
-
|
267
|
-
retcode, stdout, stderr = self.execute_wait("sbatch {0}".format(channel_script_path))
|
302
|
+
retcode, stdout, stderr = self.execute_wait("sbatch {0}".format(script_path))
|
268
303
|
|
269
304
|
if retcode == 0:
|
270
305
|
for line in stdout.split('\n'):
|
@@ -308,7 +343,14 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
|
|
308
343
|
'''
|
309
344
|
|
310
345
|
job_id_list = ' '.join(job_ids)
|
311
|
-
|
346
|
+
|
347
|
+
# Make the command to cancel jobs
|
348
|
+
_cmd = "scancel"
|
349
|
+
if self.clusters:
|
350
|
+
_cmd += f" --clusters={self.clusters}"
|
351
|
+
_cmd += " {0}"
|
352
|
+
|
353
|
+
retcode, stdout, stderr = self.execute_wait(_cmd.format(job_id_list))
|
312
354
|
rets = None
|
313
355
|
if retcode == 0:
|
314
356
|
for jid in job_ids:
|
parsl/providers/torque/torque.py
CHANGED
@@ -2,11 +2,10 @@ import logging
|
|
2
2
|
import os
|
3
3
|
import time
|
4
4
|
|
5
|
-
from parsl.channels import LocalChannel
|
6
5
|
from parsl.jobs.states import JobState, JobStatus
|
7
6
|
from parsl.launchers import AprunLauncher
|
8
|
-
from parsl.providers.torque.template import template_string
|
9
7
|
from parsl.providers.cluster_provider import ClusterProvider
|
8
|
+
from parsl.providers.torque.template import template_string
|
10
9
|
from parsl.utils import RepresentationMixin
|
11
10
|
|
12
11
|
logger = logging.getLogger(__name__)
|
@@ -33,11 +32,6 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
|
|
33
32
|
|
34
33
|
Parameters
|
35
34
|
----------
|
36
|
-
channel : Channel
|
37
|
-
Channel for accessing this provider. Possible channels include
|
38
|
-
:class:`~parsl.channels.LocalChannel` (the default),
|
39
|
-
:class:`~parsl.channels.SSHChannel`, or
|
40
|
-
:class:`~parsl.channels.SSHInteractiveLoginChannel`.
|
41
35
|
account : str
|
42
36
|
Account the job will be charged against.
|
43
37
|
queue : str
|
@@ -68,7 +62,6 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
|
|
68
62
|
|
69
63
|
"""
|
70
64
|
def __init__(self,
|
71
|
-
channel=LocalChannel(),
|
72
65
|
account=None,
|
73
66
|
queue=None,
|
74
67
|
scheduler_options='',
|
@@ -83,7 +76,6 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
|
|
83
76
|
cmd_timeout=120):
|
84
77
|
label = 'torque'
|
85
78
|
super().__init__(label,
|
86
|
-
channel,
|
87
79
|
nodes_per_block,
|
88
80
|
init_blocks,
|
89
81
|
min_blocks,
|
@@ -173,8 +165,7 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
|
|
173
165
|
tasks_per_node)
|
174
166
|
|
175
167
|
job_config = {}
|
176
|
-
|
177
|
-
job_config["submit_script_dir"] = self.channel.script_dir
|
168
|
+
job_config["submit_script_dir"] = self.script_dir
|
178
169
|
job_config["nodes"] = self.nodes_per_block
|
179
170
|
job_config["task_blocks"] = self.nodes_per_block * tasks_per_node
|
180
171
|
job_config["nodes_per_block"] = self.nodes_per_block
|
@@ -192,15 +183,13 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
|
|
192
183
|
logger.debug("Writing submit script")
|
193
184
|
self._write_submit_script(self.template_string, script_path, job_name, job_config)
|
194
185
|
|
195
|
-
channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
|
196
|
-
|
197
186
|
submit_options = ''
|
198
187
|
if self.queue is not None:
|
199
188
|
submit_options = '{0} -q {1}'.format(submit_options, self.queue)
|
200
189
|
if self.account is not None:
|
201
190
|
submit_options = '{0} -A {1}'.format(submit_options, self.account)
|
202
191
|
|
203
|
-
launch_cmd = "qsub {0} {1}".format(submit_options,
|
192
|
+
launch_cmd = "qsub {0} {1}".format(submit_options, script_path)
|
204
193
|
retcode, stdout, stderr = self.execute_wait(launch_cmd)
|
205
194
|
|
206
195
|
job_id = None
|
parsl/serialize/__init__.py
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
from parsl.serialize.facade import (
|
2
|
-
|
3
|
-
|
1
|
+
from parsl.serialize.facade import (
|
2
|
+
deserialize,
|
3
|
+
pack_apply_message,
|
4
|
+
pack_res_spec_apply_message,
|
5
|
+
serialize,
|
6
|
+
unpack_apply_message,
|
7
|
+
unpack_res_spec_apply_message,
|
8
|
+
)
|
4
9
|
|
5
10
|
__all__ = ['serialize',
|
6
11
|
'deserialize',
|
parsl/serialize/base.py
CHANGED
parsl/serialize/concretes.py
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
-
import dill
|
2
1
|
import functools
|
3
|
-
import pickle
|
4
2
|
import logging
|
3
|
+
import pickle
|
5
4
|
|
6
|
-
|
7
|
-
from parsl.serialize.base import SerializerBase
|
5
|
+
import dill
|
8
6
|
|
7
|
+
logger = logging.getLogger(__name__)
|
9
8
|
from typing import Any
|
10
9
|
|
10
|
+
from parsl.serialize.base import SerializerBase
|
11
|
+
|
11
12
|
|
12
13
|
class PickleSerializer(SerializerBase):
|
13
14
|
""" Pickle serialization covers most python objects, with some notable exceptions:
|
parsl/serialize/facade.py
CHANGED
@@ -87,16 +87,16 @@ def pack_res_spec_apply_message(func: Any, args: Any, kwargs: Any, resource_spec
|
|
87
87
|
return pack_apply_message(func, args, (kwargs, resource_specification), buffer_threshold=buffer_threshold)
|
88
88
|
|
89
89
|
|
90
|
-
def unpack_apply_message(packed_buffer: bytes
|
90
|
+
def unpack_apply_message(packed_buffer: bytes) -> List[Any]:
|
91
91
|
""" Unpack and deserialize function and parameters
|
92
92
|
"""
|
93
93
|
return [deserialize(buf) for buf in unpack_buffers(packed_buffer)]
|
94
94
|
|
95
95
|
|
96
|
-
def unpack_res_spec_apply_message(packed_buffer: bytes
|
96
|
+
def unpack_res_spec_apply_message(packed_buffer: bytes) -> List[Any]:
|
97
97
|
""" Unpack and deserialize function, parameters, and resource_specification
|
98
98
|
"""
|
99
|
-
func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer
|
99
|
+
func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer)
|
100
100
|
return [func, args, kwargs, resource_spec]
|
101
101
|
|
102
102
|
|
parsl/serialize/proxystore.py
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
import dill
|
2
1
|
import io
|
3
2
|
import typing as t
|
4
3
|
|
5
|
-
|
4
|
+
import dill
|
6
5
|
from proxystore.store import Store
|
7
6
|
|
7
|
+
from parsl.serialize.base import SerializerBase
|
8
|
+
|
8
9
|
|
9
10
|
class ProxyStoreDeepPickler(dill.Pickler):
|
10
11
|
"""This class extends dill so that certain objects will be stored into
|
parsl/tests/__init__.py
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
"""Config for Azure"""
|
2
|
-
|
2
|
+
import getpass
|
3
3
|
|
4
4
|
from parsl.config import Config
|
5
|
-
from parsl.executors import HighThroughputExecutor
|
6
|
-
from parsl.data_provider.http import HTTPInTaskStaging
|
7
5
|
from parsl.data_provider.ftp import FTPInTaskStaging
|
6
|
+
from parsl.data_provider.http import HTTPInTaskStaging
|
8
7
|
from parsl.data_provider.rsync import RSyncStaging
|
9
|
-
|
10
|
-
import
|
8
|
+
from parsl.executors import HighThroughputExecutor
|
9
|
+
from parsl.providers import AzureProvider
|
11
10
|
|
12
11
|
# If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
|
13
12
|
# If you are a user copying-and-pasting this as an example, make sure to either
|
parsl/tests/configs/bridges.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
from parsl.config import Config
|
2
|
-
from parsl.providers import SlurmProvider
|
3
|
-
from parsl.launchers import SrunLauncher
|
4
2
|
from parsl.executors import HighThroughputExecutor
|
3
|
+
from parsl.launchers import SrunLauncher
|
4
|
+
from parsl.providers import SlurmProvider
|
5
|
+
|
5
6
|
from .user_opts import user_opts
|
6
7
|
|
7
8
|
|
parsl/tests/configs/cc_in2p3.py
CHANGED
@@ -1,7 +1,6 @@
|
|
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
|
5
4
|
|
6
5
|
from .user_opts import user_opts
|
7
6
|
|
@@ -14,7 +13,6 @@ def fresh_config():
|
|
14
13
|
max_workers_per_node=1,
|
15
14
|
encrypted=True,
|
16
15
|
provider=GridEngineProvider(
|
17
|
-
channel=LocalChannel(),
|
18
16
|
nodes_per_block=2,
|
19
17
|
init_blocks=2,
|
20
18
|
max_blocks=2,
|
parsl/tests/configs/comet.py
CHANGED
@@ -1,7 +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
|
-
|
5
|
+
|
5
6
|
from .user_opts import user_opts
|
6
7
|
|
7
8
|
|
@@ -11,10 +11,9 @@ Block {Min:0, init:1, Max:1}
|
|
11
11
|
==================
|
12
12
|
|
13
13
|
"""
|
14
|
-
from parsl.providers import AWSProvider
|
15
|
-
|
16
14
|
from parsl.config import Config
|
17
15
|
from parsl.executors import HighThroughputExecutor
|
16
|
+
from parsl.providers import AWSProvider
|
18
17
|
|
19
18
|
# If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
|
20
19
|
# If you are a user copying-and-pasting this as an example, make sure to either
|
parsl/tests/configs/ec2_spot.py
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
from parsl.providers import AWSProvider
|
2
|
-
|
3
1
|
from parsl.config import Config
|
4
2
|
from parsl.executors import HighThroughputExecutor
|
3
|
+
from parsl.providers import AWSProvider
|
5
4
|
|
6
5
|
# If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
|
7
6
|
# If you are a user copying-and-pasting this as an example, make sure to either
|