{ "cells": [ { "cell_type": "markdown", "id": "229e1ccb", "metadata": {}, "source": [ "# SageMaker JumpStart を用いた LightGBM (回帰)のトレーニングと推論\n", "* JumpStart では独自のデータを用意するだけで、様々なモデルの学習と出来たモデルの推論ができる\n", "* このノートブックでは LightGBM の回帰モデルを用いたトレーニングの動かし方を記述する\n", "* データについては、AWS が公開しているデータを利用する\n", "* SageMaker SDK を使ったトレーニングと推論を記載し、最後に boto3 を使った推論を記載している\n", "* このノートブックは `Data Science 2.0` イメージ、`Python 3` カーネルで開いてください\n", "\n", "## Tabel of Contents\n", "* [事前準備](#事前準備)\n", " * [モジュールのインポート](#モジュールのインポート)\n", " * [データ取得](#データ取得)\n", "* [SageMaker JumpStart を使って CUI(SageMaker SDK) でトレーニングと推論](#SageMaker-JumpStart-を使って-CUI(SageMaker-SDK)-でトレーニングと推論)\n", " * [トレーニング](#トレーニング)\n", " * [データアップロード](#データアップロード)\n", " * [トレーニングパラメータの取得](#トレーニングパラメータの取得)\n", " * [トレーニングジョブ実行](#トレーニングジョブ実行)\n", " * [推論](#推論)\n", " * [推論パラメータの取得](#トレーニングパラメータの取得)\n", " * [推論エンドポイント作成](#推論エンドポイント作成)\n", "* [boto3 で推論](#boto3-で推論)\n", " * [定数やクライアントの設定](#定数やクライアントの設定)\n", " * [モデルと推論コードを tar.gz に固める](#モデルと推論コードを-tar.gz-に固める)\n", " * [boto3 でSageMaker でモデルの作成](#boto3-でSageMaker-でモデルの作成)\n", " * [boto3 でエンドポイントの設定を作成](#boto3-でエンドポイントの設定を作成)\n", " * [boto3 でエンドポイントを作成する](#boto3-でエンドポイントを作成する)\n", " * [boto3 で推論する](#boto3-で推論する)\n", " * [boto3 でエンドポイント他を削除](#boto3-でエンドポイント他を削除)\n" ] }, { "cell_type": "markdown", "id": "96bfbbfd", "metadata": {}, "source": [ "## 事前準備\n", "### モジュールのインポート" ] }, { "cell_type": "code", "execution_count": null, "id": "805f9504", "metadata": { "tags": [] }, "outputs": [], "source": [ "import sagemaker\n", "from sagemaker import image_uris, model_uris, script_uris\n", "from sagemaker.estimator import Estimator\n", "from sagemaker.session import Session\n", "from sagemaker import hyperparameters\n", "import json\n", "import pandas as pd\n", "from typing import Final" ] }, { "cell_type": "markdown", "id": "45c93882", "metadata": {}, "source": [ "### データ取得\n", "公開されている回帰用データを使う" ] }, { "cell_type": "code", "execution_count": null, "id": "daa6e1f8", "metadata": { "tags": [] }, "outputs": [], "source": [ "data_dir: Final[str] = 'regression_data'\n", "!if [ -d ./{data_dir} ]; then rm -rf ./{data_dir}/;fi\n", "!mkdir ./{data_dir}/\n", "!aws s3 sync s3://jumpstart-cache-prod-us-east-1/training-datasets/tabular_regress/ ./{data_dir}/" ] }, { "cell_type": "markdown", "id": "cd843487", "metadata": {}, "source": [ "## SageMaker JumpStart を使って CUI(SageMaker SDK) でトレーニングと推論\n", "### トレーニング" ] }, { "cell_type": "markdown", "id": "8dffdd86", "metadata": {}, "source": [ "#### データアップロード\n", "\n", "* トレーニングデータについて\n", " * JumpStart で自分のデータでトレーニングするには予め S3 に配置する(トレーニング実行時に S3 の URI を指定する)\n", "* データの持ち方について\n", " * csv 形式でファイル名を data.csv にする必要がある(トレーニングコードが data.csv しか受け付けないようになっている)\n", " * 訓練用データの `train/data.csv` は必ず用意する\n", " * 評価用データの`validation/data.csv` はオプション\n", " * テスト用データの `test/data.csv` はトレーニング時にもちろん使わないがまとめてアップロードしているので副次的にアップロードされる\n", " * ターゲット変数は必ず 0 列目に入れること(トレーニングコードが 0 列目をターゲット変数として認識するように実装されている)\n", "* カテゴリー変数について\n", " * データディレクトリのルートに任意の json ファイルを1つだけ含むことでカテゴリカル変数を扱うことができる\n", " * カテゴリー変数は、0 以上の整数(Int32の範囲内)でエンコードされている必要がある\n", " * カテゴリー変数は列のインデックスで辞書形式でキーに `cat_index_list` で、値に列のインデックスをリスト形式で渡す\n", " * 今回は 1 列目がカテゴリー変数" ] }, { "cell_type": "markdown", "id": "334d7f76", "metadata": {}, "source": [ "データの確認(JumpStart を動かすのには不要)" ] }, { "cell_type": "code", "execution_count": null, "id": "780b477b", "metadata": {}, "outputs": [], "source": [ "# !cat {data_dir}/cat_index.json\n", "# pd.read_csv(f'{data_dir}/train/data.csv',header=None).head()" ] }, { "cell_type": "markdown", "id": "ac5fdbfb", "metadata": {}, "source": [ "* データアップロードは [upload_data](https://sagemaker.readthedocs.io/en/stable/api/utility/session.html#sagemaker.session.Session.upload_data) メソッドを利用して、ディレクトリまるごと S3 にアップロードする\n", "* ここでは SageMaker のデフォルトバケット(`sagemaker-{region}-{account}`にアップロードしているが、任意のバケットを選択するときは `bucket` 引数を使用する\n", "* ここで出力される URI は、GUI で入力する値でもある(GUI の場合は、S3 の URI を入力したあと `Train` をクリックすれば学習が開始される \n", "\n", "