-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Move SLURM to separate module #528
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,94 @@ | ||||||
from typing import Optional | ||||||
|
||||||
from executorlib.standalone.interactive.spawner import SubprocessSpawner | ||||||
|
||||||
SLURM_COMMAND = "srun" | ||||||
|
||||||
|
||||||
class SrunSpawner(SubprocessSpawner): | ||||||
def __init__( | ||||||
self, | ||||||
cwd: Optional[str] = None, | ||||||
cores: int = 1, | ||||||
threads_per_core: int = 1, | ||||||
gpus_per_core: int = 0, | ||||||
openmpi_oversubscribe: bool = False, | ||||||
slurm_cmd_args: list[str] = [], | ||||||
): | ||||||
""" | ||||||
Srun interface implementation. | ||||||
|
||||||
Args: | ||||||
cwd (str, optional): The current working directory. Defaults to None. | ||||||
cores (int, optional): The number of cores to use. Defaults to 1. | ||||||
threads_per_core (int, optional): The number of threads per core. Defaults to 1. | ||||||
gpus_per_core (int, optional): The number of GPUs per core. Defaults to 0. | ||||||
openmpi_oversubscribe (bool, optional): Whether to oversubscribe the cores. Defaults to False. | ||||||
slurm_cmd_args (list[str], optional): Additional command line arguments. Defaults to []. | ||||||
""" | ||||||
super().__init__( | ||||||
cwd=cwd, | ||||||
cores=cores, | ||||||
openmpi_oversubscribe=openmpi_oversubscribe, | ||||||
threads_per_core=threads_per_core, | ||||||
) | ||||||
self._gpus_per_core = gpus_per_core | ||||||
self._slurm_cmd_args = slurm_cmd_args | ||||||
|
||||||
def generate_command(self, command_lst: list[str]) -> list[str]: | ||||||
""" | ||||||
Generate the command list for the Srun interface. | ||||||
|
||||||
Args: | ||||||
command_lst (list[str]): The command list. | ||||||
|
||||||
Returns: | ||||||
list[str]: The generated command list. | ||||||
""" | ||||||
command_prepend_lst = generate_slurm_command( | ||||||
cores=self._cores, | ||||||
cwd=self._cwd, | ||||||
threads_per_core=self._threads_per_core, | ||||||
gpus_per_core=self._gpus_per_core, | ||||||
openmpi_oversubscribe=self._openmpi_oversubscribe, | ||||||
slurm_cmd_args=self._slurm_cmd_args, | ||||||
) | ||||||
return super().generate_command( | ||||||
command_lst=command_prepend_lst + command_lst, | ||||||
) | ||||||
|
||||||
|
||||||
def generate_slurm_command( | ||||||
cores: int, | ||||||
cwd: str, | ||||||
threads_per_core: int = 1, | ||||||
gpus_per_core: int = 0, | ||||||
openmpi_oversubscribe: bool = False, | ||||||
slurm_cmd_args: list[str] = [], | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same mutable default argument concern. Use the same approach as above to ensure each invocation gets its own list instance: - slurm_cmd_args: list[str] = [],
+ slurm_cmd_args: Optional[list[str]] = None, and initialize within the function body: if slurm_cmd_args is None:
slurm_cmd_args = []
🧰 Tools🪛 Ruff (0.8.2)67-67: Do not use mutable data structures for argument defaults Replace with (B006) |
||||||
) -> list[str]: | ||||||
""" | ||||||
Generate the command list for the SLURM interface. | ||||||
|
||||||
Args: | ||||||
cores (int): The number of cores. | ||||||
cwd (str): The current working directory. | ||||||
threads_per_core (int, optional): The number of threads per core. Defaults to 1. | ||||||
gpus_per_core (int, optional): The number of GPUs per core. Defaults to 0. | ||||||
openmpi_oversubscribe (bool, optional): Whether to oversubscribe the cores. Defaults to False. | ||||||
slurm_cmd_args (list[str], optional): Additional command line arguments. Defaults to []. | ||||||
|
||||||
Returns: | ||||||
list[str]: The generated command list. | ||||||
""" | ||||||
command_prepend_lst = [SLURM_COMMAND, "-n", str(cores)] | ||||||
if cwd is not None: | ||||||
command_prepend_lst += ["-D", cwd] | ||||||
if threads_per_core > 1: | ||||||
command_prepend_lst += ["--cpus-per-task" + str(threads_per_core)] | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potential typo: missing equals sign in '--cpus-per-task'. Proposed fix: - command_prepend_lst += ["--cpus-per-task" + str(threads_per_core)]
+ command_prepend_lst += ["--cpus-per-task=" + str(threads_per_core)] 📝 Committable suggestion
Suggested change
|
||||||
if gpus_per_core > 0: | ||||||
command_prepend_lst += ["--gpus-per-task=" + str(gpus_per_core)] | ||||||
if openmpi_oversubscribe: | ||||||
command_prepend_lst += ["--oversubscribe"] | ||||||
if len(slurm_cmd_args) > 0: | ||||||
command_prepend_lst += slurm_cmd_args | ||||||
return command_prepend_lst |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Avoid using mutable default arguments.
Using mutable lists as default argument values can lead to unexpected behavior when multiple instances share the same list reference.
You can fix this by setting the default to None and initializing it in the method body:
And inside the constructor:
🧰 Tools
🪛 Ruff (0.8.2)
16-16: Do not use mutable data structures for argument defaults
Replace with
None
; initialize within function(B006)