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クライアントの使用
作成
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
です
サービス設定を変更する必要がある場合は、
変更
次の例に示すように、コマンドを実行します。
modify
コマンドの詳細については、「サービス設定の変更」をご参照ください。
eascmd modify registry_test -s image.json
上記のコマンドでは、registry_testはサービスの名前を指定し、image.jsonは上記の手順で作成した構成ファイルの名前を指定します。
PAIコンソールの使用
上の図は、自己管理イメージリポジトリのイメージを使用してモデルサービスをデプロイする方法を示しています。 この例では、イメージリポジトリへのアクセスに使用されるユーザー名とパスワードが設定され、モデルファイルと実装コードが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
}
}