LoginSignup
2
0

Sagemakerリソースを使ったMLパイプライン構築【2/3】

Last updated at Posted at 2023-04-07

はじめに

アドテク業界のインフラエンジニアとして、機械学習基盤をお世話をしている中で、アーキテクチャ改善を提案したので、せっかくなのでその内容を2回に分けて紹介したいと思います。(第一回の記事はこちら)

今回は使ったサービスについて、概要や使い方、APIまわりをまとめていきたいと思います。

アーキテクチャ

下記、MLPipeline構築の部分のみ切り取ったアーキテクチャです。
ここでは、今回採用したサービスの概要や採用理由などを紹介していきます。

architecture_new_qiita.png

MWAA (Amazon Managed Workflows for Apache Airflow)

  • ワークフロー管理システムであるApatch AirFlowを、AWSマネジメントサービスとして提供したもの
  • 様々なワークフロー管理システムがあるが、既存環境(Airflow)を流用できる&マネージド化していくというところで、MWAAを採用
  • MLOpsレベル2->3に移行する際は、Sagemaker Pipelineを採用し、Sagemakerですべて完結させたい (学習コストがかかる、コードの大幅な書き換えが必要などあるが)

Sagemaker Processing Job

  • SageMaker APIにより、インスタンス上で指定のDocker Imageからコンテナを起動し、処理を実行してくれるサービス
  • データ前処理、後処理、特徴量エンジニアリングといったデータ処理関連のジョブをSageMaker上で行うことが想定されている
  • ジョブ実行方法を合わせさえすれば、学習、評価、推論など、元々想定されているワークフロー以外で使うことも可能
  • 今回の構成では、商用環境・実験環境のデータ前処理のワークフローで使用している

Sagemaker Training Job

  • SageMaker APIにより、インスタンス上で指定のDocker Imageからコンテナを起動し、処理を実行してくれるサービス
  • (Processing Jobとは違い) 実行時にInput(学習データ等)/Output(モデル、メトリック等)を指定することができる
  • ジョブの流れのイメージとしては、S3からInputデータを読み込む→ 処理実行→ OutputデータをS3に書き込むという感じ
  • 主に学習をSageMaker上で行うことが想定されている
  • ジョブ実行方法を合わせさえすれば、評価や推論など、元々想定されているワークフロー以外で使うことも可能
  • 今回の構成では、商用環境・実験環境の学習・評価のワークフローで使用している

train_image.png

Sagemaker Studio

  • すべての機械学習開発ステップを実行するための専用ツールにアクセスできるウェブベースの統合開発環境
  • 下記、Studio上でできること具体例
    • Jupyter Notebookでのコードの記述と実行 (SageMaker Notebook)
    • MLワークフローの自動化 (SageMaker Pipelines)
    • モデルのバージョン管理 (Sagemaker Model Registry)
    • モデルのデプロイとモデルによる予測のパフォーマンスの監視 (SageMaker Model Monitor・SageMaker Clarify)
    • 学習の追跡・デバッグ (Sagemaker Experiment)
  • 今回の構成では、Sagemaker Studioのサービスの中で、下記を使用している
    • SageMaker Notebook: 実験作業環境
    • Sagemaker Experiment: 商用環境・実験環境の学習・評価の追跡・デバッグで使用している

Sagemaker Experiment

  • SageMaker Studio のツールの一つ
  • 反復的なモデル開発において、Inputデータ、アルゴリズム、パラメータ、環境設定、学習精度等を自動的に追跡、一元管理してくれる
  • ビジュアルインターフェイスで表示、分析、比較が可能
  • ビジュアルインターフェイスの内容を、Dataframe化することも可能

Sagemakerサービスの使い方

Sagemaker Training Jobで学習・評価する

Sagemaker Training Jobで学習・評価処理を実行したい場合、下記の2つの方法があります。

  • ①AWSが提供しているビルド済みDocker Imageを使う
  • ②独自のDocker Imageを使う

今回は既に(Argo上で動かしている)Docker Imageが存在しており、それを引き継ぐ形で構築をしたいため、②の方法を採用します。
独自のコンテナを、SageMakerで動作するように適合するために、sagemaker-training-toolkit というツールキットを使います

SageMaker Training Toolkit

SageMaker Training Toolkitは、予め作成した独自のDockerコンテナに追加することで、SageMakerと互換性を持たせて、Sagemakeモデル学習をすることができるライブラリです。
コンテナにSageMaker Training Toolkitを追加し、学習・評価処理を実行させるためには、下記を行う必要があります。

① sagemaker-training のインストール

下記のようにDockerfileに 記述することで、SageMaker Training Toolkitを追加することができます。
これにより、既存のDockerコンテナをSagemaker-containerとして動作させることができます。

RUN pip3 install sagemaker-training

② 専用ディレクトリ構成に沿った処理コードの配置

Sagemaker-containerでは、/opt/ml/ディレクトリが予約されており、このディレクトリ配下で処理が実行されます。
その中で、/opt/ml/code/配下にあるコードが、処理対象として認知されます。
そのため下記のように、処理コードを/opt/ml/code/配下にコピーするよう、Dockerfileに記述する必要があります。

COPY train.py /opt/ml/code/
Sagemaker-containerのディレクトリ構成

Sagemaker-containerのディレクトリ構成は、SageMaker APIでのジョブ呼び出し時に指定した各種パラメータと紐づいています。
(処理コードの修正をする段階に入ったときに、このディレクトリ構成の理解が重要になってきます)

/opt/ml/
├── input/
│    ├── config/
│    │    └── hyperparameters.json  # APIで定義されたハイパーパラメータがJsonファイル化され配置される
│    │
│    └── data/
│        ├── <channel_name>/ # channel_nameはInputデータのラベルのようなもの
│        │    └── <input data>  # APIで指定した学習データ(S3 prefix)がダウンロードされる
│        └── <channel_name>/
│             └── <model>  # APIで指定した'model_uri'(S3 prefix)がダウンロードされる
│
├── code/  # ここに配置されているコードが、学習コードとして認識され、実行される
│  
├── model/  # ジョブ完了後、ここに配置されている単一のモデルファイルがtarで圧縮され、APIで指定した'output_path'(S3 prefix)にアップロードされる
│
├── output/  # モデル以外のアーティファクトがここに配置され、ジョブ完了後にAPIで指定した'output_path'(S3 prefix)にアップロードされる
│
└── failure/  # ジョブ失敗時にログ等のOutputがここに配置され、ジョブ完了後にAPIで指定した'output_path'(S3 prefix)にアップロードされる

③ エントリポイントの定義

エントリポイントとは、(/opt/ml/code/ディレクトリ内のコードの中で)コンテナの起動時に実行するコードのことで、環境変数「SAGEMAKER_PROGRAM」で定義します。
下記のように、コンテナの起動時に実行するコードを、SAGEMAKER_PROGRAMとして定義するよう、Dockerfileに記述する必要があります。

ENV SAGEMAKER_PROGRAM main.py

必要に応じて、Sagemaker-containerの他の環境変数も、Dockerfileの記述により定義することもできます。

SageMaker API

学習・評価処理の呼び出しは、SageMaker Python SDKの、「sagemaker.estimator.Estimator」を使います。

流れとしては、まずestimator(SagemakerTrainingJobに引き渡す学習設定)を定義し、

estimator = sagemaker.estimator.Estimator(
    [引数1],
    [引数2],
    [引数3]
)

estimatorを元に、SagemakerTrainingJobを実行します。

estimator.fit()

今回、学習・評価のジョブ実行環境をSagemakerに移行したことで、旧構成(Argo)ではコード内で定義していた多くの学習に関するパラメータ(ハイパーパラメータや学習データ、環境変数など)を、SagemakerAPIでのジョブ呼び出し時に指定することができるようになりました。
これにより、モデル学習・評価の実験のしやすさという観点からも、改善されたと思います。

Sagemaker Processing Jobでデータ前処理をする

これはSagemaker Training Jobの使い方とかぶる部分が多いので、詳細は割愛します。

SageMaker API

データ前処理の呼び出しは、SageMaker Python SDKの、「sagemaker.processing.Processor」を使います。

Sagemaker Experimentで学習・評価の追跡をする

コンポーネント

  • experiment: runの集合体。
  • trial: runを束ねるもののようだが、古いコンポーネントっぽく、あまり意識する必要なし
  • run: 学習処理毎に、runが作成され、Input/Outputや各種パラメータを追跡してくれる

SageMaker Python SDK

SageMaker Python SDKの、「sagemaker.experiments.Run」を使います。

(実際の書き方は、今回は割愛します)
流れとしては、まずExperiment関連のパラメータを入れたRunインスタンスを作成し、

with Run(
    [引数1],
    [引数2],
    [引数3],
) as run:

その上で学習・評価処理用のSagemaker API(sagemaker.estimator.Estimator)を呼び出し、ジョブを実行します。

    estimator = sagemaker.estimator.Estimator(
        [引数1],
        [引数2],
        [引数3]
    )
    estimator.fit()

ジョブ実行開始とともに、RunインスタンスがAPI内で指定したパラメータを追跡し、完了後Experimentのビジュアルインターフェイスで表示、分析、比較することができます。
スクリーンショット 2023-12-09 163057.png

おわりに

Sagamaker APIですが、今回紹介したのはごく一部なので、他も色々試してよりよいMLPipelineを目指していきたいなと思いました。
Sagamakerをこれから導入してみたい方の参考になれば、うれしく思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0