Skip to content

Commit 4c83d7b

Browse files
committed
Fix Slurm noquote marker handling
1 parent 416a0a7 commit 4c83d7b

2 files changed

Lines changed: 30 additions & 4 deletions

File tree

nemo_run/core/execution/slurm.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import warnings
2323
from dataclasses import asdict, dataclass, field
2424
from pathlib import Path
25-
from typing import Any, Dict, Optional, Type, TypeAlias, Union
25+
from typing import Any, Dict, Optional, Type, Union
2626

2727
import invoke
2828
from invoke.context import Context
@@ -52,7 +52,13 @@
5252
from nemo_run.devspace.base import DevSpace
5353

5454
logger = logging.getLogger(__name__)
55-
noquote: TypeAlias = str
55+
56+
57+
class NoQuote(str):
58+
"""Marker for strings that must bypass shell quoting."""
59+
60+
61+
noquote = NoQuote
5662

5763

5864
@dataclass(kw_only=True)
@@ -1011,10 +1017,12 @@ def get_container_flags(
10111017
_srun_args = ["--wait=60", "--kill-on-bad-exit=1"]
10121018
_srun_args.extend(resource_req.srun_args or [])
10131019
else:
1014-
cmd_stdout = srun_stdout.replace(original_job_name, self.jobs[group_ind])
1020+
cmd_stdout = noquote(srun_stdout.replace(original_job_name, self.jobs[group_ind]))
10151021
cmd_stderr = stderr_flags.copy()
10161022
if cmd_stderr:
1017-
cmd_stderr[-1] = cmd_stderr[-1].replace(original_job_name, self.jobs[group_ind])
1023+
cmd_stderr[-1] = noquote(
1024+
cmd_stderr[-1].replace(original_job_name, self.jobs[group_ind])
1025+
)
10181026
_container_flags = get_container_flags(
10191027
base_mounts=self.executor.container_mounts,
10201028
src_job_dir=os.path.join(

test/core/execution/test_slurm_templates.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,24 @@ def test_group_resource_req_batch_request_materialize(
593593
expected = Path(artifact).read_text()
594594
assert sbatch_script.strip() == expected.strip()
595595

596+
def test_group_batch_request_quotes_regular_srun_args_but_not_log_paths(
597+
self,
598+
group_slurm_request_with_artifact: tuple[SlurmBatchRequest, str],
599+
):
600+
group_slurm_request, _ = group_slurm_request_with_artifact
601+
executor = group_slurm_request.executor
602+
group_slurm_request.executor = SlurmExecutor.merge([executor], num_tasks=2)
603+
group_slurm_request.executor.srun_args = ["--comment=hello world"]
604+
self.apply_macros(executor)
605+
606+
sbatch_script = group_slurm_request.materialize()
607+
608+
assert "'--comment=hello world'" in sbatch_script
609+
assert (
610+
"--output /some/job/dir/sample_job/log-your_account-account.sample_job-0_%j_${SLURM_RESTART_COUNT:-0}.out "
611+
"--container-image some-image"
612+
) in sbatch_script
613+
596614
def test_group_resource_req_request_custom_job_details(
597615
self,
598616
group_resource_req_slurm_request_with_artifact: tuple[SlurmBatchRequest, str],

0 commit comments

Comments
 (0)