Elastic Algorithm Service (EAS) では、カスタムイメージを使用してモデルサービスを展開できます。 サービスのランタイム環境全体を含むDockerイメージを構築し、実行時にモデルまたはコードをサービスインスタンスにマウントできます。 モデルまたはコードをマウントする方法の詳細については、「ストレージをサービスにマウントする」をご参照ください。 このトピックでは、カスタムイメージを使用してモデルサービスをデプロイする方法について説明します。
背景情報
モデルサービスには複雑なビジネスロジックが含まれることが多く、カスタム推論の実装には複雑な開発環境が必要です。 たとえば、yum install/apt-get install
コマンドを実行して、システムパスに複数の依存関係をインストールできます。 この複雑さに対応するために、EASではカスタムイメージを使用してモデルサービスを展開できます。
このトピックでは、カスタムイメージを使用して、PAIコンソールまたはEASCMDクライアントを介してモデルサービスを展開する方法について説明します。 EASCMDクライアントの使用方法の詳細については、「EASCMDクライアントのダウンロードとID認証の完了」をご参照ください。
カスタムイメージを使用してモデルサービスを展開する場合、EASエンジンは、トラフィックまたはシステムモニタリングデータを収集し、サービスリクエストに認証情報を追加するために、実行時にサイドカーコンテナとしてサービスインスタンスに挿入されます。 HTTP、WebSocket、またはgRPC (HTTP/2) を介してAPIリクエストを送信し、モデルサービスを呼び出すことができます。
gRPC経由でリクエストを送信するには、モデルサービスをデプロイするときにmetadata.enable_grpcパラメーターをtrueに設定します。
カスタムイメージの準備
HTTP、WebSocket、およびgRPC経由のアクセスをサポートする使用可能なイメージがある場合は、この手順をスキップしてモデルサービスのデプロイに進みます。
イメージサービスの開発
複数の方法を使用してイメージサービスを開発できます。 たとえば、Flaskを使用して、サービスアクセス用のwebサーバーを起動できます。 次のサンプルコードは、コードファイルがapp.pyである単純なサービスを示しています。
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)
イメージを作成する
開発にData Science Workshop (DSW) を使用する場合は、目的のDSWインスタンスの [操作] 列で [イメージの作成] をクリックします。 その後、システムはDockerイメージを構築し、Alibaba Cloud Container Registryに保存します。 モデルサービスのデプロイ中に、[カスタムイメージ] をクリックし、ドロップダウンリストからイメージを選択できます。
次のセクションでは、Dockerをインストールしてオンプレミスマシンでイメージをビルドする方法について説明します。 Alibaba Cloud Container Registryを使用してイメージを作成することもできます。 コンテナーイメージの作成方法の詳細については、「Container Registryとは」をご参照ください。
Dockerfileを書き込みます。
Dockerfileは、イメージを作成するために必要な手順と説明を含むテキストドキュメントです。
app.py
ファイルと同じレベルでDockerfileを作成する必要があります。 Dockerfileのディレクトリ構造は次のとおりです。flask_app ├── app.py └── Dockerfile
次のDockerfileでは、ビルドするイメージに
app.py
モデルサービスファイルがパッケージ化されています。 モデルサービスファイルをObject Storage service (OSS) 、file Storage NAS (NAS) 、またはGitリポジトリに保存し、実行時にモデルサービスファイルをサービスインスタンスにマウントすることもできます。 詳細については、「ストレージのサービスへのマウント」をご参照ください。# Specify the desired image. FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/python # Run the following commands in the container: RUN yum -y install python3-pip RUN pip3 install flask # Create a folder named app. RUN mkdir -p /app # Go to the app directory. RUN cd /app # Copy the app.py file in the current directory of the Linux system to the /app directory of the container. COPY app.py /app/ # Expose port 8000. EXPOSE 8000 # Set the app folder as a working directory. WORKDIR /app # Run the following command when the container is started: CMD ["flask", "run", "--host", "0.0.0.0"]
オンプレミスのマシンでイメージを構築します。 CLIで、flask_appディレクトリに移動し、次のコマンドを実行してflask-appという名前のDockerイメージをビルドします。
docker build -t flask-app .
イメージリポジトリへのイメージのプッシュ
EASは展開のためにイメージリポジトリからイメージを取得します。 次のセクションでは、オンプレミスのコンピューターで構築したイメージをイメージリポジトリにプッシュする方法について説明します。
docker images
コマンドを実行して、ビルドしたイメージのIDを取得します。イメージリポジトリを選択します。 この例では、Container Registryイメージリポジトリが使用されています。 リポジトリのアドレスは
crpi-*** .cn-hangzhou.personal.cr.aliyuncs.com/***/***
です。 異なるイメージリポジトリには、EASでの展開中のネットワーク構成の要件が異なります。 詳細については、「イメージリポジトリの選択」をご参照ください。次のコマンドを実行して、イメージをContainer Registryイメージリポジトリにプッシュします。
docker login --username=<Username> crpi-***.cn-hangzhou.personal.cr.aliyuncs.com docker tag <Image ID> crpi-***.cn-hangzhou.personal.cr.aliyuncs.com/***/***:flask-app docker push crpi-***.cn-hangzhou.personal.cr.aliyuncs.com/***/***:flask-app
画像アドレスは
crpi-*** .cn-hangzhou.personal.cr.aliyuncs.com/***/***:flask-app
です。
イメージリポジトリの選択
EASは、画像リポジトリごとに異なるネットワーク構成を必要とします。
Container Registryリポジトリ:
Container Registry Personal Edition: 各リージョンに統合された内部エンドポイントを提供します。 デプロイするモデルサービスがContainer Registry Personal Editionイメージが存在するリージョンに存在する場合、イメージの内部エンドポイントを使用してモデルサービスをデプロイできます。 それ以外の場合は、イメージのパブリックエンドポイントを使用してモデルサービスをデプロイする必要があります。
Container Registry Enterprise Edition: Container Registry Enterprise Editionイメージには、仮想プライベートクラウド (VPC) 内でのみアクセスできます。 EASがイメージをプルできるようにするには、EASを対応するVPCに接続する必要があります。 詳細は、「VPCの設定」をご参照ください。
自作イメージリポジトリ:
Harborを使用してVPCに自己管理イメージリポジトリを作成する場合、イメージリポジトリにはVPC内でのみアクセスできます。 Container Registry Enterprise Editionイメージの使用と同様に、EASをVPCに接続する必要があります。 詳細は、「VPCの設定」をご参照ください。
デフォルトでは、EASはインターネット経由でアクセスできません。 EASで画像リポジトリからインターネット経由で画像を取得する場合は、EASのインターネットアクセスを有効にする必要があります。 詳細については、「インターネットアクセスの設定」をご参照ください。
イメージリポジトリへのアクセスの認証
モデルサービスのデプロイに同じアカウントでContainer Registryイメージリポジトリを使用する場合は、ユーザー名とパスワードを入力する必要はありません。 EASを使用すると、パスワードを使用せずにサービス間で画像をプルできます。
自己構築イメージリポジトリにアクセス資格情報としてユーザー名とパスワードが必要な場合は、モデルサービスをデプロイするときにdockerAuthパラメーターを設定する必要があります。 詳細については、「モデルサービスのデプロイ」をご参照ください。
モデルサービスのデプロイ
カスタムイメージを使用してモデルサービスをデプロイするために必要な情報を取得します。
イメージリポジトリのアドレス。 例:
crpi-*** -vpc.cn-hangzhou.personal.cr.aliyuncs.com/***:flask-app
イメージに基づいてコンテナを起動するコマンド。 例:
python3 app.py
サービスがリッスンするコンテナーのポート番号。 例: 8000。
説明ポート番号はオプションです。 たとえば、サービスがEASゲートウェイではなくコンテナ内のメッセージキューからの要求を受け入れるようにする場合、ポート番号を指定する必要はありません。
PAIコンソールを使用する
次の表に、主要なパラメーターを示します。
パラメーター | 説明 |
デプロイ方法 | [イメージベースのデプロイ] を選択します。 |
イメージ設定 | [画像アドレス] を選択し、画像アドレス |
コマンド |
|
ポート番号 | 8000 |
EASCMDクライアントの使用
次のサンプルコードは、JSON設定ファイルの例を示しています。
{ "metadata": { "name": "flask_app_test", "instance": 1 }, "cloud": { "computing": { "instances": [ { "type": "ecs.c8y.large" } ] } }, "containers": [ { "image": "crpi-***-vpc.cn-hangzhou.personal.cr.aliyuncs.com/***:flask-app", "script": "python3 app.py", "port": 8000 } ] }
次の表に、カスタムイメージを使用したモデルサービス展開の主なパラメーターを示します。 その他のパラメーターについては、「モデルサービスのパラメーター」をご参照ください。
パラメーター
必須 / 任意
説明
コンテナー
イメージ
対象
モデルサービスのデプロイに使用するイメージのアドレス。
コマンド
2つのパラメーターのいずれかを指定します。
コンテナーを起動するときに実行するコマンド。 このパラメーターを使用して、/bin/shを含まないコマンドなど、単純なコマンドを指定します。 cd xxx && python app.pyなどの複雑なコマンドを実行する場合は、スクリプトパラメータを設定します。
スクリプト
コンテナーを起動するときに実行するスクリプト。 このパラメーターを使用して、複雑なコマンドを指定します。 複数の行は \nまたはセミコロン (;) で区切ります。
ポート
非対象
サービスがリッスンするコンテナーのポート番号。
重要EASエンジンはこれらのポートでリッスンするため、ポート8080とポート9090を指定しないでください。
コマンドパラメーターを設定する場合は、commandパラメーターで指定したxxx.pyファイルのポートにこのパラメーターを設定します。
dockerAuth
非対象
Dockerレジストリの認証情報。 このパラメーターは、イメージがプライベートイメージリポジトリにある場合に必要です。 有効な値: Base64-encoded形式の
username:password
。たとえば、
username:password
の値がabcd:abcde12345
の場合、echo -n "abcd:abcde12345" | base64
コマンドを実行して "abcd:abcde12345" 文字列をBase64-encodeします。 次に、dockerAuthパラメーターの値として、出力YWJjZDphYmNkZTEy ****
を指定できます。次のコマンドを実行して、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コンソールのモデルサービスの詳細ページで、またはeascmdクライアントでEASCMD desc
コマンドを実行して、サービスのエンドポイントを取得できます。
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
モデルサービスを呼び出す方法の詳細については、「パブリックエンドポイントでサービスを呼び出す」をご参照ください。
付録: サンプルサービス設定
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でのデプロイの仕組みについては、「概要」をご参照ください。
モデルサービスをデプロイした後、自動スケーリング機能を使用して、ビジネスのワークロードの変動を処理できます。 詳細については、「自動スケーリング」をご参照ください。