

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# モジュラーコードと @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
```