

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á.

# Como usar o código modular com o decorador @remote
<a name="train-remote-decorator-modular"></a>

Organize o código em módulos para facilitar o gerenciamento do workspace durante o desenvolvimento e ainda use a função do @remote para invocar uma função. Você também pode replicar os módulos locais do ambiente de desenvolvimento para o ambiente de trabalho remoto. Para fazer isso, defina parâmetro `include_local_workdir` como `True`, conforme mostrado no exemplo de código a seguir.

```
@remote(
  include_local_workdir=True,
)
```

**nota**  
O decorador e o parâmetro do @remote devem aparecer no arquivo principal, em vez de em qualquer um dos arquivos dependentes.

Quando `include_local_workdir` definido como`True`, o SageMaker AI empacota todos os scripts do Python enquanto mantém a estrutura de diretórios no diretório atual do processo. Ele também disponibiliza as dependências no diretório de trabalho.

Por exemplo, suponha que seu script Python que processa o conjunto de dados MNIST esteja dividido em um script `main.py` e um script `pytorch_mnist.py` dependente. `main.py` chama o script dependente. Além disso, o script `main.py` contém o código para importar a dependência, conforme mostrado.

```
from mnist_impl.pytorch_mnist import ...
```

O arquivo `main.py` também deve conter o decorador `@remote` e definir o parâmetro `include_local_workdir` como `True`.

Por padrão, o parâmetro `include_local_workdir` inclui todos os scripts Python no diretório. Você pode personalizar quais arquivos você deseja carregar para o trabalho usando esse parâmetro em conjunto com o parâmetro `custom_file_filter`. Você pode passar uma função que filtra as dependências do trabalho a serem carregadas no S3 ou um objeto `CustomFileFilter` que especifica os diretórios e arquivos locais a serem ignorados na função remota. Você pode usar `custom_file_filter` somente se `include_local_workdir` estiver definido como `True`: caso contrário, o parâmetro será ignorado.

O exemplo a seguir usa `CustomFileFilter` para ignorar todos os arquivos e pastas do caderno ou arquivos chamados `data` ao carregar arquivos para o S3.

```
@remote(
   include_local_workdir=True,
   custom_file_filter=CustomFileFilter(
      ignore_name_patterns=[ # files or directories to ignore
        "*.ipynb", # all notebook files
        "data", # folter or file named data
      ]
   )
)
```

O exemplo a seguir demonstra como fazer pacotes de um espaço de trabalho inteiro.

```
@remote(
   include_local_workdir=True,
   custom_file_filter=CustomFileFilter(
      ignore_pattern_names=[] # package whole workspace
   )
)
```

O exemplo a seguir mostra como é possível usar uma função para filtrar arquivos.

```
import os

def my_filter(path: str, files: List[str]) -> List[str]:
    to_ignore = []
   for file in files:
       if file.endswith(".txt") or file.endswith(".ipynb"):
           to_ignore.append(file)
   return to_ignore

@remote(
   include_local_workdir=True,
   custom_file_filter=my_filter
)
```

## Práticas recomendadas na estruturação do diretório de trabalho
<a name="train-remote-decorator-modular-bestprac"></a>

As práticas recomendadas a seguir sugerem como é possível organizar sua estrutura de diretórios ao usar o decorador `@remote` no código modular.
+ Coloque o decorador @remote em um arquivo que reside no diretório-raiz do workspace.
+ Estruture os módulos locais no nível-raiz.

A imagem de exemplo a seguir mostra a estrutura de diretórios recomendada. Neste exemplo de estrutura, o script `main.py` está localizado no diretório de nível-raiz.

```
.
├── config.yaml
├── data/
├── main.py <----------------- @remote used here 
├── mnist_impl
│ ├── __pycache__/
│ │ └── pytorch_mnist.cpython-310.pyc
│ ├── pytorch_mnist.py <-------- dependency of main.py
├── requirements.txt
```

A imagem de exemplo a seguir mostra uma estrutura do diretório que resultará em um comportamento inconsistente quando usada para anotar o código com um decorador @remote. 

Neste exemplo de estrutura, o script `main.py` que contém o decorador @remote **não** está localizado no diretório de nível-raiz. A estrutura a seguir **NÃO** é recomendada.

```
.
├── config.yaml
├── entrypoint
│ ├── data
│ └── main.py <----------------- @remote used here
├── mnist_impl
│ ├── __pycache__
│ │ └── pytorch_mnist.cpython-310.pyc
│ └── pytorch_mnist.py <-------- dependency of main.py
├── requirements.txt
```