-
Notifications
You must be signed in to change notification settings - Fork 30
Description
1、功能描述
--input(或其缩写 -i)参数用于控制任务的标准输入(stdin)是如何被重定向的。在并行计算环境中,如何将输入数据正确地分发给成百上千个并发任务是一个关键问题,--input正是解决这个问题的工具。
该参数有几种不同的模式 (),每种模式对应一种不同的stdin处理方式:
(1)- all (默认模式)
- 行为: 如果不指定-i参数,crun默认采用此模式。它会将用户发起crun命令的那个终端的标准输入,广播(broadcast)给作业步中的所有任务。
- 场景: 当用户希望所有并行任务都接收到相同的指令或数据时使用。例如,启动一个所有任务都等待一个启动信号的程序。
(2)- none
- 行为: 告诉crun不要为任何任务重定向stdin。实际上,它会将任务的stdin连接到/dev/null,这意味着任何尝试从stdin读取数据的操作都会立即得到一个文件结束符(EOF)。
- 场景: 这是运行非交互式程序(如后台服务、守护进程或纯计算任务)的最佳实践。它可以防止你的作业因为意外地等待一个永远不会到来的输入而“卡住”或挂起。
(3)- <task_id> (指定任务号)
- 行为: 将终端的stdin仅仅重定向给指定ID的那个任务。任务ID从0开始。其他所有任务的stdin都会被连接到/dev/null(等同于none模式)。
- 场景: 这在主/从(Master/Worker)计算模型中非常有用。你可以将输入发送给主任务(例如,任务0),由它来处理输入并分发工作给其他从任务。也常用于在大型并行作业中单独调试某一个任务。
(4) (指定文件名)
- 行为: 将指定文件的内容作为所有任务的stdin。crun会读取这个文件,并将其内容通过管道传递给所有任务。
- 场景: 当你的所有任务都需要处理相同的输入数据集时,这非常方便。它类似于Shell中的< filename重定向,但被集成到了作业启动流程中。
2、 Slurm 的 srun --input 在设计上并不关心文件的具体“类型”(如 .txt, .csv, .dat 等文件扩展名)。它关心的是文件的内容格式。
- 主要支持类型:文本文件(Text Files) 任何可以被程序作为标准输入读取的文本文件都是支持的。这包括:
- 纯文本文件:包含程序所需输入数据的简单文本文件。
- 格式化文本文件:如 CSV(逗号分隔值)、TSV(制表符分隔值)或其他由特定分隔符组织的文本数据文件。
- 程序代码或脚本:如果程序是解释器(如 bash、python),可以将脚本文件作为输入。
- 核心概念:标准输入流(Standard Input Stream),--input 参数处理的是数据流。Slurm 会打开你指定的文件,并将其内容通过管道(pipe)传递给你运行的程序的标准输入。因此,只要程序能够从标准输入读取数据,那么任何包含这些数据的文本文件都可以与 --input 一起使用。
3、关联的环境变量
--input 选项本身不会创建特定的环境变量来指示输入文件名。然而,它与 Slurm 的整体作业环境和一些通用环境变量紧密相关:
(1). SLURM_SUBMIT_DIR: 这是最重要的相关变量之一。它记录了执行 srun 命令时所在的目录。如果你在 --input 中使用的是相对路径(如 srun --input my_data.txt ...),那么 Slurm 会在这个 SLURM_SUBMIT_DIR 目录中查找 my_data.txt。
(2). SLURM_JOB_ID / SLURM_STEP_ID: 虽然不直接与 --input 关联,但这些变量在调试时非常有用,可以通过它们知道是哪个作业或作业步使用了特定的输入文件。
(3). SLURM_* 系列变量: srun 会为作业环境设置一系列 SLURM_* 变量(如 SLURM_NTASKS, SLURM_PROCID, SLURM_NODELIST 等)。这些变量定义了作业的并行环境。程序可以利用这些变量来决定如何处理从标准输入读取的数据。例如,一个 MPI 程序可以根据 SLURM_PROCID(进程 ID)来决定只让主进程(ID 为 0)读取输入,然后将数据分发给其他进程。
(4). SRUN_CPUS_PER_TASK 自Slurm 22.05版本起,srun不再默认从SLURM_CPUS_PER_TASK继承--cpus-per-task的设置,需要通过srun -c $SLURM_CPUS_PER_TASK或者设置export SRUN_CPUS_PER_TASK=$SLURM_CPUS_PER_TASK来传递。这虽然与输入文件无直接关系,但属于srun的环境变量交互的一部分。
参考文档:https://slurm.schedmd.com/srun.html
调研文档:https://e26ruh1viz.feishu.cn/wiki/SCfqwqhu8icEf8k9YpIcPg7PnRw