目次


Model Asset Exchange 入門

無料のオープンソース深層学習モデルをマイクロサービスとしてデプロイしてアプリケーションやサービス内で利用する

Comments

IBM Developer 上で提供されている Model Asset eXchange (MAX) は、テキスト、画像、音声、動画を処理できるオープンソース深層学習モデルを見つけて無料で利用できる場所です。キュレートされたモデルのリストには、ローカルで、またはクラウド内の Docker や Kubernetes 上でマイクロサービスとして実行できるデプロイ可能なモデルもあれば、独自のデータを使用してトレーニングできるモデルもあります。

Model Asset Exchange ランディング・ページのスクリーショット
Model Asset Exchange ランディング・ページのスクリーショット

学習の目的

この入門チュートリアルを完了すると、モデルをマイクロサービスとしてデプロイして基本的な Web アプリケーション内で利用するスキルを習得できます。

前提条件

所要時間

このチュートリアルの所要時間は約 60 分です。このチュートリアルは次のモジュールで構成されています。

チュートリアルのセットアップ

  1. ターミナル・ウィンドウ内で、チュートリアルのリポジトリーを複製します。
    git clone https://github.com/IBM/max-developer-tutorial.git
    cd max-developer-tutorial
  2. ソリューションの内容を確認するだけでなく、このチュートリアルのモジュール 2 で説明している手順にも取り組む場合は、使用する環境に Node.js または Python がインストールされていることを確認します。

チュートリアルを開始する準備ができました。

Docker 上で MAX モデル・アセットを実行する

デプロイ可能な MAX モデル・アセットが実装するマイクロサービスは、Docker または Kubernetes 上で実行することができます。

MAX アセットのコンポーネントを示す図
MAX アセットのコンポーネントを示す図

このモジュールでは、以下のタスクを行う方法を学びます。

  • Docker Hub からプルした事前ビルドされた Docker イメージを使用してマイクロサービスを実行する
  • カスタム・ビルドした Docker イメージを使用してモデル・マイクロサービスを Docker 上で実行する
  • モデル・マイクロサービスの内容を調べる

ローカル環境内で MAX モデル・マイクロサービスの機能を調べることだけが目的の場合は、対応する Docker イメージを Docker Hub からプルして実行できます。

事前ビルドされた Docker イメージを実行する

モデル・マイクロサービスの内容を調べるには、事前ビルドされた Docker イメージが簡単な手段になります。この場合、マシンに (Docker は別として) 他のソフトウェアをインストールする必要は一切ありません。ただし、イメージは事前ビルドされているため、マイクロサービスをカスタマイズしたり、その実装を確認したりすることはできません。

  1. Object Detector のモデル・ページを開きます。 Object Detector モデル・ランディング・ページのスクリーンショット
    Object Detector モデル・ランディング・ページのスクリーンショット

    注: 「Try the API (API を試す)」ボタンをクリックして、いくつかのモデルのモデル・サービス API を探索することもできます。
  2. Docker Hub から事前ビルドされた Docker イメージをデプロイする手順を見つけて、そこに記載されている docker run コマンドをターミナル・ウィンドウ内で実行します。これにより、ローカル・マシン上でマイクロサービスが起動します。
    docker run -it -p 5000:5000 codait/max-object-detector

    コンテナーが起動してサービスが利用可能になると、URL を示すステータス・メッセージが表示されます。その URL でサービスにアクセスすることができます。
  3. Web ブラウザー内で、ステータス・メッセージに示されている URL (例: http://0.0.0.0:5000) を開きます。
  4. マイクロサービスの仕様を調べます。稼働中の各マイクロサービスは、少なくとも次の 3 つのエンドポイントを公開します。
    • GET / : このエンドポイントは、対応するマイクロサービスの Swagger 仕様を返します。
    • GET /model/metadata : このエンドポイントは、対応するマイクロサービスが処理しているモデルに関する情報 (名前、説明、ライセンスなど) を返します。
    • POST /model/predict : このエンドポイントは、入力されたデータに基づく予測結果を返します。サポートされる入力データの型と形式はモデルによって異なります。詳細については、サービスの Swagger エンドポイントの説明を参照してください。
    予測を行うときは常に、マイクロサービスが次の処理を実行します。
    • 入力 (例えば、画像、テキスト、音声ファイルなど) を、深層学習モデルに取り込める形式に変換します。
    • モデルが実装されている深層学習フレームワークの API を呼び出します。
    • モデルの出力をフィルタリングし、その結果を、アプリケーションで使いやすい形式に変換します。
  5. 予測エンドポイントを試します。Swagger UI から POST /model/predict エンドポイントを呼び出すか、任意の API クライアントを使用してリクエストを送信することで、モデルの予測機能を試すことができます。モデル固有のサンプル入力は、そのモデルの GitHub リポジトリー内で確認できます。

    以下に、Object Detector モデルに対する単純な curl ベースのサンプル・リクエストを示します。

    curl -F "image=@assets/dog-human.jpg" -XPOST http://localhost:5000/model/predict

    通常、予測結果は JSON として返されます。
     {
      "status": "ok",
      "predictions": [
        {
           "label_id": "1",
           "label": "person",
           "probability": 0.944034993648529,
           "detection_box": [
               0.1242099404335022,
               0.12507188320159912,
               0.8423267006874084,
               0.5974075794219971
           ]
         },
       ...
  6. マイクロサービスを停止します。
    1. docker ps コマンドを使用して稼働中のコンテナーをリストアップします。
      docker ps
    2. 該当するイメージの CONTAINER ID をメモします。
      CONTAINER ID   IMAGE
      53...          codait/max-object-detector
    3. 前のステップでメモした CONTAINER ID を指定して、docker stop コマンドを実行します。これで、マイクロサービスが停止します。
      docker stop 53...

カスタマイズ可能な Docker イメージを実行する

Docker イメージの内容 (モデルを処理するコードの実装など) を調べる場合、または Docker イメージをカスタマイズする場合は、モデル・アセットの GitHub リポジトリーを複製してください。

  1. Object Detector のモデル・ページ上で「Get this model (このモデルを取得)」をクリックし、モデルの GitHub リポジトリーにナビゲートします。

  2. 以下の手順に従ってモデルをビルドします。ビルド・プロセスは、一般に 2 つのステップで構成されます。
    • ソースをローカル・マシンに複製します。
    • Docker ベース・イメージをビルドします。
    Object Detector Docker イメージをビルドするには、ターミナル・ウィンドウ内で次のコマンドを実行します。
    git clone https://github.com/IBM/MAX-Object-Detector.git
    cd MAX-Object-Detector

    通常、モデルを処理するコードは、Flask と深層学習フレームワーク・ライブラリー (TensorFlow や PyTorch など) を使用して PyTorch で実装されています。

    このサービスのコンシューマーがどの深層学習フレームワークが使用されているかを知る必要はありません。サービス API は特定のフレームワークに依存しないためです。

    イメージをビルドする準備が整ったら、docker build コマンドを実行します。

    docker build -t max-object-detector .

    ビルド・プロセス中に、必要な依存関係がダウンロードされます。

    ビルドするイメージによっては、このプロセスが完了するまで時間がかかることがあります。

    ビルド・プロセスが完了したら、デプロイ作業に移ります。

  3. ターミナル・ウィンドウ内で、リストアップされている docker run コマンドを実行してマイクロサービスを起動します。
    docker run -it -p 5000:5000 max-object-detector

    コンテナーが起動してサービスが利用可能になると、ステータス・メッセージが表示されます。そのステータス・メッセージに、サービスにアクセスできる URL が示されています。
  4. Web ブラウザー内で、ステータス・メッセージに示されている URL (例: http://0.0.0.0:5000/) を開きます。
  5. コンテナーを停止したり、ターミナル・ウィンドウを終了したりしないでください。このコンテナーは次のモジュール内で使用します。

モジュール 1 のまとめ

このモジュールでは、次のタスクを行う方法を学びました。

  • Docker Hub からプルした事前ビルドされた Docker イメージを使用してマイクロサービスを実行する
  • カスタム・ビルドした Docker イメージを使用してモデル・マイクロサービスを Docker 上で実行する
  • モデル・マイクロサービスの内容を調べる

次のモジュールでは、Node.js または Python で作成された Web アプリケーションからモデル・マイクロサービスを利用する方法を学びます。

MAX モデル・アセットを使用する

これまでのところでは、ローカル環境内でモデル・マイクロサービスを Docker 上にデプロイし、サービスの API エンドポイントを探索しました。このモジュールでは、以下のタスクを行う方法を学びます。

  • モデル・マイクロサービスの予測エンドポイントを呼び出す
  • 単純な Web アプリケーションを使用して予測結果を処理し、視覚化する

以下の図は、サンプル Web アプリケーション (左側) と Object Detector モデル・マイクロサービス間のデータ・フローを示しています。

アーキテクチャー図
アーキテクチャー図

セットアップ

  1. モデル・マイクロサービスが稼働中であることを確認するために、ターミナル・ウィンドウ内で次のコマンドを実行します。
    curl -i http://localhost:5000/model/metadata

    このコマンドからエラーが返された場合は、次のコマンドを実行してマイクロサービスを起動します。

    docker run -it -p 5000:5000 codait/max-object-detector

このチュートリアルを準備する際に、Node.js と Python を使用して単純な Web アプリケーション・スタブを作成しました。ここでは、このいずれかのスタブを完成するために、モデル・マイクロサービスの予測エンドポイントを呼び出し、結果を処理して視覚化するコードを追加します。

使用するプログラミング言語に応じた手順に従ってください。

Node.js を使用してマイクロサービスを利用する

  1. ターミナル・ウィンドウ内で、Node.js サンプル・アプリケーションのリポジトリー (https://github.com/IBM/max-tutorial-app-nodejs) を複製します。
    git clone https://github.com/IBM/max-tutorial-app-nodejs.git
    cd max-tutorial-app-nodejs

    注: 以下の手順を省略して完成版のサンプル・アプリケーションの内容を確認したい場合は、ターミナル・ウィンドウ内で git checkout solution を実行して solution ブランチをチェックアウトしてください。

  2. static/index.html、static/js/webapp.js、app.js の各ファイルを任意のエディターで開きます。
    • static/index.html は、単純な Web UI を実装するファイルです。ユーザーはこの Web UI を使用して、ローカル・ファイル・システムから PNG/JPG 画像を選択できます。
    • static/js/webapp.js には、モデル・マイクロサービスの予測エンドポイント /model/predict を呼び出し、結果を解析し、検出されたオブジェクトをアノテーション付きの境界ボックスで囲んで描画する JavaScript コードが含まれています。
    • app.js は、単純な Express ベースの Web サーバーを実装するファイルです。この Web サーバーはアプリケーションのコンテンツ (Web ページ、JavaScript、スタイルシートなど) を配信するとともに、リクエストをモデル・マイクロサービスにリダイレクトします。
  3. static/js/webapp.js ファイル内で、次の作業を行います。
    1. TODO R1 を見つけて、予測リクエストのペイロードを確認します。このモデルを使用するには、PNG/JPG でエンコードされた画像ファイルを入力として渡さなければなりません。必要に応じて、しきい値も入力として渡すことができます。しきい値はフィルターとして機能し、検出されたオブジェクトのうち、モデルによる確信度が低いものを結果セットから削除します。このサンプル・アプリケーション内では例示を目的として、デフォルト値 (0.7) をそれよりも小さい値でオーバーライドしています。
    2. TODO T1 を見つけて、TODO プレースホルダーをマイクロサービスの実際の予測エンドポイント /model/predict で置き換えます。
    3. TODO T2 を見つけて、TODO プレースホルダーをマイクロサービスの実際の予測リクエスト・メソッド POST で置き換えます。
    4. 変更内容を保存します。

    注: Web ブラウザー内でマイクロサービスの URL (例: http://localhost:5000/) を開くことで、いつでも Swagger 仕様を調べてサポート対象のモデル・エンドポイントを確認することができます。

  4. 前提条件をインストールし、アプリケーションを起動します。
    npm install
    npm start
  5. Web ブラウザー内で http://localhost:8090/ を開きます。
    • Safari の場合: Web インスペクター内で「Network (ネットワーク)」タブを開きます (MacOS: <option><command><i>>)
    • Google Chrome の場合: デベロッパー・ツール内で「Network (ネットワーク)」タブを開きます (MacOS: <option><command><i>)
    • Mozilla Firefox の場合: Web 開発者ツール内で「Network (ネットワーク)」タブを開きます (MacOS: <option><command><i>)
  6. assets/ ディレクトリー内にあるサンプル・イメージ (またはマシン上に保管されている他の PNG/JPG 画像) を選択し、「Detect Objects (オブジェクトを検出)」をクリックします。

    エンドポイント URL とリクエスト・メソッドを適切に定義していれば、検出されたオブジェクトがないことを伝えるメッセージが表示されます。まだマイクロサービス・レスポンスを処理するコードをカスタマイズしていないため、これは正常な動作です。

  7. ブラウザーの「Network (ネットワーク)」タブ内で、予測リクエストのレスポンスを調べます。レスポンスは次のようなコードになっているはずです。
    {
      "status": "ok",
      "predictions": [
          {
              "label_id": "88",
              "label": "teddy bear",
              "probability": 0.9896332025527954,
              "detection_box": [
                  0.27832502126693726,
                  0.5611844062805176,
                  0.643224835395813,
                  0.8432191610336304
              ]
          },
          {
              "label_id": "1",
              "label": "person",
              "probability": 0.9879012107849121,
              "detection_box": [
                  0.24251864850521088,
                  0.26926863193511963,
                  0.6558930277824402,
                  0.5768759846687317
              ]
          }
      ]
    }

predictions 配列には、検出されたオブジェクトごとに次の要素を特定するエントリが格納されます。

  • オブジェクトの label (person、dog、cat など)
  • 検出されたオブジェクトがその指定のラベルを表しているかどうかの信頼度 (probability) (1 = 高信頼度、0 = 低信頼度)
  • 検出されたオブジェクトを囲む境界ボックスの座標 (y_1、x_1、y_2、x_2)
  1. static/js/webapp.js ファイル内で、次の作業を行います。

    1. TODO T3 を見つけて、TODO プレースホルダーを predictions で置き換えます。
    2. 変更内容を保存します。
  2. Web ブラウザー内に http://localhost:8090/ を再ロードして、もう一度オブジェクトの検出を試みます。

    アプリケーションは、検出されたオブジェクトを囲む境界ボックスとラベルを表示するはずです。

    アノテーション付きオブジェクトを示すスクリーンショット
    アノテーション付きオブジェクトを示すスクリーンショット

Python を使用してマイクロサービスを利用する

  1. ターミナル・ウィンドウ内で、Python サンプル・アプリケーションのリポジトリー (https://github.com/IBM/max-tutorial-app-python) を複製します。
    git clone https://github.com/IBM/max-tutorial-app-python.git
    cd max-tutorial-app-python

    以下の手順を省略して完成版のサンプル・アプリケーションの内容を確認したい場合は、ターミナル・ウィンドウ内で git checkout solution を実行して solution ブランチをチェックアウトしてください。
  2. 任意のエディターで app.py ファイルを開きます。

    このアプリケーションは、単純な Flask ベースの Web サーバーを実装しています。この Web サーバーはアプリケーションの静的コンテンツ (Web ページ、JavaScript、スタイルシートなど) を配信し、モデル・マイクロサービスを呼び出します。

  3. app.py ファイル内で、次の作業を行います。
    1. TODO R1 を見つけて、予測リクエストのペイロードを確認します。このモデルを使用するには、PNG/JPG でエンコードされた画像ファイルを入力として渡さなければなりません。必要に応じて、しきい値も入力として渡すことができます。しきい値はフィルターとして機能し、検出されたオブジェクトのうち、モデルによる確信度が低いものを結果セットから削除します。このサンプル・アプリケーション内では例示を目的として、デフォルト値 (0.7) をそれよりも小さい値でオーバーライドしています。
    2. TODO T1 を見つけて、TODO プレースホルダーをマイクロサービスの実際の予測エンドポイント /model/predict で置き換えます。
    3. 変更内容を保存します。

    Web ブラウザー内でマイクロサービスの URL (例: http://localhost:5000/) を開くことで、いつでも Swagger 仕様を調べてサポート対象のモデル・エンドポイントを確認することができます。

  4. ターミナル・ウィンドウ内で、前提条件をインストールし、アプリケーションを起動します。
    pip install -r requirements.txt
    python app.py
  5. Web ブラウザー内で http://localhost:8090/ を開きます。
  6. assets/ ディレクトリー内にあるサンプル・イメージ (またはマシン上に保管されている他の PNG/JPG 画像) を選択し、「Detect Objects (オブジェクトを検出)」をクリックします。

    エンドポイント URL とリクエスト・メソッドを適切に定義していれば、検出されたオブジェクトがないことを伝えるメッセージが表示されます。まだマイクロサービス・レスポンスを処理するコードをカスタマイズしていないため、これは正常な動作です。

  7. アプリケーションのデバッグ出力を調べます。以下のような内容になっているはずです。
 {
  "status": "ok",
  "predictions": [
      {
          "label_id": "88",
          "label": "teddy bear",
          "probability": 0.9896332025527954,
          "detection_box": [
              0.27832502126693726,
              0.5611844062805176,
              0.643224835395813,
              0.8432191610336304
          ]
      },
      {
          "label_id": "1",
          "label": "person",
          "probability": 0.9879012107849121,
          "detection_box": [
              0.24251864850521088,
              0.26926863193511963,
              0.6558930277824402,
              0.5768759846687317
          ]
      }
  ]
 }

predictions 配列には、検出されたオブジェクトごとに次の要素を特定するエントリが格納されます。

  • オブジェクトの label (person、dog、cat など)
  • 検出されたオブジェクトがその指定のラベルを表しているかどうかの信頼度 (probability) (1 = 高信頼度、0 = 低信頼度)
  • 検出されたオブジェクトを囲む境界ボックスの座標 (y_1、x_1、y_2、x_2)
  1. app.py ファイル内で、次の作業を行います。
    1. TODO T2 を見つけて、次の行のコメントを外し、TODO プレースホルダーを predictions で置き換えます。
    2. 変更内容を保存します。
  2. Web ブラウザー内に http://localhost:8090/ を再ロードして、もう一度オブジェクトの検出を試みます。

    アプリケーションは、検出されたオブジェクトを囲む境界ボックスとラベルを表示するはずです。

    アノテーション付きオブジェクトを示すスクリーンショット
    アノテーション付きオブジェクトを示すスクリーンショット

モジュール 2 のまとめ

このモジュールでは、次のタスクを行う方法を学びました。

  • 深層学習モデルの予測エンドポイントを呼び出すコードを追加する
  • レスポンスを処理して視覚化する

まとめ

このチュートリアルでは、モデル・マイクロサービスをデプロイして、基本的な Web アプリケーション内で利用する方法を説明しました。また、環境をセットアップする方法、マイクロサービスを実行して利用する方法も説明しました。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, Cognitive computing
ArticleID=1065721
ArticleTitle=Model Asset Exchange 入門
publish-date=05092019