
Hydra Submitit Launcher 插件实战用 SLURM 集群与本地模式调度你的 Sweep 任务【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydraHydra 的 Submitit Launcher 插件hydra-submitit-launcher为 Hydra 应用提供了基于 Submitit 的 SLURM 集群 Launcher让你可以直接把--multirun的批量任务提交到集群调度执行同时还内置了一个submitit_localLauncher 用于本地快速测试。读完本文你将掌握插件的安装方式、两种 Launcher 的全部可配置参数及其含义、命令行覆盖技巧并能基于仓库源码理解任务提交的底层调用链。插件是什么Submitit Launcher 插件是 Hydra 官方插件家族的一员位于仓库 plugins/hydra_submitit_launcher其核心定位由 README.md 概括为基于 Submitit 提供支持 SLURM 的 Hydra Launcher。该插件在hydra/launcher配置组下注册了两个可选配置项见 config.pysubmitit_slurm面向 SLURM 集群对应SlurmLauncher配置节点为SlurmQueueConfsubmitit_local面向本地测试对应LocalLauncher配置节点为LocalQueueConf。插件源码中BaseSubmititLauncher继承自 Hydra 的Launcher基类见 submitit_launcher.pyLocalLauncher与SlurmLauncher只是分别把_EXECUTOR设为local和slurm的两个子类submitit_launcher.py二者共享同一套提交逻辑。安装在已安装 Hydra 的环境中使用 pip 直接安装即可pip install hydra-submitit-launcher --upgrade从插件的 setup.py 可以看到其运行前提python_requires3.10依赖hydra-core1.1.0.dev7与submitit1.4.6。安装完成后插件会通过 Hydra 的插件发现机制自动注册。仓库测试 test_submitit_launcher.py 中的test_discovery用例专门验证了LocalLauncher与SlurmLauncher都能被Plugins.instance().discover(Launcher)发现。启用方式插件安装后并不会自动启用需要显式指定 Launcher。有两种标准做法在命令行中追加hydra/launchersubmitit_slurm在应用的defaults列表中覆盖hydra/launcherdefaults: - override hydra/launcher: submitit_slurm关于插件配置的标准做法可参考仓库文档 patterns/configuring_plugins。需要注意一个关键前提插件期望目标主机上存在一个有效的运行环境通常意味着提交主机与目标主机之间要有共享文件系统。同时官方文档特别警告必须使用--multirunLauncher 才会被真正接管——单次运行模式下 Launcher 不会被调用。两种 Launcher 的完整参数SLURM Launchersubmitit_slurm在配置文件中启用submitit_slurm后运行下面命令即可查看hydra.launcher的全部默认参数# package hydra.launcher submitit_folder: ${hydra.sweep.dir}/.submitit/%j timeout_min: 60 cpus_per_task: null gpus_per_node: null tasks_per_node: 1 mem_gb: null nodes: 1 name: ${hydra.job.name} _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.SlurmLauncher partition: null qos: null comment: null constraint: null exclude: null gres: null cpus_per_gpu: null gpus_per_task: null mem_per_gpu: null mem_per_cpu: null account: null signal_delay_s: 120 max_num_timeout: 0 python: null additional_parameters: {} array_parallelism: 256 setup: null srun_args: nullLocal Launchersubmitit_local# package hydra.launcher _target_: hydra_plugins.hydra_submitit_launcher.submitit_launcher.LocalLauncher submitit_folder: ${hydra.sweep.dir}/.submitit/%j timeout_min: 60 cpus_per_task: 1 gpus_per_node: 0 tasks_per_node: 1 mem_gb: 4 nodes: 1 name: ${hydra.job.name}参数详解两组参数由共享基类BaseQueueConf和 SLURM 专属的SlurmQueueConf定义见 config.py两类 Launcher 共享的公共参数BaseQueueConf参数默认值说明submitit_folder${hydra.sweep.dir}/.submitit/%jSubmitit 存放任务日志与状态的文件夹模板%j会被替换为实际任务 IDtimeout_min60任务最大时长分钟超时后 SLURM 会终止任务cpus_per_tasknullSLURM/1local每个任务分配的 CPU 数gpus_per_nodenullSLURM/0local每个节点分配的 GPU 数tasks_per_node1每个节点上生成的任务数mem_gbnullSLURM/4local每个节点上为任务预留的内存GBnodes1任务使用的节点数name${hydra.job.name}任务名称默认取当前 Hydra job 名stderr_to_stdoutfalse将 stderr 重定向到 stdout该参数在 config.py 中定义对应 Submitit 的stderr_to_stdout支持见插件 NEWS.md 1.2.0 更新记录SLURM 专属参数SlurmQueueConf这些参数主要用于配置sbatch提交脚本对应 SLURM 的sbatch选项详见 config.py参数默认值说明partitionnull集群上使用的 SLURM 分区qosnullSLURM 服务质量Quality of Servicecommentnull任务备注constraintnull节点约束条件excludenull排除的节点列表gresnull通用资源申请如 GPU 型号1.2.0 起支持cpus_per_gpunull每块 GPU 分配的 CPU 数gpus_per_tasknull每个任务分配的 GPU 数mem_per_gpunull每块 GPU 分配的内存mem_per_cpunull每个 CPU 分配的内存accountnullSLURM 计费账户1.2.0 起支持Submitit 专属参数config.py参数默认值说明signal_delay_s120超时前发送 USR1 信号的延迟秒数用于给任务预留清理/保存检查点的窗口max_num_timeout0任务超时后的最大重试次数。仅在确认代码能通过从最新检查点恢复来正确处理重新提交后再修改此值pythonnull使用的 Python 解释器路径默认跟随运行 Hydra 的sys.executableadditional_parameters{}补充插件尚未内置支持的参数例如{mail-user: userexample.com, mail-type: BEGIN}array_parallelism256并行运行的最大任务数setupnull在srun之前于 sbatch 脚本中执行的命令列表srun_argsnull额外传给srun的参数参数覆盖与命令行用法所有参数都可以在配置文件里设置也可以在命令行中直接覆盖例如把超时时间改成 3 分钟python foo.py --multirun hydra/launchersubmitit_slurm hydra.launcher.timeout_min3将hydra.launcher.tasks_per_node设为null可以从生成的 SLURM 提交脚本中省略--ntasks-per-node选项python foo.py --multirun hydra/launchersubmitit_slurm hydra.launcher.tasks_per_nodenull这条行为有对应的测试用例保障测试 test_submitit_launcher.py 验证了tasks_per_node1是默认值且设置为null后依然会正确传递到executor.update_parameters()。使用其他 Python 解释器运行被提交的任务可以覆盖hydra.launcher.pythonpython foo.py --multirun hydra/launchersubmitit_slurm hydra.launcher.python/opt/venv/bin/python测试 test_slurm_python_parameter 表明python与max_num_timeout会被作为slurm_python、slurm_max_num_timeout传入submitit.AutoExecutor(clusterslurm, ...)而不会出现在update_parameters的资源参数里。底层执行流程从源码看任务提交的核心逻辑集中在 BaseSubmititLauncher.launch执行链路大致如下构造执行器以submitit_folder作为folder把max_num_timeout、python两个参数分别映射为{executor}_max_num_timeout和{executor}_python通过submitit.AutoExecutor(cluster...)创建执行器。更新资源参数公共参数BaseQueueConf的字段原样透传其余参数自动加上slurm_/local_前缀后再传给executor.update_parameters(**params)。准备 sweep 目录创建hydra.sweep.dir并应用权限模式若配置了hydra.sweep.mode。批量映射对每个 sweep 覆盖组合调用executor.map_array(self, ...)把self.__call__作为提交到集群的可调用对象任务返回后收集j.results()[0]作为JobReturn序列。在集群侧每个任务实际执行的是 BaseSubmititLauncher.call它会恢复Singleton状态、重新加载对应覆盖组合的 sweep 配置用submitit.JobEnvironment().job_id填充hydra.job.id最终通过 Hydra 的run_job执行用户任务函数。checkpoint方法则利用submitit.helpers.DelayedSubmission支持超时重提交submitit_launcher.py。此外submitit的导入被刻意放在方法内部lazy import以保证插件发现过程保持快速。示例应用插件仓库自带一个可直接运行的示例应用见 example/my_app.pyhydra.main装饰的应用会通过submitit.JobEnvironment()读取集群环境信息打印当前进程 PID、任务编号与环境对象然后休眠 1 秒。其配置 example/config.yaml 中已经通过defaults覆盖启用了submitit_slurmdefaults: - override hydra/launcher: submitit_slurm task: 1以task1,2,3做 multirun 会启动 3 个执行多任务执行机制参见 tutorials/basic/running_your_app/2_multirun若想在本地先做测试可以追加hydra/launchersubmitit_local覆盖$ python my_app.py task1,2,3 --multirun [HYDRA] Sweep output dir : multirun/2020-05-28/15-05-22 [HYDRA] #0 : task1 [HYDRA] #1 : task2 [HYDRA] #2 : task3运行结束后可以在输出目录中查看每个任务的日志与 multirun 配置$ tree . ├── 0 │ └── my_app.log ├── 1 │ └── my_app.log ├── 2 │ └── my_app.log └── multirun.yaml $ cat 0/my_app.log [2020-05-28 15:05:23,511][__main__][INFO] - Process ID 15887 executing task 1 ... [2020-05-28 15:05:24,514][submitit][INFO] - Job completed successfully测试套件中的 test_example 也以-mmultirun加hydra/launchersubmitit_local的方式实际运行了该示例验证整个链路可用。小结hydra-submitit-launcher让 Hydra 的 multirun 批量实验可以无缝落到 SLURM 集群上也提供了submitit_local用于本地联调。实际使用时牢记三点其一必须用--multirun触发 Launcher其二集群环境通常需要提交机与执行机之间共享文件系统其三涉及超时重试max_num_timeout前务必确认你的任务代码能够从检查点正确恢复。【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考