Amazon SageMaker Examplesを読んでみた 〜End To End ML Lifecycle & Prepare Data編〜

この記事は[UMITRON Advent Calendar 2024](https://adventar.org/calendars/9995) 4日目の記事です

---

# まえがき

ウミトロンでは、Amazon SageMakerを活用して画像認識サービスを構築しています。
私自身、SageMaker の利用経験はおろか、プロダクト開発そのものの経験が乏しい状態でウミトロンに入社しました。そのため、当初は手探りでの実装が続き、試行錯誤の日々を送ってきました。
それから 3 年がたち、SageMaker をはじめとする AWS サービスや、機械学習（ML）プロジェクトのライフサイクル各ステップにおける必要な機能について、少しずつ理解が深まってきたと感じています。
一方で、これまでの取り組みを振り返ると、最適なサービス選択や実装を十分に行えていなかったと気づかされることも増えてきました。
このような背景から、今一度 SageMaker を体系的に学び直し、自信を持って迅速かつ適切に開発を進められるスキルを身に付けたいと思うようになりました。



そこで今年のアドベントカレンダーでは、SageMakerに関する機能を幅広く理解するために、[公式のサンプルノートブック](https://github.com/aws/amazon-sagemaker-examples/tree/default)を読み、それらの内容をまとめることにしました。
複数あるカテゴリのうち、End-to-End ML Lifecycle、Prepare Data、Deploy and Monitor、Build and Train Models、MLOpsについてまとめます。
また、それらの中でも画像認識に関連がありそうなものかつ基本的な機能に関するものをピックアップし、それらの概要と、Python SDKやboto3による主要なAPI呼び出し、（あれば）所感をまとめます。
API呼び出しは、アルゴリズム開発の根幹に関わる以下5カテゴリに分類しています。

1. **インフラ管理** - エンドポイントや学習ジョブなどのリソース設定
2. **データ準備** - データの読み込みや前処理
3. **学習と推論** - モデルの学習と推論ワークフローの管理
4. **パイプライン構築** - 自動化とワークフローの統合
5. **監視とトラッキング** - モデル監視やデバッグのユーティリティ

これは私自身の備忘録としての役割が大きいですが、同じように SageMaker 初心者で「どのような機能が存在し、どう活用できるのか」を俯瞰したい方の一助となれば幸いです。

本日は、End-to-End ML LifecycleとPrepare Dataについてまとめます（解説部分は簡潔に記述するため断定調です）。
明日以降、本アドベントカレンダーで残りのカテゴリについてもまとめる予定です。

- 12月5日：[Deploy and Monitor編](https://qiita.com/hosonot/items/e089f0ecb4ee10737cea)
- 12月13日：[Build and Train Models & MLOps編](https://qiita.com/hosonot/items/33a1f4ab1f581ca5727c)

# **End To End ML Lifecycle**

SageMaker Autopilotを使い、MLモデルの一連の作業を実施するサンプル群

3つのサンプルがあるが、大まかな流れはどれも同じなのでCustomer Churn Prediction with Amazon SageMaker Autopilotのみについて記す

## [Customer Churn Prediction with Amazon SageMaker Autopilot](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20%20end_to_end_ml_lifecycle/sm-autopilot_customer_churn.ipynb)
    
### 概要
    
 - SageMaker Autopilotを使ってchurn（顧客の離脱）を予測
 - データと予測したいもののみをAutopilotに渡し、推定モデルを自動構築する
 - 構築したモデルを[リアルタイム推論](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/realtime-endpoints.html)としてデプロイ
    
### 主要なAPI呼び出し

| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| 学習と推論 | SageMaker.Client.create_auto_ml_job | Autopilotジョブを作成（現在は[v2](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker/client/create_auto_ml_job_v2.html)の使用が推奨されている） |
| 学習と推論 | SageMaker.Client.describe_auto_ml_job | Autopilotジョブの状態を取得（現在は[v2](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker/client/describe_auto_ml_job_v2.html)の使用が推奨されている） |
| インフラ管理 | SageMaker.Client.create_model | 推論用のモデルを作成 |
| インフラ管理 | SageMaker.Client.create_endpoint_config | 推論用のエンドポイント設定を作成 |
| インフラ管理 | SageMaker.Client.create_endpoint | 推論用のエンドポイントを作成 |
| 学習と推論 | sagemaker.predictor.Predictor.predict | エンドポイントに推論をリクエスト（SageMaker.Client.invoke_endpointでも同様のことができる） |
    
### 所感
    
- SageMaker Autopilotは大部分が自動化された強力なツールだが、テーブルデータしかサポートされていないので画像認識で使われる機会は少なそう
    - 特徴抽出器 + 分類器 or 回帰という構成を取るなら選択肢になるかも
    - 分類や回帰のためのアルゴリズムは指定もできる（[選択できるアルゴリズム](https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html)）
- 推論にsagemaker SDKのsagemaker.predictor.Predictorはバイナリデータの送信がサポートされていないので、画像データのバイナリデータを使う場合は、boto3のSageMaker.Client.invoke_endpointを使うことになりそう

# Prepare Data

学習データを準備するためのサンプル群。
Feature Storeへのデータ登録や、Human-in-the-Loopによるアノテーションの作成、アノテーション結果の解析や修正方法等が解説されている。

画像処理との関連が薄いものや、分散処理に関するもの等は対象外とした。この理由でSageMaker Data Wranglerについても、サンプルではテーブルデータの分析のみだったので調査していないが、[画像データのdata augmentationも可能](https://aws.amazon.com/jp/about-aws/whats-new/2023/05/amazon-sagemaker-data-wrangler-image-data-preparation/)らしいのでそちらは別途調査したいと思った

## [Amazon SageMaker Feature Store: Introduction to Feature Store](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20prepare_data/sm-feature_store_introduction/sm-feature_store_introduction.ipynb)
    
### 概要
    
- テーブルデータをSageMaker Feature Storeに登録する
- テーブルデータをメタデータとともに、論理グループであるfeature groupに登録する
    
### 主要なAPI呼び出し
    
| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| データ準備 | sagemaker.feature_store.feature_group.FeatureGroup.load_feature_definitions | テーブルデータからfeature groupのデータ型等の構造を取得 |
| データ準備 | sagemaker.feature_store.feature_group.FeatureGroup.create | Feature groupを作成 |
| データ準備 | sagemaker.feature_store.feature_group.FeatureGroup.update_feature_metadata | メタデータを作成/更新 |
| データ準備 | sagemaker.feature_store.feature_group.FeatureGroup.ingest | データをfeature groupに登録 |
    
### 所感
    
- そもそもfeature storeとは何かということについては、[このサイト](https://mlops.community/learn/feature-store/)が参考になった
- 画像認識においては特に以下のような場合にfeature storeは役立ちそうだと感じた
  - 特徴量抽出 + 近似最近傍探索といった検索ベースのアルゴリズムを採用する場合
  - 画像と共に多くの属性情報が取得でき、それらの管理がデータセット作成に重要な場合
- 上記のような場合でなくとも、単に画像の取得日時や場所を管理するためにも使えそうだが、個人的にはオーバースペックだと感じた

## [Create an Active Learning Workflow using Amazon SageMaker Ground Truth](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20prepare_data/sm-ground_truth_active_learning_workflow_bring_your_own_model/sm-ground_truth_active_learning_workflow_bring_your_own_model.ipynb)
    
### 概要
    
- ノートブックは[この手順](https://aws.amazon.com/jp/blogs/machine-learning/bring-your-own-model-for-amazon-sagemaker-labeling-workflows-with-active-learning/)の一部
- テキスト分類器を [UCI News Dataset](https://archive.ics.uci.edu/ml/datasets/News+Aggregator)でアクティブラーニング
- 部分的にラベル付けされたデータセットに対して、以下の手順で学習を繰り返す
    1. ラベル付きデータで分類器を学習
    2. 学習した分類器でラベルが付いていないデータを分類
    3. 信頼度が高いものは分類結果を正解ラベルとして登録、信頼度が低いものの一部をSageMaker Ground Truthで人手でラベルリング
    4. ラベルがついていないデータが残っていたら1. に戻る
    5. ラベルがついていないデータがなくなったら終了
- 上記をAWS Step Functionsで作成
- ノートブックの役割は初期データの作成、SageMaker Ground Truthの設定json作成、独自アルゴリズムイメージのECRへのプッシュ
    
### 主要なAPI呼び出し
    
| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| 学習と推論 | sagemaker.estimator.Estimator.fit | モデルの学習 |
    
### 所感
    
- 手順解説＋アルゴリズムの詳細に依存する部分をノートブックにし、その他の枠組みをpythonにするという分割方法は参考になった
- 実際にアルゴリズムを運用しながらアクティブラーニングをする場合、運用しながら蓄積した信頼度を参照するなど、本番環境との連携方法をも検討する必要があると感じた
## [Understanding Annotation Consolidation: A SageMaker Ground Truth Demonstration for Image Classification](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20prepare_data/sm-ground_truth_annotation_consolidation_image_classification/sm-ground_truth_annotation_consolidation_image_classification.ipynb)
    
### 概要
    
- SageMaker Ground Truthで複数のアノテータのアノテーションを統合するアルゴリズムの解説
    - ここで扱われているのはマルチクラスアノテーションの統合方法だが、その他のアノテーションがどのように統合されるかは[ここ](https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html)に記載されている
- Modified Dawid-Skene (MDS)という、EMアルゴリズムに基づいてノイズに頑健にアノテーションを統合するアルゴリズムが使われている
- このノートブックでは、MDSが単純な多数決によるアノテーション統合よりも優れていることをデモンストレーションしている
    
### 主要なAPI呼び出し
    
なし

### 所感
- アノテーションを統合する仕組みはSageMaker Ground Truthに組み込まれているので自分で記述する必要はないが、manifestファイルをプロットする部分のコードは、アノテーション結果の分析に使えるかもしれない

## [From Unlabeled Data to a Deployed Machine Learning Model: A SageMaker Ground Truth Demonstration for Object Detection](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20prepare_data/sm-ground_truth_object_detection_example/sm-ground_truth_object_detection_example.ipynb)
    
### 概要
    
- 物体検出器の学習データをSageMaker Ground Truthのアクティブラーニングで作成する
     - 対応しているアノテーションの種類であれば、アクティブラーニングによる自動アノテーションができる（[参考](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/sms-automated-labeling.html)）
- 自動アノテーションの実行過程の状況（自動アノテーション精度や自動アノテーションされた数等）とアノテーション結果を分析する
- 作成されたデータで物体検出器を学習
- バッチ変換で物体検出器を検証し、リアルタイム推論としてデプロイ
    
### 主要なAPI呼び出し
    
| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| インフラ管理 | SageMaker.Client.create_labeling_job | SageMaker Ground Truthのラベリングジョブを作成。LabelingJobAlgorithmsConfigを設定すると自動アノテーションが有効になる |
| データ準備 | SageMaker.Client.describe_labeling_job | ラベリングジョブの状態を取得する |
| インフラ管理 | sagemaker.amazon.amazon_estimator.get_image_uri | 組み込みアルゴリズムのイメージURIを取得。現在はsagemaker.image_uris.retrieve()の利用が推奨されている |
| 学習と推論 | SageMaker.Client.create_training_job | トレーニングジョブを作成 |
| インフラ管理 | SageMaker.Client.create_model | 推論用のモデルを作成 |
| インフラ管理 | SageMaker.Client.create_transform_job | バッチ変換ジョブを作成 |
| インフラ管理 | SageMaker.Client.create_endpoint_config | 推論用のエンドポイント設定を作成 |
| インフラ管理 | SageMaker.Client.create_endpoint | 推論用のエンドポイントを作成 |
| 学習と推論 | SageMaker.Client.invoke_endpoint | エンドポイントに推論をリクエスト |
    
### 所感
    
- アノテーション結果の分析が多岐に渡っており参考になった。大規模なデータセットを構築する場合はさまざまな切り口でどのようなデータのアノテーションの信頼度が低いのかを定量的に把握することで問題を早期に発見できるのかもしれないと感じた
- 自動アノテーションを使わない場合も、組み込みアルゴリズムを使った物体検出の学習からデプロイまでの流れをまとめた良い例だと感じた

## [Amazon Augmented AI(A2I) Integrated with AWS Marketplace ML Models](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20prepare_data/sm-marketplace_augmented_ai_with_marketplace_ml_models/sm-marketplace_augmented_ai_with_marketplace_ml_models.ipynb)
    
### 概要
    
- SagmeMaker A2I（Amazon Augmented AI）で物体検出結果を人間によってレビューする枠組みを作成
    - 確信度が低いもののみ人間による確認をする
- 物体検出器のモデルは[AWS Marketplace ML model](https://aws.amazon.com/marketplace/solutions/machine-learning/pre-trained-models)から取得する
    
### 主要なAPI呼び出し
    
| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| パイプライン構築 | SageMaker.Client.create_flow_definition | SageMaker A2Iでヒューマンレビューを設定 |
| パイプライン構築 | SageMaker.Client.describe_flow_definition | 設定したヒューマンレビューの内容を確認 |
| インフラ管理 | sagemaker.ModelPackage.deploy | AWS Marketplace ML modelのエンドポイントを作成。ノートブックでは物体検出器をリアルタイムインスタンスでデプロイしている |
| 学習と推論 | SageMaker.Client.invoke_endpoint | エンドポイントに推論をリクエスト |
| パイプライン構築 | SageMaker.Client.start_human_loop | ヒューマンレビューが開始する（タスクの割当てとレビュー結果の保存が実行される） |
| パイプライン構築 | SageMaker.Client.list_workteams | レビューアの一覧を取得。ノートブックではレビュー用UIのURLを取得している |
| パイプライン構築 | SageMaker.Client.describe_human_loop | ヒューマンレビューの状態を取得 |

 ## [Chaining using Ground Truth Streaming Labeling Jobs](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20prepare_data/sm-ground_truth_chained_streaming_labeling_job.ipynb)
    
### 概要
    
- SageMaker Ground Truthのストリーミングラベリングジョブを作成する
    - ストリーミングラベリングジョブ：リアルタイムにデータを追加できる。手動で停止されるか十日間新規データ追加がなくなるまで続く
- ２つのストリーミングジョブをチェーンさせる
    - １つ目のジョブで矩形のアノテーションをし、２つ目のジョブでその矩形を調整する
    
### 主要なAPI呼び出し
    
| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| インフラ管理 | SageMaker.Client.create_labeling_job | SageMaker Ground Truthのラベリングジョブを作成。 ”InputConfig” → “DataSource” → “SnsDataSource”を設定するとストリーミングジョブになる |
| インフラ管理 | SageMaker.Client.describe_labeling_job | ラベリングジョブの状態を取得する |
| インフラ管理 | SageMaker.Client.stop_labeling_job | ラベリングジョブを停止する |
    
### 所感
    
- ストリーミングジョブへのデータ追加はAmazon SNSで簡単にできるので、例えば、本番環境での推定結果のうち信頼度が低いものを逐次ラベリングジョブに追加することでアクティブラーニングができるようになると思った
- SNSトピックへの通知をpython(boto3)で行っているが、S3のイベント通知機能やEventBridgeを使ってもいいかもしれないと感じた
- 今回の例では２つのラベリングジョブが矩形の作成用ジョブと修正用ジョブという役割だったが、複数人でアノテーションした場合に[うまくマージしてくれる機能](https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html)があるので、Aさんが作成、Bさんが調整というようにジョブをチェーンさせるのは合理的じゃない場合がある気がした
    - 例えば、Bさんがアノテーションのプロフェッショナルだが、Bさんの負荷を軽減したいという場合は上記のような分担は合理的かもしれない
    - チェーンの便利な使い方は開発者ガイドで紹介されていた：https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/sms-reusing-data.html

 ## [Labeling Adjustment Job Adaptation](https://github.com/aws/amazon-sagemaker-examples/blob/default/%20%20%20%20%20%20%20prepare_data/sm-ground_truth_labeling_adjustment_job_adaptation.ipynb)
    
### 概要
    
- SageMaker Ground Truthのアノテーションジョブで作成されたmanifestファイルから特定のラベルが削除されたmanifestファイルを生成する
- 不要なラベルが削除されたmanifestファイルを修正用アノテーションジョブの入力にすることを想定している
    
### 主要なAPI呼び出し
    
| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| インフラ管理 | SageMaker.Client.describe_labeling_job | ラベリングジョブの状態を取得する |
    
### 所感
    
- 他のサンプルに比べ複雑なことはしていないが、manifestファイルの解析が細かく関数定義されいるので、他の目的でも使いまわせそうな部分が多いかもと感じた

---
ウミトロンは、「持続可能な水産養殖を地球に実装する」というミッション実現に向けて、日々プロダクト開発・展開にチーム一丸となって邁進しています。
ウミトロンのニュースや活動状況を各種SNSで配信していますので、ぜひチェックいただき、来年も応援よろしくお願いします！
Facebook https://www.facebook.com/umitronaqtech/
X https://x.com/umitron
Instagram https://www.instagram.com/umitron.aqtech/
Linkedin https://www.linkedin.com/company/umitron