すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:カスタムイメージを使用したモデルサービスのデプロイ

最終更新日:Jul 22, 2024

Elastic Algorithm Service (EAS) では、カスタムイメージを使用してモデルサービスを展開できます。 サービスのランタイム環境全体を含むDockerイメージを構築し、実行時にモデルまたはコードをサービスインスタンスにマウントできます。 モデルまたはコードをマウントする方法の詳細については、「ストレージをサービスにマウントする (詳細) 」をご参照ください。 このトピックでは、カスタムイメージを使用してモデルサービスをデプロイする方法について説明します。

背景情報

モデルサービスには複雑なビジネスロジックが含まれることが多く、カスタム推論の実装には複雑な開発環境が必要です。 たとえば、yum install/apt-get installコマンドを使用して、システムパスに複数の依存関係をインストールできます。 この複雑さに対応するために、EASではカスタムイメージを使用してモデルサービスを展開できます。

このトピックでは、カスタムイメージを使用して、PAIコンソールまたはEASCMDクライアントを介してモデルサービスを展開する方法について説明します。 EASCMDクライアントの使用方法の詳細については、「EASCMDクライアントのダウンロードとユーザー認証の完了」をご参照ください。

カスタムイメージを使用してモデルサービスを展開する場合、EASエンジンは、トラフィックまたはシステムモニタリングデータを収集し、サービスリクエストに認証情報を追加するために、実行時にサイドカーコンテナとしてサービスインスタンスに挿入されます。 HTTP、WebSocket、またはgRPC (HTTP/2) を介してAPIリクエストを送信し、モデルサービスを呼び出すことができます。

説明

gRPC経由でリクエストを送信するには、サービスをデプロイするときにmetadata.enable_grpcパラメーターをtrueに設定します。

イメージリポジトリの選択

EASは、次のタイプのカスタムイメージリポジトリをサポートします。

  • Container Registry: コンテナーイメージの作成方法の詳細については、Container Registryとは

    • Personal Edition: registry-vpc.cn-shanghai.aliyuncs.comなど、各リージョンに統一された内部アドレスを提供します。

      説明

      デフォルトでは、EASはインターネットにアクセスできません。 Container Registry Personal Editionイメージを展開に使用するには、EASがアクティブ化されているリージョンの内部アドレスを使用します。

    • Enterprise Edition: 画像の高速化やオンデマンドのリソース読み込みなどの高度な機能を提供します。 詳細については、「コンテナーイメージのリソースをオンデマンドで読み込む」をご参照ください。

      説明

      Container Registry Enterprise Editionイメージには、仮想プライベートクラウド (VPC) 内でのみアクセスできます。 EASが画像をプルできるようにするには、EASを対応するVPCに接続する必要があります。 詳細については、「ネットワーク接続の設定」をご参照ください。

  • 自己管理イメージリポジトリ: Harborを使用してVPCに自己管理イメージリポジトリを作成する場合、イメージリポジトリにはVPC内でのみアクセスできます。 Container Registry Enterprise Editionイメージの使用と同様に、EASをVPCに接続する必要があります。 詳細については、「ネットワーク接続の設定」をご参照ください。

説明

デフォルトでは、EASはインターネット経由でアクセスできません。 EASで画像リポジトリからインターネット経由で画像を取得する場合は、EASのインターネットアクセスを有効にする必要があります。 詳細については、「インターネットアクセスとホワイトリストの設定」をご参照ください。

イメージリポジトリへのアクセスの認証

認証に必要な情報は、イメージリポジトリのタイプによって異なります。

  • Container Registry: Alibaba Cloudアカウントを使用してEASを有効化し、EASにContainer Registryへのアクセス権限を付与した場合、同じアカウントを使用して、認証なしでContainer Registry Personal EditionまたはEnterprise Editionイメージをプルできます。

  • 自己管理イメージリポジトリ: 自己管理イメージリポジトリがアクセス資格情報としてユーザー名とパスワードを使用する場合、モデルサービスをデプロイするときにdockerAuthパラメーターを設定する必要があります。 詳細については、このトピックの「モデルサービスのデプロイ」を参照してください。

カスタムイメージの開発

説明

HTTP、WebSocket、およびgRPC経由のアクセスをサポートするイメージがデプロイされている場合は、この手順をスキップしてモデルサービスのデプロイに進みます。

複数の方法を使用してイメージを開発できます。 たとえば、Flaskを使用してwebサーバーを起動できます。 サンプルコード:

from flask import Flask
 
app = Flask(__name__)
 
@app.route('/hello/model')
def hello_world():
    return 'Hello World'
 
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)  

また、EASが提供する高性能サービングフレームワークであるallsparkを使用して、イメージを開発することもできます。 詳細については、「Pythonを使用したカスタムプロセッサの開発」をご参照ください。

# -*- coding: utf-8 -*-
import allspark


class MyProcessor(allspark.BaseProcessor):
    def initialize(self):
        """
        This function is only executed once when the service starts, 
        and traffic is not imported until the execution completes. 
        It can be used to load models and service initialization.
        """
        pass

    def process(self, data):
        """
        Each time a request is received, this function is called.
        The input parameter of the function is the request body of the HTTP request, 
        and the function returns two parameters: 
        1. the first parameter will be used as the HTTP response body, 
        2. the second parameter is the HTTP response status code.
        """
        data = 'hello eas'

        return bytes(data, encoding='utf8'), 200

if __name__ == '__main__':
    runner = MyProcessor(endpoint='0.0.0.0:8000')
    runner.run()

開発が完了したら、docker buildコマンドを実行して、コードを含むイメージをビルドし、そのイメージをサービスのデプロイに使用できます。 または、コードをApsara File Storage NAS (NAS) ファイルシステムまたはGitリポジトリに保存し、サービスの実行中にコードをマウントすることもできます。 詳細については、「ストレージのサービスへのマウント (詳細) 」をご参照ください。

モデルサービスのデプロイ

準備

  • カスタムイメージを使用してモデルサービスをデプロイするために必要な情報を取得します。

    • イメージリポジトリのアドレス。 例: registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz

    • イメージに基づいてコンテナを起動するコマンド。 例: /data/eas/ENV/bin/python /data/eas/app.py

    • サービスがリッスンするコンテナーのポート番号。 例: 8000。

      説明

      ポート番号はオプションです。 たとえば、サービスがEASゲートウェイではなくコンテナ内のメッセージキューからの要求を受け入れるようにする場合、ポート番号を指定する必要はありません。

  • サービスのデプロイに使用するJSON設定ファイルを準備するは、次の例に基づいています。

    構成ファイルを使用して、EASCMDクライアントを使用するか、API操作を呼び出してモデルサービスをデプロイできます。 PAIコンソールでモデルサービスをデプロイすると、GUIとのやり取りに基づいて構成ファイルが自動的に生成されます。

    {
      "name": "image_test",
      "containers": [
        {
          "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
          "env": [
            {
              "name": "var_name",
              "value": "var_value"
            }
          ],
          "command": "/data/eas/ENV/bin/python /data/eas/app.py",
          "port": 8000
        }
      ],
      "metadata": {
        "cpu": 1,
        "instance": 1
      }
    }

    次の表に、JSONファイルのパラメーターを示します。

    パラメーター

    必須

    説明

    コンテナー

    イメージ

    モデルサービスのデプロイに使用するイメージのアドレス。

    EASはインターネット経由のアクセスをサポートしていないため、EASが接続されているVPC内のイメージのアドレスを指定する必要があります。 例: registry-vpc.cn-shanghai.aliyuncs.com

    env

    name

    イメージに基づいてコンテナを起動するために使用される環境変数の名前。

    イメージに基づいてコンテナを起動するために使用される環境変数の値。

    コマンド

    2つのパラメーターのいずれかを指定します。

    コンテナーを起動するときに実行するコマンド。 このパラメーターを使用して、/bin/shを含まないコマンドなど、単純なコマンドを指定します。 cd xxx && python app.pyなどの複雑なコマンドを実行する場合は、スクリプトパラメータを設定します。

    スクリプト

    コンテナーを起動するときに実行するスクリプト。 このパラメーターを使用して、複雑なコマンドを指定します。 複数の行は \nまたはセミコロン (;) で区切ります。

    ポート

    不可

    サービスがリッスンするコンテナーのポート番号。

    重要
    • EASエンジンはこれらのポートでリッスンするため、ポート8080とポート9090を指定しないでください。

    • コマンドパラメーターを設定する場合は、commandパラメーターで指定したxxx.pyファイルのポートにこのパラメーターを設定します。

    準備する

    pythonRequirements

    不可

    コンテナーが起動する前にインストールするパッケージのリスト。 このパラメーターは、システムパスでPythonコマンドとpipコマンドが使用可能な場合にのみ有効です。 例:

    "prepare": {
      "pythonRequirements": [
        "numpy==1.16.4",
        "absl-py==0.11.0"
      ]
    }

    pythonRequirementsPath

    不可

    コンテナーを起動する前にインストールするパッケージを含むrequirements.txtファイルのパス。 このパラメーターは、システムパスでPythonコマンドとpipコマンドが使用可能な場合にのみ有効です。 requirements.txtファイルは、画像に保存することも、ストレージからマウントすることもできます。 例:

    "prepare": {
      "pythonRequirementsPath": "/data_oss/requirements.txt"
    }

    health_check

    tcp_socket.port

    不可

    TCPヘルスチェックリクエストの受信に使用されるポート番号。

    http_get.path

    不可

    HTTPヘルスチェックリクエストの受信に使用されるHTTPサーバーアドレス。

    http_get.port

    不可

    HTTPヘルスチェックリクエストの受信に使用されるHTTPサーバーのポート番号。

    initial_delay_秒

    不可

    ヘルスチェックを開始するまでのデフォルトの待機時間。 デフォルト値: 3。 単位は秒です。

    period_秒

    不可

    連続するヘルスチェック要求の間隔。 デフォルト値: 3。 単位は秒です。

    timeout_秒

    不可

    ヘルスチェック要求のタイムアウト期間。 デフォルト値は 1 です。 単位は秒です。 ヘルスチェック要求がタイムアウト期間内に応答を受信しなかった場合、ヘルスチェックは失敗したと報告されます。

    success_threshold

    不可

    正常なコンテナを判断するために必要なヘルスチェックの成功数。 たとえば、このパラメーターを2に設定すると、2回のヘルスチェックが成功した後、コンテナーは正常と見なされ、トラフィックの受信が開始されます。

    failure_threshold

    不可

    異常なコンテナを特定するために失敗したヘルスチェックの必要な数。 たとえば、このパラメーターを4に設定した場合、4回のヘルスチェックが失敗し、トラフィックの受信が停止した後、コンテナーは異常と見なされます。

    dockerAuth

    不可

    Dockerレジストリの認証情報。 このパラメーターは、イメージがプライベートイメージリポジトリにある場合に必要です。 有効な値: Base64-encoded形式のusername:password

    たとえば、username:passwordの値がabcd:abcde12345の場合、echo -n "abcd:abcde12345" | base64コマンドを実行して "abcd:abcde12345" 文字列をBase64-encodeします。 次に、dockerAuthパラメーターの値として、出力YWJjZDphYmNkZTEy **** を指定できます。

    メタデータ

    不可

    サービスのメタデータ。 詳細については、「EASCMDクライアントを使用するコマンドの実行」をご参照ください。

    name

    サービスの名前。 名前はリージョン内で一意である必要があります。

EASCMDクライアントの使用

  1. 作成EASCMDクライアントでコマンドを実行します。

eascmd create image.json

上記のコマンドでは、image.jsonに、上記の手順で作成した設定ファイルの名前を指定します。

コマンドが期待どおりに実行される場合、次の例に示すように、コマンド出力にはサービスのエンドポイントとトークンが含まれます。

[RequestId]: BFFFE5F5-1F07-437E-B59A-AF1F2B66****
+-------------------+-----------------------------------------------------------------------------------+
| Internet Endpoint | http://182848887922***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test    |
| Intranet Endpoint | http://182848887922***.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test|
|             Token | NjA4MzQxOWQ0MTY2M2Y4OGY0NjgwODkwZTZmYWJmZWU1ZmY0Njhk****                          |
+-------------------+-----------------------------------------------------------------------------------+
[OK] Service is now creating
[OK] Waiting [Total: 2, Pending: 2, Running: 0]
[OK] Running [Total: 2, Pending: 0, Running: 2]
[OK] Service is running

です

  1. サービス設定を変更する必要がある場合は、変更次の例に示すように、コマンドを実行します。

modifyコマンドの詳細については、「サービス設定の変更」をご参照ください。

eascmd modify registry_test -s image.json

上記のコマンドでは、registry_testはサービスの名前を指定し、image.jsonは上記の手順で作成した構成ファイルの名前を指定します。

PAIコンソールimageの使用

上の図は、自己管理イメージリポジトリのイメージを使用してモデルサービスをデプロイする方法を示しています。 この例では、イメージリポジトリへのアクセスに使用されるユーザー名とパスワードが設定され、モデルファイルと実装コードがOSSからサービスインスタンスにマウントされます。 次の設定ファイルが生成されます。

{
  "metadata": {
    "name": "image_test",
    "instance": 1
  },
  "storage": [
    {
      "mount_path": "/models/",
      "oss": {
        "path": "oss://example-cn-beijing/models/",
        "readOnly": true
      }
    },
    {
      "mount_path": "/root/code",
      "oss": {
        "path": "oss://example-cn-beijing/processors/",
        "readOnly": true
      }
    }
  ],
  "containers": [
    {
      "image": "myharbor.com/xxx/yyy:zzz",
      "script": "python /root/code/app.py",
      "port": 8000,
      "prepare": {
        "pythonRequirementsPath": "/root/code/requirements.txt"
      },
      "env": [
        {
          "name": "var_name",
          "value": "var_value"
        }
      ]
    }
  ],
  "dockerAuth": "YWJjOmJjZA=="
}

モデルサービスの呼び出し

モデルサービスをデプロイした後、PAIコンソールのEAS-Online model Servicesページで、またはeascmdクライアントでEASCMD descコマンドを実行して、サービスのエンドポイントを取得できます。 Flaskを使用して、モデルサービスをホストするコンテナー内にwebサービスを作成するとします。 サンプルコード:

from flask import Flask
 
app = Flask(__name__)
 
@app.route('/hello/model')
def hello_world():
    return 'Hello World'
 
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

webサービスには、エンドポイント /hello/modelでアクセスできます。 同期リクエストをwebサービスに送信するには、モデルサービスのエンドポイントに /hello/modelを追加する必要があります。

たとえば、EASのモデルサービスのエンドポイントはhttp:// 182848887922 *** .cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_testです。

次に、webサービスへのリクエストを次のエンドポイントに送信する必要があります。

http:// 182848887922 *** .cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test/hello/model

サービスを呼び出す方法の詳細については、「パブリックエンドポイントでサービスを呼び出す」をご参照ください。

付録: サンプルサービス設定

pythonRequirementsパラメーターの設定

{
  "name": "image_test",
  "containers": [
    {
      "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
      "prepare": {
        "pythonRequirements": [
          "numpy==1.16.4",
          "absl-py==0.11.0"
        ]
      },
      "command": "python app.py",
      "port": 8000
    }
  ],
  "metadata": {
    "instance": 1
  }
}

health_checkパラメーターの設定

{
   "name": "image_test",
   "containers": [
     {
       "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
       "command": "python app.py",
       "port": 8000,
       "health_check":{
         "http_get": {
           "path": "/",
           "port": 8000
         },
         "initial_delay_seconds": 3,
         "period_seconds": 3,
         "timeout_seconds": 1,
         "success_threshold": 2,
         "failure_threshold": 4
       }
     }
   ],
   "metadata": {
      "instance": 1
     }
}

gRPCプロトコルの使用

{
  "name": "image_test",
  "containers": [
    {
      "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
      "command": "python app.py",
      "port": 8000
    }
  ],
  "metadata": {
    "instance": 1,
    "enable_grpc": true
  }
}

関連ドキュメント

  • EASでのデプロイの仕組みについては、「概要」をご参照ください。

  • サービスをデプロイした後、自動スケーリング機能を使用して、ビジネスのワークロードの変動を処理できます。 詳細については、「自動スケーリング」をご参照ください。