WDL ワークフロー定義の詳細 - AWS HealthOmics

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

WDL ワークフロー定義の詳細

以下のトピックでは、HealthOmics の WDL ワークフロー定義で使用できるタイプとディレクティブについて詳しく説明します。

WDL lenient での暗黙的な型変換

HealthOmics は、input.json ファイルとワークフロー定義で暗黙的な型変換をサポートしています。暗黙的な型キャストを使用するには、ワークフローを作成するときにワークフローエンジンを WDL lenient として指定します。WDL lenient は、Cromwell から移行されたワークフローを処理するように設計されています。お客様の Cromwell ディレクティブといくつかの非準拠ロジックをサポートしています。

WDL lenient は、WDL の制限された例外のリストで、以下の項目の型変換をサポートしています。

  • Int に浮動します。この場合、強制によって精度が失われません (1.0 は 1 にマップされます)。

  • Int/Float への文字列。強制によって精度が失われることはありません。

  • W が Y に強制され、X が Z に強制される場合、[W, X] を配列 [Pair[Y, Z]] にマッピングします。

  • Array[Pair[W, X]] を Map[Y, Z] に、W が Y に強制され、X が Z に強制される場合 (1.0 マップが 1 など)。

暗黙的な型キャストを使用するには、ワークフローまたはワークフローバージョンを作成するときに、ワークフローエンジンを WDL_LENIENT として指定します。

コンソールでは、ワークフローエンジンパラメータの名前は Language です。API では、ワークフローエンジンパラメータに engine という名前が付けられます。詳細については、プライベートワークフローを作成するまたはワークフローバージョンを作成するを参照してください。

input.json の名前空間定義

HealthOmics は input.json で完全修飾変数をサポートしています。たとえば、ワークフロー SumWorkflow で number1 と number2 という名前の 2 つの入力変数を宣言するとします。

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" Amazon S3 および HealthOmics ストレージ URIsは、ワークフローに提供される IAM ロールがこれらのオブジェクトへの読み取りアクセス権を持っている限りインポートされます。他の URI スキーム (file://、、 など) https://はサポートされていませんftp://。URI は オブジェクトを指定する必要があります。ディレクトリにすることはできません。つまり、 で終わることはできません/
Directory string Directory d "d": "s3://bucket/path/" Directory タイプは WDL 1.0 または 1.1 に含まれていないため、WDL ファイルの ヘッダーversion developmentに を追加する必要があります。URI は Amazon S3 URI で、プレフィックスが '/' で終わる必要があります。ディレクトリのすべてのコンテンツは、1 回のダウンロードとしてワークフローに再帰的にコピーされます。には、ワークフローに関連するファイルのみを含める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 形式を使用する必要があります。
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 該当なし 該当なし 該当なし WDL Objectタイプは古いため、いずれの場合Structも に置き換える必要があります。

WDL のディレクティブ

HealthOmics は、HealthOmics がサポートするすべての WDL バージョンで次のディレクティブをサポートしています。

GPU リソースを設定する

HealthOmics は、サポートされているすべての GPU インスタンスacceleratorCountでランタイム属性 acceleratorTypeと をサポートします。HealthOmics はgpuCount、アクセラレーターと同じ機能を持つ gpuTypeおよび という名前のエイリアスもサポートしています。WDL 定義に両方のディレクティブが含まれている場合、HealthOmics はアクセラレーター値を使用します。

次の例は、これらのディレクティブを使用する方法を示しています。

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

サービスエラーのタスク再試行を設定する

HealthOmics は、サービスエラー (5XX HTTP ステータスコード) のために失敗したタスクに対して最大 2 回の再試行をサポートします。最大再試行回数 (1 または 2) を設定し、サービスエラーの再試行をオプトアウトできます。デフォルトでは、HealthOmics は最大 2 回の再試行を試みます。

次の例では、 preemptibleがサービスエラーの再試行をオプトアウトするように を設定します。

{ preemptible: 0 }

HealthOmics でのタスクの再試行の詳細については、「」を参照してくださいタスクの再試行

メモリ不足のタスク再試行を設定する

HealthOmics は、メモリ不足 (コンテナ終了コード 137、4XX HTTP ステータスコード) のために失敗したタスクの再試行をサポートしています。HealthOmics は、再試行するたびにメモリの量を 2 倍にします。

デフォルトでは、HealthOmics はこのタイプの障害を再試行しません。maxRetries ディレクティブを使用して、最大再試行回数を指定します。

次の例では、 を 3 maxRetriesに設定するため、HealthOmics はタスクの完了を最大 4 回試行します (最初の試行と 3 回の再試行)。

runtime { maxRetries: 3 }
注記

メモリ不足のタスク再試行には、GNU findutils 4.2.3+ が必要です。デフォルトの HealthOmics イメージコンテナには、このパッケージが含まれています。WDL 定義でカスタムイメージを指定する場合は、そのイメージに GNU findutils 4.2.3+ が含まれていることを確認してください。

リターンコードを設定する

returnCodes 属性は、タスクが正常に実行されたことを示すリターンコードまたは一連のリターンコードを指定するメカニズムを提供します。WDL エンジンは、WDL 定義のランタイムセクションで指定したリターンコードを尊重し、それに応じてタスクのステータスを設定します。

runtime { returnCodes: 1 }

HealthOmics は、returnCodes と同じ機能を持つ continueOnReturnCode という名前のエイリアスもサポートreturnCodes。両方の属性を指定すると、HealthOmics は returnCodes 値を使用します。

WDL ワークフロー定義の例

次の例は、WDL BAMで から CRAM に変換するためのプライベートワークフロー定義を示しています。CRAM から へのBAMワークフローでは、2 つのタスクを定義し、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}" } }