Amazon SageMakerのsampleでどんなことができるのか見てみる

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

こんにちは、小澤です。

当エントリは「Machine Learning Advent Calendar 2017」の15日目のエントリです。

今回は、SVMのカーネル編をやる予定でしたが、re:Invent 2017で発表されたAmazon SageMakerがすでに利用可能になっているので、サンプルからどんなことができるのか見ていきたいと思います。

ノートブックの作成

SageMakerでは、機械学習の試行錯誤をするためにJupyter Notebookを作成することが可能です。

ノートブックを実行するためのインスタンスの作成に関する設定を行います。

IAMロールの作成では、新規作成を行うとデータやモデルを保持するためのS3バケットへのアクセスと、AmazonSageMakerFullAccess権限を持ったIAMロールが作成されます。

「ノートブックインスタンスの作成」を選択するとインスタンスが作成され、メニューの「ノートブックインスタンス」を選択すると一覧に作成したものが表示されます。

この画面で、ステータスが「InService」になれば利用可能な状態になります。

ノートブックを利用する

利用可能になっているノートブックインスタンスの「オープン」を選択することで、ノートブックが開きます。

通常のJupyter Notebookの画面が表示されるのがわかるかと思います。

SageMakerでは豊富なサンプルが用意されています。 今回はこの中から sample-notebooks > introduction_to_amazon_algorithms > linear_learner_mnist > linear_learner_mnist.ipynb を見てみましょう。

ノートブックを開くと最初にサンプルや利用するデータセットについての説明が記載されています。

ここでは、

  • 線形の分類器を作成する
  • データはmnist
  • 0-9の手書き数字が書かれた28x28のグレースケール画像

などの情報が書かれています。

処理内容を見ていきましょう。

まず最初に利用するIAMロールやS3に関する情報を設定しています。

<br />

となっている部分を利用するS3バケット名に変更して実行しています。 通常のJupyter Notebookなので、Ctrl-Enterでセルの実行ができます。

次に、データの取得を行っています。

次に、データの確認をしています。 データの確認は、機械学習を行うにあたってまず最初にやるべきことです。

ここでは、実際の画像データを表示してみています。

続いて、学習データの特徴量をnumpyのarrayに変換、正解ラベルをone-hotな形式に変換しています。 その後、SageMakerで扱う密なテンソルに変換しているようです。

続いて、

  • データをS3に出力
  • 学習モデルの出力先の設定

を行っています。

さて、いよいよもってSageMakerの仕組みを使って学習を行います。

SageMakerのEstimatorに関する設定を行って、fit関数で学習の処理を実行しています。 Estimatorに渡すパラメータは

  • 実行するリージョン
  • IAMロール
  • 学習に使うインスタンス数
  • 学習に使うインスタンスタイプ
  • モデル出力先

といったものをまず最初に渡して、その後ハイパーパラメータの設定を行うようです。

学習に利用する関数がfitであることからもわかるように、AWS環境に特化してスケールするように拡張されたscikit-learnくらいの感覚で、分散処理がどのように行われているかの実態を意識せずに学習できるようになっているようです。

学習を行っている際に、SageMakerのメニューからジョブを選択すると、学習処理のジョブがNotebookとは別に分散処理環境に投入されて学習が行われているのが確認できます。

ジョブを選択すると、そのジョブに関する具体的な情報を確認することが可能です。

作成されたモデルはメニューの「モデル」からも確認可能です。

学習が完了すると、S3にモデルのファイルが出力されているのが確認できます。

モデルの学習が終わったので、続いて予測を行う仕組みを作成していきます。 モデルの予測器のデプロイを行っています。

デプロイが完了すると、メニューの「エンドポントの設定」および「エンドポント」からデプロイされたモデルを確認することができます。

エンドポントを選択すると、APIにアクセスするためのURLなどの情報が確認できます。

サンプルの最後では、モデルの検証をするために、APIにアクセスして予測を行っています。

このサンプルでは、HTTPのPOSTをラップしたPythonのSDKを使っています。 まず、リクエストのシリアライズとレスポンスのでシリアライズの方法を指定しています。

続いて、実際に予測を行ってみての結果を出力しています。

取得した結果は、予測スコアが最大になるラベルとそのスコアを取得しています。

予測のやり方がわかったので、テストデータにたいする予測を行って、その結果をまとめています。

ここでは、各ラベルごとではなく、全体で予測ができたか否かの混同行列を作成しているようです。

これでこのサンプルは終わりとなっています。

このサンプルを実際に見ていただくと(英語ではありますが)より詳細に何を行っているかも確認できるかと思います。

ここからさらに

さて、ここまでで、試行錯誤を行いながらの学習と、その結果を予測APIとしてデプロイするまでの流れをjupyter Notebook内で完結させられるという便利さを見ていただけたかと思います。 しかも開発者はインスタンス数とタイプを指定するだけで、その中身を詳細に記述する必要がなく分散スケールさせることができる仕組みになっています。

そららの仕組みをラップするために、sagemakerライブラリが利用されており、ここからさらに他の手法の使い方なども見たい場合には豊富なサンプルが用意されています。

学習や予測エンドポイントの作成も個別にAWSマネジメントコンソールなどから行えるようなので、様々な場面で幅広く活用できる可能性がまだまだありそうですね。

また、公式の情報であるAmazon SageMaker の紹介によると、TensorFlowやMXNetも利用可能とのことなので、p3インスタンスで分散処理させるとDeep Leaningを含めて実用的な使い方ができるかと思います。

おわりに

今回は、Amazon SageMakerでどんなことができるのかを書かせていだきました。

SageMakerは機械学習のロジックだけでなく、システムに組み込むのに必要な様々な要素をデータ分析者が使い慣れているJupyter Notebookのみで完結させらる非常に手軽な仕組みで、大規模データにも分散処理によってスケールさせられるクラウドネイティブな設計になっていることが見ていただけたかと思います。

明日は、本日予定していたSVMのカーネル編を書かせていただく予定です。 お楽しみに!