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

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

最終更新日:Jan 06, 2025

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とは」をご参照ください。

  1. 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"]
  2. オンプレミスのマシンでイメージを構築します。 CLIで、flask_appディレクトリに移動し、次のコマンドを実行してflask-appという名前のDockerイメージをビルドします。

    docker build -t flask-app . 

イメージリポジトリへのイメージのプッシュ

EASは展開のためにイメージリポジトリからイメージを取得します。 次のセクションでは、オンプレミスのコンピューターで構築したイメージをイメージリポジトリにプッシュする方法について説明します。

  1. docker imagesコマンドを実行して、ビルドしたイメージのIDを取得します。

  2. イメージリポジトリを選択します。 この例では、Container Registryイメージリポジトリが使用されています。 リポジトリのアドレスはcrpi-*** .cn-hangzhou.personal.cr.aliyuncs.com/***/*** です。 異なるイメージリポジトリには、EASでの展開中のネットワーク構成の要件が異なります。 詳細については、「イメージリポジトリの選択」をご参照ください。

  3. 次のコマンドを実行して、イメージを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コンソールを使用する

次の表に、主要なパラメーターを示します。

パラメーター

説明

デプロイ方法

[イメージベースのデプロイ] を選択します。

イメージ設定

[画像アドレス] を選択し、画像アドレスcrpi-*** -vpc.cn-hangzhou.personal.cr.aliyuncs.com/***:flask-appを入力します。 この例では、Container Registryイメージリポジトリが使用されています。 ユーザー名とパスワードを入力する必要はありません。

コマンド

python3アプリ. py

ポート番号

8000

EASCMDクライアントの使用

  1. 次のサンプルコードは、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 **** を指定できます。

  2. 次のコマンドを実行して、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
  3. サービス設定を変更する必要がある場合は、変更次の例に示すように、コマンドを実行します。

    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でのデプロイの仕組みについては、「概要」をご参照ください。

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