AWS再入門ブログリレー2022 Amazon SageMaker 編

2022.02.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、AWS事業本部コンサルティング部の森田です。

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の 13 日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2022 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。13 日目のテーマは『Amazon SageMaker』です。

Amazon SageMakerとは

Amazon SageMakerとは、機械学習モデルを作成・動作させるためのAWSフルマネージドサービスです。 以下は、AWSの公式ページの文章になります。

フルマネージドインフラストラクチャ、ツール、ワークフローを使用して、あらゆるユースケース向けの機械学習 (ML) モデルを構築、トレーニング、デプロイします。

私は、初めてみたとき、「!?」となったので、もう少しだけ掘り下げて解説していきます。

機械学習モデルとは


機械学習モデルとは、AIの核となる部分で、この部分が、画像認識や数値予測を決定しています。
なので、機械学習を行うためには、この機械学習モデルを作ることが必要不可欠です。
しかし、この機械学習モデルを作成するため・運用するためにはいくつかの問題が生じます。

機械学習モデルを作成するときに生じる問題

学習・開発環境の構築

機械学習モデルを作成するためには、多くの計算を行う必要があります。
この計算を素早く終えさせるために、マシンのリソース(GPU・CPUなど)を効率よく使用するようにライブラリの設定やドライバのインストールなど、様々な設定が必要となります。
しかも、ドライバ・ライブラリのバージョンによって依存関係もあるため、ただインストールだけでは動作しなかったりします。
また、複数人で開発を行う場合、その環境をセキュアに共有する必要もあり、開発環境を構築するにも一苦労です。

機械学習モデルを運用するときに生じる問題

継続的なデプロイ

機械学習モデルも、一般的なアプリケーションと同様にただ一度デプロイしたら終わりではなく、適切にモデルが機能しているかを監視する必要があります。
また、このときに期待した効果を発揮できていないと判断した場合は、迅速に適切なモデルをデプロイする必要もあります。
こちらも自前しようとすれば、とても大変そうですね。。。

改めて、Amazon SageMaker

機械学習モデルに関しての従来の問題をこのAmazon SageMakerでは解決し、実際のモデル開発部分に集中することができます。
Amazon SageMakerでは、多くの機能を提供していますが、今回は以下について説明していきます。

  • ラベリング ... SageMaker Ground Truth
  • 開発 ... SageMaker Studio, SageMaker Studio Lab
  • 学習 ... 分散学習, マネージドスポットトレーニング
  • モデル変換 ... SageMaker Neo
  • 推論 ... オートスケーリング, A/Bテスト, 推論パイプライン

ラベリング

SageMaker Ground Truth


機械学習モデルを作成する場合、ラベル(予測すべき値)が存在していない場合があります。
例えば、画像認識を行うケースを考えてみましょう。
画像を予め収集していたとしても、その画像が何として認識すれば良いかの部分(ラベル)は保存されていないので、作成する必要ができてきます。
この作成には、ラベルをつけるツールの準備やデータの数だけ作業を行う必要もあり、非常に手間がかかります。
SageMaker Ground Truthでは、このラベル付けを手助けするツールを提供しています。また、外部のベンダーに依頼する機能もあり、ラベリングの手間を減らすことができます。
また、AWS re:Invent 2021では、 Amazon SageMaker Ground Truth Plus を発表しました。
こちらは、バージニア北部での提供のみですが、ラベル付けの要件とデータを共有するだけで、機械学習タスクのトレーニングを受けたエキスパートが代わりにラベリングを行ってくれます。
よりラベリングの手間を排除し、高品質なラベリングを提供することが期待できるサービスとなっております。

開発

SageMaker Studio

SageMaker Studioは、「学習・開発環境の構築」の問題を解決するサービスです。
SageMaker Studioでは、学習・開発環境をコンソールから数クリックで、簡単に素早くセットアップが可能となっております。
さらに、コンピューティングリソースも好きなタイミングで増減させることができます。
作成したモデルについても、SageMaker Studio上からPython SDKを用いて簡単にデプロイまで行うことができます。

SageMaker Studio Lab

SageMaker Studioでは、利用するリソースに対して費用が発生しますが、SageMaker Studio Labでは、無料で機械学習を行うことができます。
詳しくは以下の記事で紹介しておりますので、ぜひご参照ください。

学習

分散学習

分散学習とは、単一のGPUに収まらないデータを小さいサイズに分割して、その分割したデータを複数のGPUを利用して並列処理を行います。
単一のGPUを利用するよりも、効率よく学習が行えるため、素早く学習を終えることができます。
通常、リソース間の調整や大幅なコードの修正などが必要ですが、SageMakerでは、既存のコードに対して僅かな修正を行うことで、あとは自動で分散学習を行ってくれます。

マネージドスポットトレーニング

マネージドスポットトレーニングでは、学習をオンデマンドインスタンスではなく、スポットインスタンスを使って自動的に学習を行います。
これに伴い、トレーニング費用を最大で 90% 削減できるとされています。
ここで気になるのが、「スポットインスタンスであれば、途中で中断しないのか?」というところですが、中断はしますが、中断後についても自動で復帰できるように作成されています。
こちらも、分散学習同様、僅かな修正を行うだけで良いです。

モデル変換

SageMaker Neo


SageMaker Neoでは、機械学習モデルをコンパイルすることで特定のデバイスに最適化を行い、より推論速度の高速化や使用リソースの削減が可能となります。
EC2、Ambarella、Apple、ARM、Intel、MediaTek、Nvidiaなど多くのデバイスに対応しています。

推論

オートスケーリング

デプロイしたエンドポイントに対して、オートスケーリングポリシーを設定することができます。
これにより、需要に応じて柔軟にリソースを利用し、コストダウンが見込めます。
設定できるメトリクスは以下の2つになっています。

  • 1インスタンスの分間の平均リクエスト数
  • カスタムメトリクス

スケールさせる最小及び、最大のインスタンス数、クールダウン期間の項目の設定も必要となります。

A/Bテスト

機械学習モデルも、一般のアプリケーション同様に、そのモデルが本番環境下で有用であるかを検証しなければなりません。
その際には、A/B テストとして複数のモデルに重み付けを行い、複数のモデルを1つのエンドポイントに紐づけることができます。

推論パイプライン

機械学習を行う際の多くは、入力されたデータに対して前処理を行う必要があります。
また、予測値についても一度処理を行わないと扱いづらいケースが多々あります。
このような場合には、推論パイプラインを利用することで、データの前処理、推論、データの後処理の順に処理を行わせることができます。
それぞれの工程をマイクローサービスのように扱うことができ、工程の再利用が見込めます。
詳しくは以下の記事で紹介しておりますので、ぜひご参照ください。

やってみる

では、実際にSageMakerを利用して、機械学習モデルの作成、デプロイ、推論までは行っていきます。

SageMaker Studioの起動

まずは、今回の実行環境であるSageMaker Studioを起動します。

今回は、高速セットアップを使用し、IAMロールを作成します。

ロール作成後、ドメインを作成します。
ドメインを作成することで、Studioの起動ができるようになります。

初回起動時は、少し時間がかかりますので、待つと以下のような画面に切り替わります。

学習用コードのセットアップ

今回使用するコードは、Git Hubにまとめてあるので、クローンして持ってきます。

$ git clone https://github.com/cH6noota/SageMakerSample.git

SageMakerSampleディレクトリ内に、train.ipynbファイルがあるので、こちらのコードを上から順に実行していきます。

データセットの作成

CIFAR-100と呼ばれるデータを使用します。
npy形式に変換し、boto3でS3にアップロードします。

# tensorflow のインストール
! conda install tensorflow -y 
import tensorflow as tf
# データの読み込み
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar100.load_data()
# 格納するディレクトリ作成
!mkdir data
# npy形式で保存
import numpy as np
np.save('data/train_data', x_train)
np.save('data/train_labels', y_train)

np.save('data/eval_data', x_test)
np.save('data/eval_labels', y_test)

import boto3

region = "ap-northeast-1"

bucket_name = "sagemaker-datasets-sample-hogefuga"

s3_client = boto3.client('s3',region_name = region)
location = {'LocationConstraint' : region}
s3_client.create_bucket(Bucket = bucket_name , CreateBucketConfiguration = location)

import glob
for filepath in glob.glob("./data/*.npy"):
    s3_client.upload_file(filepath, bucket_name, filepath.replace("./data/", ""))

モデルの定義・学習

モデルについては、main.pyで記述してあります。(今回は、Xceptionで転移学習を行ってます)
ノートブックからは、モデルの記述してあるファイル名、入力するパラメータやインスタンスタイプ、フレームワークのバージョンを指定し、fitで学習を行います。

from sagemaker.tensorflow import TensorFlow
cifar_estimator = TensorFlow(
    entry_point="main.py",
    role=role,
    instance_count=2,
    instance_type="ml.p3.2xlarge",
    framework_version="2.1.0",
    py_version="py3",
    metric_definitions=metric_definitions,
    enable_sagemaker_metrics=True,
    distribution={"parameter_server": {"enabled": True}},
    tags=[{"Key": "trial-desc", "Value": trial_desc}],
)

モデルのデプロイ

作成した機械学習モデルを推論エンドポイントにデプロイします。
デプロイは、たった1行で行えます。
エンドポイント名は、後ほどローカル環境で推論を行う際に使用しますので、メモしておきます。

predictor = cifar_estimator.deploy(initial_instance_count=1, instance_type="ml.p2.xlarge")
predictor.endpoint_name

Studioでの検証

実際にテストデータを3つ使用して、推論の結果を確認します。

predictions = predictor.predict(x_test[0:3])
print("予測された値:{}".format(CIFAR100_LABELS_LIST[np.argmax(predictions["predictions"][0])]) , 
          "正解の値:{}".format(CIFAR100_LABELS_LIST[y_test[0][0]]))
print("予測された値:{}".format(CIFAR100_LABELS_LIST[np.argmax(predictions["predictions"][1])]) , 
          "正解の値:{}".format(CIFAR100_LABELS_LIST[y_test[1][0]]))
print("予測された値:{}".format(CIFAR100_LABELS_LIST[np.argmax(predictions["predictions"][2])]) , 
          "正解の値:{}".format(CIFAR100_LABELS_LIST[y_test[2][0]]))

ローカル環境での検証

最後に、ローカル環境からエンドポイントにアクセスし、動作の確認を行います。

! pip install pillow -y
import json
import numpy as np
import boto3
import io
from PIL import Image
import IPython.display as display

runtime = boto3.Session().client(service_name='sagemaker-runtime')
endpoint = 'エンドポイント名'

def predict(file_name):
    # Load the image bytes
    f = open(file_name, 'rb').read()
    f = io.BytesIO(f)
    image_view = Image.open(f).convert('RGB')
    batch_size = 1
    image = np.asarray(image_view.resize((32, 32)))
    image = np.concatenate([image[np.newaxis, :, :]] * batch_size)
    body = json.dumps({"signature_name": "serving_default", "instances": image.tolist()})

    # Call your model for predicting which object appears in this image.
    response = runtime.invoke_endpoint(
        EndpointName=endpoint,
        ContentType='application/json', 
        Body=body
    )
    result = response['Body'].read()
    pred = json.loads(result)['predictions'][0]
    index = np.argmax(pred)
    display.display( image_view.resize((128, 128)) ) 
    print("{}%で{}です".format(int(pred[index]*100), CIFAR100_LABELS_LIST[index]))

import glob
for file_name in glob.glob("./sample/*"):
    predict(file_name)

ローカル環境での検証結果

検証結果は以下のようになりました。概ねうまく予測できていそうです。

最後に

Amazon SageMakerといっても、非常に多くの機能があり、今回ご紹介したのはほんの一部です。

また、2022年2月24日にAWS Innovate - AI/ML Edition が開催予定ですので、 ここで実際の機械学習サービスのユースケースをキャッチアップしてみてはいかがでしょうか。

以上、『AWS 再入門ブログリレー 2022』の 13 日目のエントリ『Amazon SageMaker』編でした。

来週 (2/21) はLimChaejeongさんの「Amazon S3」の予定です。お楽しみに!!

参考