

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

# ローカルコードを SageMaker トレーニングジョブとして実行する
<a name="train-remote-decorator"></a>

ローカル機械学習 (ML) Python コードは、単一ノードの大規模な Amazon SageMaker トレーニングジョブとして実行することも、複数の並列ジョブとして実行することもできます。これは、次のコードサンプルに示すように、コードに @remote デコレータで注釈を付けることで実現できます。リモート関数では複数のインスタンスにわたる[分散トレーニング](https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-training.html)がサポートされていません。

```
@remote(**settings)
def divide(x, y):
    return x / y
```

SageMaker Python SDK は、既存のワークスペース環境と関連するデータ処理コードおよびデータセットを、SageMaker トレーニングプラットフォーム上で実行される SageMaker トレーニングジョブに自動的に変換します。また、永続キャッシュ機能を有効化して、以前にダウンロードした依存関係パッケージをキャッシュすることで、ジョブのスタートアップレイテンシーをさらに短縮することもできます。このジョブのレイテンシーの短縮は、SageMaker AI が管理するウォームプールだけを使用した場合のレイテンシーの短縮よりも大きくなります。詳細については、「[永続キャッシュを使用する](train-warm-pools.md#train-warm-pools-persistent-cache)」を参照してください。

**注記**  
分散トレーニングジョブは、リモート関数ではサポートされていません。

以下のセクションでは、ローカル機械学習コードに @remote デコレータで注釈を付け、ユースケースに合わせてエクスペリエンスを調整する方法を示します。これには、環境のカスタマイズと SageMaker Experiments との統合が含まれます。

**Topics**
+ [環境をセットアップする](#train-remote-decorator-env)
+ [リモート関数を呼び出す](train-remote-decorator-invocation.md)
+ [設定ファイル](train-remote-decorator-config.md)
+ [ランタイム環境をカスタマイズする](train-remote-decorator-customize.md)
+ [コンテナイメージの互換性](train-remote-decorator-container.md)
+ [Amazon SageMaker Experiments によるパラメータとメトリクスの記録](train-remote-decorator-experiments.md)
+ [モジュラーコードと @remote デコレータの使用](train-remote-decorator-modular.md)
+ [ランタイム依存関係用のプライベートリポジトリ](train-remote-decorator-private.md)
+ [サンプルノートブックの例](train-remote-decorator-examples.md)

## 環境をセットアップする
<a name="train-remote-decorator-env"></a>

次の 3 つのオプションから 1 つ選択して、環境をセットアップします。

### Amazon SageMaker Studio Classic からコードを実行する
<a name="train-remote-decorator-env-studio"></a>

SageMaker ノートブックを作成し、SageMaker Studio Classic イメージで利用可能なイメージを添付することで、SageMaker Studio Classic からローカル機械学習コードに注釈を付けて実行できます。以下の手順は、SageMaker ノートブックの作成、SageMaker Python SDK のインストール、およびコードへのデコレータでの注釈付けに役立ちます。

1. 次のように、SageMaker ノートブックを作成し、SageMaker Studio Classic にイメージをアタッチします。

   1. *Amazon SageMaker AI 開発者ガイド*の「[Launch Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-launch.html)」の指示に従います。

   1. 左のナビゲーションペインで **[Studio]** を選択します。新しいウィンドウが開きます。

   1. **[使用を開始]** ダイアログボックスで、下向き矢印からユーザープロファイルを選択します。新しいウィンドウが開きます。

   1. **[Studio Classic を開く]** を選択します。

   1. メインワークエリアから **[ランチャーを開きます]** を選択します。新しいページが開きます。

   1. メインワークエリアから **[ノートブックの作成]** を選択します。

   1. **[環境の変更]** ダイアログボックスの **[イメージ]** の横にある下向き矢印から **[Base Python 3.0]** を選択します。

      @remote デコレータは、SageMaker Studio Classic ノートブックにアタッチされたイメージを自動的に検出し、それを使用して SageMaker トレーニングジョブを実行します。`image_uri` がデコレータまたは設定ファイルの引数として指定されている場合、検出されたイメージの代わりに `image_uri` で指定された値が使用されます。

      SageMaker Studio Classic でノートブックを作成する方法の詳細については、「[Create or Open an Amazon SageMaker Studio Classic Notebook](https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-create-open.html#notebooks-create-file-menu)」の「**Create a Notebook from the File Menu**」セクションを参照してください。

      使用可能なイメージのリストについては、「[Supported Docker images](https://docs.aws.amazon.com/sagemaker/latest/dg/train-remote-decorator-container.html)」を参照してください。

1. SageMaker Python SDK をインストールします。

   SageMaker Studio Classic ノートブック内のコードに @remote 関数で注釈を付けるには、SageMaker Python SDK がインストールされている必要があります。次のコードサンプルに示すように、SageMaker Python SDK をインストールします。

   ```
   !pip install sagemaker
   ```

1. @remote デコレータを使用して、SageMaker トレーニングジョブで関数を実行します。

   ローカル機械学習コードを実行するには、まず依存関係ファイルを作成し、ローカルコードを配置する場所を SageMaker AI に指示します。そのためには、以下の手順を実行します。

   1. SageMaker Studio Classic Launcher のメインワークエリアの **[ユーティリティとファイル]** で、**[テキストファイル]** を選択します。これにより、`untitled.txt.` と呼ばれるテキストファイルを含む新しいタブが開きます。

      SageMaker Studio ユーザーインターフェイス (UI) の詳細については、「[Amazon SageMaker Studio Classic UI Overview](https://docs.aws.amazon.com//sagemaker/latest/dg/studio-ui.html)」を参照してください。

   1. `untitled.txt ` を `requirements.txt` に名前変更します。

   1. SageMaker AI ライブラリとともに、コードに必要なすべての依存関係を `requirements.txt` に追加します。

      `divide` 関数例の `requirements.txt` の最小限のコードサンプルを以下のセクションに示します。

      ```
      sagemaker
      ```

   1. 以下のように依存関係ファイルを渡して、リモートデコレータを使用してコードを実行します。

      ```
      from sagemaker.remote_function import remote
      
      @remote(instance_type="ml.m5.xlarge", dependencies='./requirements.txt')
      def divide(x, y):
          return x / y
      
      divide(2, 3.0)
      ```

      その他のコードサンプルについては、サンプルノートブック [quick\_start.ipynb](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-remote-function/quick_start/quick_start.ipynb) を参照してください。

      すでに SageMaker Studio Classic ノートブックを実行していて、「**2. Install the SageMaker Python SDK**」の指示に従って Python SDK をインストールする場合は、カーネルを再起動する必要があります。詳細については、Amazon SageMaker AI 開発者ガイドの「[Use the SageMaker Studio Classic Notebook Toolbar](https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-menu.html)」を参照してください。

### Amazon SageMaker ノートブックからコードを実行する
<a name="train-remote-decorator-env-notebook"></a>

SageMaker ノートブックインスタンスからローカル機械学習コードに注釈を付けることができます。以下の手順は、カスタムカーネルを使用したノートブックインスタンスの作成、SageMaker Python SDK のインストール、およびコードへのデコレータでの注釈付けに役立ちます。

1. カスタム `conda` カーネルを使用してノートブックインスタンスを作成します。

   ローカル機械学習コードに @remote デコレータで注釈を付け、SageMaker のトレーニングジョブ内で使用できます。まず、SageMaker ノートブックインスタンスを作成してカスタマイズし、Python バージョン 3.7 以降 (3.10.x まで) のカーネルを使用する必要があります。そのためには、以下の手順を実行します。

   1. SageMaker AI コンソール ([https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)) を開きます。

   1. 左側のナビゲーションパネルで、**[ノートブック]** を選択してオプションを展開します。

   1. 展開されたオプションから **[ノートブックインスタンス]** を選択します。

   1. **[ノートブックインスタンスの作成]** ボタンを選択します。新しいページが開きます。

   1. **ノートブックインスタンス名には**、スペースなしで 63 文字以内の名前を入力します。有効な文字は、**A～Z**、**a～z**、**0～9**、および **.****:****\+****=****@**** \_****%****-** (ハイフン) です。

   1. **[ノートブックインスタンス設定]** ダイアログボックスで、**[追加設定]** の横にある右矢印を展開します。

   1. **[ライフサイクル設定 - オプション]** で、下向き矢印を展開して **[新しいライフサイクル設定を作成する]** を選択します。新しいダイアログボックスが開きます。

   1. **[名前]** で、構成設定の名前を入力します。

   1. **[スクリプト]** ダイアログボックスの **[ノートブックの開始]** タブで、テキストボックスの既存の内容を次のスクリプトに置き換えます。

      ```
      #!/bin/bash
      
      set -e
      
      sudo -u ec2-user -i <<'EOF'
      unset SUDO_UID
      WORKING_DIR=/home/ec2-user/SageMaker/custom-miniconda/
      source "$WORKING_DIR/miniconda/bin/activate"
      for env in $WORKING_DIR/miniconda/envs/*; do
          BASENAME=$(basename "$env")
          source activate "$BASENAME"
          python -m ipykernel install --user --name "$BASENAME" --display-name "Custom ($BASENAME)"
      done
      EOF
      
      echo "Restarting the Jupyter server.."
      # restart command is dependent on current running Amazon Linux and JupyterLab
      CURR_VERSION_AL=$(cat /etc/system-release)
      CURR_VERSION_JS=$(jupyter --version)
      
      if [[ $CURR_VERSION_JS == *$"jupyter_core     : 4.9.1"* ]] && [[ $CURR_VERSION_AL == *$" release 2018"* ]]; then
       sudo initctl restart jupyter-server --no-wait
      else
       sudo systemctl --no-block restart jupyter-server.service
      fi
      ```

   1. **[スクリプト]** ダイアログボックスの **[ノートブックを作成]** タブで、テキストボックスの既存の内容を次のスクリプトに置き換えます。

      ```
      #!/bin/bash
      
      set -e
      
      sudo -u ec2-user -i <<'EOF'
      unset SUDO_UID
      # Install a separate conda installation via Miniconda
      WORKING_DIR=/home/ec2-user/SageMaker/custom-miniconda
      mkdir -p "$WORKING_DIR"
      wget https://repo.anaconda.com/miniconda/Miniconda3-4.6.14-Linux-x86_64.sh -O "$WORKING_DIR/miniconda.sh"
      bash "$WORKING_DIR/miniconda.sh" -b -u -p "$WORKING_DIR/miniconda" 
      rm -rf "$WORKING_DIR/miniconda.sh"
      # Create a custom conda environment
      source "$WORKING_DIR/miniconda/bin/activate"
      KERNEL_NAME="custom_python310"
      PYTHON="3.10"
      conda create --yes --name "$KERNEL_NAME" python="$PYTHON" pip
      conda activate "$KERNEL_NAME"
      pip install --quiet ipykernel
      # Customize these lines as necessary to install the required packages
      EOF
      ```

   1. ウィンドウの右下にある **[構成を作成]** ボタンを選択します。

   1. ウィンドウの右下にある **[ノートブックインスタンスの作成]** ボタンを選択します。

   1. ノートブックインスタンスの **[ステータス]** が **[保留中]** から **[InService]** に変わるまで待ちます。

1. ノートブックインスタンスで Jupyter Notebook を作成します。

   以下の手順は、新しく作成した SageMaker インスタンスで Python 3.10 を使用して Jupyter Notebook を作成する方法を示しています。

   1. 前のステップのノートブックインスタンスの **[ステータス]** が **[InService]** になったら、次の操作を行います。

      1. 新しく作成したノートブックインスタンスの **[名前]** を含んでいる行の **[アクション]** で **[Jupyter を開く]** を選択します。新しい Jupyter サーバーが開きます。

   1. Jupyter サーバーで、右上のメニューから **[新規]** を選択します。

   1. 下向き矢印から **[conda\_custom\_python310]** を選択します。Python 3.10 カーネルを使用する新しい Jupyter Notebook が作成されます。この新しい Jupyter Notebook は、ローカルの Jupyter Notebook と同様に使用できるようになりました。

1. SageMaker Python SDK をインストールします。

   仮想環境が実行されたら、次のコードサンプルを使用して SageMaker Python SDK をインストールします。

   ```
   !pip install sagemaker
   ```

1. @remote デコレータを使用して、SageMaker トレーニングジョブで関数を実行します。

   SageMaker ノートブック内の @remote デコレータでローカル機械学習コードに注釈を付けると、SageMaker トレーニングでコードの機能が自動的に解釈され、SageMaker トレーニングジョブとして実行されます。次の手順を実行して、ノートブックを設定します。

   1. ステップ 1「**カスタムカーネルを使用して SageMaker ノートブックインスタンスを作成します**」で作成した SageMaker ノートブックインスタンスのノートブックメニューでカーネル名を選択します。

      詳細については、「[イメージまたはカーネルの変更](https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-run-and-manage-change-image.html)」を参照してください。

   1. 下向き矢印から、3.7 以降のバージョンの Python を使用するカスタム `conda` カーネルを選択します。

      例として、`conda_custom_python310` を選択すると Python 3.10 用のカーネルが選択されます。

   1. **[選択]** を選択します。

   1. カーネルのステータスがアイドル (カーネルが起動したことを示す) になるのを待ちます。

   1. Jupyter サーバーホームで、右上のメニューから **[新規]** を選択します。

   1. 下矢印の横で **[テキストファイル]** を選択します。`untitled.txt.` という名前の新しいテキストファイルが作成されます。

   1. `untitled.txt` から `requirements.txt` に名前を変更し、コードに必要な依存関係を `sagemaker` と一緒に追加します。

   1. 次に示すように、依存関係ファイルを渡して、リモートデコレータを使用してコードを実行します。

      ```
      from sagemaker.remote_function import remote
      
      @remote(instance_type="{{ml.m5.xlarge}}", dependencies='./requirements.txt')
      def divide(x, y):
          return x / y
      
      divide(2, 3.0)
      ```

      その他のコードサンプルについては、サンプルノートブック [quick\_start.ipnyb](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-remote-function/quick_start/quick_start.ipynb) を参照してください。

### ローカル IDE 内からコードを実行する
<a name="train-remote-decorator-env-ide"></a>

任意のローカル IDE 内でローカル機械学習コードに @remote デコレータで注釈を付けることができます。以下の手順は、必要な前提条件、Python SDK のインストール方法、およびコードに @remote デコレータで注釈を付ける方法を示しています。

1. ( AWS Command Line Interface AWS CLI) を設定し、次のようにロールを作成して、前提条件をインストールします。
   + 「[Set Up Amazon SageMaker AI Prerequisites](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-set-up.html#gs-cli-prereq)」の「**AWS CLI Prerequisites**」セクションの指示に従って、SageMaker AI ドメインにオンボーディングします。
   + 「[SageMaker AI Roles](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)」の「**実行ロールを作成する**」セクションに従って、IAM ロールを作成します。

1. PyCharm または `conda` を使用するとともに、Python バージョン 3.7 以降 (3.10.x まで) を使用して、仮想環境を作成します。
   + 以下のように PyCharm を使用して仮想環境を設定します。

     1. メインメニューから **[ファイル]** を選択します。

     1. **[新しいプロジェクト]** を選択します。

     1. **[使用する新しい環境]** の下向き矢印から **[Conda]** を選択します。

     1. **[Python のバージョン]** フィールドで、下向き矢印を使用して 3.7 以降の Python のバージョンを選択します。リストから 3.10.x まで選択できます。  
![Python の新しい環境が Conda と選択され、Python バージョンが 3.10 と選択されました。](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/training-pycharm-ide.png)
   + Anaconda がインストールされている場合、以下のように `conda` を使用して仮想環境をセットアップできます。
     + Anaconda Prompt のターミナルインターフェースを開きます。
     + Python バージョン 3.7 以降 (3.10x まで) を使用して、新しい `conda` 環境を作成し、アクティブ化します。次のコードサンプルは、Python バージョン 3.10 を使用して `conda` 環境を作成する方法を示しています。

       ```
       conda create -n {{sagemaker_jobs_quick_start}} python=3.10 pip
       conda activate {{sagemaker_jobs_quick_start}}
       ```

1. SageMaker Python SDK をインストールします。

   任意の IDE からコードをパッケージ化するには、Python 3.7 以降 (最大 3.10x) を使用して仮想環境を設定する必要があります。また、互換性があるコンテナイメージも必要です。次のコードサンプルを使用して、SageMaker Python SDK をインストールします。

   ```
   pip install sagemaker
   ```

1. @remote デコレータ内部でコードをラップします。SageMaker Python SDK では、コードの機能を自動的に解釈し、SageMaker トレーニングジョブとして実行します。以下のコードサンプルは、必要なライブラリをインポートする方法、SageMaker セッションを設定する方法、および @remote デコレータで関数に注釈を付ける方法を示しています。

   必要な依存関係を直接指定するか、アクティブな `conda` 環境からの依存関係を使用してコードを実行できます。
   + 依存関係を直接指定するには、次の操作を行います。
     + コードがある作業ディレクトリに `requirements.txt` ファイルを作成します。
     + SageMaker ライブラリとともに、コードに必要なすべての依存関係を追加します。次のセクションでは、`divide` 関数例の `requirements.txt` の最小限のコードサンプルを示します。

       ```
       sagemaker
       ```
     + 依存関係ファイルを渡し、@remote デコレータを使用してコードを実行します。以下のコードサンプルでは、SageMaker がジョブの実行に使用する AWS Identity and Access Management (IAM) ロール ARN で `The IAM role name` を置き換えます。

       ```
       import boto3
       import sagemaker
       from sagemaker.remote_function import remote
       
       sm_session = sagemaker.Session(boto_session=boto3.session.Session(region_name="{{us-west-2}}"))
       settings = dict(
           sagemaker_session=sm_session,
           role={{<The IAM role name>}},
           instance_type="{{ml.m5.xlarge}}",
           dependencies='./requirements.txt'
       )
       
       @remote(**settings)
       def divide(x, y):
           return x / y
       
       
       if __name__ == "__main__":
           print(divide(2, 3.0))
       ```
   + アクティブな `conda` 環境からの依存関係を使用するには、以下に示すように `dependencies` パラメータの値 `auto_capture` を使用します。

     ```
     import boto3
     import sagemaker
     from sagemaker.remote_function import remote
     
     sm_session = sagemaker.Session(boto_session=boto3.session.Session(region_name="{{us-west-2}}"))
     settings = dict(
         sagemaker_session=sm_session,
         role={{<The IAM role name>}},
         instance_type="{{ml.m5.xlarge}}",
         dependencies="auto_capture"
     )
     
     @remote(**settings)
     def divide(x, y):
         return x / y
     
     
     if __name__ == "__main__":
         print(divide(2, 3.0))
     ```
**注記**  
前述のコードを Jupyter Notebook 内に実装することもできます。PyCharm Professional 版は Jupyter をネイティブにサポートしています。詳細については、PyCharm のドキュメントの「[Jupyter notebook support](https://www.jetbrains.com/help/pycharm/ipython-notebook-support.html)」を参照してください。