

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

# SageMaker AI コンポーネントを使用する
<a name="kubernetes-sagemaker-components-tutorials"></a>

このチュートリアルでは、SageMaker AI Components for Kubeflow Pipelines を使用してパイプラインを実行し、SageMaker AI の MNIST データセットで Kmeans を使用して分類モデルをトレーニングします。ワークフローでは、Kubeflow Pipelines をオーケストレーターとして使用し、SageMaker AI をワークフローの各ステップを実行するために使用します。この例は既存の [SageMaker AI の例](https://github.com/aws/amazon-sagemaker-examples/blob/8279abfcc78bad091608a4a7135e50a0bd0ec8bb/sagemaker-python-sdk/1P_kmeans_highlevel/kmeans_mnist.ipynb)から抜粋したもので、SageMaker AI Components for Kubeflow Pipelines と連携するように変更されています。

を使用して Python でパイプラインを定義 AWS SDK for Python (Boto3) し、KFP ダッシュボード、KFP CLI、または Boto3 を使用してワークフローをコンパイル、デプロイ、実行できます。サンプルの MNIST 分類パイプラインの完全なコードについては、「[Kubeflow Github リポジトリ](https://github.com/kubeflow/pipelines/tree/master/samples/contrib/aws-samples/mnist-kmeans-sagemaker#mnist-classification-with-kmeans)」を参照してください。パイプラインを使用するには、Python ファイルのクローンをゲートウェイノードに作成します。

その他の [SageMaker AI Kubeflow Pipelines の例](https://github.com/kubeflow/pipelines/tree/master/samples/contrib/aws-samples) は GitHub で確認できます。使用するコンポーネントの詳細については、「[KubeFlow Pipelines GitHub リポジトリ](https://github.com/kubeflow/pipelines/tree/master/components/aws/sagemaker)」を参照してください。

分類パイプラインの例を実行するには、トレーニングジョブに AWS リソースへのアクセス許可を付与する SageMaker AI IAM 実行ロールを作成し、デプロイオプションに対応するステップに進みます。

## SageMaker AI 実行ロールを作成する
<a name="create-an-amazonsagemaker-execution-role"></a>

`kfp-example-sagemaker-execution-role` IAM ロールは、SageMaker AI ジョブが AWS リソースにアクセスするために引き受けるランタイムロールです。次のコマンドでは、 という名前の IAM 実行ロールを作成し`kfp-example-sagemaker-execution-role`、2 つの管理ポリシー (AmazonSageMakerFullAccess、AmazonS3FullAccess) をアタッチし、SageMaker AI との信頼関係を作成して、SageMaker AI ジョブにそれらの AWS リソースへのアクセスを許可します。

このロールは、パイプラインの実行時に入力パラメータとして指定します。

次のコマンドを実行してロールを作成します。出力で返される ARN を書き留めておきます。

```
SAGEMAKER_EXECUTION_ROLE_NAME=kfp-example-sagemaker-execution-role

TRUST="{ \"Version\": \"2012-10-17		 	 	 \", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"sagemaker.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\" } ] }"
aws iam create-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --assume-role-policy-document "$TRUST"
aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess

aws iam get-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --output text --query 'Role.Arn'
```

## AWS デプロイ時のフル Kubeflow
<a name="run-pipelines-on-full-kubeflow-deployment"></a>

[K-Means を使用した MNIST 分類のための SageMaker トレーニングパイプラインチュートリアル](https://awslabs.github.io/kubeflow-manifests/docs/amazon-sagemaker-integration/sagemaker-components-for-kubeflow-pipelines/)の手順に従います。

## Kubeflow Pipelines のスタンドアロンデプロイ
<a name="run-pipelines-on-standalone-kubeflow-pipelines-deployment"></a>

### データセットを準備する
<a name="prepare-datasets"></a>

パイプラインを実行するには、データ抽出前処理スクリプトを Amazon S3 バケットにアップロードする必要があります。このバケットとこのサンプルのすべてのリソースは、`us-east-1` リージョンに配置する必要があります。 バケットの作成については、「[バケットを作成する](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)」を参照してください。

ゲートウェイノードでクローンを作成した Kubeflow リポジトリの `mnist-kmeans-sagemaker` フォルダから、以下のコマンドを実行して Amazon S3 バケットに `kmeans_preprocessing.py` ファイルをアップロードします。「`<bucket-name>`」を Amazon S3 バケットの名前に変更します。

```
aws s3 cp mnist-kmeans-sagemaker/kmeans_preprocessing.py s3://{{<bucket-name>}}/mnist_kmeans_example/processing_code/kmeans_preprocessing.py
```

### パイプラインをコンパイルしてデプロイする
<a name="compile-and-deploy-your-pipeline"></a>

パイプラインを定義したら、中間表現にコンパイルしてから、クラスターの Kubeflow Pipelines サービスに送信する必要があります。中間表現は、tar.gz ファイルに圧縮された YAML ファイルの形式のワークフロー仕様です。パイプラインをコンパイルするには KFP SDK が必要です。

#### KFP SDK をインストールする
<a name="install-kfp-sdk"></a>

ゲートウェイノードのコマンドラインから以下を実行します。

1. 「[Kubeflow pipelines のドキュメント](https://www.kubeflow.org/docs/pipelines/sdk/install-sdk/)」の手順を実行して、KFP SDK をインストールします。

1. 以下のコマンドを使用して、KFP SDK がインストールされたことを確認します。

   ```
   pip show kfp
   ```

1. 以下を使用して、`dsl-compile` が正しくインストールされたことを確認します。

   ```
   which dsl-compile
   ```

#### パイプラインをコンパイルする
<a name="compile-your-pipeline"></a>

Kubeflow Pipelines とのやり取りには、KFP UI、KFP CLI、KFP SDK の 3 つの方法を使用できます。以下のセクションでは、KFP UI と CLI を使用したワークフローについて説明します。

ゲートウェイノードから以下の手順を実行します。

1. 使用する Amazon S3 バケット名と IAM ロール ARN で Python ファイルを変更します。

1. 以下のように、コマンドラインから `dsl-compile` コマンドを実行して、パイプラインをコンパイルします。`<path-to-python-file>` はパイプラインのパスに、`<path-to-output>` は tar.gz ファイルの保存先の場所に置き換えます。

   ```
   dsl-compile --py {{<path-to-python-file>}} --output {{<path-to-output>}}
   ```

#### KFP CLI を使用してパイプラインをアップロードして実行する
<a name="upload-and-run-the-pipeline-using-the-kfp-cli"></a>

ゲートウェイノードのコマンドラインから以下の手順を実行します。KFP では、パイプラインの実行は実験として整理されます。実験名を指定することもできます。実験名を指定しない場合は、**[Default]** (デフォルト) の実験の下に実行が一覧表示されます。

1. 以下のようにパイプラインをアップロードします。

   ```
   kfp pipeline upload --pipeline-name {{<pipeline-name>}} {{<path-to-output-tar.gz>}}
   ```

   出力は次のようになります。パイプライン `ID` を書き留めておきます。

   ```
   Pipeline 29c3ff21-49f5-4dfe-94f6-618c0e2420fe has been submitted
   
   Pipeline Details
   ------------------
   ID           29c3ff21-49f5-4dfe-94f6-618c0e2420fe
   Name         sm-pipeline
   Description
   Uploaded at  2020-04-30T20:22:39+00:00
   ...
   ...
   ```

1. 以下のコマンドを使用して実行を作成します。現在のところ、KFP CLI の run コマンドは、実行作成中の入力パラメータの指定をサポートしていません。コンパイルする前に、 AWS SDK for Python (Boto3) パイプラインファイルのパラメータを更新する必要があります。`<experiment-name>` と `<job-name>` を任意の名前に置き換えます。`<pipeline-id>` を、送信済みのパイプラインの ID に置き換えます。`<your-role-arn>` を、`kfp-example-pod-role` の ARN に置き換えます。`<your-bucket-name>` を、作成した Amazon S3 バケットの名前に置き換えます。

   ```
   kfp run submit --experiment-name {{<experiment-name>}} --run-name {{<job-name>}} --pipeline-id {{<pipeline-id>}} role_arn="{{<your-role-arn>}}" bucket_name="{{<your-bucket-name>}}"
   ```

   `dsl-compile` コマンドの出力として作成されたコンパイル済みパイプラインパッケージを使用して、実行を直接送信することもできます。

   ```
   kfp run submit --experiment-name {{<experiment-name>}} --run-name {{<job-name>}} --package-file {{<path-to-output>}} role_arn="{{<your-role-arn>}}" bucket_name="{{<your-bucket-name>}}"
   ```

   出力は次のようになります。

   ```
   Creating experiment aws.
   Run 95084a2c-f18d-4b77-a9da-eba00bf01e63 is submitted
   +--------------------------------------+--------+----------+---------------------------+
   | run id                               | name   | status   | created at                |
   +======================================+========+==========+===========================+
   | 95084a2c-f18d-4b77-a9da-eba00bf01e63 | sm-job |          | 2020-04-30T20:36:41+00:00 |
   +--------------------------------------+--------+----------+---------------------------+
   ```

1. UI に移動して、ジョブの進行状況をチェックします。

#### KFP UI を使用してパイプラインをアップロードして実行します。
<a name="upload-and-run-the-pipeline-using-the-kfp-ui"></a>

1. 左パネルで、**[Pipelines]** (パイプライン) タブを選択します。

1. 右上にある **[\+UploadPipeline]** を選択します。

1. パイプラインの名前と説明を入力します。

1. **[ファイルのアップロード]** を選択し、CLI または AWS SDK for Python (Boto3)を使用して作成した tar.gz ファイルへのパスを入力します。

1. 左パネルで、**[Pipelines]** (パイプライン) タブを選択します。

1. 作成したパイプラインを見つけます。

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

1. 入力パラメータを入力します。

1. **[Run]** (実行) を選択します。

### 予測を実行する
<a name="running-predictions"></a>

分類パイプラインがデプロイされると、デプロイコンポーネントによって作成されたエンドポイントに対して分類予測を実行できます。KFP UI を使用して、`sagemaker-deploy-model-endpoint_name` の出力アーティファクトをチェックします。.tgz ファイルをダウンロードしてエンドポイント名を抽出するか、使用したリージョンで SageMaker AI コンソールをチェックします。

#### 予測を実行するアクセス許可を設定する
<a name="configure-permissions-to-run-predictions"></a>

予測をゲートウェイノードから実行する場合は、このセクションをスキップしてください。

**他のマシンを使用して予測を実行するには、クライアントマシンの使用する IAM ロールに `sagemaker:InvokeEndpoint` アクセス許可を割り当てます。**

1. ゲートウェイノードで、以下のコマンドを実行して IAM ポリシーファイルを作成します。

   ```
   cat <<EoF > ./sagemaker-invoke.json
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sagemaker:InvokeEndpoint"
               ],
               "Resource": "*"
           }
       ]
   }
   EoF
   ```

1. クライアントノードの IAM ロールにポリシーをアタッチします。

   以下のコマンドを実行してください。`<your-instance-IAM-role>` を IAM ロールの名前に置き換えます。`<path-to-sagemaker-invoke-json>` は、作成したポリシーファイルへのパスに置き換えます。

   ```
   aws iam put-role-policy --role-name {{<your-instance-IAM-role>}} --policy-name sagemaker-invoke-for-worker --policy-document file://{{<path-to-sagemaker-invoke-json>}}
   ```

#### 予測を実行する
<a name="run-predictions"></a>

1. 次の内容`mnist-predictions.py`で、 という名前のクライアントマシンから AWS SDK for Python (Boto3) ファイルを作成します。`ENDPOINT_NAME` 変数を置き換えます。このスクリプトは MNIST データセットをロードし、それらの数字から CSV を作成し、予測のためにエンドポイントに送信して結果をプリントします。

   ```
   import boto3
   import gzip
   import io
   import json
   import numpy
   import pickle
   
   ENDPOINT_NAME='{{<endpoint-name>}}'
   region = boto3.Session().region_name
   
   # S3 bucket where the original mnist data is downloaded and stored
   downloaded_data_bucket = f"jumpstart-cache-prod-{region}"
   downloaded_data_prefix = "1p-notebooks-datasets/mnist"
   
   # Download the dataset
   s3 = boto3.client("s3")
   s3.download_file(downloaded_data_bucket, f"{downloaded_data_prefix}/mnist.pkl.gz", "mnist.pkl.gz")
   
   # Load the dataset
   with gzip.open('mnist.pkl.gz', 'rb') as f:
       train_set, valid_set, test_set = pickle.load(f, encoding='latin1')
   
   # Simple function to create a csv from our numpy array
   def np2csv(arr):
       csv = io.BytesIO()
       numpy.savetxt(csv, arr, delimiter=',', fmt='%g')
       return csv.getvalue().decode().rstrip()
   
   runtime = boto3.Session(region).client('sagemaker-runtime')
   
   payload = np2csv(train_set[0][30:31])
   
   response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                      ContentType='text/csv',
                                      Body=payload)
   result = json.loads(response['Body'].read().decode())
   print(result)
   ```

1. 次のように AWS SDK for Python (Boto3) ファイルを実行します。

   ```
   python mnist-predictions.py
   ```

### 結果とログを表示する
<a name="view-results-and-logs"></a>

パイプラインの実行中は、コンポーネントを選択することによって、入力や出力などの実行の詳細をチェックできます。作成されたリソースの名前が一覧表示されます。

KFP リクエストが正常に処理され、SageMaker AI ジョブが作成されると、KFP UI のコンポーネントログに SageMaker AI で作成されたジョブへのリンクが記載されます。ジョブが正常に作成されると、CloudWatch ログも提供されます。

同じクラスターで実行するパイプラインジョブが多すぎると、十分なポッドを利用できないことを示すエラーメッセージが表示されることがあります。これを修正するには、ゲートウェイノードにログインし、使用していないパイプラインで作成されたポッドを削除します。

```
kubectl get pods -n kubeflow
kubectl delete pods -n kubeflow {{<name-of-pipeline-pod>}}
```

### クリーンアップ
<a name="cleanup"></a>

パイプラインの処理が終了したら、リソースをクリーンアップする必要があります。

1. パイプラインが正常に終了しない場合は、KFP ダッシュボードで **[Terminate]** (終了) を選択して、パイプラインの実行を終了します。

1. **[終了]** オプションが機能しない場合は、ゲートウェイノードにログインし、パイプラインによって作成されたすべてのポッドを以下のように手動で終了します。

   ```
   kubectl get pods -n kubeflow
   kubectl delete pods -n kubeflow {{<name-of-pipeline-pod>}}
   ```

1.  AWS アカウントを使用して、SageMaker AI サービスにログインします。すべてのトレーニング、バッチ変換、HPO のジョブを手動で停止します。モデル、データバケット、エンドポイントを削除して、追加コストが発生しないようにします。パイプライン実行を終了しても SageMaker AI のジョブは停止しません。