Amazon Web Services ブログ

Amazon SageMaker Processing – フルマネージドなデータ加工とモデル評価

2019年12月3日 Amazon SageMaker の新しい機能であり、データの前処理や後処理、モデルの評価といったワークロードをフルマネージドなインフラストラクチャの上で簡単に実行する機能である、Amazon SageMaker Processing を発表できることを嬉しく思います。

精度の高い機械学習(ML)モデルを学習するためには、多くの異なるステップを必要としますが、以下のようなデータの前処理より重要なものはないでしょう。

  • 機械学習アルゴリズムが活用できる入力フォーマットへデータセットを変換
  • カテゴリカル特徴量のOne-Hot エンコーディングのような、既存の特徴量をさらに表現力の高い特徴量へ変換
  • 数値型特徴量のリスケールや平準化
  • 住所をGPSの座標に置き換えるような、高レベルな特徴量の作成
  • 自然言語処理を適用するための文章のクリーニングやトークン化

これらのタスクは、データセットに応じて異なるスクリプトを実行することになり、そして、後で学習の際に使われるための加工済データを保存します。あなたが想像する通り、機械学習チームにとって、これらを手作業で行ったり、自動化ツールを構築してスケールさせることは魅力的なな計画とは言えません。同様のことが後処理ジョブ(フィルタリングや照合など)やモデル評価ジョブ(異なるテスト用データセットに対するスコアリング)にも言えるかも知れません。

これらの課題を解決するために、 Amazon SageMaker Proscessing が開発されました。より詳細をご紹介させて下さい。

Amazon SageMaker Processing の紹介

Amazon SageMaker Processing はデータサイエンティストと機械学習エンジニアが前処理、後処理、モデル評価といったワークロードを Amazon SageMaker 上で簡単に行うための新しい Python SDK を導入します。

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

必要に応じて、特定の Docker イメージに制限されることなく、独自の Docker イメージをお使い頂くことが出来ます。これにより、最大限の柔軟性を提供し、SageMaker ProcessingAmazon ECSAmazon Elastic Kubernetes Servicesなどの AWS コンテナサービス、さらにはオンプレミスなどでコードの実行が可能になります。

まずは sickit-learn を使った簡単なデモはいかがでしょうか?その後、独自コンテナの使用について簡単に議論しようと思います。もちろん Github にある例をご確認頂くことも出来ます。

組み込み Scikit-Learn コンテナを用いたデータの前処理

scikit-learn ジョブを実行するためにどのように SageMaker Processing SDK が使われるのかを示します。
まず始めに、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 script(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 の学習ジョブの入力にそのまま使うことが出来ます。

<pre><code class="lang- bash">$ 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</code></pre><p> </p>

では、独自コンテナを使う場合はどうでしょうか?

独自コンテナを用いたデータの前処理

人気のライブラリである 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 Elasic 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 SageMaker の AWS フォーラム、または通常の AWS へのご連絡先からフィードバックをお寄せください。

− Julian

翻訳は Machine Learning SA の上総が担当しました。原文は、こちら