背景・取り組み内容
SageMakerを使用する際、初めての方は「SageMaker Studio」内にあるJupyter Notebookインスタンスを立ち上げてモデルの学習をされることが多いと思います。
いちいちAWSにアクセスしてSageMakerStudioを立ち上げ、さらにNotebookインスタンスを立ち上げ、一連の作業が終了したらインスタンスを終了させる…という一連のプロセスは個人的に億劫だなと感じます。
そこで今回は、ローカルのVScodeからSageMakerを使うことができないかと思い勉強として取り組んでみたところできましたので備忘録として記事を書きました。
参考までに、筆者の現在のレベルとしては
・機械学習には少し触れた程度
・Sagemakerは今まで触れたことがなく、今回初めて1週間程度触れてみた
という状態から、NotebookをローカルPCで動かしてみるというところにチャレンジしてみた素人レベルの人間です。
色々なサイトを参考しながら取り組んでおります。
前編では、データセットの準備まで行います。
後編では、SageMakerでの学習とエンドポイント作成を行います。
ちなみにNotebookインスタンスの料金表は以下の通りです。今回のような小さなデータセットであれば、「ml.t3.medium」のような小さなインスタンスでも十分動作しました。ですのでStudioノートブックでもコストは軽微です。
今後大きなインスタンスを使う場面もあると思いますので、その場合にローカルのハイスペックPCからSageMakerを動かすということができればコスト面でも貢献できると考えています。
使用環境
エディタ
Visual Studio Code(1.62.3)
Jupyter Notebook※デバッグしやすいのでVSCode内で使いました
使用言語
Python3.8
Part1:ライブラリのインストール・各種パスの設定
使用するライブラリのインストール・各種フォルダパスの設定を行います。
# sklearn
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
# SageMaker SDK
import sagemaker
from sagemaker.serializers import CSVSerializer
# S3操作用モジュール
import boto3
# データ操作に使うモジュール
import pandas as pd
import numpy as np
import io
# Part1:各種パス設定
## SageMaker用のロール
# 例:role = sagemaker.get_execution_role()
role = '■■■■■'
## データやモデルを置くS3
bucket = '■■■■■'
prefix = 'sagemaker/■■■■■' #sagemakerというフォルダを作ってその直下にプロジェクトごとのフォルダを作るとわかりやすい
my_region = 'ap-northeast-1'
accesskey = '■■■■■'
sercretkey = '■■■■■'
Part2:データ準備
「scikit-learn」に含まれている乳がんの診断データセットを使用しました。
ガンに関して計30の特徴が用意されています。この特徴量から「良性(1)か悪性(0)か」を予測します。
以下のサイトを参考にさせていただきました。とてもわかりやすくサンプルデータがまとめられております。
# Part2:データ準備
# 乳がんのデータセット読み込み
data = load_breast_cancer()
# 目的変数の抽出
y_all = pd.DataFrame(data["target"],columns=["target"])
y_all.head()
# 説明変数の抽出
X_all = pd.DataFrame(data["data"],columns=data["feature_names"])
X_all.head()
# 7:3の割合で学習用データと検証用データを分割
X_train, X_test, y_train, y_test = train_test_split(X_all, y_all, test_size=0.3, random_state=0)
# 学習用データと検証用データの変数を結合
train_data = pd.concat([y_train,X_train],axis=1,sort=False)
test_data = pd.concat([y_test,X_test],axis=1,sort=False)
# バックアップとしてS3の指定したバケットにデータをアップロード
filename1 = 'train_data.csv'
filename2 = 'test_data.csv'
train_data.to_csv(filename1, index=False, header=False)
test_data.to_csv(filename2, index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket).Object(os.path.join(prefix+'/', f'train/{filename1}')).upload_file(filename1)
boto3.Session().resource('s3').Bucket(bucket).Object(os.path.join(prefix+'/', f'test/{filename2}')).upload_file(filename2)
後半では、このデータセットを使ってSageMaker上で学習とエンドポイント作成を行いました。
あわせて御覧ください。