sierra-research 1.3.11__py3-none-any.whl → 1.5.0__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.
- sierra/__init__.py +3 -3
- sierra/core/__init__.py +3 -3
- sierra/core/batchroot.py +223 -0
- sierra/core/cmdline.py +681 -1057
- sierra/core/compare.py +11 -0
- sierra/core/config.py +96 -88
- sierra/core/engine.py +306 -0
- sierra/core/execenv.py +380 -0
- sierra/core/expdef.py +11 -0
- sierra/core/experiment/__init__.py +1 -0
- sierra/core/experiment/bindings.py +150 -101
- sierra/core/experiment/definition.py +414 -245
- sierra/core/experiment/spec.py +83 -85
- sierra/core/exproot.py +44 -0
- sierra/core/generators/__init__.py +10 -0
- sierra/core/generators/experiment.py +528 -0
- sierra/core/generators/generator_factory.py +138 -137
- sierra/core/graphs/__init__.py +23 -0
- sierra/core/graphs/bcbridge.py +94 -0
- sierra/core/graphs/heatmap.py +245 -324
- sierra/core/graphs/pathset.py +27 -0
- sierra/core/graphs/schema.py +77 -0
- sierra/core/graphs/stacked_line.py +341 -0
- sierra/core/graphs/summary_line.py +506 -0
- sierra/core/logging.py +3 -2
- sierra/core/models/__init__.py +3 -1
- sierra/core/models/info.py +19 -0
- sierra/core/models/interface.py +52 -122
- sierra/core/pipeline/__init__.py +2 -5
- sierra/core/pipeline/pipeline.py +228 -126
- sierra/core/pipeline/stage1/__init__.py +10 -0
- sierra/core/pipeline/stage1/pipeline_stage1.py +45 -31
- sierra/core/pipeline/stage2/__init__.py +10 -0
- sierra/core/pipeline/stage2/pipeline_stage2.py +8 -11
- sierra/core/pipeline/stage2/runner.py +401 -0
- sierra/core/pipeline/stage3/__init__.py +12 -0
- sierra/core/pipeline/stage3/gather.py +321 -0
- sierra/core/pipeline/stage3/pipeline_stage3.py +37 -84
- sierra/core/pipeline/stage4/__init__.py +12 -2
- sierra/core/pipeline/stage4/pipeline_stage4.py +36 -354
- sierra/core/pipeline/stage5/__init__.py +12 -0
- sierra/core/pipeline/stage5/pipeline_stage5.py +33 -208
- sierra/core/pipeline/yaml.py +48 -0
- sierra/core/plugin.py +529 -62
- sierra/core/proc.py +11 -0
- sierra/core/prod.py +11 -0
- sierra/core/ros1/__init__.py +5 -1
- sierra/core/ros1/callbacks.py +22 -21
- sierra/core/ros1/cmdline.py +59 -88
- sierra/core/ros1/generators.py +159 -175
- sierra/core/ros1/variables/__init__.py +3 -0
- sierra/core/ros1/variables/exp_setup.py +122 -116
- sierra/core/startup.py +106 -76
- sierra/core/stat_kernels.py +4 -5
- sierra/core/storage.py +13 -32
- sierra/core/trampoline.py +30 -0
- sierra/core/types.py +116 -71
- sierra/core/utils.py +103 -106
- sierra/core/variables/__init__.py +1 -1
- sierra/core/variables/base_variable.py +12 -17
- sierra/core/variables/batch_criteria.py +387 -481
- sierra/core/variables/builtin.py +135 -0
- sierra/core/variables/exp_setup.py +19 -39
- sierra/core/variables/population_size.py +72 -76
- sierra/core/variables/variable_density.py +44 -68
- sierra/core/vector.py +1 -1
- sierra/main.py +256 -88
- sierra/plugins/__init__.py +119 -0
- sierra/plugins/compare/__init__.py +14 -0
- sierra/plugins/compare/graphs/__init__.py +19 -0
- sierra/plugins/compare/graphs/cmdline.py +120 -0
- sierra/plugins/compare/graphs/comparator.py +291 -0
- sierra/plugins/compare/graphs/inter_controller.py +531 -0
- sierra/plugins/compare/graphs/inter_scenario.py +297 -0
- sierra/plugins/compare/graphs/namecalc.py +53 -0
- sierra/plugins/compare/graphs/outputroot.py +73 -0
- sierra/plugins/compare/graphs/plugin.py +147 -0
- sierra/plugins/compare/graphs/preprocess.py +172 -0
- sierra/plugins/compare/graphs/schema.py +37 -0
- sierra/plugins/engine/__init__.py +14 -0
- sierra/plugins/engine/argos/__init__.py +18 -0
- sierra/plugins/{platform → engine}/argos/cmdline.py +144 -151
- sierra/plugins/{platform/argos/variables → engine/argos/generators}/__init__.py +5 -0
- sierra/plugins/engine/argos/generators/engine.py +394 -0
- sierra/plugins/engine/argos/plugin.py +393 -0
- sierra/plugins/{platform/argos/generators → engine/argos/variables}/__init__.py +5 -0
- sierra/plugins/engine/argos/variables/arena_shape.py +183 -0
- sierra/plugins/engine/argos/variables/cameras.py +240 -0
- sierra/plugins/engine/argos/variables/constant_density.py +112 -0
- sierra/plugins/engine/argos/variables/exp_setup.py +82 -0
- sierra/plugins/{platform → engine}/argos/variables/physics_engines.py +83 -87
- sierra/plugins/engine/argos/variables/population_constant_density.py +178 -0
- sierra/plugins/engine/argos/variables/population_size.py +115 -0
- sierra/plugins/engine/argos/variables/population_variable_density.py +123 -0
- sierra/plugins/engine/argos/variables/rendering.py +108 -0
- sierra/plugins/engine/ros1gazebo/__init__.py +18 -0
- sierra/plugins/engine/ros1gazebo/cmdline.py +175 -0
- sierra/plugins/{platform/ros1robot → engine/ros1gazebo}/generators/__init__.py +5 -0
- sierra/plugins/engine/ros1gazebo/generators/engine.py +125 -0
- sierra/plugins/engine/ros1gazebo/plugin.py +404 -0
- sierra/plugins/engine/ros1gazebo/variables/__init__.py +15 -0
- sierra/plugins/engine/ros1gazebo/variables/population_size.py +214 -0
- sierra/plugins/engine/ros1robot/__init__.py +18 -0
- sierra/plugins/engine/ros1robot/cmdline.py +159 -0
- sierra/plugins/{platform/ros1gazebo → engine/ros1robot}/generators/__init__.py +4 -0
- sierra/plugins/engine/ros1robot/generators/engine.py +95 -0
- sierra/plugins/engine/ros1robot/plugin.py +410 -0
- sierra/plugins/{hpc/local → engine/ros1robot/variables}/__init__.py +5 -0
- sierra/plugins/engine/ros1robot/variables/population_size.py +146 -0
- sierra/plugins/execenv/__init__.py +11 -0
- sierra/plugins/execenv/hpc/__init__.py +18 -0
- sierra/plugins/execenv/hpc/adhoc/__init__.py +18 -0
- sierra/plugins/execenv/hpc/adhoc/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/adhoc/plugin.py +131 -0
- sierra/plugins/execenv/hpc/cmdline.py +137 -0
- sierra/plugins/execenv/hpc/local/__init__.py +18 -0
- sierra/plugins/execenv/hpc/local/cmdline.py +31 -0
- sierra/plugins/execenv/hpc/local/plugin.py +145 -0
- sierra/plugins/execenv/hpc/pbs/__init__.py +18 -0
- sierra/plugins/execenv/hpc/pbs/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/pbs/plugin.py +121 -0
- sierra/plugins/execenv/hpc/slurm/__init__.py +18 -0
- sierra/plugins/execenv/hpc/slurm/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/slurm/plugin.py +133 -0
- sierra/plugins/execenv/prefectserver/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/cmdline.py +66 -0
- sierra/plugins/execenv/prefectserver/dockerremote/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/dockerremote/cmdline.py +66 -0
- sierra/plugins/execenv/prefectserver/dockerremote/plugin.py +132 -0
- sierra/plugins/execenv/prefectserver/flow.py +66 -0
- sierra/plugins/execenv/prefectserver/local/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/local/cmdline.py +29 -0
- sierra/plugins/execenv/prefectserver/local/plugin.py +133 -0
- sierra/plugins/{hpc/adhoc → execenv/robot}/__init__.py +1 -0
- sierra/plugins/execenv/robot/turtlebot3/__init__.py +18 -0
- sierra/plugins/execenv/robot/turtlebot3/plugin.py +204 -0
- sierra/plugins/expdef/__init__.py +14 -0
- sierra/plugins/expdef/json/__init__.py +14 -0
- sierra/plugins/expdef/json/plugin.py +504 -0
- sierra/plugins/expdef/xml/__init__.py +14 -0
- sierra/plugins/expdef/xml/plugin.py +386 -0
- sierra/{core/hpc → plugins/proc}/__init__.py +1 -1
- sierra/plugins/proc/collate/__init__.py +15 -0
- sierra/plugins/proc/collate/cmdline.py +47 -0
- sierra/plugins/proc/collate/plugin.py +271 -0
- sierra/plugins/proc/compress/__init__.py +18 -0
- sierra/plugins/proc/compress/cmdline.py +47 -0
- sierra/plugins/proc/compress/plugin.py +123 -0
- sierra/plugins/proc/decompress/__init__.py +18 -0
- sierra/plugins/proc/decompress/plugin.py +96 -0
- sierra/plugins/proc/imagize/__init__.py +15 -0
- sierra/plugins/proc/imagize/cmdline.py +49 -0
- sierra/plugins/proc/imagize/plugin.py +270 -0
- sierra/plugins/proc/modelrunner/__init__.py +16 -0
- sierra/plugins/proc/modelrunner/plugin.py +250 -0
- sierra/plugins/proc/statistics/__init__.py +15 -0
- sierra/plugins/proc/statistics/cmdline.py +64 -0
- sierra/plugins/proc/statistics/plugin.py +390 -0
- sierra/plugins/{hpc → prod}/__init__.py +1 -0
- sierra/plugins/prod/graphs/__init__.py +18 -0
- sierra/plugins/prod/graphs/cmdline.py +269 -0
- sierra/plugins/prod/graphs/collate.py +279 -0
- sierra/plugins/prod/graphs/inter/__init__.py +13 -0
- sierra/plugins/prod/graphs/inter/generate.py +83 -0
- sierra/plugins/prod/graphs/inter/heatmap.py +86 -0
- sierra/plugins/prod/graphs/inter/line.py +134 -0
- sierra/plugins/prod/graphs/intra/__init__.py +15 -0
- sierra/plugins/prod/graphs/intra/generate.py +202 -0
- sierra/plugins/prod/graphs/intra/heatmap.py +74 -0
- sierra/plugins/prod/graphs/intra/line.py +114 -0
- sierra/plugins/prod/graphs/plugin.py +103 -0
- sierra/plugins/prod/graphs/targets.py +63 -0
- sierra/plugins/prod/render/__init__.py +18 -0
- sierra/plugins/prod/render/cmdline.py +72 -0
- sierra/plugins/prod/render/plugin.py +282 -0
- sierra/plugins/storage/__init__.py +5 -0
- sierra/plugins/storage/arrow/__init__.py +18 -0
- sierra/plugins/storage/arrow/plugin.py +38 -0
- sierra/plugins/storage/csv/__init__.py +9 -0
- sierra/plugins/storage/csv/plugin.py +12 -5
- sierra/version.py +3 -2
- sierra_research-1.5.0.dist-info/METADATA +238 -0
- sierra_research-1.5.0.dist-info/RECORD +186 -0
- {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/WHEEL +1 -2
- sierra/core/experiment/xml.py +0 -454
- sierra/core/generators/controller_generator_parser.py +0 -34
- sierra/core/generators/exp_creator.py +0 -351
- sierra/core/generators/exp_generators.py +0 -142
- sierra/core/graphs/scatterplot2D.py +0 -109
- sierra/core/graphs/stacked_line_graph.py +0 -251
- sierra/core/graphs/stacked_surface_graph.py +0 -220
- sierra/core/graphs/summary_line_graph.py +0 -371
- sierra/core/hpc/cmdline.py +0 -142
- sierra/core/models/graphs.py +0 -87
- sierra/core/pipeline/stage2/exp_runner.py +0 -286
- sierra/core/pipeline/stage3/imagizer.py +0 -149
- sierra/core/pipeline/stage3/run_collator.py +0 -317
- sierra/core/pipeline/stage3/statistics_calculator.py +0 -478
- sierra/core/pipeline/stage4/graph_collator.py +0 -320
- sierra/core/pipeline/stage4/inter_exp_graph_generator.py +0 -240
- sierra/core/pipeline/stage4/intra_exp_graph_generator.py +0 -317
- sierra/core/pipeline/stage4/model_runner.py +0 -168
- sierra/core/pipeline/stage4/rendering.py +0 -283
- sierra/core/pipeline/stage4/yaml_config_loader.py +0 -103
- sierra/core/pipeline/stage5/inter_scenario_comparator.py +0 -328
- sierra/core/pipeline/stage5/intra_scenario_comparator.py +0 -989
- sierra/core/platform.py +0 -493
- sierra/core/plugin_manager.py +0 -369
- sierra/core/root_dirpath_generator.py +0 -241
- sierra/plugins/hpc/adhoc/plugin.py +0 -125
- sierra/plugins/hpc/local/plugin.py +0 -81
- sierra/plugins/hpc/pbs/__init__.py +0 -9
- sierra/plugins/hpc/pbs/plugin.py +0 -126
- sierra/plugins/hpc/slurm/__init__.py +0 -9
- sierra/plugins/hpc/slurm/plugin.py +0 -130
- sierra/plugins/platform/__init__.py +0 -9
- sierra/plugins/platform/argos/__init__.py +0 -9
- sierra/plugins/platform/argos/generators/platform_generators.py +0 -383
- sierra/plugins/platform/argos/plugin.py +0 -337
- sierra/plugins/platform/argos/variables/arena_shape.py +0 -145
- sierra/plugins/platform/argos/variables/cameras.py +0 -243
- sierra/plugins/platform/argos/variables/constant_density.py +0 -136
- sierra/plugins/platform/argos/variables/exp_setup.py +0 -113
- sierra/plugins/platform/argos/variables/population_constant_density.py +0 -175
- sierra/plugins/platform/argos/variables/population_size.py +0 -102
- sierra/plugins/platform/argos/variables/population_variable_density.py +0 -132
- sierra/plugins/platform/argos/variables/rendering.py +0 -104
- sierra/plugins/platform/ros1gazebo/__init__.py +0 -9
- sierra/plugins/platform/ros1gazebo/cmdline.py +0 -213
- sierra/plugins/platform/ros1gazebo/generators/platform_generators.py +0 -137
- sierra/plugins/platform/ros1gazebo/plugin.py +0 -335
- sierra/plugins/platform/ros1gazebo/variables/__init__.py +0 -10
- sierra/plugins/platform/ros1gazebo/variables/population_size.py +0 -204
- sierra/plugins/platform/ros1robot/__init__.py +0 -9
- sierra/plugins/platform/ros1robot/cmdline.py +0 -175
- sierra/plugins/platform/ros1robot/generators/platform_generators.py +0 -112
- sierra/plugins/platform/ros1robot/plugin.py +0 -373
- sierra/plugins/platform/ros1robot/variables/__init__.py +0 -10
- sierra/plugins/platform/ros1robot/variables/population_size.py +0 -146
- sierra/plugins/robot/__init__.py +0 -9
- sierra/plugins/robot/turtlebot3/__init__.py +0 -9
- sierra/plugins/robot/turtlebot3/plugin.py +0 -194
- sierra_research-1.3.11.data/data/share/man/man1/sierra-cli.1 +0 -2349
- sierra_research-1.3.11.data/data/share/man/man7/sierra-examples.7 +0 -508
- sierra_research-1.3.11.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
- sierra_research-1.3.11.data/data/share/man/man7/sierra-glossary.7 +0 -285
- sierra_research-1.3.11.data/data/share/man/man7/sierra-platforms.7 +0 -358
- sierra_research-1.3.11.data/data/share/man/man7/sierra-usage.7 +0 -729
- sierra_research-1.3.11.data/data/share/man/man7/sierra.7 +0 -78
- sierra_research-1.3.11.dist-info/METADATA +0 -492
- sierra_research-1.3.11.dist-info/RECORD +0 -133
- sierra_research-1.3.11.dist-info/top_level.txt +0 -1
- {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
- {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,125 +0,0 @@
|
|
1
|
-
# Copyright 2020 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
"""HPC plugin for running experiments with an ad-hoc set of compute nodes.
|
5
|
-
|
6
|
-
E.g., whatever computers you happen to have laying around in the lab.
|
7
|
-
|
8
|
-
"""
|
9
|
-
|
10
|
-
# Core packages
|
11
|
-
import os
|
12
|
-
import typing as tp
|
13
|
-
import argparse
|
14
|
-
import shutil
|
15
|
-
import pathlib
|
16
|
-
|
17
|
-
# 3rd party packages
|
18
|
-
import implements
|
19
|
-
|
20
|
-
# Project packages
|
21
|
-
from sierra.core import types, utils
|
22
|
-
from sierra.core.experiment import bindings
|
23
|
-
|
24
|
-
|
25
|
-
@implements.implements(bindings.IParsedCmdlineConfigurer)
|
26
|
-
class ParsedCmdlineConfigurer():
|
27
|
-
"""Configure SIERRA for ad-hoc HPC.
|
28
|
-
|
29
|
-
May use the following environment variables:
|
30
|
-
|
31
|
-
- ``SIERRA_NODEFILE`` - If this is not defined ``--nodefile`` must be
|
32
|
-
passed.
|
33
|
-
|
34
|
-
"""
|
35
|
-
|
36
|
-
def __init__(self, exec_env: str) -> None:
|
37
|
-
pass
|
38
|
-
|
39
|
-
def __call__(self, args: argparse.Namespace) -> None:
|
40
|
-
if args.nodefile is None:
|
41
|
-
assert 'SIERRA_NODEFILE' in os.environ,\
|
42
|
-
("Non-hpc.adhoc environment detected: --nodefile not "
|
43
|
-
"passed and 'SIERRA_NODEFILE' not found")
|
44
|
-
args.nodefile = os.environ['SIERRA_NODEFILE']
|
45
|
-
|
46
|
-
assert utils.path_exists(args.nodefile), \
|
47
|
-
f"SIERRA_NODEFILE '{args.nodefile}' does not exist"
|
48
|
-
|
49
|
-
assert not args.platform_vc,\
|
50
|
-
"Platform visual capture not supported on Adhoc"
|
51
|
-
|
52
|
-
|
53
|
-
@implements.implements(bindings.IExpShellCmdsGenerator)
|
54
|
-
class ExpShellCmdsGenerator():
|
55
|
-
"""Generate the cmd to invoke GNU Parallel in the ad-hoc HPC environment.
|
56
|
-
"""
|
57
|
-
|
58
|
-
def __init__(self,
|
59
|
-
cmdopts: types.Cmdopts,
|
60
|
-
exp_num: int) -> None:
|
61
|
-
self.cmdopts = cmdopts
|
62
|
-
|
63
|
-
def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
64
|
-
return []
|
65
|
-
|
66
|
-
def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
67
|
-
return []
|
68
|
-
|
69
|
-
def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
|
70
|
-
jobid = os.getpid()
|
71
|
-
|
72
|
-
# Even if we are passed --nodelist, we still make our own copy of it, so
|
73
|
-
# that the user can safely modify it (if they want to) after running
|
74
|
-
# stage 1.
|
75
|
-
nodelist = pathlib.Path(exec_opts['exp_input_root'],
|
76
|
-
f"{jobid}-nodelist.txt")
|
77
|
-
|
78
|
-
resume = ''
|
79
|
-
# This can't be --resume, because then GNU parallel looks at the results
|
80
|
-
# directory, and if there is stuff in it, (apparently) assumes that the
|
81
|
-
# job finished...
|
82
|
-
if exec_opts['exec_resume']:
|
83
|
-
resume = '--resume-failed'
|
84
|
-
|
85
|
-
# Make sure there are no duplicate nodes
|
86
|
-
unique_nodes = types.ShellCmdSpec(
|
87
|
-
cmd='sort -u {0} > {1}'.format(exec_opts["nodefile"], nodelist),
|
88
|
-
shell=True,
|
89
|
-
wait=True)
|
90
|
-
# Make sure GNU parallel uses the right shell, because it seems to
|
91
|
-
# defaults to /bin/sh since all cmds are run in a python shell which
|
92
|
-
# does not have $SHELL set.
|
93
|
-
use_bash = types.ShellCmdSpec(
|
94
|
-
cmd='export PARALLEL_SHELL={0}'.format(shutil.which('bash')),
|
95
|
-
shell=True,
|
96
|
-
wait=True,
|
97
|
-
env=True)
|
98
|
-
|
99
|
-
# GNU parallel cmd
|
100
|
-
parallel = 'parallel {2} ' \
|
101
|
-
'--jobs {1} ' \
|
102
|
-
'--results {4} ' \
|
103
|
-
'--joblog {3} ' \
|
104
|
-
'--sshloginfile {0} ' \
|
105
|
-
'--workdir {4} < "{5}"'
|
106
|
-
|
107
|
-
log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
|
108
|
-
parallel = parallel.format(nodelist,
|
109
|
-
exec_opts['n_jobs'],
|
110
|
-
resume,
|
111
|
-
log,
|
112
|
-
exec_opts['scratch_dir'],
|
113
|
-
exec_opts['cmdfile_stem_path'] + exec_opts['cmdfile_ext'])
|
114
|
-
|
115
|
-
parallel_spec = types.ShellCmdSpec(cmd=parallel,
|
116
|
-
shell=True,
|
117
|
-
wait=True)
|
118
|
-
|
119
|
-
return [unique_nodes, use_bash, parallel_spec]
|
120
|
-
|
121
|
-
|
122
|
-
__api__ = [
|
123
|
-
'ParsedCmdlineConfigurer',
|
124
|
-
'ExpShellCmdsGenerator',
|
125
|
-
]
|
@@ -1,81 +0,0 @@
|
|
1
|
-
# Copyright 2020 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
"""HPC plugin for running SIERRA locally.
|
5
|
-
|
6
|
-
Not necessarily HPC, but it fits well enough under that semantic umbrella.
|
7
|
-
|
8
|
-
"""
|
9
|
-
|
10
|
-
# Core packages
|
11
|
-
import typing as tp
|
12
|
-
import shutil
|
13
|
-
import pathlib
|
14
|
-
|
15
|
-
# 3rd party packages
|
16
|
-
import implements
|
17
|
-
|
18
|
-
# Project packages
|
19
|
-
from sierra.core import types
|
20
|
-
from sierra.core.experiment import bindings
|
21
|
-
|
22
|
-
|
23
|
-
@implements.implements(bindings.IExpShellCmdsGenerator)
|
24
|
-
class ExpShellCmdsGenerator():
|
25
|
-
"""
|
26
|
-
Generate the command to invoke GNU parallel for local HPC.
|
27
|
-
"""
|
28
|
-
|
29
|
-
def __init__(self,
|
30
|
-
cmdopts: types.Cmdopts,
|
31
|
-
exp_num: int) -> None:
|
32
|
-
self.cmdopts = cmdopts
|
33
|
-
|
34
|
-
def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
35
|
-
return []
|
36
|
-
|
37
|
-
def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
38
|
-
return []
|
39
|
-
|
40
|
-
def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
|
41
|
-
resume = ''
|
42
|
-
|
43
|
-
# This can't be --resume, because then GNU parallel looks at the results
|
44
|
-
# directory, and if there is stuff in it, (apparently) assumes that the
|
45
|
-
# job finished...
|
46
|
-
if exec_opts['exec_resume']:
|
47
|
-
resume = '--resume-failed'
|
48
|
-
|
49
|
-
# Make sure GNU parallel uses the right shell, because it seems to
|
50
|
-
# defaults to /bin/sh since all cmds are run in a python shell which
|
51
|
-
# does not have $SHELL set.
|
52
|
-
shell = shutil.which('bash')
|
53
|
-
use_bash = types.ShellCmdSpec(cmd=f'export PARALLEL_SHELL={shell}',
|
54
|
-
shell=True,
|
55
|
-
wait=True,
|
56
|
-
env=True)
|
57
|
-
|
58
|
-
parallel = 'parallel {1} ' \
|
59
|
-
'--jobs {2} ' \
|
60
|
-
'--results {0} '\
|
61
|
-
'--joblog {3} '\
|
62
|
-
'--no-notice < "{4}"'
|
63
|
-
|
64
|
-
log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
|
65
|
-
parallel = parallel.format(exec_opts['scratch_dir'],
|
66
|
-
resume,
|
67
|
-
exec_opts['n_jobs'],
|
68
|
-
log,
|
69
|
-
exec_opts['cmdfile_stem_path'] +
|
70
|
-
exec_opts['cmdfile_ext'])
|
71
|
-
|
72
|
-
parallel_spec = types.ShellCmdSpec(cmd=parallel,
|
73
|
-
shell=True,
|
74
|
-
wait=True)
|
75
|
-
|
76
|
-
return [use_bash, parallel_spec]
|
77
|
-
|
78
|
-
|
79
|
-
__api__ = [
|
80
|
-
'ExpShellCmdsGenerator'
|
81
|
-
]
|
sierra/plugins/hpc/pbs/plugin.py
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
# Copyright 2020 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
"""
|
5
|
-
HPC plugin for running SIERRA on HPC clusters using the TORQUE-PBS scheduler.
|
6
|
-
"""
|
7
|
-
|
8
|
-
# Core packages
|
9
|
-
import os
|
10
|
-
import typing as tp
|
11
|
-
import argparse
|
12
|
-
import shutil
|
13
|
-
import pathlib
|
14
|
-
|
15
|
-
# 3rd party packages
|
16
|
-
import implements
|
17
|
-
|
18
|
-
# Project packages
|
19
|
-
from sierra.core import types
|
20
|
-
from sierra.core.experiment import bindings
|
21
|
-
|
22
|
-
|
23
|
-
@implements.implements(bindings.IParsedCmdlineConfigurer)
|
24
|
-
class ParsedCmdlineConfigurer():
|
25
|
-
"""Configure SIERRA for PBS HPC.
|
26
|
-
|
27
|
-
Uses the following environment variables (if any of them are not defined an
|
28
|
-
assertion will be triggered):
|
29
|
-
|
30
|
-
- ``PBS_NUM_PPN``
|
31
|
-
- ``PBS_NODEFILE``
|
32
|
-
- ``PBS_JOBID``
|
33
|
-
|
34
|
-
"""
|
35
|
-
|
36
|
-
def __init__(self, exec_env: str) -> None:
|
37
|
-
pass
|
38
|
-
|
39
|
-
def __call__(self, args: argparse.Namespace) -> None:
|
40
|
-
keys = ['PBS_NUM_PPN',
|
41
|
-
'PBS_NODEFILE',
|
42
|
-
'PBS_JOBID'
|
43
|
-
]
|
44
|
-
|
45
|
-
for k in keys:
|
46
|
-
assert k in os.environ,\
|
47
|
-
f"Non-PBS environment detected: '{k}' not found"
|
48
|
-
|
49
|
-
assert args.exec_jobs_per_node is not None, \
|
50
|
-
"--exec-jobs-per-node is required (can't be computed from PBS)"
|
51
|
-
|
52
|
-
assert not args.platform_vc,\
|
53
|
-
"Platform visual capture not supported on PBS"
|
54
|
-
|
55
|
-
|
56
|
-
@implements.implements(bindings.IExpShellCmdsGenerator)
|
57
|
-
class ExpShellCmdsGenerator():
|
58
|
-
"""Generate the cmd to invoke GNU Parallel on PBS HPC.
|
59
|
-
|
60
|
-
"""
|
61
|
-
|
62
|
-
def __init__(self,
|
63
|
-
cmdopts: types.Cmdopts,
|
64
|
-
exp_num: int) -> None:
|
65
|
-
self.cmdopts = cmdopts
|
66
|
-
|
67
|
-
def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
68
|
-
return []
|
69
|
-
|
70
|
-
def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
71
|
-
return []
|
72
|
-
|
73
|
-
def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
|
74
|
-
resume = ''
|
75
|
-
jobid = os.environ['PBS_JOBID']
|
76
|
-
nodelist = pathlib.Path(exec_opts['exp_input_root'],
|
77
|
-
f"{jobid}-nodelist.txt")
|
78
|
-
|
79
|
-
resume = ''
|
80
|
-
# This can't be --resume, because then GNU parallel looks at the results
|
81
|
-
# directory, and if there is stuff in it, (apparently) assumes that the
|
82
|
-
# job finished...
|
83
|
-
if exec_opts['exec_resume']:
|
84
|
-
resume = '--resume-failed'
|
85
|
-
|
86
|
-
unique_nodes = types.ShellCmdSpec(cmd=f'sort -u $PBS_NODEFILE > {nodelist}',
|
87
|
-
shell=True,
|
88
|
-
wait=True)
|
89
|
-
|
90
|
-
# Make sure GNU parallel uses the right shell, because it seems to
|
91
|
-
# defaults to /bin/sh since all cmds are run in a python shell which
|
92
|
-
# does not have $SHELL set.
|
93
|
-
shell = shutil.which('bash')
|
94
|
-
use_bash = types.ShellCmdSpec(cmd=f'export PARALLEL_SHELL={shell}',
|
95
|
-
shell=True,
|
96
|
-
wait=True,
|
97
|
-
env=True)
|
98
|
-
|
99
|
-
parallel = 'parallel {2} ' \
|
100
|
-
'--jobs {1} ' \
|
101
|
-
'--results {4} ' \
|
102
|
-
'--joblog {3} ' \
|
103
|
-
'--sshloginfile {0} ' \
|
104
|
-
'--workdir {4} < "{5}"'
|
105
|
-
|
106
|
-
log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
|
107
|
-
parallel = parallel.format(nodelist,
|
108
|
-
exec_opts['n_jobs'],
|
109
|
-
resume,
|
110
|
-
log,
|
111
|
-
exec_opts['scratch_dir'],
|
112
|
-
exec_opts['cmdfile_stem_path'] +
|
113
|
-
exec_opts['cmdfile_ext'])
|
114
|
-
|
115
|
-
parallel_spec = types.ShellCmdSpec(cmd=parallel,
|
116
|
-
shell=True,
|
117
|
-
wait=True)
|
118
|
-
|
119
|
-
return [unique_nodes, use_bash, parallel_spec]
|
120
|
-
|
121
|
-
|
122
|
-
__api__ = [
|
123
|
-
'ParsedCmdlineConfigurer',
|
124
|
-
|
125
|
-
|
126
|
-
]
|
@@ -1,130 +0,0 @@
|
|
1
|
-
# Copyright 2020 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
"""
|
5
|
-
HPC plugin for running SIERRA on HPC clusters using the SLURM scheduler.
|
6
|
-
"""
|
7
|
-
|
8
|
-
# Core packages
|
9
|
-
import typing as tp
|
10
|
-
import argparse
|
11
|
-
import shutil
|
12
|
-
import pathlib
|
13
|
-
import os
|
14
|
-
|
15
|
-
# 3rd party packages
|
16
|
-
import implements
|
17
|
-
|
18
|
-
# Project packages
|
19
|
-
from sierra.core import types
|
20
|
-
from sierra.core.experiment import bindings
|
21
|
-
|
22
|
-
|
23
|
-
@implements.implements(bindings.IParsedCmdlineConfigurer)
|
24
|
-
class ParsedCmdlineConfigurer():
|
25
|
-
"""Configure SIERRA for SLURM HPC.
|
26
|
-
|
27
|
-
Uses the following environment variables (if any of them are not defined an
|
28
|
-
assertion will be triggered):
|
29
|
-
|
30
|
-
- ``SLURM_CPUS_PER_TASK``
|
31
|
-
- ``SLURM_TASKS_PER_NODE``
|
32
|
-
- ``SLURM_JOB_NODELIST``
|
33
|
-
- ``SLURM_JOB_ID``
|
34
|
-
|
35
|
-
"""
|
36
|
-
|
37
|
-
def __init__(self, exec_env: str) -> None:
|
38
|
-
pass
|
39
|
-
|
40
|
-
def __call__(self, args: argparse.Namespace) -> None:
|
41
|
-
keys = ['SLURM_CPUS_PER_TASK',
|
42
|
-
'SLURM_TASKS_PER_NODE',
|
43
|
-
'SLURM_JOB_NODELIST',
|
44
|
-
'SLURM_JOB_ID']
|
45
|
-
|
46
|
-
for k in keys:
|
47
|
-
assert k in os.environ,\
|
48
|
-
f"Non-SLURM environment detected: '{k}' not found"
|
49
|
-
|
50
|
-
assert not args.platform_vc,\
|
51
|
-
"Platform visual capture not supported on SLURM"
|
52
|
-
|
53
|
-
# SLURM_TASKS_PER_NODE can be set to things like '1(x32),3', indicating
|
54
|
-
# that not all nodes will run the same # of tasks. SIERRA expects all
|
55
|
-
# nodes to have the same # tasks allocated to each (i.e., a homogeneous
|
56
|
-
# allocation), so we check for this.
|
57
|
-
assert "," not in os.environ['SLURM_TASKS_PER_NODE'], \
|
58
|
-
"SLURM_TASKS_PER_NODE not homogeneous"
|
59
|
-
|
60
|
-
|
61
|
-
@implements.implements(bindings.IExpShellCmdsGenerator)
|
62
|
-
class ExpShellCmdsGenerator():
|
63
|
-
"""Generate the cmd to correctly invoke GNU Parallel on SLURM HPC.
|
64
|
-
|
65
|
-
"""
|
66
|
-
|
67
|
-
def __init__(self,
|
68
|
-
cmdopts: types.Cmdopts,
|
69
|
-
exp_num: int) -> None:
|
70
|
-
self.cmdopts = cmdopts
|
71
|
-
|
72
|
-
def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
73
|
-
return []
|
74
|
-
|
75
|
-
def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
|
76
|
-
return []
|
77
|
-
|
78
|
-
def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
|
79
|
-
jobid = os.environ['SLURM_JOB_ID']
|
80
|
-
nodelist = pathlib.Path(exec_opts['exp_input_root'],
|
81
|
-
f"{jobid}-nodelist.txt")
|
82
|
-
|
83
|
-
resume = ''
|
84
|
-
# This can't be --resume, because then GNU parallel looks at the results
|
85
|
-
# directory, and if there is stuff in it, (apparently) assumes that the
|
86
|
-
# job finished...
|
87
|
-
if exec_opts['exec_resume']:
|
88
|
-
resume = '--resume-failed'
|
89
|
-
|
90
|
-
unique_nodes = types.ShellCmdSpec(
|
91
|
-
cmd=f'scontrol show hostnames $SLURM_JOB_NODELIST > {nodelist}',
|
92
|
-
shell=True,
|
93
|
-
wait=True)
|
94
|
-
|
95
|
-
# Make sure GNU parallel uses the right shell, because it seems to
|
96
|
-
# defaults to /bin/sh since all cmds are run in a python shell which
|
97
|
-
# does not have $SHELL set.
|
98
|
-
shell = shutil.which('bash')
|
99
|
-
use_bash = types.ShellCmdSpec(cmd=f'export PARALLEL_SHELL={shell}',
|
100
|
-
shell=True,
|
101
|
-
wait=True)
|
102
|
-
|
103
|
-
parallel = 'parallel {2} ' \
|
104
|
-
'--jobs {1} ' \
|
105
|
-
'--results {4} ' \
|
106
|
-
'--joblog {3} ' \
|
107
|
-
'--sshloginfile {0} ' \
|
108
|
-
'--workdir {4} < "{5}"'
|
109
|
-
|
110
|
-
log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
|
111
|
-
parallel = parallel.format(nodelist,
|
112
|
-
exec_opts['n_jobs'],
|
113
|
-
resume,
|
114
|
-
log,
|
115
|
-
exec_opts['scratch_dir'],
|
116
|
-
exec_opts['cmdfile_stem_path'] +
|
117
|
-
exec_opts['cmdfile_ext'])
|
118
|
-
parallel_spec = types.ShellCmdSpec(cmd=parallel,
|
119
|
-
shell=True,
|
120
|
-
wait=True)
|
121
|
-
|
122
|
-
return [unique_nodes, use_bash, parallel_spec]
|
123
|
-
|
124
|
-
|
125
|
-
__api__ = [
|
126
|
-
'ParsedCmdlineConfigurer',
|
127
|
-
'ExpShellCmdsGenerator'
|
128
|
-
|
129
|
-
|
130
|
-
]
|