

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将模块化代码用于 @remote 装饰器
<a name="train-remote-decorator-modular"></a>

可以将您的代码整理为模块，以便在开发过程中轻松管理工作区，并且仍可以使用 @remote 函数来调用函数。您也可以将本地模块从开发环境复制到远程作业环境。为此，请将 `include_local_workdir` 参数设置为 `True`，如以下示例所示。

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

**注意**  
@remote 装饰器和参数必须出现在主文件中，而不是出现在任何依赖项文件中。

设置`include_local_workdir`为时`True`， SageMaker AI 会打包所有 Python 脚本，同时保持进程当前目录中的目录结构。它还使依赖项在作业的工作目录中可用。

例如，假设处理 MNIST 数据集的 Python 脚本分为一个 `main.py` 脚本和一个从属 `pytorch_mnist.py` 脚本。`main.py` 调用从属脚本。此外，`main.py` 脚本还包含导入从属关系的代码，如下所示。

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

`main.py` 文件还必须包含 `@remote` 装饰器，并且必须将 `include_local_workdir` 参数设置为 `True`。

默认情况下，`include_local_workdir` 参数包括目录中的所有 Python 脚本。您可以将此参数与 `custom_file_filter` 参数结合使用，自定义要上传到作业中的文件。您既可以传递一个用于筛选要上传到 S3 的作业从属关系的函数，也可以传递一个指定要在远程函数中忽略的本地目录和文件的 `CustomFileFilter` 对象。只有在 `include_local_workdir` 设置为 `True` 时，才能使用 `custom_file_filter`——否则参数将被忽略。

以下示例使用 `CustomFileFilter` 来忽略所有笔记本文件和文件夹，或者在将文件上传到 S3 时忽略名为 `data` 的文件。

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

以下示例演示了如何打包整个工作空间。

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

以下示例说明了如何使用函数筛选文件。

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

## 构建工作目录的最佳实践
<a name="train-remote-decorator-modular-bestprac"></a>

以下最佳实践建议您在模块化代码中使用 `@remote` 装饰器时如何组织目录结构。
+ 将 @remote 装饰器放入位于工作区的根级别目录下的文件中。
+ 在根级别构建本地模块。

以下示例图显示了推荐的目录结构。在此示例结构中，`main.py` 脚本位于根级别目录下。

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

以下示例图显示了一个目录结构，当使用 @remote 装饰器为代码添加注释时，该结构会导致不一致的行为。

在此示例结构中，包含 @remote 装饰器的 `main.py` 脚本**不**在根级别目录下。建议**不要**使用以下结构。

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