Snakemake工作流如何记录单任务耗时与总耗时?
Snakemake日志配置与性能分析问题解答
背景
运行Snakemake工作流时,控制台仅记录任务开始时间(示例:[Fri Jul 12 10:39:15 2024]),希望调整日志以显示每个任务耗时、工作流总耗时(单位:毫秒),用于对比PyPSA-Eur不同求解器的性能,手动计算耗时效率低下。工作流运行示例如下:
Assuming unrestricted shared filesystem usage. Building DAG of jobs... Provided cores: 8 Rules claiming more threads will be scaled down. Job stats: job count -------- ------- run_main 1 total 1 Select jobs to execute... Execute 1 jobs... [Fri Jul 12 10:39:15 2024] localrule run_main: input: input/input.txt output: output/output.txt jobid: 0 reason: Code has changed since last execution resources: tmpdir=C:\Users\eis\AppData\Local\Temp\PyCharmPortableTemp Running snake_script.py at C:\python_env\workspace\resilient\snakemake_demo Processed data written to output/output.txt [Fri Jul 12 10:39:15 2024] Finished job 0. 1 of 1 steps (100%) done
a) 是否存在可调整格式字符串等的日志配置文件?
Snakemake没有直接提供用于修改控制台输出格式的日志配置文件,但可以通过两种方式实现耗时记录需求:
- 规则内自定义计时:在每个规则中嵌入Python计时逻辑,计算并打印任务耗时:
rule run_main: input: "input/input.txt" output: "output/output.txt" run: import time start = time.time() # 原有规则执行逻辑 shell("python snake_script.py") elapsed_ms = (time.time() - start) * 1000 print(f"[任务 {wildcards} 耗时] {elapsed_ms:.2f} 毫秒")
- 全局钩子(Hook)计时:利用Snakemake 7.0+版本的钩子功能,全局捕获任务的开始和结束时间,自动计算耗时:
import time from snakemake.utils import min_version min_version("7.0.0") def job_start(job): job._start_time = time.time() def job_finish(job): elapsed_ms = (time.time() - job._start_time) * 1000 print(f"[完成任务 {job.jobid}] 耗时: {elapsed_ms:.2f} 毫秒") snakemake.hooks.job_start = job_start snakemake.hooks.job_finish = job_finish
工作流总耗时可通过外部脚本包裹Snakemake命令实现,比如:
start=$(date +%s%N) snakemake --cores 8 end=$(date +%s%N) echo "工作流总耗时: $(( (end - start) / 1000000 )) 毫秒"
b) 是否有针对Snakemake的性能分析工具,可帮助监控与优化工作流性能?
有多种工具和方法支持Snakemake工作流的性能分析,适配PyPSA-Eur求解器对比场景:
- Snakemake内置报告:运行
snakemake --report performance_report.html,生成的HTML报告包含所有任务的执行时间、资源占用等数据,可直观对比不同求解器任务的耗时差异。 --stats参数导出统计数据:运行snakemake --stats workflow_stats.json,生成JSON格式的详细统计文件,包含每个任务的开始/结束时间、资源使用情况,可编写脚本批量解析对比求解器性能。- 第三方可视化工具:使用
snakeviz将任务耗时数据可视化,通过导入统计数据生成交互式图表,快速定位耗时最长的求解步骤。 - PyPSA-Eur日志解析:PyPSA-Eur的求解器规则会输出包含时间戳的日志文件,直接解析这些日志提取求解阶段的耗时,无需额外修改工作流即可对比不同求解器的性能。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

