Amazon SageMaker AI で機械学習モデルのトレーニングとデプロイを体験する
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
準備 8 項目中 1 番目
前提条件
- リージョン:
ap-northeast-1(東京) - IAM ユーザーまたはロールに SageMaker、S3、IAM の操作権限があること
準備 8 項目中 2 番目
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| SageMaker ドメイン | QuickSetupDomain-<日時>(自動命名) | SageMaker Studio 環境 |
| SageMaker ユーザープロファイル | default-<日時>(自動命名) | Studio にログインするユーザー |
| IAM ロール | AmazonSageMaker-ExecutionRole-<日時>(自動作成) | トレーニングジョブやエンドポイントの実行用 |
| JupyterLab スペース | basic-notebook | ノートブックを動かす環境 |
| S3 バケット | sagemaker-ap-northeast-1-<アカウントID>(自動作成) | トレーニングデータとモデルの保存先 |
| SageMaker エンドポイント | xgboost-basic-endpoint | リアルタイム推論用 |
手順 8 項目中 3 番目
ステップ1: SageMaker ドメインの作成
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
SageMakerと入力し、表示された「Amazon SageMaker」を選択します - 左側ナビゲーションの「Environment configuration」→「ドメイン」を選択します
- 「ドメインを作成」をクリックします
- 「シングルユーザー向けの設定 (クイックセットアップ)」を選択し、「設定」をクリックします
- クイックセットアップでは、ドメイン名・ユーザープロファイル名・実行ロールの入力はありません。ドメイン(
QuickSetupDomain-<日時>)、ユーザープロファイル(default-<日時>)、AmazonSageMakerFullAccessポリシーが付いた実行ロール(AmazonSageMaker-ExecutionRole-<日時>)が自動で作られます - 1 分ほどでドメインの作成が完了します。「ドメイン」の一覧でステータスが「InService」になっていれば完了です
手順 8 項目中 4 番目
ステップ2: SageMaker Studio の起動
- ドメインの作成が終わると、SageMaker Studio が新しいタブで自動的に開きます。開かなかった場合は、ドメイン一覧の「Studio を開く」をクリックします
- 初回はツアーの案内(Welcome)が表示されるので、「Skip Tour」で閉じます
- SageMaker Studio のホーム画面が表示されます(画面は英語です)
手順 8 項目中 5 番目
ステップ3: ノートブックの作成とデータの準備
- SageMaker Studio のホーム画面で、アプリケーションの「JupyterLab」を選択します
- 「Create JupyterLab space」をクリックします
- 名前に
basic-notebookと入力し、共有の設定は「Private」のまま「Create space」をクリックします - スペースの詳細画面に切り替わります。インスタンスはデフォルト(
ml.t3.medium)のまま「Run space」をクリックします - ステータスが「Running」になったら「Open JupyterLab」をクリックします。JupyterLab が新しいタブで開きます
- 開いたときに表示される通知やチャットのパネルは閉じてかまいません。ランチャーの「Notebook」から「Python 3 (ipykernel)」を選択し、ノートブックを新規作成します
- JupyterLab にあらかじめ入っている SageMaker Python SDK は v3 系で、この記事のコード(v2 の書き方)はそのままでは
ImportErrorになります。最初のセルで次のコマンドを実行して v2 を入れ、メニューの「Kernel」→「Restart Kernel」でカーネルを再起動します。依存関係の警告が表示されますが、動作には影響ありません
%pip install "sagemaker<3"
- カーネルを再起動したら、次のセルに以下のコードを入力し、実行します(Shift + Enter)。このコードはセッションと実行ロールを取得し、データの保存先にする既定の S3 バケット(
sagemaker-ap-northeast-1-<アカウントID>。無ければ自動で作成されます)を確認します
import sagemaker
import boto3
import numpy as np
import pandas as pd
from sagemaker import Session
# セッションとリージョンの設定
session = sagemaker.Session()
bucket = session.default_bucket()
role = sagemaker.get_execution_role()
region = boto3.Session().region_name
print(f"S3 バケット: {bucket}")
print(f"実行ロール: {role}")
print(f"リージョン: {region}")
- 次のセルに以下のコードを入力して実行します。サンプルデータを生成し、S3 にアップロードします
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# サンプルデータの生成(二値分類)
X, y = make_classification(
n_samples=1000,
n_features=10,
n_informative=5,
n_redundant=2,
random_state=42
)
# トレーニングデータとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# XGBoost 用の CSV 形式(1列目がラベル)
train_data = np.column_stack([y_train, X_train])
test_data = np.column_stack([y_test, X_test])
# CSV ファイルとして保存
pd.DataFrame(train_data).to_csv("train.csv", header=False, index=False)
pd.DataFrame(test_data).to_csv("test.csv", header=False, index=False)
# S3 にアップロード
prefix = "sagemaker-basic-xgboost"
train_path = session.upload_data("train.csv", bucket=bucket, key_prefix=f"{prefix}/train")
test_path = session.upload_data("test.csv", bucket=bucket, key_prefix=f"{prefix}/test")
print(f"トレーニングデータ: {train_path}")
print(f"テストデータ: {test_path}")
手順 8 項目中 6 番目
ステップ4: トレーニングジョブの実行
- 次のセルに以下のコードを入力して実行します。XGBoost の組み込みアルゴリズムを使ってトレーニングジョブを開始します
from sagemaker.inputs import TrainingInput
# XGBoost コンテナイメージの取得
container = sagemaker.image_uris.retrieve("xgboost", region, version="1.7-1")
# Estimator の設定
xgb = sagemaker.estimator.Estimator(
image_uri=container,
role=role,
instance_count=1,
instance_type="ml.m5.large",
output_path=f"s3://{bucket}/{prefix}/output",
sagemaker_session=session,
)
# ハイパーパラメータの設定
xgb.set_hyperparameters(
objective="binary:logistic",
num_round=100,
max_depth=5,
eta=0.2,
)
# トレーニングデータの指定
train_input = TrainingInput(
s3_data=train_path,
content_type="text/csv",
)
# トレーニングジョブの開始
xgb.fit({"train": train_input})
- トレーニングジョブが開始されると、ログがセルの出力に表示されます。完了までに数分かかります
- SageMaker コンソールでもトレーニングジョブの状態を確認できます。左側ナビゲーションの「Model training & customization」→「Training & tuning jobs」を選択すると、実行したジョブの一覧が表示されます
手順 8 項目中 7 番目
ステップ5: モデルのデプロイ
- ノートブックに戻り、次のセルに以下のコードを入力して実行します。トレーニング済みモデルをリアルタイム推論エンドポイントにデプロイします
# エンドポイントへのデプロイ
predictor = xgb.deploy(
initial_instance_count=1,
instance_type="ml.m5.large",
endpoint_name="xgboost-basic-endpoint",
)
print("エンドポイントのデプロイが完了しました")
- デプロイが完了するまで数分待ちます
- SageMaker コンソールの左側ナビゲーションの「Deployments & inference」→「エンドポイント」を選択すると、作成したエンドポイントが表示されます
手順 8 項目中 8 番目
ステップ6: 推論の実行
- ノートブックで次のセルに以下のコードを入力して実行します。デプロイしたエンドポイントに推論リクエストを送信します
from sagemaker.serializers import CSVSerializer
# シリアライザーの設定
predictor.serializer = CSVSerializer()
# テストデータから数件を使って推論
test_samples = X_test[:5]
predictions = predictor.predict(test_samples)
print("予測結果:")
print(predictions.decode("utf-8"))
print("\n実際のラベル:")
print(y_test[:5])
- 出力された予測結果は 0 から 1 の間の確率値です。0.5 以上であればクラス 1、0.5 未満であればクラス 0 と判定します
- 実際のラベルと比較することで、モデルの予測精度を確認できます