

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Utilisation d’un code modulaire avec le décorateur @remote
<a name="train-remote-decorator-modular"></a>

Vous pouvez organiser votre code en modules pour faciliter la gestion de l’espace de travail pendant le développement, tout en utilisant la fonction @remote pour invoquer une fonction. Vous pouvez également répliquer les modules locaux de votre environnement de développement vers l’environnement de tâche distante. Pour ce faire, définissez le paramètre `include_local_workdir` sur `True`, comme illustré dans l’exemple de code suivant.

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

**Note**  
Le décorateur et le paramètre @remote doivent apparaître dans le fichier principal, plutôt que dans les fichiers dépendants.

Lorsqu'il `include_local_workdir` est défini sur`True`, SageMaker AI empaquette tous les scripts Python tout en conservant la structure du répertoire dans le répertoire actuel du processus. Cela rend également les dépendances disponibles dans le répertoire de travail de la tâche.

Supposons, par exemple, que votre script Python qui traite le jeu de données MNIST soit divisé en un script `main.py`t et un script `pytorch_mnist.py` dépendant. `main.py` appelle le script dépendant. Le `main.py` script contient également le code permettant d’importer la dépendance comme indiqué.

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

Le fichier `main.py` doit également contenir le décorateur `@remote` et le paramètre `include_local_workdir` doit être défini sur `True`.

Le paramètre `include_local_workdir` inclut par défaut tous les scripts Python dans le répertoire. Vous pouvez personnaliser les fichiers que vous souhaitez charger vers la tâche en utilisant ce paramètre conjointement avec le paramètre `custom_file_filter`. Vous pouvez transmettre soit une fonction qui filtre les dépendances de tâches à charger vers S3, soit un objet `CustomFileFilter` qui spécifie les répertoires locaux et les fichiers à ignorer dans la fonction à distance. Vous ne pouvez utiliser `custom_file_filter` que si `include_local_workdir` est défini sur `True`, sinon le paramètre est ignoré.

L’exemple suivant utilise `CustomFileFilter` pour ignorer tous les fichiers et dossiers de bloc-notes ou les fichiers nommés `data` lors du chargement de fichiers vers 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
      ]
   )
)
```

L’exemple suivant montre comment empaqueter un espace de travail entier.

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

L’exemple suivant montre comment utiliser une fonction pour filtrer les fichiers.

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

## Bonnes pratiques en matière de structuration de votre répertoire de travail
<a name="train-remote-decorator-modular-bestprac"></a>

Les bonnes pratiques suivantes suggèrent comment organiser votre structure de répertoire lorsque vous utilisez le décorateur `@remote` dans votre code modulaire.
+ Placez le décorateur @remote dans un fichier situé dans le répertoire de niveau racine de l’espace de travail.
+ Structurez les modules locaux au niveau de la racine.

L’image d’exemple suivante montre la structure de répertoire recommandée. Dans cet exemple de structure, le script `main.py` se trouve dans le répertoire de niveau racine.

```
.
├── 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
```

L’exemple d’image suivant montre une structure de répertoire qui se traduira par un comportement incohérent lorsqu’elle est utilisée pour annoter votre code avec un décorateur @remote. 

Dans cet exemple de structure, le script `main.py` qui contient le décorateur @remote ne se trouve **pas** dans le répertoire de niveau racine. La structure suivante n’est **PAS** recommandée.

```
.
├── 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
```