工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

SageMakerチュートリアルをやってSageMakerを理解する

概要

AWS公式のチュートリアルで、Amazon SageMakerを使った機械学習モデルの構築、トレーニング、デプロイまでの一連の作業を体験し、

  • SageMakerSDKを用いることで統一されたインターフェースでコーディングできること
  • レーニング先、デプロイ先インスタンスをいちいち自分で用意せず済むこと

などのメリットが理解できた。



背景と目的

最近、AWS認定 機械学習スペシャリストを受験しようと考えている。いろいろ参考資料を読み進めるうちに、AWS機械学習系サービスの現物に触れてみたいと思った。SageMakerを使ってモデルの構築、トレーニング、デプロイなど一連の作業をどのように行えばよいかを体験してみる。



詳細

1. 実施内容

AWS公式のチュートリアルをやってみることにした。

aws.amazon.com

Amazon SageMaker と XGBoost ML アルゴリズムを使用して機械学習 (ML) モデルを構築、トレーニング、デプロイする方法を学習

このチュートリアルでは、以下の方法を学びます。

  1. SageMaker ノートブックインスタンスを作成する
  2. データの準備
  3. データから学習するためのモデルのトレーニン
  4. モデルのデプロイ
  5. ML モデルのパフォーマンスの評価

とある。ひとまず、モデルを構築、トレーニング、デプロイに至るまでの一連の作業を体験できそうだ。


2. 参考資料


3. 作業

以下、チュートリアルの作業手順に沿って進めるだけなので難しいところはないが、気になった部分だけメモる。

3.1 Amazon SageMaker ノートブックインスタンスの作成

3.1.1 ノートブックインスタンス設定

  • Notebook instance type
    • 一番安いml.t2.medium。1時間当たり$0.0608(Tokyo)。
  • Elastic Inference
  • プラットフォーム識別子: Amazon Linux2
    • OSのバージョンの設定のようだ。こちらによると、2022年12月現在Amazon Linux 1はサポートが徐々に終了しつつあってAmazon Linux2が推奨される状況のようだ。AL2では、Python2やChainerをサポートしないとのこと。ここでは、もちろんAmazon Linux 2を用いる。
  • 追加設定
    • ライフサイクル設定: 設定なし
    • ボリュームサイズ: 5GB
    • IMDSの最小バージョン: 2

3.1.2 アクセス許可と暗号化

  • IAMロール
    • 学習に使用するデータはS3に置くので、S3へのアクセス可能なIAMロールをSageMakerノートブックインスタンスに割り当てている。

3.1.3 残りの設定

デフォルトのまま。

  • ネットワーク: 非VPC
    • インスタンスからインターネットへのアクセスができるとの記述がある


3.2 データの準備

3.2.1 Jupyterノートブックの新規作成

conda_python3を選択した。Python3が使える環境。

3.2.2 ライブラリのインポート、XGBoostコンテナのダウンロード

実行したところ、get_execution_roleのところでエラーが出た。

---------------------------------------------------------------------------
UnknownServiceError                       Traceback (most recent call last)
/tmp/ipykernel_8360/3331419634.py in <cell line: 13>()
     11 
     12 # Define IAM role
---> 13 role = get_execution_role()
     14 prefix = 'sagemaker/DEMO-xgboost-dm'
     15 my_region = boto3.session.Session().region_name # set the region of the instance
:
以下省略
:
UnknownServiceError: Unknown service: 'sagemaker-metrics'. Valid service names are: 

知らないサービスということで、sagemaker SDKが古かったりするのか?と思い、

!pip install --upgrade sagemaker

を実行し、バージョンの整合性で警告が出たりはしたがとりあえずv2.126.0にアップグレードできた。(conda_python3を選んでいるのでcondaで入れるべき?)Jupyterのカーネルを再起動し、sagemakerのバージョンが変わったことを確認して再度セルを実行してみたところ、OKだった!

v2.125.0は、sagemaker-metricsがUnknownServiceErrorになってしまうバグがあるのかも?

3.2.3 S3へのデータ格納

このセルを実行することで、インスタンスと同じリージョンにバケットが作成される。

3.2.4 SageMakerインスタンスにデータをS3からダウンロード

AWSがこのチュートリアル用に用意しているCSVファイルデータをダウンロードして、pandasのDataFrameに読み取る

3.2.5 トレーニングデータの作成

レーニングデータとテストデータに7:3で分割する。


3.3 ML モデルをトレーニングする

3.3.1 トレーニングデータをCSVにしてS3にアップロードしてさらにロード

3.2.5で分割されたトレーニングデータの方をCSVに戻してS3にアップロードしている。そして、それをさらにsagemaker.inputs.TrainingInputという形式でロードしている。sagemaker.inputs.TrainingInputは、sagemakerのトレーニングジョブで使用される入力データ形式が定められており、S3にあるデータを読み取ってその形式にするためのクラスのようだ。

sagemaker.readthedocs.io

3.3.2 モデルの定義、ハイパーパラメータ設定

ロールARNは文字列で指定した。インスタンスタイプは、学習に用いるインスタンスの指定。作業中のノートブックインスタンスとは別。

xgb = sagemaker.estimator.Estimator(
    xgboost_container,
    "ロールのARNを直打ち", 
    instance_count=1, 
    instance_type='ml.m4.xlarge',
    output_path='s3://{}/{}/output'.format(bucket_name, prefix),
    sagemaker_session=sess
)

3.3.3 学習

レーニング用のインスタンスの準備などで、実際にトレーニングが開始するまでに数分かかる。 損失が下がっていく。トレーニング自体は1分程度で終了。今回の場合、トレーニングより圧倒的にインスタンスの準備の方が時間がかかった。


3.4 モデルのデプロイ

3.4.1 デプロイ

コード1行でデプロイできる。インスタンスの準備も何もいらない。非常に楽だ。

3.4.2 予測

テスト用データを先ほどデプロイした予測器に突っ込んで予測させる。CSVSerializerという形式を予測器に割り当てて入力データを処理させる。


3.5 モデルの性能評価

トータルでは89%の精度。この分野の知識がないのでよくわからないが、圧倒的に多い"申し込みしない人"を9割予測できていて、誤判定の数が全体に対して少ないから一応目的は達成できているということなのか?まあ、これはチュートリアルなので踏み込んでもしょうがない。とにかく、混同行列で評価してパッと結果が見られるということ。

Overall Classification Rate: 89.5%

Predicted      No Purchase    Purchase
Observed
No Purchase    90% (10769)    37% (167)
Purchase        10% (1133)     63% (288) 


3.6 クリーンアップ

デプロイ先とJupyterノートブックインスタンスチュートリアルが終わったら使わないので、しっかり片づける。片づけないと無駄にお金を取られる。



まとめと今後の課題

AWS公式のチュートリアルで、Amazon SageMakerを使った機械学習モデルの構築、トレーニング、デプロイまでの一連の作業を体験できたので、自分の関心のあるテーマで実践するのに活かしていきたい。