Skip to content

新增crun -i, --input=<mode>功能 #552

@haofangTu-bot

Description

@haofangTu-bot

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions