

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

# CWL ワークフロー定義の詳細
<a name="workflow-languages-cwl"></a>

Common Workflow Language または CWL で記述されたワークフローは、WDL および Nextflow で記述されたワークフローと同様の機能を提供します。Amazon S3 または HealthOmics ストレージ URIs を入力パラメータとして使用できます。

サブワークフローの secondaryFile で入力を定義する場合は、メインワークフローに同じ定義を追加します。

HealthOmics ワークフローはオペレーションプロセスをサポートしていません。CWL ワークフローのオペレーションプロセスの詳細については、[CWL ドキュメント](https://www.commonwl.org/user_guide/topics/operations.html)を参照してください。

ベストプラクティスは、使用するコンテナごとに個別の CWL ワークフローを定義することです。固定 Amazon ECR URI を使用して dockerPull エントリをハードコードしないことをお勧めします。

**Topics**
+ [HealthOmics を使用するように CWL ワークフローを変換する](#workflow-cwl-convert)
+ [を使用してタスクの再試行をオプトアウトする `omicsRetryOn5xx`](#workflow-cwl-retry-5xx)
+ [ワークフローステップをループする](#workflow-cwl-loop)
+ [メモリを増やしてタスクを再試行する](#workflow-cwl-out-of-memory-retry)
+ [例](#workflow-cwl-examples)

## HealthOmics を使用するように CWL ワークフローを変換する
<a name="workflow-cwl-convert"></a>

既存の CWL ワークフロー定義を HealthOmics を使用するように変換するには、次の変更を行います。
+ すべての Docker コンテナ URIs Amazon ECR URIs。
+ すべてのワークフローファイルがメインワークフローで入力として宣言され、すべての変数が明示的に定義されていることを確認します。
+ すべての JavaScript コードが厳格モードの苦情であることを確認します。

## を使用してタスクの再試行をオプトアウトする `omicsRetryOn5xx`
<a name="workflow-cwl-retry-5xx"></a>

HealthOmics は、サービスエラー (5XX HTTP ステータスコード) が原因でタスクが失敗した場合、タスクの再試行をサポートします。デフォルトでは、HealthOmics は失敗したタスクを最大 2 回再試行します。HealthOmics でのタスクの再試行の詳細については、「」を参照してください[タスクの再試行](monitoring-runs.md#run-status-task-retries)。

サービスエラーのタスク再試行をオプトアウトするには、ワークフロー定義で `omicsRetryOn5xx` ディレクティブを設定します。このディレクティブは、要件またはヒントに基づいて定義できます。移植性のヒントとして ディレクティブを追加することをお勧めします。

```
requirements:
  ResourceRequirement:
    omicsRetryOn5xx: false

hints:
  ResourceRequirement:
    omicsRetryOn5xx: false
```

要件はヒントを上書きします。タスク実装が、囲みワークフローの要件によっても提供されるヒントでリソース要件を提供する場合、囲み要件が優先されます。

ワークフローの異なるレベルに同じタスク要件が表示される`hints`場合、HealthOmics は からの最も具体的なエントリを使用します `requirements` ( にエントリがない場合は )`requirements`。次のリストは、HealthOmics が構成設定を適用するために使用する優先順位を、優先順位の低いものから最も高いものまで示しています。
+ ワークフローレベル
+ ステップレベル
+ ワークフロー定義のタスクセクション

次の例は、ワークフローのさまざまなレベルで `omicsRetryOn5xx`ディレクティブを設定する方法を示しています。この例では、ワークフローレベルの要件がワークフローレベルのヒントを上書きします。タスクレベルとステップレベルの要件設定は、ヒント設定を上書きします。

```
class: Workflow
# Workflow-level requirement and hint
requirements:
  ResourceRequirement:
    omicsRetryOn5xx: false

hints:
  ResourceRequirement:
    omicsRetryOn5xx: false  # The value in requirements overrides this value 

steps:
  task_step:
    # Step-level requirement
    requirements:
      ResourceRequirement:
        omicsRetryOn5xx: false
    # Step-level hint
    hints:
      ResourceRequirement:
        omicsRetryOn5xx: false
    run:
      class: CommandLineTool
      # Task-level requirement
      requirements:
        ResourceRequirement:
          omicsRetryOn5xx: false
      # Task-level hint
      hints:
        ResourceRequirement:
          omicsRetryOn5xx: false
```

## ワークフローステップをループする
<a name="workflow-cwl-loop"></a>

HealthOmics はワークフローステップのループをサポートしています。ループを使用して、指定された条件が満たされるまでワークフローステップを繰り返し実行できます。これは、タスクを複数回、または特定の結果が得られるまで繰り返す必要がある反復プロセスに役立ちます。

**注:** ループ機能には CWL バージョン 1.2 以降が必要です。1.2 より前のバージョンの CWL を使用するワークフローは、ループオペレーションをサポートしていません。

CWL ワークフローでループを使用するには、ループ要件を定義します。次の例は、ループ要件設定を示しています。

```
requirements:
  - class: "http://commonwl.org/cwltool#Loop"
    loopWhen: $(inputs.counter < inputs.max)
    loop:
      counter:
        loopSource: result
        valueFrom: $(self)
    outputMethod: last
```

`loopWhen` フィールドは、ループが終了するタイミングを制御します。この例では、カウンターが最大値より小さい限り、ループは続行されます。`loop` フィールドは、反復間で入力パラメータを更新する方法を定義します。は、前の反復のどの出力を次の反復にフィードするか`loopSource`を指定します。に設定された `outputMethod`フィールドは、最終イテレーションの出力のみ`last`を返します。

## メモリを増やしてタスクを再試行する
<a name="workflow-cwl-out-of-memory-retry"></a>

HealthOmics out-of-memoryタスクの失敗の自動再試行をサポートしています。タスクがコード 137 (out-of-memory) で終了すると、HealthOmics は指定された乗数に基づいてメモリ割り当てを増やした新しいタスクを作成します。

**注記**  
HealthOmics はout-of-memory障害を最大 3 回再試行するか、メモリ割り当てが 1536 GiB に達するまで、いずれかの制限に達するまで再試行します。

次の例は、out-of-memory再試行を設定する方法を示しています。

```
hints:
  ResourceRequirement:
    ramMin: 4096
  http://arvados.org/cwl#OutOfMemoryRetry:
    memoryRetryMultiplier: 2.5
```

out-of-memoryが原因でタスクが失敗した場合、HealthOmics は式 を使用して再試行メモリ割り当てを計算します`previous_run_memory × memoryRetryMultiplier`。上記の例では、4096 MB のメモリを持つタスクが失敗した場合、再試行は 4096 × 2.5 = 10,240 MB のメモリを使用します。

`memoryRetryMultiplier` パラメータは、再試行に割り当てる追加のメモリの量を制御します。
+ **デフォルト値:** 値を指定しない場合、デフォルト値は になります `2` (メモリが 2 倍になります）。
+ **有効な範囲:** より大きい正の数である必要があります`1`。無効な値の場合、4XX 検証エラーが発生します。
+ **有効な最小値:** 意味のあるメモリの増加を確保し`1.5`、過剰な再試行を防ぐために、 `1` と の間の値は自動的に に増加`1.5`します。

## 例
<a name="workflow-cwl-examples"></a>

以下は、CWL で記述されたワークフローの例です。

```
cwlVersion: v1.2
class: Workflow

inputs:
in_file:
type: File
secondaryFiles: [.fai]

out_filename: string
docker_image: string


outputs:
copied_file:
type: File
outputSource: copy_step/copied_file

steps:
copy_step:
in:
  in_file: in_file
  out_filename: out_filename
  docker_image: docker_image
out: [copied_file]
run: copy.cwl
```

次のファイルは、`copy.cwl`タスクを定義します。

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: cp

inputs:
in_file:
type: File
secondaryFiles: [.fai]
inputBinding:
  position: 1

out_filename:
type: string
inputBinding:
  position: 2
docker_image:
type: string

outputs:
copied_file:
type: File
outputBinding:
    glob: $(inputs.out_filename)

requirements:
InlineJavascriptRequirement: {}
DockerRequirement:
dockerPull: "$(inputs.docker_image)"
```

以下は、GPU 要件を使用して CWL で記述されたワークフローの例です。

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: ["/bin/bash", "docm_haplotypeCaller.sh"]
$namespaces:
cwltool: http://commonwl.org/cwltool#
requirements:
cwltool:CUDARequirement:
cudaDeviceCountMin: 1
cudaComputeCapability: "nvidia-tesla-t4" 
cudaVersionMin: "1.0"
InlineJavascriptRequirement: {}
InitialWorkDirRequirement:
listing:
- entryname: 'docm_haplotypeCaller.sh'
  entry: |
          nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version --format=csv   

inputs: []
outputs: []
```