Alibaba PAIでend-to-endに機械学習アプリを作ってみた(Part 1)

  はじめまして。SBクラウド機械学習エンジニアのマクシムです。

 今回は3つの記事に渡って、Alibabaの機械学習プラットフォーム「PAI」を使ってデータの読み込みからアプリのサービングまで、end-to-endに機械学習アプリを作ってみます。PAIの開発環境、「DSW」(Data Science Workshop)とモデルサービングサービス、「EAS」(Elastic Algorithm Service)を主に、その他OSSやECSなどの複数のクラウドプロダクトを組み合わせて以下のような基礎的な服画像分類ウェブアプリを作ります。左の画面で服の画像をアップロードすると、右の画面に変わって服のカテゴリー名が返ってきます(赤い枠)。

 

f:id:sbc_maxime:20200323120926p:plain

服画像分類WEBアプリ

 

この記事は、機械学習モデルを構築できるが、それを使った実際のアプリサービスの展開のやり方が分からない人、または、「データ」や「AI」、「機械学習」という単語をよく聞くが、実際どのようにアプリができているかイメージのつかない方に向けて書いています。

説明と共にコードなどを共有していきますが、今回の記事では機械学習モデルやコードの性能よりも、開発プロセス全体の流れとPAIの使い方に集中するので予めご了承ください。今回は国際サイトの「シンガポール」リージョンで実装します。

開発プロセスの流れは以下の通りになります:

 

f:id:sbc_maxime:20200303101747p:plain

 

 今回のPart 1では、OSSやNASなどのストレージシステムから洋服の画像データを読み込み、PAI-DSWでニューラルネットモデルを組んで学習させる作業を行います。次回Part 2とPart 3では、学習済みのモデルのデプロイ、そしてアプリサービングの説明をします。

 

目次 

  

 


1. OSSにデータをアップロード

 

今回は服の画像を分類してくれるアプリを作るということで、機械学習では定番のFashion-MNISTデータセットを使います。データの形式は以下のような28x28ピクセルの服画像(アレイ形式)が合計70000枚(train: 60000、test: 10000)揃っていて、10個のカテゴリーにラベリングされています。

 

f:id:sbc_maxime:20200303110336p:plain

服のカテゴリー

f:id:sbc_maxime:20200303110846p:plain

サンプルデータ

 

OSS(Object Storage Service)はスケーラブルなクラウドストレージサービスで、大量の非構造化データを保存することができます。今回はMNISTを使いますが、本来はGB単位の整理されていない状態のデータが集まることが多く、OSSのようなデータレイクに保存するのが一般的です。

 

早速ダウンロードしてOSSに保存してみましょう。

  1. Kaggleからデータをダウンロードして解凍(.csv版が用意されているので楽)
  2. OSSにバケット作成("pai-demo-app"と名付けます)
  3. バケットに"data/"フォルダを作成し、解凍したファイルの"fashion-mnist_train.csv"と"fashion-mnist_test.csv"をアップロード

 

f:id:sbc_maxime:20200309154302p:plain

1. データダウンロード

f:id:sbc_maxime:20200303142636p:plain

2. バケット作成

f:id:sbc_maxime:20200303142736p:plain

3. ファイルアップロード


 


2. PAI-DSWとNASの設定

 

 PAIのDSWはJupyterのようにノートブック形式に開発を行える環境です。更にCPUやGPUの性能と数を自由に変更でき、使うリソースによって従量課金される仕組みとなっています。なので、モデルの学習の時間が長すぎる時は、一時的にアップグレードすることができて便利です。注意点としては、課金はGPUの使用時間ではなく、DSW本体を使う時間によってカウントされるので、開発を行なっていない時はインスタンスをオフにしましょう。

早速インスタンスを作ってみましょう。GPU性能は後から変えられるのでとりあえず一番安いのに設定します。

f:id:sbc_maxime:20200303145301p:plain

DSWの設定

 

DSWにはデフォルトで5GBの容量が付いてきます。ただ、学習データが5GBを超える際、NAS(Network Attached Storage)を繋げる必要があります。

f:id:sbc_maxime:20200303152031p:plain

NAS設定前のDSWの状態

今回のデータは5GB未満ですが、見本として設定してみます。実際に試したい方は、公式ドキュメントも参考してみてください(中国語なので、読めない方はGoogle翻訳などを使ってくださいね)。

  1. OSSと同じリージョン(Singapore)にNAS File Systemを作成
  2. NASにマウントポイントを追加して、VPC、VSwitchとPermission Groupの設定
  3. DSWからのNASのアクセスを許可する(初回のみ必要)
  4. 作ったFile SystemのID をコピー
  5. 上で作ったDSWインスタンスの「Config」でNAS File System ID を貼り付け
  6. DSWを起動し、ターミナルを開いて「$ df -h」で正しく"/nas"ディレクトリーが追加されたか確認

 

f:id:sbc_maxime:20200303152726p:plain

1. NAS File System作成

f:id:sbc_maxime:20200303152914p:plain

2. マウントポイント設定

f:id:sbc_maxime:20200303153052p:plain

3. NAS許可

f:id:sbc_maxime:20200309184240p:plain

4. ファイルシステムIDをコピー

f:id:sbc_maxime:20200303153443p:plain

5. NASのIDをDSWに貼り付け

f:id:sbc_maxime:20200305180008p:plain

6. NASディレクトリの確認

 

 


3. OSSからNASへのデータインポート

 

次に、OSSに保存してあるデータをDSWで使えるようにするために、NASにダウンロードします。そこで、Alibabaが配っているOSSのPython SDK(“oss2”)を使います。DSW環境にデフォルトで入っていますが、このページにインストール方法が書かれてあるので、必要な方は参考にしてください。

  1. DSWでPython 3 ノートブックを開いて、下記の"import_data.ipynb"コードを実行。アクセスキーとIDは事前にアリババクラウドコンソールで準備しておきます。
  2. /nas/に正しく保存されたか確認

 

f:id:sbc_maxime:20200305174649p:plain

1. Python 3ノートブックを開く

f:id:sbc_maxime:20200305174310p:plain

2. ファイルインポート確認



※ このコードは指定されたOSSバケットの中身を全てダウンロードするようになっています。特定のファイルのみインポートしたい場合はこちらを参考にしてコードを変えてみてください。

gist4ab166364157217c79eb58717764be2a

 

 


4. DSWでモデル開発&学習

 

 今回は2D画像データを扱うので畳み込み層(convolution layer)を用いたニューラルネットモデル(CNN)をTensorflow2で作ります。新しいTensorFlowノートブックを開いて下記コードを実行すれば、モデルの学習が行われてモデルの状態がファイルに保存されます。下で順番に解説します。

 

f:id:sbc_maxime:20200309182252p:plain

TensorFlowノートブック

 

gistf6b43e12b986e2f7de8bfb990438aa40

 

ノートブックの解説:

「初期設定」
まず、ライブラリをインポートします。今回使うTensorFlowのバージョンは2.0です。tf.enable_eager_execution()はTFオペレーションが定義された時に値の評価が行われるようにする設定です。TFの細かい部分なので、分からない方はあまり気にしないで大丈夫です。

「データの準備」
学習データとテストデータを読み込んで中身の画像情報(入力)とラベル情報(出力)を分割して、それぞれを変数に保存します。次に、(784,)のベクトルとして保存されている入力画像情報「X」を(28x28)の2Dアレイに変換し、1次元のラベルベクトル「y」を10次元のバイナリベクトルに変換します(i.e., one-hotエンコーディング)。最後に、60000枚の学習データから10000枚をvalidationデータとして使います。

「モデル構築」
今回はモデル構築にあまり時間をかけずに、TensorFlowチュートリアルで紹介されているモデルの構造をtf.kerasで再現します。

「モデル学習」
まず、"/nas/model/checkpoints"フォルダを作って、validationデータを指定して20エポック分学習させます。更に、エポック毎にモデルのweightを保存しておきます。学習が終わった段階で、エポック毎のモデルのlossとaccuracyを確認します。lossの図をみると、今回は9エポック目からvalidationのlossが上がっていくため、9エポック以降は過学習している恐れがあると分かります。なので、今回はモデルの状態を(epochs=9)のweightの状態に戻して使うことにします。

「モデル評価」
testデータに対して、89.17%の精度で正しく結果を出すモデルが出来上がったようです。今回はこれくらいの精度で十分なので、そのまま使うことにします。

「モデル保存」
最後に、モデルを.h5形式で保存して、ローカルPCにダウンロードしておきます。

 


まとめ

 

 ここまでで、OSSやNASとPAI-DSWをうまく連携させて一旦モデルが出来上がり、ファイルに保存しました。 モデルの精度や運用面での工夫の余地はまだたくさんありますが、今回はPAIを使った簡単なデモアプリということで、ミニマムの作業量でサクッと終わらせちゃいます。

次回Part 2では、PAI-EASを使ってモデルのパッケージングとデプロイのやり方を紹介します。是非続けて読んでみてください。