news 2026/3/22 18:00:37

【WDL】8. 实践:本地/集群运行

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【WDL】8. 实践:本地/集群运行

WDL可以使用本地、集群、云端三种模式来跑流程,本地运行是不需要服务器后台配置文件,而另外两种需要配置文件。

本地运行

下载cromwell和womtool到本地服务器,地址:https://github.com/broadinstitute/cromwell/releases
不建议下载最新版本,我试了下最新的version 78是报错的,好像是java版本的匹配问题。

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/hsqldb/jdbcDriver has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

我这里以version 51为例。

示例一

编写echo.wdl

workflow wf_echo { call echo output { echo.outFile echo.content } } task echo { String out command { echo Hello World! > ${out} } output { File outFile = "${out}" Array[String] content = read_lines(outFile) } }

womtool校验WDL:

java -jar womtool-51.jar validate echo.wdl

显示Success!

生成json:

java -jar womtool-51.jar inputs echo.wdl >echo.json

修改echo.json内容,配置输入文件:

{ "wf_echo.echo.out": "hello_world" }

cromwell运行WDL脚本:

java -jar cromwell-51.jar run echo.wdl --inputs echo.json

注意查看运行状态status是 'Succeeded'还是'Failed'。

流程执行完毕默认会在运行流程的目录下生成两个目录,cromwell-executions和cromwell-workflow-logs分别是执行步骤和log目录。cromwell-executions目录结构如下:

wf_echo/ └── d62e94fe-372d-434c-abcb-144036f26935 └── call-echo ├── execution │ ├── hello_world │ ├── rc │ ├── script │ ├── script.background │ ├── script.submit │ ├── stderr │ ├── stderr.background │ ├── stdout │ └── stdout.background └── tmp.d25a3769

每次运行都会生成一串字符串目录(不会覆盖之前的结果),每个task都有类似的目录结果。私以为执行速度很慢(调用的东西很多),且过程文件太多了!

目标结果:

$ cat hello_world Hello World!

示例二

一个稍微复杂点的例子,并行多输出。看看它的结果目录。
test.wdl:

workflow testwdl { Int? thread = 6 String varwdl String prefix Array[Int] intarray = [1,2,3,4,5] if(thread>5) { call taska { input: vara = varwdl, infile = taskb.outfile, prefix = prefix } } scatter (sample in intarray) { call taskb { input: varb = 'testb', thread = thread, prefix = sample } } } task taska { String vara Array[File] infile String prefix command { cat ${sep=" " infile} >${prefix}_${vara}.txt } } task taskb { String varb Int thread String prefix command { echo ${varb} ${thread} >${prefix}.txt } output { File outfile = '${prefix}.txt' } }

test.json:

{ "testwdl.varwdl": "hellowdl", "testwdl.prefix": "testwdl" }

执行java -jar cromwell-51.jar run test.wdl --inputs test.json

生成的目录结果:

23ab84c5-f219-4f2d-852f-677df6811a0b ├── call-taska │ ├── execution │ │ ├── rc │ │ ├── script │ │ ├── script.background │ │ ├── script.submit │ │ ├── stderr │ │ ├── stderr.background │ │ ├── stdout │ │ ├── stdout.background │ │ └── testwdl_hellowdl.txt │ ├── inputs │ │ ├── -1507720077 │ │ │ └── 3.txt │ │ ├── 2086182641 │ │ │ └── 1.txt │ │ ├── 289231282 │ │ │ └── 2.txt │ │ ├── -806655499 │ │ │ └── 5.txt │ │ └── 990295860 │ │ └── 4.txt │ └── tmp.de320778 └── call-taskb ├── shard-0 │ ├── execution │ │ ├── 1.txt │ │ ├── rc │ │ ├── script │ │ ├── script.background │ │ ├── script.submit │ │ ├── stderr │ │ ├── stderr.background │ │ ├── stdout │ │ └── stdout.background │ └── tmp.eba86162 ├── shard-1 │ ├── execution │ │ ├── 2.txt │ │ ├── rc │ │ ├── script │ │ ├── script.background │ │ ├── script.submit │ │ ├── stderr │ │ ├── stderr.background │ │ ├── stdout │ │ └── stdout.background │ └── tmp.658f2d2f ├── shard-2 │ ├── execution │ │ ├── 3.txt │ │ ├── rc │ │ ├── script │ │ ├── script.background │ │ ├── script.submit │ │ ├── stderr │ │ ├── stderr.background │ │ ├── stdout │ │ └── stdout.background │ └── tmp.ae04eda0 ├── shard-3 │ ├── execution │ │ ├── 4.txt │ │ ├── rc │ │ ├── script │ │ ├── script.background │ │ ├── script.submit │ │ ├── stderr │ │ ├── stderr.background │ │ ├── stdout │ │ └── stdout.background │ └── tmp.bcfe9d45 └── shard-4 ├── execution │ ├── 5.txt │ ├── rc │ ├── script │ ├── script.background │ ├── script.submit │ ├── stderr │ ├── stderr.background │ ├── stdout │ └── stdout.background └── tmp.2e004f34

集群运行

cromwell 不仅支持本地计算机任务调度,同时支持集群/云计算作业管理系统,只需要进行简单配置,就可以实现大规模计算。
官方针对不同的集群/云作业管理系统提供了相关的配置文件(https://github.com/broadinstitute/cromwell/tree/develop/cromwell.example.backends),但是本质都是讲调度命令嵌入其中。

SGE配置:backend.conf

include required(classpath("application")) backend { default = SGE # sge config providers { SGE { actor-factory = "cromwell.backend.impl.sfs.config.ConfigBackendLifecycleActorFactory" config { # Limits the number of concurrent jobs concurrent-job-limit = 50 # Warning: If set, Cromwell will run 'check-alive' for every job at this interval # exit-code-timeout-seconds = 120 runtime-attributes = """ Int cpu = 8 Float? memory_gb String? sge_queue String? sge_project """ submit = """ qsub \ -terse \ -N ${job_name} \ -wd ${cwd} \ -o ${out}.out \ -e ${err}.err \ ${"-pe smp " + cpu} \ ${"-l mem_free=" + memory_gb + "g"} \ ${"-q " + sge_queue} \ ${"-P " + sge_project} \ ${script} """ kill = "qdel ${job_id}" check-alive = "qstat -j ${job_id}" job-id-regex = "(\\d+)" # filesystem config filesystems { local { localization: [ "hard-link","soft-link", "copy" ] caching { duplication-strategy: [ "hard-link","soft-link", "copy" ] # Default: "md5" hashing-strategy: "md5" # Default: 10485760 (10MB). fingerprint-size: 10485760 # Default: false check-sibling-md5: false } } } } } } }

提交命令:
java -Dconfig.file=backend.conf -jar cromwell-51.jar run test.wdl --inputs test.json

若有Docker,也需要配置,示例如下:

dockerRoot=/cromwell-executions backend { default = Docker providers { # Example backend that _only_ runs workflows that specify docker for every command. Docker { actor-factory = "cromwell.backend.impl.sfs.config.ConfigBackendLifecycleActorFactory" config { run-in-background = true runtime-attributes = "String docker" # 嵌入 docker 的运行命令 # docker_cwd 通过 dockerRoot(默认 /cromwell-executions) 设置, 与当前目录(${cwd})下 ./cromwell-executions 相对应 submit-docker = "docker run --rm -v ${cwd}:${docker_cwd} -i ${docker} /bin/bash < ${docker_script}" } } }

关于云端的配置,运营商基本上已经配好了,我们只需要只用它的接口即可,不行就找技术支持。

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 6:18:55

【每日算法】LeetCode 169. 多数元素:从暴力枚举到巧妙投票

对前端开发者而言&#xff0c;学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始&#xff0c;每天投入一小段时间&#xff0c;结合前端场景去理解和练习…

作者头像 李华
网站建设 2026/3/15 10:38:53

Open-AutoGLM灾害推演能力曝光(模拟万级并发灾情调度仅需8秒)

第一章&#xff1a;Open-AutoGLM 应急救灾调度辅助在重大自然灾害或突发事件中&#xff0c;快速、精准的应急资源调度是保障生命安全与社会稳定的决定性因素。Open-AutoGLM 作为一款基于开源大语言模型的智能决策辅助系统&#xff0c;专为复杂场景下的多目标优化调度设计&#…

作者头像 李华
网站建设 2026/3/14 13:22:12

Linux发展到6.0了,其在嵌入式应用中,实时性方面有没有一些改进?

各专栏更新如下&#x1f447; 大模型初探分享零基础AI学习经历 OAI-5G开源通信平台实践 OpenWRT常见问题分析 5G CPE 组网技术分享 Linux音视频采集及视频推拉流应用实践详解 得力工具提升工作效率 Linux内核发展到6.0及更新的版本&#xff0c;在实时性方面确实取得了里程…

作者头像 李华
网站建设 2026/3/20 2:05:05

怎么查外国文献写研究现状:方法与技巧指南

一、wispaper 入口在这&#x1f449;https://www.wispaper.ai/ 追踪自己研究方向的前沿&#xff0c;其实是搞科研关键的技能之一 问题是&#xff0c;每天手动去检索新论文太麻烦&#xff01;看《Nature》《Science》这种综合期刊又太杂&#xff0c;想找对口内容很难&#xf…

作者头像 李华
网站建设 2026/3/13 8:12:16

怎么找出一篇论文的研究问题:实用方法与技巧指南

一、wispaper 入口在这&#x1f449;https://www.wispaper.ai/ 追踪自己研究方向的前沿&#xff0c;其实是搞科研关键的技能之一 问题是&#xff0c;每天手动去检索新论文太麻烦&#xff01;看《Nature》《Science》这种综合期刊又太杂&#xff0c;想找对口内容很难&#xf…

作者头像 李华
网站建设 2026/3/15 7:09:11

Open-AutoGLM如何实现个性化教学?3个真实场景深度拆解

第一章&#xff1a;Open-AutoGLM如何重塑个性化教学新范式Open-AutoGLM作为新一代开源自动生成语言模型&#xff0c;正以强大的语义理解与内容生成能力推动教育领域的深层变革。其核心优势在于能够根据学习者的知识水平、学习风格和兴趣偏好&#xff0c;动态构建个性化的教学路…

作者头像 李华