@@ -14,18 +14,23 @@ FlowLine 是一个用于 **GPU资源管理** 和 **并发指令流调度** 的
1414* 🧩 ** 系统概要设计** :详见 [ 概要设计] ( ./docs/design.md )
1515* 🏗️ ** 系统架构详解** :详见 [ 架构说明] ( ./docs/arch.md )
1616
17- 该系统的设计初衷是为了替代手动监控 GPU 状态并依次执行命令的低效方式。在传统流程中,用户需要持续关注 GPU 的剩余显存和使用情况 ,以便手动启动 Python 脚本或终止进程,这在多任务实验场景中尤为繁琐。本项目通过自动化机制解决了这些问题,提升了实验效率与资源利用率。
17+ 该系统的设计初衷是为了替代手动监控 GPU 状态并依次执行命令的低效方式。在传统流程中,用户需要持续关注 GPU 的显存占用和利用率,还可能cuda out of memory ,以便手动启动 Python 脚本或终止进程,这在多任务实验场景中尤为繁琐。本项目通过自动化机制解决了这些问题,提升了实验效率与资源利用率。
1818
19- > ~ 你也不想因为 CUDA Out of Memory 重新手动改sh吧。 ~
19+ 本系统的设计初衷在于替代传统的手动 GPU 监控与命令执行流程,从而提升实验效率。在传统方式下,用户需持续关注 GPU 的显存占用与利用率,并可能因 CUDA 内存不足(CUDA Out of Memory)而中断任务,需要手动启动或终止 Python 脚本。这种操作在多任务实验场景中尤为繁琐。本项目通过自动化管理机制,提升了实验效率与资源利用率。
2020
2121## 核心特性
2222
23- * 实时 GPU 状态监控:自动检测可用 GPU 数量、显存占用、进程信息等、并选择最恰当的GPU;
23+ * 实时 GPU 状态监控:自动检测可用 GPU 数量、显存占用、进程信息等、并根据自定义优先函数排序;
24+ * ** 报错自动处理** :错误中断后自动重新入队而解决 CUDA Out of Memory 等非程序BUG;
2425* 命令调度与资源控制:支持配置每条命令所需 GPU 数量、显存下限、最大并行数等条件;
2526* 动态调控机制:可手动终止或重启进程,实现任务队列灵活管理;
2627* 多任务并发执行:支持任务优先级队列、失败重试等策略,适用于批量实验运行;
2728* 双重交互入口:命令行接口适合在 Linux 服务器上进行脚本化控制与批量部署,Web 界面适合进行任务的可视化查看、状态监控与实时干预。
2829
30+ ## Updates
31+
32+ * 2025.09.09: 新增用户自定义 GPU 优先级排序功能,通过 ` user_cmp ` 参数传入自定义排序函数,详见 [ main_cli.py] ( ./main_cli.py ) 示例。
33+
2934## 🚀 快速使用指南
3035
3136### 🖥️ 使用命令行接口(CLI 模式)
@@ -34,13 +39,13 @@ FlowLine 是一个用于 **GPU资源管理** 和 **并发指令流调度** 的
3439
3540你可以将 ` flowline ` 文件夹拷贝到项目的根目录下直接引用,也可以通过以下方式将其安装到你的 Python 环境中:
3641
37- - 从pip安装
42+ * 从pip安装
3843
3944``` bash
4045pip install fline
4146```
4247
43- - 或者从源代码安装
48+ * 或者从源代码安装
4449
4550``` bash
4651pip install -e < flowline库路径>
@@ -76,31 +81,61 @@ pip install -e <flowline库路径>
7681
7782</details >
7883
79- #### 3. 定义任务构造函数 ` func(dict, gpu_id) `
84+ #### 3. 定义任务构造函数 和 GPU优先级比较函数(可选)
8085
8186你需要自定义一个函数,用于根据 Excel 中的每一行任务参数 ` dict ` 以及分配的 GPU 编号 ` gpu_id ` 构造出最终的命令行字符串。
8287
8388<details >
8489<summary >示例和说明</summary >
8590
86- 例如 :
91+ 详见 [ main_cli.py ] ( ./main_cli.py ) 示例。主要部分如下 :
8792
8893``` python
89- from flowline import run_cli
94+ def func (dict , gpu_id , sorted_gpu_ids ):
95+ print (sorted_gpu_ids)
96+ return " CUDA_VISIBLE_DEVICES=" + str (gpu_id)+ " python -u test/test.py " + " " .join([f " -- { k} { v} " for k, v in dict .items()])
97+
98+ def cmp (info1 , info2 ):
99+ if info1.free_memory > info2.free_memory:
100+ return - 1
101+ elif info1.free_memory < info2.free_memory:
102+ return 1
103+ else :
104+ return 0
90105
91106if __name__ == " __main__" :
92- def func (param_dict , gpu_id ):
93- cmd = " CUDA_VISIBLE_DEVICES=" + str (gpu_id) + " python -u test/test.py "
94- args = " " .join([f " -- { k} { v} " for k, v in param_dict.items()])
95- return cmd + args
96-
97- run_cli(func, " test/todo.xlsx" )
107+ # run_cli(func, "test/todo.csv")
108+ run_cli(func, " test/todo.csv" , user_cmp = cmp ) # user_cmp可选
98109```
99110
100- * ` param_dict ` 是由 Excel 中当前任务行构造出的字典,键为列名,值为单元格内容;
101- * ` gpu_id ` 是系统动态分配的 GPU 编号,保证任务不冲突;
102- * 拼接后的命令字符串将作为子进程执行,等效于直接在命令行中执行该命令;
103- * 你可以根据实际情况替换为 shell 脚本、conda 环境、主命令变体等。
111+ * ` dict ` 是由 Excel 中当前任务行构造出的字典,键为列名,值为单元格内容;
112+ * ` gpu_id ` 是系统动态分配的 GPU 编号,保证任务不冲突,其此刻一定满足显存空间最小限制;
113+ * ` sorted_gpu_ids ` (可选)是经过优先级排序后的可用 GP U序列,为可能的多 GPU 任务适配;
114+ * 拼接后的命令字符串将作为子进程执行,等效于直接在命令行中执行该命令。你可以根据实际情况替换为 shell 脚本、conda 环境、主命令变体等。
115+
116+ <details >
117+ <summary >user_cmp 可用参数表</summary >
118+
119+ info1、info2其实是 [ gpu.py] ( .flowline/core/gpu.py ) 的 GPU_info 对象的实例,其可用作比较函数的参数有:
120+
121+ 可以用一个 Markdown 表格清晰地表示 ` GPU_info ` 类中每个参数的含义:
122+
123+ | 参数名 | 类型 | 含义说明 |
124+ | ------------------ | --------- | ------------------------------------------------------------- |
125+ | ` free_memory ` | int/float | GPU 当前可用显存大小(通常单位为 MB 或 GB) |
126+ | ` total_memory ` | int/float | GPU 总显存容量 |
127+ | ` utilization ` | int/float | GPU 当前使用率(百分比,0\~ 100) |
128+ | ` user_process_num ` | int | 当前用户进程数量(默认初始化为 0,可统计特定用户的 GPU 进程) |
129+ | ` all_process_num ` | int | GPU 上运行的所有进程数量 |
130+ | ` time ` | float | 记录信息更新时间的时间戳(UNIX 时间戳格式) |
131+ | ` name ` | str | GPU 名称,如 "NVIDIA GeForce RTX 3090" |
132+ | ` temperature ` | int/float | GPU 当前温度(单位通常为摄氏度 °C) |
133+ | ` power ` | float | GPU 当前功耗(单位通常为瓦特 W) |
134+ | ` max_power ` | float | GPU 最大设计功耗(单位瓦特 W) |
135+
136+ 如果你需要,我可以帮你画一个** 可视化示意图** ,把 GPU 状态参数和它们的含义一目了然地展示出来,这在文档或汇报中很直观。你希望我画吗?
137+
138+ </details >
104139
105140<details >
106141<summary >关于输出和python -u</summary >
@@ -124,7 +159,13 @@ log/
124159</details >
125160</details >
126161
127- #### 4. 输入` run ` 开始运行任务流
162+ #### 4. 运行程序后输入` run ` 开始运行任务流
163+
164+ 运行 ` main_cli.py ` 启动程序:
165+
166+ ``` bash
167+ python main_cli.py
168+ ```
128169
129170<details >
130171<summary >FlowLine CLI 命令参考表</summary >
143184| ` exit ` | 无 | 退出程序(等效` Ctrl+D ` ) |
144185| ` help ` 或 ` ? ` | 无 | 显示帮助信息 |
145186
146-
147187<details >
148188<summary >命令使用示例</summary >
149189
175215# 退出程序
176216> exit
177217```
218+
178219</details >
179220</details >
180221
@@ -203,7 +244,6 @@ python -m http.server 8000
203244
204245这将在 [ http://localhost:8000 ] ( http://localhost:8000/ ) 启动前端服务,前端可通过 RESTful API 访问后端任务状态与控制接口。
205246
206-
207247<div align =center >
208248 <img src =" ./docs/fig/gpu.png " alt =" Image 1 " height =" 200px " />
209249 <img src =" ./docs/fig/task.png " alt =" Image 1 " height =" 200px " />
@@ -217,26 +257,27 @@ python -m http.server 8000
217257
218258### 📌 使用前须知
219259
220- - 本项目提供的工具** 不会以暴力方式强制杀掉他人任务** ,也** 不会绕过权限限制或系统调度机制** 。
221- - 本脚本默认** 只在用户拥有访问权限的设备上运行** ,请确保遵守所在实验室或计算平台的使用规则。
222- - ** 请勿用于占用公共资源或干扰他人科研工作** ,违者后果自负。
260+ * 本项目提供的工具** 不会以暴力方式强制杀掉他人任务** ,也** 不会绕过权限限制或系统调度机制** 。
261+ * 本脚本默认** 只在用户拥有访问权限的设备上运行** ,请确保遵守所在实验室或计算平台的使用规则。
262+ * ** 请勿用于占用公共资源或干扰他人科研工作** ,违者后果自负。
223263
224264### 🚨 风险声明
225265
226266使用本脚本可能带来的风险包括但不限于:
227267
228- - 与他人并发调度产生冲突,影响公平使用;
229- - 若滥用,可能违反实验室/平台管理规定;
268+ * 与他人并发调度产生冲突,影响公平使用;
269+ * 若滥用,可能违反实验室/平台管理规定;
230270
231271开发者对因使用本脚本而导致的** 资源冲突、账号受限、数据丢失或任何直接间接损失** 概不负责。
232272
233273## 💐 贡献
234274
235275欢迎大家为本模板贡献代码、修正bug或完善文档!
236- - 如有建议或问题,请提交Issue。
237- - 欢迎提交Pull Request。
238276
239- > [ !TIP]
277+ * 如有建议或问题,请提交Issue。
278+ * 欢迎提交Pull Request。
279+
280+ > [ !TIP]
240281> 若对您有帮助,请给这个项目点上 ** Star** !
241282
242283** 感谢所有贡献者!**
0 commit comments