提交它!
什么是submitit?
Submitit是一个轻量级工具,用于在Slurm集群中提交Python函数进行计算。它基本上封装了提交过程,并提供对结果、日志等的访问。 Slurm是一个开源、容错且高度可扩展的集群管理和作业调度系统,适用于大型和小型Linux集群。 Submitit允许在Slurm上执行和本地执行之间无缝切换。
一个例子胜过千言万语:执行加法
在安装了submitit
的环境中:
import submitit
def add(a, b):
return a + b
# executor是提交接口(日志存储在该文件夹中)
executor = submitit.AutoExecutor(folder="log_test")
# 设置超时时间(分钟)和运行作业的分区
executor.update_parameters(timeout_min=1, slurm_partition="dev")
job = executor.submit(add, 5, 7) # 将计算add(5, 7)
print(job.job_id) # 你的作业ID
output = job.result() # 等待完成并返回输出
assert output == 12 # 5 + 7 = 12... 你的加法在集群中计算完成
Job
类还提供了读取日志文件的工具(job.stdout()
和job.stderr()
)。
如果你想运行的是命令,可以使用submitit.helpers.CommandFunction
将其转换为Python函数,然后提交它。
默认情况下,CommandFunction
中的stdout是静默的,但可以通过verbose=True
取消静默。
在这里查看更多示例!!!
Submitit是一个Python 3.8+工具箱,用于向Slurm提交作业。 它旨在从Python代码中运行Python函数。
安装
快速安装,在已安装pip
的虚拟环境/conda环境中(检查which pip
):
- 稳定版本:
pip install submitit
- 使用__conda__安装稳定版本:
conda install -c conda-forge submitit
- main分支:
pip install git+https://github.com/facebookincubator/submitit@main#egg=submitit
你可以尝试运行MNIST示例来检查一切是否按预期工作(需要sklearn)。
文档
查看以下页面以获取更详细的信息:
- 示例:展示了一系列处理错误、并发、多任务等的示例。
- 结构和主要对象:帮助你更好地理解
submitit
的工作原理、每个作业创建的文件以及你将交互的主要对象。 - 检查点:了解如何配置你的作业以便在被抢占和/或超时时进行检查点。
- 提示和注意事项:提供了使用
submitit
时可能有用的一系列信息。 - 使用nevergrad进行超参数搜索:
nevergrad
使用的基本示例以及它如何与submitit
接口。
目标
这个Python3包的目标是能够从Python内部轻松地在Slurm上启动作业,使用与标准库包concurrent.futures
相同的提交和作业模式:
使用这个轻量级包有以下几个好处:
- 提交任何函数,包括lambda和脚本定义的函数。
- 如果作业失败,会引发带有堆栈跟踪的错误。
- 重新排队被抢占的作业(仅限Slurm)
- 在一行内在
submitit
执行器和concurrent.futures
执行器之间切换,因此可以轻松地在slurm上或本地使用多线程运行代码。 - 当被抢占或超时时对有状态的可调用对象进行检查点,并从当前状态重新排队(高级功能)。
- 轻松访问多节点/任务作业的任务本地/全局排名。
- 相同的代码可以通过插件系统在不同的集群上工作。
Submitit被FAIR研究人员在FAIR集群上使用。 默认设置是为了让他们的工作更轻松,可能并不适合每个集群。
非目标
- 用于运行slurm作业的命令行工具。这里,一切都发生在Python内部。为此,你可以使用Hydra的submitit插件(版本 >= 1.0.0)。
- 任务队列,这只实现了启动任务的能力,但不以任何方式调度它们。
- 在Python2中使用!这是一个仅支持Python3.8+的包 :)
与dask.distributed的比较
dask
是一个优秀的分布式计算框架。dask.distributed
提供了与submitit
相同的concurrent.futures
执行器API:
from distributed import Client
from dask_jobqueue import SLURMCluster
cluster = SLURMCluster(processes=1, cores=2, memory="2GB")
cluster.scale(2) # 这可能需要几秒钟来启动
executor = Client(cluster)
executor.submit(...)
与submitit
的主要区别是,dask.distributed
将作业分配给一组工作者(参见上面的cluster
变量),而submitit
作业直接在集群上运行。在这个意义上,submitit
是比dask.distributed
更低级的接口,你可以更直接地控制你的作业,包括单独的stdout
和stderr
,以及在抢占和超时情况下可能的检查点。另一方面,你应该避免使用submitit
提交多个小任务,这会创建许多独立的作业并可能使集群过载,而通过dask.distributed
你可以毫无问题地这样做。
贡献者
按时间顺序:Jérémy Rapin, Louis Martin, Lowik Chanussot, Lucas Hosseini, Fabio Petroni, Francisco Massa, Guillaume Wenzek, Thibaut Lavril, Vinayak Tantia, Andrea Vedaldi, Max Nickel, Quentin Duval(欢迎贡献并添加你的名字 ;) )
许可证
Submitit根据MIT许可证发布。