

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Especificidades da definição do fluxo de trabalho do CWL
<a name="workflow-languages-cwl"></a>

Os fluxos de trabalho escritos em Common Workflow Language, ou CWL, oferecem funcionalidade semelhante aos fluxos de trabalho escritos em WDL e Nextflow. Você pode usar o Amazon S3 ou o HealthOmics armazenamento URIs como parâmetros de entrada. 

Se você definir a entrada em um SecondaryFile em um subfluxo de trabalho, adicione a mesma definição no fluxo de trabalho principal.

HealthOmics os fluxos de trabalho não oferecem suporte aos processos operacionais. Para saber mais sobre os processos operacionais nos fluxos de trabalho da CWL, consulte a documentação da [CWL](https://www.commonwl.org/user_guide/topics/operations.html).

A melhor prática é definir um fluxo de trabalho CWL separado para cada contêiner que você usa. Recomendamos que você não codifique a entrada DockerPull com um URI fixo do Amazon ECR.

**Topics**
+ [Converta fluxos de trabalho CWL para uso HealthOmics](#workflow-cwl-convert)
+ [Opte por não participar da tarefa novamente usando `omicsRetryOn5xx`](#workflow-cwl-retry-5xx)
+ [Repetir uma etapa do fluxo de trabalho](#workflow-cwl-loop)
+ [Repita as tarefas com maior memória](#workflow-cwl-out-of-memory-retry)
+ [Exemplos](#workflow-cwl-examples)

## Converta fluxos de trabalho CWL para uso HealthOmics
<a name="workflow-cwl-convert"></a>

Para converter uma definição de fluxo de trabalho CWL existente para uso HealthOmics, faça as seguintes alterações:
+ Substitua todo o contêiner URIs Docker pelo Amazon URIs ECR.
+ Certifique-se de que todos os arquivos do fluxo de trabalho sejam declarados no fluxo de trabalho principal como entrada e que todas as variáveis estejam definidas explicitamente.
+ Certifique-se de que todo JavaScript código seja uma reclamação de modo estrito.

## Opte por não participar da tarefa novamente usando `omicsRetryOn5xx`
<a name="workflow-cwl-retry-5xx"></a>

HealthOmics suporta novas tentativas de tarefas se a tarefa falhar devido a erros de serviço (códigos de status HTTP 5XX). Por padrão, HealthOmics tenta até duas tentativas de uma tarefa com falha. Para obter mais informações sobre a repetição de tarefas HealthOmics, consulte[Tentativas de tarefas](monitoring-runs.md#run-status-task-retries).

Para desativar a repetição da tarefa devido a erros de serviço, configure a `omicsRetryOn5xx` diretiva na definição do fluxo de trabalho. Você pode definir essa diretiva em requisitos ou dicas. Recomendamos adicionar a diretiva como uma dica de portabilidade.

```
requirements:
  ResourceRequirement:
    omicsRetryOn5xx: false

hints:
  ResourceRequirement:
    omicsRetryOn5xx: false
```

Os requisitos substituem as dicas. Se a implementação de uma tarefa fornece um requisito de recurso em dicas que também é fornecido pelos requisitos em um fluxo de trabalho envolvente, os requisitos anexos têm precedência.

Se o mesmo requisito de tarefa aparecer em níveis diferentes do fluxo de trabalho, HealthOmics usa a entrada mais específica de `requirements` (ou`hints`, se não houver entradas`requirements`). A lista a seguir mostra a ordem de precedência HealthOmics usada para aplicar as definições de configuração, da prioridade mais baixa para a mais alta:
+ Nível do fluxo de trabalho
+ Nível de etapa
+ Seção de tarefas da definição do fluxo de trabalho

O exemplo a seguir mostra como configurar a `omicsRetryOn5xx` diretiva em diferentes níveis do fluxo de trabalho. Neste exemplo, o requisito no nível do fluxo de trabalho substitui as dicas no nível do fluxo de trabalho. As configurações de requisitos nos níveis de tarefa e etapa substituem as configurações de dicas.

```
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
```

## Repetir uma etapa do fluxo de trabalho
<a name="workflow-cwl-loop"></a>

HealthOmics suporta o loop de uma etapa do fluxo de trabalho. Você pode usar loops para executar etapas do fluxo de trabalho repetidamente até que uma condição especificada seja atendida. Isso é útil para processos iterativos em que você precisa repetir uma tarefa várias vezes ou até que um determinado resultado seja alcançado.

**Nota: A** funcionalidade de loop requer a versão 1.2 ou posterior do CWL. Os fluxos de trabalho usando versões do CWL anteriores à 1.2 não oferecem suporte a operações de loop.

Para usar loops em seu fluxo de trabalho CWL, defina um requisito de loop. O exemplo a seguir mostra a configuração dos requisitos de loop:

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

O `loopWhen` campo controla quando o loop termina. Neste exemplo, o loop continua enquanto o contador for menor que o valor máximo. O `loop` campo define como os parâmetros de entrada são atualizados entre as iterações. O `loopSource` especifica qual saída da iteração anterior alimenta a próxima iteração. O `outputMethod` campo definido como `last` retorna somente a saída da iteração final.

## Repita as tarefas com maior memória
<a name="workflow-cwl-out-of-memory-retry"></a>

HealthOmics suporta repetição automática de falhas de out-of-memory tarefas. Quando uma tarefa sai com o código 137 (out-of-memory), HealthOmics cria uma nova tarefa com maior alocação de memória com base no multiplicador especificado.

**nota**  
HealthOmics repete as out-of-memory falhas até 3 vezes ou até que a alocação de memória alcance 1536 GiB, qualquer que seja o limite atingido primeiro.

O exemplo a seguir mostra como configurar a nova out-of-memory tentativa:

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

Quando uma tarefa falha devido a out-of-memory, HealthOmics calcula a alocação de memória de repetição usando a fórmula:. `previous_run_memory × memoryRetryMultiplier` No exemplo acima, se a tarefa com 4096 MB de memória falhar, a nova tentativa usará 4096 × 2,5 = 10.240 MB de memória.

O `memoryRetryMultiplier` parâmetro controla a quantidade de memória adicional a ser alocada para tentativas de repetição:
+ **Valor padrão:** se você não especificar um valor, o padrão é `2` (dobra a memória)
+ **Intervalo válido:** deve ser um número positivo maior que`1`. Valores inválidos resultam em um erro de validação 4XX
+ **Valor efetivo mínimo:** valores entre `1` e `1.5` são aumentados automaticamente `1.5` para garantir aumentos significativos de memória e evitar tentativas excessivas de repetição

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

Veja a seguir um exemplo de um fluxo de trabalho escrito em 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
```

O arquivo a seguir define a `copy.cwl` tarefa.

```
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)"
```

Veja a seguir um exemplo de um fluxo de trabalho escrito em CWL com um requisito de GPU.

```
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: []
```