

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# CWL 워크플로 정의 세부 정보
<a name="workflow-languages-cwl"></a>

공통 워크플로 언어 또는 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>

HealthOmics를 사용하도록 기존 CWL 워크플로 정의를 변환하려면 다음을 변경합니다.
+ 모든 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
```

요구 사항은 힌트를 재정의합니다. 태스크 구현이 인클로징 워크플로의 요구 사항에서 제공하는 힌트에 리소스 요구 사항을 제공하는 경우 인클로징 요구 사항이 우선합니다.

워크플로의 다른 수준에서 동일한 작업 요구 사항이 나타나는 경우 HealthOmics는의 가장 구체적인 항목`requirements`(또는에 항목이 없는 `hints`경우 )을 사용합니다`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회 또는 메모리 할당이 1536GiB에 도달할 때까지 중 먼저 도달하는 쪽까지 재시도합니다.

다음 예제에서는 out-of-memory 재시도를 구성하는 방법을 보여줍니다.

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

out-of-memory으로 인해 작업이 실패하면 HealthOmics는 공식을 사용하여 재시도 메모리 할당을 계산합니다`previous_run_memory × memoryRetryMultiplier`. 위 예제에서 메모리가 4,096MB인 작업이 실패하면 재시도는 4,096 × 2.5 = 10,240MB의 메모리를 사용합니다.

`memoryRetryMultiplier` 파라미터는 재시도에 할당할 추가 메모리의 양을 제어합니다.
+ **기본값:** 값을 지정하지 않으면 기본값은 입니다`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: []
```