View a markdown version of this page

WDL 工作流程定义细节 - AWS HealthOmics

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

WDL 工作流程定义细节

以下主题提供了有关中可用于 WDL 工作流定义的类型和指令的 HealthOmics详细信息。

WDL 中的隐式类型转换 lenient

HealthOmics 支持 input.json 文件和工作流程定义中的隐式类型转换。要使用隐式类型转换,请在创建工作流时将工作流引擎指定为 WDL lenient。WDL lenient 包括所有标准 WDL 功能以及专为从 Cromwell 迁移的工作流程设计的其他兼容性行为。它支持客户的克伦威尔指令和一些不符合要求的逻辑。

WDL lenient 支持 WDL 有限例外列表中的以下项目的类型转换:https://github.com/openwdl/wdl/blob/wdl-1.1/SPEC.md#-limited-exceptions

  • 浮点到 Int,其中强制不会导致精度损失(例如 1.0 映射到 1)。

  • 字符串到 Int/Float,其中强制不会导致精度损失。

  • 在 W 可强制转换为 Y 且 X 可强制转换为 Z 的情况下,将 [W, X] 映射到数组 [Pair [Y, Z]]。

  • 数组 [配对 [W, X]] 到 Map [Y, Z],其中 W 可强制转换为 Y,X 可强制转换为 Z(例如 1.0 映射到 1)。

要使用隐式类型转换,请在创建工作流或工作流程版本时将工作流引擎指定为 WDL_LENIENT。

在控制台中,工作流引擎参数名为语言。在 API 中,工作流引擎参数被命名为引擎。有关更多信息,请参阅 创建私有工作流程创建工作流程版本

input.json 中的命名空间定义

HealthOmics 支持 input.json 中的完全限定变量。例如,如果您在工作流程中声明了两个名为 number1 和 number2 的输入变量:SumWorkflow

workflow SumWorkflow { input { Int number1 Int number2 } }

你可以在 input.json 中将它们用作完全限定变量:

{ "SumWorkflow.number1": 15, "SumWorkflow.number2": 27 }

WDL 中的原始类型

下表显示了 WDL 中的输入如何映射到匹配的原始类型。 HealthOmics 对类型强制的支持有限,因此我们建议您设置显式类型。

原始类型
WDL 类型 JSON 类型 示例 WDL 示例 JSON 密钥和值 注意
Boolean boolean Boolean b "b": true 该值必须为小写且未加引号。
Int integer Int i "i": 7 必须不加引号。
Float number Float f "f": 42.2 必须不加引号。
String string String s "s": "characters" 作为 URI 的 JSON 字符串必须映射到 WDL 文件才能导入。
File string File f "f": "s3://amzn-s3-demo-bucket1/path/to/file" 只要为工作流程提供的 IAM 角色具有对这些对象的读取权限,就会导入 Amazon S3 和 HealthOmics 存储 URI。不支持其他 URI 方案(例如file://https://、和ftp://)。URI 必须指定一个对象。它不能是目录,这意味着它不能以结尾/
Directory string Directory d "d": "s3://bucket/path/" Directory类型不包含在 WDL 1.0 或 1.1 中,因此您需要添加version development到 WDL 文件的标题中。URI 必须是亚马逊 S3 URI,且前缀以 “/” 结尾。该目录的所有内容将以单次下载的形式递归复制到工作流程中。Directory应仅包含与工作流程相关的文件。

WDL 中的复杂类型

下表显示了 WDL 中的输入如何映射到匹配的复杂 JSON 类型。WDL 中的复杂类型是由原始类型组成的数据结构。诸如列表之类的数据结构将转换为数组。

复杂类型
WDL 类型 JSON 类型 示例 WDL 示例 JSON 密钥和值 注意
Array array Array[Int] nums “nums": [1, 2, 3] 数组的成员必须遵循 WDL 数组类型的格式。
Pair object Pair[String, Int] str_to_i “str_to_i": {"left": "0", "right": 1} 该对的每个值都必须使用其匹配的 WDL 类型的 JSON 格式。WDL Pair JSON 表示形式中的字符串密钥名称不区分大小写。例如,在反序列化为 Pair 类型时,{"left”: “0”, “right”: 1} 和 {"LEFT”: “0",“右”: 1} 被视为等效。
Map object Map[Int, String] int_to_string "int_to_string": { 2: "hello", 1: "goodbye" } 地图中的每个条目都必须使用其匹配的 WDL 类型的 JSON 格式。
Struct object
struct SampleBamAndIndex { String sample_name File bam File bam_index } SampleBamAndIndex b_and_i
"b_and_i": { "sample_name": "NA12878", "bam": "s3://amzn-s3-demo-bucket1/NA12878.bam", "bam_index": "s3://amzn-s3-demo-bucket1/NA12878.bam.bai" }
结构成员的名称必须与 JSON 对象密钥的名称完全匹配。每个值都必须使用匹配的 WDL 类型的 JSON 格式。
Object N/A N/A N/A WDL Object 类型已过期,Struct在任何情况下都应替换为。

WDL 中的指令

HealthOmics 在所有支持的 WDL 版本中 HealthOmics 支持以下指令。

配置 GPU 资源

HealthOmics 支持运行时属acceleratorType性和acceleratorCount所有支持的 GPU 实例。 HealthOmics 还支持名为gpuType和的别名gpuCount,其功能与加速器对应的别名相同。如果 WDL 定义包含这两个指令,则 HealthOmics 使用加速器值。

以下示例显示如何使用这些指令:

runtime { gpuCount: 2 gpuType: "nvidia-tesla-t4" }

为服务错误配置任务重试

HealthOmics 对于因服务错误(5XX HTTP 状态码)而失败的任务,最多支持两次重试。您可以配置最大重试次数(1 或 2),也可以选择不因服务错误而重试。默认情况下,最多 HealthOmics 尝试两次重试。

以下示例设置preemptible为针对服务错误选择不重试:

{ preemptible: 0 }

有关中的任务重试的更多信息 HealthOmics,请参阅任务重试次数

为内存不足配置任务重试

HealthOmics 支持重试因内存不足而失败的任务(容器退出代码 137,4XX HTTP 状态码)。 HealthOmics 每次重试的内存量都会增加一倍。

默认情况下, HealthOmics 不会针对此类失败重试。使用该maxRetries指令指定最大重试次数。

以下示例设置maxRetries为 3,因此最多 HealthOmics 尝试四次尝试完成任务(初始尝试加上三次重试):

runtime { maxRetries: 3 }
注意

重试内存不足的任务需要 GNU findutils 4.2.3+。默认 HealthOmics 图像容器包含此包。如果您在 WDL 定义中指定了自定义图像,请确保该图像包含 GNU findutils 4.2.3+。

配置返回码

ret urnCodes 属性提供了一种机制,用于指定返回码或一组返回代码,以指示任务的成功执行。WDL 引擎遵循您在 WDL 定义的运行时部分中指定的返回代码,并相应地设置任务状态。

runtime { returnCodes: 1 }

HealthOmics 还支持名为 continue 的别名 OnReturnCode,它具有与 returnC odes 相同的功能。如果您同时指定这两个属性,则 HealthOmics 使用返回代码值。

支持的 WDL 磁盘表单

HealthOmics 接受所有标准 WDL 1.1 disks 表单。挂载路径和磁盘类型说明符 (SSD,HDD) 被忽略——仅提取数字大小。如果声明了多个条目,则将大小相加到单个/tmp分配中。

接受的表格 示例 已解析的大小
整数disks: 700700 GiB
字符串disks: "700"700 GiB
带单位的字符串disks: "700 GiB""700 GB"700 GiB
Cromwell-style 使用路径和类型disks: "local-disk 700 SSD"700 GiB(忽略路径和类型)
Comma-separated 条目disks: "local-disk 300 SSD, /scratch 200 SSD"500 GiB(总计)
字符串数组disks: ["/tmp 300 GiB", "/scratch 200 GiB"]500 GiB(总计)

HealthOmics 将所有临时存储器安装在。/tmp如果您的工作流程定义声明了多个disks条目,则将汇总大小并将总数配置为单/tmp个卷。有关 WDL disks 运行时属性的更多信息,请参阅 WDL 1.1 规范。

其他支持的运行时属性

使用 OmicStime O ut 运行时属性配置任务级超时

HealthOmics 提供自定义omicsTimeout属性来设置工作流程中的最长任务持续时间。使用以下一个或多个单位将超时持续时间指定为整数(秒)或字符串:smh、或d。例如,"40m""1h30m""1m3s"

以下示例说明如何在 WDL 任务定义的runtime部分中指定omicsTimeout属性。此示例将超时设置为 40 分钟。

runtime { omicsTimeout: "40m" }

HealthOmics 为 WDL omicsTimeout 运行时属性提供以下支持:

  1. HealthOmics 支持超时值的精度为 1 分钟。您可以指定介于 60 秒和最大运行持续时间值之间的值。

  2. 如果您输入的值小于 60,则将其 HealthOmics 四舍五入到 60 秒。对于大于 60 的值,向下 HealthOmics 舍入到最接近的分钟。

  3. 如果任务超时,则 HealthOmics 取消该任务。此操作的持续时间可能为一到两分钟。

  4. 任务超时时, HealthOmics 将运行和任务状态设置为失败,并取消运行中的其他任务(对于处于 “启动”、“待处理” 或 “正在运行” 状态的任务)。 HealthOmics 将其在超时之前完成的任务的输出导出到您指定的 S3 输出位置。

  5. 任务处于待处理状态的时间不计入任务持续时间。

  6. 如果运行是运行组的一部分,并且该运行组的超时时间早于任务计时器,则运行和任务将转换为失败状态。

所有跑步的最大持续时间都在可调整配额的HealthOmics 服务配额控制范围内。您可以申请增加此配额。

WDL 中的任务元数据

HealthOmics 支持 WDL 任务的以下元数据选项。

使用 volatile 属性禁用任务级缓存

volatil e 属性允许您禁用 WDL 工作流程中特定任务的呼叫缓存。当任务被标记为 volatile 时,它将始终执行并且永远不会使用缓存的结果,即使为运行启用了缓存也是如此。

vol atile 属性添加到任务定义的部分:

task my_volatile_task { meta { volatile: true } input { String input_file } command { echo "Processing ${input_file}" > output.txt } output { File result = "output.txt" } }

WDL 工作流程定义示例

以下示例显示了BAM在 WDL 中从CRAM转换为的私有工作流程定义。t CRAM o BAM 工作流程定义了两个任务并使用genomes-in-the-cloud容器中的工具,该工具如示例所示,并且是公开可用的。

以下示例显示如何将 Amazon ECR 容器作为参数包括在内。这 HealthOmics 允许在容器开始运行之前验证对容器的访问权限。

{ ... "gotc_docker":"<account_id>.dkr.ecr.<region>.amazonaws.com/genomes-in-the-cloud:2.4.7-1603303710" }

以下示例说明当文件位于 Amazon S3 存储桶中时,如何指定在运行中使用哪些文件。

{ "input_cram": "s3://amzn-s3-demo-bucket1/inputs/NA12878.cram", "ref_dict": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.dict", "ref_fasta": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta", "ref_fasta_index": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta.fai", "sample_name": "NA12878" }

如果要指定序列存储中的文件,请使用序列存储的 URI 进行指示,如以下示例所示。

{ "input_cram": "omics://429915189008.storage.us-west-2.amazonaws.com/111122223333/readSet/4500843795/source1", "ref_dict": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.dict", "ref_fasta": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta", "ref_fasta_index": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta.fai", "sample_name": "NA12878" }

然后,您可以在 WDL 中定义您的工作流程,如以下示例所示。

version 1.0 workflow CramToBamFlow { input { File ref_fasta File ref_fasta_index File ref_dict File input_cram String sample_name String gotc_docker = "<account>.dkr.ecr.us-west-2.amazonaws.com/genomes-in-the- cloud:latest" } #Converts CRAM to SAM to BAM and makes BAI. call CramToBamTask{ input: ref_fasta = ref_fasta, ref_fasta_index = ref_fasta_index, ref_dict = ref_dict, input_cram = input_cram, sample_name = sample_name, docker_image = gotc_docker, } #Validates Bam. call ValidateSamFile{ input: input_bam = CramToBamTask.outputBam, docker_image = gotc_docker, } #Outputs Bam, Bai, and validation report to the FireCloud data model. output { File outputBam = CramToBamTask.outputBam File outputBai = CramToBamTask.outputBai File validation_report = ValidateSamFile.report } } #Task definitions. task CramToBamTask { input { # Command parameters File ref_fasta File ref_fasta_index File ref_dict File input_cram String sample_name # Runtime parameters String docker_image } #Calls samtools view to do the conversion. command { set -eo pipefail samtools view -h -T ~{ref_fasta} ~{input_cram} | samtools view -b -o ~{sample_name}.bam - samtools index -b ~{sample_name}.bam mv ~{sample_name}.bam.bai ~{sample_name}.bai } #Runtime attributes: runtime { docker: docker_image } #Outputs a BAM and BAI with the same sample name output { File outputBam = "~{sample_name}.bam" File outputBai = "~{sample_name}.bai" } } #Validates BAM output to ensure it wasn't corrupted during the file conversion. task ValidateSamFile { input { File input_bam Int machine_mem_size = 4 String docker_image } String output_name = basename(input_bam, ".bam") + ".validation_report" Int command_mem_size = machine_mem_size - 1 command { java -Xmx~{command_mem_size}G -jar /usr/gitc/picard.jar \ ValidateSamFile \ INPUT=~{input_bam} \ OUTPUT=~{output_name} \ MODE=SUMMARY \ IS_BISULFITE_SEQUENCED=false } runtime { docker: docker_image } #A text file is generated that lists errors or warnings that apply. output { File report = "~{output_name}" } }