概要
AWS公式のチュートリアルで、Amazon SageMakerを使った機械学習モデルの構築、トレーニング、デプロイまでの一連の作業を体験し、
などのメリットが理解できた。
背景と目的
最近、AWS認定 機械学習スペシャリストを受験しようと考えている。いろいろ参考資料を読み進めるうちに、AWSの機械学習系サービスの現物に触れてみたいと思った。SageMakerを使ってモデルの構築、トレーニング、デプロイなど一連の作業をどのように行えばよいかを体験してみる。
詳細
1. 実施内容
Amazon SageMaker と XGBoost ML アルゴリズムを使用して機械学習 (ML) モデルを構築、トレーニング、デプロイする方法を学習
このチュートリアルでは、以下の方法を学びます。
とある。ひとまず、モデルを構築、トレーニング、デプロイに至るまでの一連の作業を体験できそうだ。
2. 参考資料
3. 作業
以下、チュートリアルの作業手順に沿って進めるだけなので難しいところはないが、気になった部分だけメモる。
3.1 Amazon SageMaker ノートブックインスタンスの作成
3.1.1 ノートブックインスタンス設定
- Notebook instance type
- 一番安いml.t2.medium。1時間当たり$0.0608(Tokyo)。
- Elastic Inference
- プラットフォーム識別子: Amazon Linux2
- 追加設定
- ライフサイクル設定: 設定なし
- ボリュームサイズ: 5GB
- IMDSの最小バージョン: 2
3.1.2 アクセス許可と暗号化
- IAMロール
- 学習に使用するデータはS3に置くので、S3へのアクセス可能なIAMロールをSageMakerノートブックインスタンスに割り当てている。
3.1.3 残りの設定
デフォルトのまま。
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にあるデータを読み取ってその形式にするためのクラスのようだ。
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を使った機械学習モデルの構築、トレーニング、デプロイまでの一連の作業を体験できたので、自分の関心のあるテーマで実践するのに活かしていきたい。