Amazon Web Services ブログ

Amazon SageMaker Processing – 完全マネージド型のデータ処理とモデル評価

本日、フルマネージドインフラストラクチャで前処理、後処理、およびモデル評価のワークロードを簡単に実行できる、Amazon SageMaker の新機能、Amazon SageMaker Processing をリリースいたしました。

高精度な機械学習 (ML) モデルをトレーニングするにはさまざまな手順を踏む必要がありますが、中でもデータセットの前処理が最も重要となるでしょう。たとえば:

  • 使用中の ML アルゴリズムに合う入力形式にデータセットを変換する、
  • 既存の特徴をより表現力のある表現 (one-hot エンコーディングカテゴリ別特徴など) に変換する、
  • 数値特徴を再スケーリングまたは正規化する、
  • 高レベル特徴量エンジニアリングを行う (例: 住所を GPS 座標に置き換える)、
  • 自然言語処理アプリケーションのテキストをクリーニングし、トークン分割する、
  • などなど!

これらのタスクは、(とても大変な) データセットに対する特注スクリプトの実行と、後でトレーニングジョブで使用する処理済みバージョンの保存を伴います。ご想像のとおり、それらを手動で実行したり、オートメーションツールを構築およびスケールしたりする必要があることを考えると、ML チームは気が重くなります。後処理ジョブ (フィルタリングや照合など) やモデル評価ジョブ (さまざまなテストセットに対するモデルのスコアリング) についても同じことが言えます。

この問題を解決するために、私たちは Amazon SageMaker Processing を構築しました。それでは、詳細を説明しましょう。

Amazon SageMaker Processing のご紹介
Amazon SageMaker Processing には、データサイエンティストと ML エンジニアが Amazon SageMaker で前処理、後処理、およびモデル評価ワークロードを簡単に実行できる新式の Python SDK が導入されています。

この SDK では SageMaker 組み込みの scikit-learn コンテナを使用します。scikit-learn はおそらくデータセット変換用の最も人気のあるライブラリです。

他に必要なものがある場合は、Docker イメージのどの仕様にも準拠せずに独自の Docker イメージを使用することもできます。これにより、SageMaker Processing で、 Amazon ECSAmazon Elastic Kubernetes Service といった AWS のコンテナサービスで、さらにはオンプレミスで、ご希望のどんなコードを実行する際にも最大限の柔軟性を得られます。

それでは、scikit-learn を使った簡単なデモを解説していきましょう。 その後、独自のコンテナを使用する場合についても簡単にご説明します。もちろん、Github には完全なサンプルが掲載されています。

組み込みの scikit-learn コンテナを使用してデータを前処理する
SageMaker Processing SDK を使用して scikit-learn ジョブを実行する方法は以下のとおりです。

最初に、使用する scikit-learn のバージョンとマネージド型インフラストラクチャの要件に合う SKLearnProcessor オブジェクトを作成します。

from sagemaker.sklearn.processing import SKLearnProcessor
sklearn_processor = SKLearnProcessor(framework_version='0.20.0',
                                     role=role,
                                     instance_count=1,
                                     instance_type='ml.m5.xlarge')

次に、前処理スクリプト (詳細はこの後すぐ) を以下のように実行します。

  • データセット (dataset.csv) は、宛先ディレクトリ (/input) のコンテナ内に自動的にコピーされます。必要に応じて、その他の入力を追加できます。
  • Python スクリプト (preprocessing.py) はここでデータセットを読み取ります。オプションで、コマンドライン引数をスクリプトに渡すことができます。
  • スクリプトはデータを前処理し、3 つに分割して、コンテナ内のファイルを /opt/ml/processing/output/train/opt/ml/processing/output/validation、および/opt/ml/processing/output/test に保存します。
  • ジョブが完了すると、すべての出力が S3 内のデフォルトの SageMaker バケットに自動的にコピーされます。
from sagemaker.processing import ProcessingInput, ProcessingOutput
sklearn_processor.run(
    code='preprocessing.py',
    # arguments = ['arg1', 'arg2'],
    inputs=[ProcessingInput(
        source='dataset.csv',
        destination='/opt/ml/processing/input')],
    outputs=[ProcessingOutput(source='/opt/ml/processing/output/train'),
        ProcessingOutput(source='/opt/ml/processing/output/validation'),
        ProcessingOutput(source='/opt/ml/processing/output/test')]
)

これで終わりです! 前処理スクリプトのスケルトンを確認して、まとめとしましょう。

import pandas as pd
from sklearn.model_selection import train_test_split
# Read data locally 
df = pd.read_csv('/opt/ml/processing/input/dataset.csv')
# Preprocess the data set
downsampled = apply_mad_data_science_skills(df)
# Split data set into training, validation, and test
train, test = train_test_split(downsampled, test_size=0.2)
train, validation = train_test_split(train, test_size=0.2)
# Create local output directories
try:
    os.makedirs('/opt/ml/processing/output/train')
    os.makedirs('/opt/ml/processing/output/validation')
    os.makedirs('/opt/ml/processing/output/test')
except:
    pass
# Save data locally
train.to_csv("/opt/ml/processing/output/train/train.csv")
validation.to_csv("/opt/ml/processing/output/validation/validation.csv")
test.to_csv("/opt/ml/processing/output/test/test.csv")
print('Finished running processing job')

S3 バケットをざっと見てみると、ファイルが正常に処理され、保存されていることが確認できます。これで、ファイルを直接 SageMaker トレーニングジョブの入力として使用できるようになりました。

$ aws s3 ls --recursive s3://sagemaker-us-west-2-123456789012/sagemaker-scikit-learn-2019-11-20-13-57-17-805/output
2019-11-20 15:03:22 19967 sagemaker-scikit-learn-2019-11-20-13-57-17-805/output/test.csv
2019-11-20 15:03:22 64998 sagemaker-scikit-learn-2019-11-20-13-57-17-805/output/train.csv
2019-11-20 15:03:22 18058 sagemaker-scikit-learn-2019-11-20-13-57-17-805/output/validation.csv

それでは、独自のコンテナを使用する場合はどうなるでしょうか?

独自のコンテナでデータを処理する
人気の高い spaCy ライブラリでテキストデータを前処理しようとしていると仮定します。必要なバニラ状態の Docker コンテナを定義する方法は以下のとおりです。

FROM python:3.7-slim-buster
# Install spaCy, pandas, and an english language model for spaCy.
RUN pip3 install spacy==2.2.2 && pip3 install pandas==0.25.3
RUN python3 -m spacy download en_core_web_md
# Make sure python doesn't buffer stdout so we get logs ASAP.
ENV PYTHONUNBUFFERED=TRUE
ENTRYPOINT ["python3"]

次に、Docker コンテナを構築してローカルでテストし、当社のマネージド型 Docker レジストリサービスである Amazon Elastic Container Registry にプッシュします。

次のステップとして、ScriptProcessor オブジェクトを使用して処理ジョブを設定し、構築およびプッシュ済みのコンテナの名前を渡します。

from sagemaker.processing import ScriptProcessor
script_processor = ScriptProcessor(image_uri='123456789012.dkr.ecr.us-west-2.amazonaws.com/sagemaker-spacy-container:latest',
                role=role,
                instance_count=1,
                instance_type='ml.m5.xlarge')

最後に、前の例と同様にジョブを実行します。

script_processor.run(code='spacy_script.py',
    inputs=[ProcessingInput(
        source='dataset.csv',
        destination='/opt/ml/processing/input_data')],
    outputs=[ProcessingOutput(source='/opt/ml/processing/processed_data')],
    arguments=['tokenizer', 'lemmatizer', 'pos-tagger']
)

残りのプロセスは上記とまったく同じです。コンテナ内の入力をコピーし、コンテナから S3 に出力をコピーします。

実にシンプルだと思いませんか? 繰り返しますが、ここでは前処理に注目しましたものの、後処理とモデル評価でも同様のジョブを実行できます。Github にある例もぜひ確認しておいてください。

今すぐ利用可能!
Amazon SageMaker Processing は、Amazon SageMaker が利用可能なすべての商用リージョンで今すぐ利用できます。

AWS では皆さんからのフィードバックをお待ちしています。Amazon SageMakerAWS フォーラム、または通常の AWS サポート連絡先からご意見をお寄せください。

Julien