有些训练任务 A 通常要运行很久,通常要半夜才能执行完成。 而当任务完成之后,我希望能根据任务的 exit code 是否为 0 来选择执行下一个分支 B 或 C.
在一个相对固定的流程里,A/B/C 的执行逻辑是可以用 bash 脚本轻松写出来的,但这个属于探索阶段,当 A 开始执行时,我还没想好 B/C 是什么,所以需要在 A 执行流程中再提交 B/C 为 A 结果的条件分支。
想问下 linux 有没有这样的队列与条件执行工具:
可以动态提交任务,不用写死脚本
执行逻辑类似于: submit "sleep 600" as A; submit "echo success" as B if A.exitcode == 0; submit "echo fail" as C if A.exitcode != 0
可以规定最多同时执行的任务数
1
iminto 2023-05-12 10:33:56 +08:00
jenkins 吧,有你折腾的时间,jenkins 部署的 CI 早都上线了
|
2
s82kd92l OP @iminto java/CI 生态熟悉成本有点高, 而且公司机器只能在 webterminal 里面跑命令, 自建 http 服务在浏览器是不通的。
|
3
iminto 2023-05-12 11:14:17 +08:00
那就 python ansible 这类轻量工具上来,也没啥学习成本,比 bash 也语法规范易扩展点
|
4
zhangsanfeng2012 2023-05-12 11:25:59 +08:00
|
6
s82kd92l OP @zhangsanfeng2012 如果没有条件分支这样是可以的,但是还是想要依赖 first.sh 的结果做选择, 另外就是这种依赖逻辑可能叠很多层,想知道有没有更灵活的工具
|
7
ruidoBlanco 2023-05-12 11:47:45 +08:00 1
bash 就可以解決。
A 完成時,跑一個腳本,用來根據 A 的運行結果,從文件裡指定的列表裡選擇跑 B ,或者 C 。 所以,A 跑起來的時候,定義下一個任務的文件可以不存在。它結束的時候有就行了。文件內容大概可以是這樣 > cat jobs pwd date > cat choose_job.sh #!/bin/bash [ $1 -eq 0 ] && eval `sed -n 1p jobs` || eval `sed -n 2p jobs` > uptime ; ./choose_job.sh $? 13:44:14 up 22 days, 22:04, 8 users, load average: 0.16, 0.18, 0.08 /home/roy/tmp > grep aaa jobs; ./choose_job.sh $? Fri May 12 01:44:28 PM AEST 2023 |
8
moshiyeap100 2023-05-12 13:44:11 +08:00
把执行结果存在本地。
{status=0,taskChose=A} if status=0 然后拉起对应的任务继续执行。 |
9
oldsix2 2023-05-12 14:05:14 +08:00
|
10
MrKrabs 2023-05-12 14:22:28 +08:00 1
nq
|
11
bantianys 2023-05-12 14:29:17 +08:00 1
用的 airflow ,下面的代码是 chatgpt 鲁的一个简单 demo ,可以参考下。
from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.operators.python_operator import PythonOperator from datetime import datetime, timedelta def task_a(): # 在此处编写任务 A 的代码 return True # 假设任务 A 成功执行 def task_b(): # 在此处编写任务 B 的代码 return True def task_c(): # 在此处编写任务 C 的代码 return True default_args = { 'owner': 'airflow', 'depends_on_past': False, 'start_date': datetime(2022, 1, 1), 'retries': 1, 'retry_delay': timedelta(minutes=5), } dag = DAG('task_flow', default_args=default_args, schedule_interval=timedelta(days=1), max_active_runs=1) task_a = PythonOperator( task_id='task_a', python_callable=task_a, dag=dag, ) task_b = PythonOperator( task_id='task_b', python_callable=task_b, dag=dag, ) task_c = PythonOperator( task_id='task_c', python_callable=task_c, dag=dag, ) task_a >> [task_b, task_c] 部署和执行 Airflow DAG 的步骤如下: 安装 Airflow:请参考官方文档安装 Airflow 。 创建 DAG 文件:将代码保存为一个.py 文件,然后将文件放在您的 DAG 目录中(默认为~/airflow/dags/)。 启动 Airflow 服务:运行以下命令以启动 Airflow 服务: BASH 复制 airflow webserver -p 8080 airflow scheduler 第一个命令启动 Web 服务器,第二个命令启动调度器。您可以将这些命令放在后台运行,这样它们就会一直运行。 运行 DAG:通过 Airflow 的 Web 界面,您可以手动运行 DAG 。在 Web 界面中,DAG 任务列表中应该会显示您的任务流程。在任务列表中,单击"Trigger Dag"按钮以手动运行 DAG 。 查看日志:Airflow 会自动记录每个任务的日志。您可以通过 Web 界面查看任务的日志,以了解任务的详细信息。 希望这些步骤可以帮助您部署和执行 Airflow DAG 。如果您有任何其他问题,请随时问我。 |
12
s82kd92l OP |
13
abbottcn 2023-05-12 19:29:47 +08:00 via iPhone
slurm
Or slurm job array. 高性能计算方面,基本都是用这类东西。 |
14
james122333 2023-05-12 21:41:52 +08:00
用 bash 写还是很简单的 但不说那么多了
只能说你的解法思路是错的 |
15
james122333 2023-05-12 21:43:21 +08:00
训练任务 一看就知道 我怎么可能搞自己
|
16
awinds 2023-05-13 12:03:35 +08:00
python 也可以啊,取出执行结果判断后继续执行
|