VantageからSageMakerのAPIを実行する方法

著者 [Wenjie Tehan](wenjie.tehan@teradata.com)
最終更新日 2022年2月8日

:::note warn
警告
本記事はTeradata Corporationによる[Getting Started](https://quickstarts.teradata.com/index.html#getting-access-to-vantage)に掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については原本をご参照下さい。
また、修正が必要な箇所やご要望についてはコメントをよろしくお願いします。
:::

# 概要
このハウツーは、Amazon SageMakerとTeradata Vantageを統合するのに役立ちます。このガイドで説明するアプローチはこのサービスと統合するための多くの潜在的なアプローチの1つです。

Amazon SageMakerはフルマネージドな機械学習プラットフォームを提供します。Amazon SageMakerとTeradataには2つのユースケースがあります。

①	データはTeradata Vantage上に存在しAmazon SageMakerはモデル定義とその後のスコアリングの両方に使用されます。この使用例ではTeradataはAmazon S3環境にデータを提供し、Amazon SageMakerがモデル開発のためにトレーニングおよびテストデータセットを利用できるようにします。TeradataはさらにAmazon S3を通じてAmazon SageMakerによるその後のスコアリングのためにデータを利用できるようにします。このモデルではTeradataはデータリポジトリのみとなります。

②	データはTeradata Vantage上に存在しAmazon SageMakerはモデル定義に使用され、Teradataはその後のスコアリングに使用されます。このユースケースでは、TeradataはAmazon S3環境にデータを提供しAmazon SageMakerはモデル開発のためにトレーニングおよびテストデータセットを消費できるようにします。Teradataは、Amazon SageMakerのモデルをTeradataのテーブルにインポートしTeradata Vantageでスコアリングを行う必要があります。このモデルではTeradataはデータリポジトリでありスコアリングエンジンでもあります。

このドキュメントでは、最初のユースケースについて説明します。

Amazon SageMakerはAmazon S3バケットからトレーニングデータとテストデータを消費します。この記事ではTeradataの分析データセットをAmazon S3バケットにロードする方法について説明します。その後、データはAmazon SageMakerで利用可能になり機械学習モデルを構築してトレーニングし本番環境に展開することができます。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。


::: note info
メモ！
Vantageの新しいインスタンスが必要な場合は、[Google Cloud](https://qiita.com/ykswi/items/10a382de5fa5a4a42c50)、[Azure](https://qiita.com/ykswi/items/2c30aa1f5413b16c838c)、[AWS](https://qiita.com/ykswi/items/fba559149ad568678d58)のクラウドにVantage Expressという無料版をインストールすることができます。また、[VMware](https://qiita.com/ykswi/items/ebe1d854c38db9bb0f51)、[VirtualBox](https://qiita.com/ykswi/items/ffadaa375add309f2075)、または[UTM](https://qiita.com/ykswi/items/94995954ae723185c2f7)を使用して、ローカルマシン上でVantage Expressを実行することもできます。
:::


・Amazon S3バケットにアクセスしAmazon SageMakerサービスを使用するためのIAM権限
・学習データを保存するためのAmazon S3バケット


# データの読み込み
Amazon SageMakerはAmazon S3バケットからデータをトレーニングします。以下はVantageからAmazon S3バケットにトレーニングデータをロードする手順です。

①	Amazon SageMakerコンソールに移動しノートブックインスタンスを作成します。ノートブックインスタンスを作成する方法については[Amazon SageMaker開発者ガイド](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-setup-working-env.html)を参照してください。

![画像01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/11004f02-b5db-f478-d49b-107a9a6df43d.png)

②	ノートブックのインスタンスを開きます。

![画像02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/52c6f306-d839-484e-0594-4a09a3848b75.png)

③	**新規作成 → conda_python3** をクリックして新規ファイルを起動します。

![画像03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/77d7cc1c-e4b8-5d77-7783-c6b0fd479662.png)

④	Teradata Pythonライブラリをインストールします。

```:install_teradataml
!pip install teradataml
```

⑤	新しいセルに追加のライブラリをインポートします。

```:import_library
import teradataml as tdml
from teradataml import create_context, get_context, remove_context
from teradataml.dataframe.dataframe import DataFrame
import pandas as pd
import boto3, os
```

⑥	新しいセルで、Teradata Vantageに接続します。**ホスト名**、**データベースユーザー名**、**データベースパスワード** はVantageの環境にあわせて置き換えてください。

```:create_context
create_context(host = '<hostname>', username = '<database user name>', password = '<database password>')
```

⑦	TeradataML DataFrame APIを使用して学習用データセットが存在するテーブルからデータを取得する。

```:get_data
train_data = tdml.DataFrame('table_with_training_data')
trainDF = train_data.to_pandas()
```

⑧	ローカルファイルにデータを書き込む。

```:write2localfile
trainFileName = 'train.csv'
trainDF.to_csv(trainFileName, header=None, index=False)
```

⑨	Amazon S3にファイルをアップロードします。

```:upload2s3
bucket = 'sagedemo'
prefix = 'sagemaker/train'

trainFile = open(trainFileName, 'rb')
boto3.Session().resource('s3').Bucket(bucket).Object(os.path.join(prefix, localFile)).upload_fileobj(trainFile)
```


# モデルのトレーニング
①	左メニューの**Training**から**Training jobs**を選択し、**Create training job**をクリックします。

![画像04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/80039a02-ae11-a5f9-b9a5-8b57f3e5507e.png)

②	**トレーニングジョブ**の作成ウィンドウで**ジョブ名**（例：**xgboost-bank**）を記入しIAMロールの**新しいロールを作成します。** Amazon S3バケットに**Any S3バケット**、ロールの作成に**Create role**を選択します。

![画像05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/8adc201f-fffe-1f34-b486-49f2ce00346f.png)

③	**Create training job**ウィンドウに戻りアルゴリズムとして**XGBoost**を使用します。

![画像06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/1fa9fb86-f211-9db4-6080-26be57a0c69e.png)

④	インスタンスタイプはデフォルトの**ml.m4.xlarge**、インスタンスあたりの追加ストレージボリュームは30GBを使用します。これは短いトレーニングジョブで10分以上はかからないはずです。

![画像07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/999ae1be-6edc-d498-9e7d-0a4ff643deaf.png)

⑤	以下のハイパーパラメータを入力しそれ以外はデフォルトのままにしてください。

```:hyper_parameters
num_round=100
silent=0
eta=0.2
gamma=4
max_depth=5
min_child_weight=6
subsample=0.8
objective='binary:logistic'
```

⑥	**Input data configuration**には学習データを保存したAmazon S3バケットを入力します。Input modeは**File**です。Content typeは**csv**です。**S3のロケーション**はファイルのアップロード先です。

![画像08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/c26ac50f-cfcf-d855-e0a9-9fb79c37ca06.png)

⑦	**Output data configuration**には出力データを保存するパスを入力します。

![画像09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/ae1bca89-ca26-99ec-e0c7-713ffc347137.png)

⑧	他はデフォルトのまま「トレーニングジョブの作成」をクリックします。トレーニングジョブの設定方法の詳細は[Amazon SageMaker Developer Guide](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-mkt-algo-train.html#sagemaker-mkt-algo-train-console)に記載されています。

トレーニングジョブが作成されるとAmazon SageMakerはMLインスタンスを起動してモデルをトレーニングし、結果のモデル成果物やその他の出力を出力データ構成（デフォルトではパス/<トレーニングジョブ名>/output）に格納します。

# モデルのデプロイ
モデルを学習させた後、永続的なエンドポイントを使用してモデルをデプロイします。

# モデルの作成
①	左パネルの「**Inference**」から「**Models**」を選択し「**Create model**」を選択します。モデル名（例：**xgboost-bank**）を記入し前のステップで作成したIAMロールを選択します。
②	**コンテナ定義1**では「**Location of inference code image**」として、「**433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest**」を使用します。**モデル成果物の場所**には学習ジョブの出力パスを指定します。

![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/df560472-c965-c036-483d-c7b762853e8e.png)

③	他はデフォルトのまま「**モデルを作成**」します。


# エンドポイントコンフィギュレーションを作成する
①	作成したモデルを選択し、[**Create endpoint configuration**]をクリックします。

![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/429291fb-3cf3-78da-8b4a-98b5ee1afa7f.png)

②	名前（例：**xgboost-bank**）を記入しその他はdefaultを使用します。モデル名とトレーニングジョブは自動的に入力されるはずです。**Create endpoint configuration** をクリックします。

# エンドポイントの作成
①	左パネルから**Inference** → **Models**を選択し、再度モデルを選択し、今度は**Create endpoint**をクリックします。

![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/b05cd099-ecc3-4f60-5f21-0ceb76358e08.png)

②	名前（例：**xgboost-bank**）を記入し「**既存のエンドポイント構成を使用する**：image::sagemaker-with-teradata-vantage/attach.endpoint.config.png[エンドポイント構成を添付する]」を選択します。

③	前回の手順で作成したエンドポイント構成を選択し[**Select endpoint configuration**]をクリックします。

![画像13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/bd5b54f8-1d53-034c-ac1a-bad440207863.png)

④	他のすべてをデフォルトのままにして「**エンドポイントを作成**」をクリックします。

これでモデルがエンドポイントにデプロイされクライアントアプリケーションから利用できるようになります。


# まとめ
このハウツーでは、Vantageから学習データを抽出し、それを使ってAmazon SageMakerでモデルを学習させる方法を紹介しました。
このソリューションでは、
Jupyterノートブックを使用してVantageからデータを抽出しS3バケットに書き込み、
SageMaker のトレーニングジョブは S3 バケットからデータを読み込みモデルを生成し、
このモデルをサービスエンドポイントとして AWS にデプロイ
しました。

# さらに詳しく
・[Train ML models in Vantage using only SQL](https://quickstarts.teradata.com/ml.html)

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)