深層学習モデルを Red Hat OpenShift 上にデプロイする

学習の目的

この入門チュートリアルに従うことで、Model Asset Exchange から取得した深層学習モデルをマイクロサービスとして Red Hat OpenShift 上にデプロイする方法を学ぶことができます。

チュートリアルを完了した時点で、OpenShift Web コンソールまたは OpenShift Container Platform コマンドライン・インターフェース (CLI) を使用して以下の作業を行う方法を習得できているはずです。

  • 新しいプロジェクトを作成する
  • Docker Hub 上で一般公開されているコンテナー・イメージから作成したモデルに対応するマイクロサービスをデプロイする
  • マイクロサービスを一般公開するためのルートを作成する

前提条件

このチュートリアルに従うには、以下のものが必要です。

このチュートリアルは、IBM Cloud 上の Red Hat OpenShift v3.11 を使用して作成されています。Red Hat OpenShift Online を使用してチュートリアルに従う場合、このチュートリアルが作成された時点での Red Hat OpenShift Online バージョン 3 とは GUI にいくつかの違いがあることに気付くはずです。

所要時間

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

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

このチュートリアルに従うには、小規模な 1 ノードの OpenShift クラスターにアクセス可能でなければなりません。

Red Hat OpenShift クラスターをプロビジョニングする

既存のクラスターにアクセスできない場合は、IBM クラウド上にクラスターをプロビジョニングします。あるいは、IBM Cloud ではなく openshift.com 上にクラスターをプロビジョニングするのでも構いません。

このチュートリアルは、openshift.com 上のスターター無料枠を使用して完了することができます。ただし、その場合は使用できる RAM が 2 GiB に制限されます。リソースを大量に使用するモデルには、この容量では足りない可能性があります。

このチュートリアルの説明とスクリーンショットでは一貫して os-max-test-cluster という名前のクラスターを参照します。必要な場合は常に、この名前を実際のクラスター名で置き換えてください。

クラスターのプロビジョニングが完了したら、チュートリアルを開始できます。

深層学習モデルに対応するマイクロサービスを Red Hat OpenShift 上にデプロイする

このチュートリアルでは、Model Asset Exchange から取得したモデルに対応するマイクロサービスを、OpenShift Web コンソールOpenShift Container Platform CLI のそれぞれを使用して Red Hat OpenShift 上にデプロイします。両方の手順を行うのでも、どちらか一方を行うのでも構いません。

OpenShift Web コンソールを使用してデプロイする

チュートリアルの前半では、MAX-オブジェクト検出器 というモデルに対応するマイクロサービスをデプロイします。このモデルを使用すると、写真内のオブジェクトを識別できます。

  1. OpenShift Web コンソールを開きます。

    1. Web ブラウザー内で IBM Cloud 上の Kubernetes クラスターのページを開きます。
    2. OpenShift クラスターのエントリー os-max-test-cluster を見つけます。
    3. 」ドロップダウン・メニューから「OpenShift web console (OpenShift Web コンソール)」を選択します。  「OpenShift web console (OpenShift Web コンソール)」ボタンを示すスクリーンショット

      カタログ・ブラウザーが表示されます。

  2. ドロップダウン・メニューから「Application console (アプリケーション・コンソール)」を選択します。既存のプロジェクトのリストが表示されます。OpenShift 内ではプロジェクトを使用して関連するリソースを整理します。

    アプリケーション・コンソールに切り替えるためのメニュー項目を示すスクリーンショット

  3. 新しいプロジェクトを作成して、プロジェクト名 (例: max-deployments) と表示名を割り当て、必要に応じて説明を入力します。
  4. 作成したプロジェクトを開きます。

マイクロサービス Docker イメージをデプロイする

パブリック・リポジトリー内またはプライベート・リポジトリー内でホストされている Docker イメージのどちらでもデプロイできます。MAX-Object-Detector Docker イメージは、Docker Hub 上で codait/max-object-detector という名前でホストされています。

  1. プロジェクトの概要ページで、「Deploy Image (イメージのデプロイ)」を選択します。

    プロジェクトの画面のスクリーンショット

    概要ページの表示内容が上記とは異なる場合 (たとえば、すでにアプリケーションが含まれる既存のプロジェクトを使用しているため)、メニュー・バーにある「Add to Project (プロジェクトに追加)」ドロップダウン・メニューから「Deploy Image (イメージのデプロイ)」を選択します。

  2. デプロイするモデル対応 Docker イメージを選択します。

    1. Image Name (イメージ名)」ラジオ・ボタンをオンにして、ソースとしてパブリック・リポジトリーまたはプライベート・リポジトリーを選択します。
    2. イメージ名またはプル仕様 として codait/max-object-detector と入力します (あるいは、このリンク先の Docker Hub 上のリポジトリー内にあるモデル対応 Docker イメージの名前を入力します)。

      コンテナー・イメージを選択する画面のスクリーンショット

    3. イメージ名の横にある虫眼鏡をクリックして (または Enter キーを押して) Docker イメージのメタデータをロードします。
  3. 選択した Docker イメージのデプロイメント構成を確認します。

    デプロイメント構成を確認する画面のスクリーンショット

    Name (名前)」フィールドには、Docker イメージの名前を使用した値が事前に入力されます。OpenShift ではアプリケーションのデプロイ時に作成するリソースを識別するために、この名前を使用します。

    文字をいくつか追加、変更、または削除すると、生成されるイメージ・ストリーム名、デプロイメント構成名、サービス名、ホスト名が、その変更によってどのように影響されるのかを確認できます (ただし、このチュートリアルでは事前入力された名前をそのまま使用してください)。

    環境変数の設定を確認する画面のスクリーンショット

    ほとんどのモデル対応マイクロサービスの動作は、環境変数を設定することでカスタマイズできます。例えば、オリジン間リソース共有のサポートを有効にするには、デプロイメント構成内の CORS_ENABLE 変数を true に設定します。モデル固有の環境変数の設定については、そのモデルのドキュメントを参照してください。

  4. Deploy (デプロイ)」ボタンをクリックして Docker イメージをデプロイします。

  5. ウィンドウを閉じて、「Overview (概要)」タブを開きます (デフォルトでこのタブが選択されていない場合)。Object Detector モデル対応マイクロサービスのデプロイメント構成が表示されます。

    デプロイメントを表示する画面のスクリーンショット

    デフォルトでは、マイクロサービスの 1 つのインスタンスだけが起動されます。実行するポッドのターゲット数を増やすことで、手作業でデプロイメントをスケールアウトできます (スケールアウトとは、より多くのリソースを同時に処理するために稼働中にするマイクロサービスのインスタンス数を増やすことです)。また、自動スケーリングを有効にすることもできます (自動スケーリングとは、必要に応じて最大 X 個のインスタンスが実行されるようにすることです)。それには、デプロイメント構成名をクリックし、「Configuration (構成)」、「Add Autoscaler (オートスケーラーの追加)」の順に選択します。

デプロイ後のマイクロサービスは、クラスター内部でのみ (ポート 5000 で) 可視になります。マイクロサービスを一般公開するには、ルートを作成する必要があります。

ルートを作成する

OpenShift 内でルートを作成する際は、保護されていないルートと保護されたルートのどちらを公開するかを選択できます。モデル対応マイクロサービスは HTTP を使用して通信するため、保護されていない HTTP 接続を公開するようにルーターを構成することも (このチュートリアルではこの方法を採ります)、保護された HTTP 接続を公開して OpenShift ルーターが自動的に接続を終了するように構成することもできます。

  1. 「NETWORKING (ネットワーキング)」セクションにある「Create Route (ルートの作成)」を選択します。
  2. 構成の設定を確認します。ホスト名を空のままにしたときのデフォルトでは、生成された URL で、保護されていない HTTP 接続が公開されます。 ルート構成を確認する画面のスクリーンショット

    保護された HTTP ルートを構成する場合は、「Secure route (セキュア・ルート)」を選択し、「TLS Termination (TLS 終端)」は「Edge (エッジ)」に、「Insecure Traffic (非セキュア・トラフィック)」は「None (なし)」に設定します。TLS 証明書には、独自に入手したものを指定することも、ルーターのデフォルト証明書を指定することもできます。

  3. Create (作成)」をクリックしてルートを作成します。ルート作成の処理が完了すると、デプロイ済みのモデル対応マイクロサービスのパブリック URL が表示されます。 作成されたルートが表示された画面のスクリーンショット

    ルーターがリクエストを拒否したことを伝えるエラーが表示されたら、ルート名を短くしてください。(ルート名、プロジェクト名、クラスター名、ルーターのドメインを連結して) 生成される URL の長さは、63 文字の最大文字数を超えてしまいがちです。

  4. 表示された URL を開いて、マイクロサービスの OpenAPI 仕様のエンドポイントにアクセスできることを確認します。

    OpenAPI 仕様を確認する画面のスクリーンショット

  5. Object Detector を使用してこのチュートリアルの手順に従っている場合は、表示された URL の末尾に /app を追加して、ブラウザー内で Object Detector に組み込まれているサンプル・アプリケーションを開き、イメージをサブミットしてデプロイ済みサービスをテストします。

    組み込みサンプル・アプリケーションをテストする画面のスクリーンショット

チュートリアルのまとめまでスキップするか、次のセクションの手順に従って、コマンドライン・インターフェースを使ってモデル対応マイクロサービスをデプロイする方法を学んでください。

CLI を使用してデプロイする

OpenShift Container Platform CLI (oc) を使用してアプリケーションをデプロイ、管理することもできます。CLI を使用してマイクロサービスをクラスター内にデプロイするには、その前に、クラスターにログインする必要があります。

  1. OpenShift Web コンソールを開いて、ログイン・コマンドをコピーします。

    1. Web ブラウザー内で IBM Cloud 上の Kubernetes クラスターのページを開きます。
    2. OpenShift クラスターのエントリー os-max-test-cluster を見つけます。
    3. 」ドロップダウン・メニューから「OpenShift web console (OpenShift Web コンソール)」を選択します。

       「OpenShift web console (OpenShift Web コンソール)」ボタンを示すスクリーンショット

      カタログのブラウザーが表示されます。

    4. アバターのドロップダウンから、「Copy Login Command (ログイン・コマンドをコピー)」を選択します。

       「Copy Login Command (ログイン・コマンドをコピー)」メニュー項目を示すスクリーンショット

    ログイン・コマンドを共有しないでください。このコマンドには、アカウント内のリソースへのアクセス権を付与するトークンが含まれています。

  2. OpenShift CLI を使用してクラスターにログインします。

    1. ターミナル・ウィンドウを開きます。
    2. コピーしたログイン・コマンドを貼り付けます。

      oc login https://...--token=...
      

    ヒント: コマンドの詳細を確認するには、oc <コマンド> --help を実行します (例: oc login --help)。

  3. 新しいプロジェクトを作成して、max-deployments-cli のような名前を付けます。OpenShift では、プロジェクトを使用して関連リソースを整理します。

    oc new-project max-deployments-cli
    

    既存のプロジェクトを一覧表示するには、oc projects コマンドを使用します。プロジェクトを切り替えるには、oc project <プロジェクト名> コマンドを使用します。

Docker イメージをデプロイする

パブリック・リポジトリー内またはプライベート・リポジトリー内でホストされている Docker イメージのどちらでもデプロイできます。チュートリアルの後半では、MAX-画像キャプション・ジェネレーター というモデルに対応するマイクロサービスをデプロイします。このデモで示しているように、センテンス内にある写真の内容を記述するために使用できます。

  1. Docker Hub 上の codait/max-image-caption-generator Docker イメージにアクセスできることを確認します。

    oc new-app --search codait/max-image-caption-generator
    

    イメージにアクセスできる場合は、以下のような出力が表示されます。

     Docker images (oc new-app --docker-image=<docker-image> [--code=<source>])
     -----
     codait/max-image-caption-generator
     Registry: Docker Hub
     Tags:     latest
    
  2. Docker イメージをデプロイします。

    oc new-app codait/max-image-caption-generator
    

    出力を確認します。デフォルトでは、生成されるリソース (イメージ・ストリーム、デプロイメント構成、サービス、ホストなど) の名前には、イメージ名の max-image-caption-generator が使用されます。

    --> Found Docker image ...(... days old) from Docker Hub for "codait/max-image-caption-generator"
    
     * An image stream tag will be created as "max-image-caption-generator: latest" that will track this image
     * This image will be deployed in deployment config "max-image-caption-generator"
     * Port 5000/tcp will be load balanced by service "max-image-caption-generator"
       * Other containers can access this service through the hostname "max-image-caption-generator"
     * WARNING: Image "codait/max-image-caption-generator" runs as the 'root' user which may not be permitted by your cluster administrator
    
    --> Creating resources ...
     imagestream.image.openshift.io "max-image-caption-generator" created
     deploymentconfig.apps.openshift.io "max-image-caption-generator" created
     service "max-image-caption-generator" created
    --> Success
    ...
    Run 'oc status' to view your app.
    

    イメージのデプロイ時に --name <カスタム名> パラメーターを指定すると、デフォルトの名前を変更できます。

  3. ほとんどのモデル対応マイクロサービスの動作は、環境変数を設定することでカスタマイズできます。例えば、オリジン間リソース共有のサポートを有効にするには、以下のように、デプロイメント構成内の CORS_ENABLE 変数を true に設定します。

    oc set env deploymentconfig max-image-caption-generator CORS_ENABLE=true
    

    モデル固有の環境変数の設定については、そのモデルのドキュメントを参照してください。

  4. デプロイメントのステータスを照会します。

    oc status
    

    デプロイメントが完了した時点では、マイクロサービスの 1 つのインスタンスが稼働中になります。インスタンスはクラスター内部でのみ (ポート 5000 で) 可視になります。

    In project max-deployments-cli on server https://...
    
    svc/max-image-caption-generator - ...:5000
      dc/max-image-caption-generator deploys istag/max-image-caption-generator:latest
        deployment #1 deployed 15 minutes ago - 1 pod
    

    実行するポッドのターゲット数を増やすことで、手作業でデプロイメントをスケールアウトできます (oc scale --replicas=2 deploymentconfig max-image-caption-generator)。また、自動スケーリングを構成することもできます。

    マイクロサービスを一般公開するには、ルートを作成する必要があります。

ルートを作成する

OpenShift 内でルートを作成する際は、保護されていないルートと保護されたルートのどちらを公開するかを選択できます。モデル対応マイクロサービスは HTTP を使用して通信するため、保護されていない HTTP 接続を公開するようにルーターを構成することも (このチュートリアルではこの方法を採ります)、保護された HTTP 接続を公開して OpenShift ルーターが自動的に接続を終了するように構成することもできます。

  1. マイクロサービスのルートを作成します。

    oc expose service max-image-caption-generator
    
  2. マイクロサービスのパブリック URL を取得します。

    oc get route max-image-caption-generator
    

    HOST/PORT 列に、生成されたホスト名が表示されます。

    NAME                          HOST/PORT                                                          ...     
    max-image-caption-generator   max-image-caption-generator-max-deployments-cli...appdomain.cloud  ...
    

    表示された HOST/PORTInvalidHost となっている場合、生成されたホスト名は無効です。この問題は、ホスト名の長さが 63 文字の最大文字数を超えている場合によく起こります。問題を解決するには、ルート名を短くしてください。例えば、max-image-caption-generator サービスのルート名を短くするとしたら、oc expose service max-image-caption-generator --name <短くしたルート名> を実行し、続いて oc get route <短くしたルート名> を実行してパブリック URL を取得します。

  3. Web ブラウザー内で表示された URL を開いて、マイクロサービスにアクセスできることを確認します。

    OpenAPI 仕様を確認する画面のスクリーンショット

  4. /model/predict エンドポイントから、任意の写真に対して期待される結果が返されることを確認します。

    注: 計算集約型のモデルの場合、ルーターのデフォルト構成を使用すると、/model/predict エンドポイントの呼び出しが HTTP エラー 504 (ゲートウェイ・タイムアウト) で終わることがあります。この問題を解決するには、ルーターのタイムアウト値を大きくするために、oc annotate route <ルーター名> --overwrite haproxy.router.openshift.io/timeout=<秒数>s を実行します。

まとめ

このチュートリアルでは、OpenShift Web コンソールまたは OpenShift Container Platform コマンドライン・インターフェース (CLI) を使用して以下の作業を行う方法を説明しました。

  • 新しいプロジェクトを作成する
  • Docker Hub 上で一般公開されているコンテナー・イメージから作成したモデルに対応するマイクロサービスをデプロイする
  • マイクロサービスを一般公開するためのルートを作成する

Model Asset Exchange の詳細や、デプロイされたモデル対応サービスを Node-RED や JavaScript で使用する方法については、Learning Path: An introduction to the Model Asset Exchangeこのリンク先の CodePen を参照してください。

Red Hat OpenShift の詳細を学ぶには、以下のリソースも役立つはずです。