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

Platform For AI:スケーラブルなジョブとしてオンラインポートレートサービスを展開する

最終更新日:Dec 13, 2024

非同期推論シナリオでは、不十分なリソース使用率やスケールアウト中の要求の中断などの問題が発生する可能性があります。 この問題を解決するために、Platform for AI (PAI) のElastic Algorithm Service (EAS) は、最適化されたサービスサブスクリプションメカニズムを備えたスケーラブルなジョブサービスを提供します。 このトピックでは、オンラインポートレートサービスをスケーラブルなジョブとしてデプロイして推論を実行する方法について説明します。

前提条件

  • 仮想プライベートクラウド (VPC) が作成され、VPCのインターネットアクセスが有効になっています。

    1. VPC、vSwitch、およびセキュリティグループが作成されます。 詳細については、「IPv4 CIDRブロックを使用したVPCの作成」および「セキュリティグループの作成」をご参照ください。

    2. インターネットNATゲートウェイがVPCに作成されます。 elastic IPアドレス (EIP) がゲートウェイに関連付けられ、SNATエントリがゲートウェイで設定されます。 詳細については、「インターネットNATゲートウェイのSNAT機能を使用したインターネットへのアクセス」をご参照ください。

  • モデルトレーニングとポートレート作成のために、5〜20枚のトレーニング画像と1枚のテンプレート画像を用意する。 次のイメージ形式がサポートされています。. jpg. jpeg、および. png

    • ソロポートレートを作成するには、人の顔を含むテンプレート画像のみが必要です。 複数のトレーニング画像内の顔は、同じ人物に属します。

    • 複数人のポートレートを作成するには、テンプレート画像に複数の顔が含まれている必要があり、顔の数はモデルトレーニングで指定されたmodel_idパラメーターの値と同じである必要があります。

    • 各画像のサイズが512x512ピクセルより大きいことを確認してください。

  • Object Storage Service (OSS) バケットが作成されます。 詳細については、「バケットの作成」をご参照ください。

制限事項

AIポートレートソリューションは、中国 (北京) とシンガポールのリージョンでのみサポートされています。

モデル推論用のスケーラブルなジョブのデプロイ

  1. PAI コンソールにログインします。 ページ上部のリージョンを選択します。 次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) の入力] をクリックします。

  2. 検証サービスをデプロイします。

    1. [サービスのデプロイ] をクリックします。 [カスタムモデルのデプロイ] セクションで、[カスタムデプロイ] をクリックします。

    2. [カスタムデプロイ] ページで、パラメーターを設定します。 次の表に、主要なパラメーターを示します。 他のパラメーターについてはデフォルト値を使用します。 詳細については、「PAIコンソールでのモデルサービスのデプロイ」をご参照ください。

      • [基本情報] セクションで、[サービス名] (photog_checkなど) を入力します。

      • [環境情報] セクションで、次のパラメーターを設定します。

        項目

        説明

        デプロイ方法

        [イメージベースのデプロイ] を選択し、[非同期サービス] を有効にします。

        イメージ設定

        [イメージアドレス] を選択し、イメージアドレスを指定します。 有効な値:

        • 中国 (北京) リージョンの画像アドレス: 1.0.0.pub

        • シンガポール地域の画像アドレス: 1.0.0.pub

        コードビルド

        [OSS] をクリックし、次のパラメーターを設定します。

        • OSS: OSSバケットパスを選択します。 例: oss:// examplebucket/

        • マウントパス: この例では、/photog_ossが使用されます。

        コマンド

        python app.pyに設定します。

        ポート番号

        7860に設定します。

      • [リソースのデプロイ] セクションで、次のパラメーターを設定します。

        パラメーター

        説明

        リソースタイプ

        [パブリックリソース] を選択します。

        デプロイリソース

        [GPU] タブで-gu30インスタンスタイプを選択します。 ml.gu7i.c32m188.1-gu30インスタンスタイプの使用を推奨します。

        追加のシステムディスク

        値を120に設定します。 (単位:GB)

      • [非同期サービス] セクションで、次のパラメーターを設定します。

        パラメーター

        説明

        リソースタイプ

        [パブリックリソース] を選択します。

        デプロイ

        • 最小インスタンス数: 1

        • vCPU: 8コア

        • メモリ (GB): 64

        単一入力リクエストの最大データ

        値を20480 KBに設定して、キュー内の各リクエストに十分なストレージスペースを確保します。

        単一出力の最大データ

      • [VPC] セクションで、作成した仮想プライベートクラウド (VPC) 、vSwitch、およびセキュリティグループを選択します。

      • [サービス設定] セクションで、次のオプションを追加します。 詳細については、完全な設定例をご参照ください。

        項目

        追加オプション

        メタデータ

        次のオプションを追加します。

        "rpc": {
                    "keepalive": 3600000,
                    "worker_threads": 1
                }
        • keepalive: 1つのリクエストの最大処理時間。 単位:ミリ秒。 値を3600000に設定します。

        • worker_threads: 各EASインスタンスでリクエストを同時に処理するために使用されるスレッドの数。

          デフォルト値は5で、キューにある最初の5つのタスクが同じインスタンスに割り当てられることを指定します。 リクエストを順番にキューに入れて処理するために、このオプションを1に設定することを推奨します。

        キュー

        失敗後の繰り返し配信を防ぐには、"max_delivery": 1オプションを追加します。

        完全な設定の例:

        {
            "metadata": {
                "name": "photog_check",
                "instance": 1,
                "rpc": {
                    "keepalive": 3600000,
                    "worker_threads": 1
                },
                "type": "Async"
            },
            "cloud": {
                "computing": {
                    "instance_type": "ml.gu7i.c32m188.1-gu30",
                    "instances": null
                },
                "networking": {
                    "vswitch_id": "vsw-2ze4o9kww55051tf2****",
                    "security_group_id": "sg-2ze0kgiee55d0fn4****",
                    "vpc_id": "vpc-2ze5hl4ozjl4fo7q3****"
                }
            },
            "features": {
                "eas.aliyun.com/extra-ephemeral-storage": "100Gi"
            },
            "queue": {
                "cpu": 8,
                "max_delivery": 1,
                "min_replica": 1,
                "memory": 64000,
                "resource": "",
                "source": {
                    "max_payload_size_kb": 20480
                },
                "sink": {
                    "max_payload_size_kb": 20480
                }
            },
            "storage": [
                {
                    "oss": {
                        "path": "oss://examplebucket/",
                        "readOnly": false
                    },
                    "properties": {
                        "resource_type": "code"
                    },
                    "mount_path": "/photog_oss"
                }
            ],
            "containers": [
                {
                    "image": "registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:check.1.0.0.pub",
                    "script": "python app.py",
                    "port": 7860
                }
            ]
        }
    3. [デプロイ] をクリックします。

  3. トレーニングサービスを展開します。

    1. [サービスのデプロイ] をクリックします。 [カスタムモデルのデプロイ] セクションで、[カスタムデプロイ] をクリックします。

    2. [カスタムデプロイ] ページで、パラメーターを設定します。 次の表に、主要なパラメーターを示します。 他のパラメーターについてはデフォルト値を使用します。 詳細については、「PAIコンソールでのモデルサービスのデプロイ」をご参照ください。

      • [基本情報] セクションで、[サービス名] (photog_checkなど) を入力します。

      • [環境情報] セクションで、次のパラメーターを設定します。

        パラメーター

        説明

        デプロイ方法

        [イメージベースのデプロイ] を選択し、[非同期サービス] を有効にします。

        イメージ設定

        [イメージアドレス] を選択し、イメージアドレスを指定します。 有効な値:

        • 中国 (北京) リージョンの画像アドレス: 1.0.0.pub

        • シンガポール地域の画像アドレス: 1.0.0.pub

        コードビルド

        [OSS] をクリックし、次のパラメーターを設定します。

        • OSS: 検証サービスに指定したOSSバケットパスを選択します。 例: oss:// examplebucket/

        • マウントパス: この例では、/photog_ossが使用されます。

        コマンド

        python app.pyに設定します。

        ポート番号

        7860に設定します。

      • [リソースのデプロイ] セクションで、次のパラメーターを設定します。

        パラメーター

        説明

        リソースタイプ

        [パブリックリソース] を選択します。

        デプロイリソース

        [GPU] タブで-gu30インスタンスタイプを選択します。 ml.gu7i.c32m188.1-gu30インスタンスタイプの使用を推奨します。

        追加のシステムディスク

        値を120に設定します。 (単位:GB)

      • [非同期サービス] セクションで、次のパラメーターを設定します。

        パラメーター

        説明

        リソースタイプ

        [パブリックリソース] を選択します。

        デプロイ

        • 最小インスタンス数: 1

        • vCPU: 8コア

        • メモリ (GB): 64

        単一入力リクエストの最大データ

        値を20480 KBに設定して、キュー内の各リクエストに十分なストレージスペースを確保します。

        単一出力の最大データ

      • [VPC] セクションで、作成した仮想プライベートクラウド (VPC) 、vSwitch、およびセキュリティグループを選択します。

      • [サービス設定] セクションで、次のオプションを追加します。 詳細については、完全な設定例をご参照ください。

        項目

        追加オプション

        autoscaler

        必要に応じて、 サービスの自動スケーリングの設定。 詳細については、「自動スケーリング」をご参照ください。

        "behavior": {
          "scaleDown": {
            "stabilizationWindowSeconds": 60
          }
        },
        "max": 5,
        "min": 1,
        "strategies": {
                    "queue[backlog]": 1
        }

        metadata

        次のオプションを追加します。

        "rpc": {
                    "keepalive": 3600000,
                    "worker_threads": 1
                }
        • keepalive: 1つのリクエストの最大処理時間。 単位:ミリ秒。 値を3600000に設定します。

        • worker_threads: 各EASインスタンスで要求を同時に処理するために使用されるスレッドの数。

          デフォルト値は5で、キューにある最初の5つのタスクが同じインスタンスに割り当てられることを指定します。 リクエストを順番にキューに入れて処理するために、このオプションを1に設定することを推奨します。

        キュー

        失敗後の繰り返し配信を防ぐには、"max_delivery": 1オプションを追加します。

        完全な設定の例:

        {
            "autoscaler": {
                "behavior": {
                    "scaleDown": {
                        "stabilizationWindowSeconds": 60
                    }
                },
                "max": 5,
                "min": 1,
                "strategies": {
                    "queue[backlog]": 1
                }
            },
            "metadata": {
                "name": "photog_train_pmml",
                "instance": 1,
                "rpc": {
                    "keepalive": 3600000,
                    "worker_threads": 1
                },
                "type": "Async"
            },
            "cloud": {
                "computing": {
                    "instance_type": "ml.gu7i.c32m188.1-gu30",
                    "instances": null
                },
                "networking": {
                    "vswitch_id": "vsw-2ze4o9kww55051tf2****",
                    "security_group_id": "sg-2ze0kgiee55d0fn4****",
                    "vpc_id": "vpc-2ze5hl4ozjl4fo7q3****"
                }
            },
            "features": {
                "eas.aliyun.com/extra-ephemeral-storage": "120Gi"
            },
            "queue": {
                "cpu": 8,
                "max_delivery": 1,
                "min_replica": 1,
                "memory": 64000,
                "resource": "",
                "source": {
                    "max_payload_size_kb": 20480
                },
                "sink": {
                    "max_payload_size_kb": 20480
                }
            },
            "storage": [
                {
                    "oss": {
                        "path": "oss://examplebucket/",
                        "readOnly": false
                    },
                    "properties": {
                        "resource_type": "code"
                    },
                    "mount_path": "/photog_oss"
                }
            ],
            "containers": [
                {
                    "image": "registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:train.1.0.0.pub",
                    "script": "python app.py",
                    "port": 7860
                }
            ]
        }
    3. [デプロイ] をクリックします。

  4. 予測サービスをデプロイします。

    この例では、予測サービスがスケーラブルなジョブとしてデプロイされています。 以下の手順を実行します。

    1. [サービスのデプロイ] をクリックします。 [カスタムモデルデプロイ] セクションで、[JSONデプロイ] をクリックします。

    2. JSONエディターに次の設定情報を入力します。

      {
          "metadata": {
              "name": "photog_pre_pmml",
              "instance": 1,
              "rpc": {
                  "keepalive": 3600000,
                  "worker_threads": 1
              },
              "type": "ScalableJob"
          },
          "cloud": {
              "computing": {
                  "instance_type": "ecs.gn6v-c8g1.2xlarge",
                  "instances": null
              },
              "networking": {
                  "vswitch_id": "vsw-2ze4o9kww55051tf2****",
                  "security_group_id": "sg-2ze0kgiee55d0fn4****",
                  "vpc_id": "vpc-2ze5hl4ozjl4fo7q3****"
              }
          },
          "features": {
              "eas.aliyun.com/extra-ephemeral-storage": "120Gi"
          },
          "queue": {
              "cpu": 8,
              "max_delivery": 1,
              "min_replica": 1,
              "memory": 64000,
              "resource": "",
              "source": {
                  "max_payload_size_kb": 20480
              },
              "sink": {
                  "max_payload_size_kb": 20480
              }
          },
          "storage": [
              {
                  "oss": {
                      "path": "oss://examplebucket/",
                      "readOnly": false
                  },
                  "properties": {
                      "resource_type": "code"
                  },
                  "mount_path": "/photog_oss"
              }
          ],
          "containers": [
              {
                  "image": "registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:infer.1.0.0.pub",
                  "env": [
                      {
                          "name": "URL",
                          "value": "http://127.0.0.1:8000"
                      },
                      {
                          "name": "AUTHORIZATION",
                          "value": "="
                      }
                  ],
                  "script": "python app.py",
                  "port": 7861
              },
              {
                  "image": "eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2",
                  "port": 8000,
                  "script": "./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-install --api --filebrowser --sd-dynamic-cache --data-dir /photog_oss/photog/webui/"
              }
          ]
      }

      次の表に、主要なパラメーターを示します。 他のパラメーターを設定する方法の詳細については、「サービスモデルに関連するパラメーター」をご参照ください。

      パラメーター

      説明

      メタデータ

      name

      サービス名。リージョン内で一意です。

      タイプ

      非同期推論サービスをスケーラブルなジョブとして展開するには、値をScalableJobに設定します。

      コンテナー

      イメージ

      AIポートレート予測サービスとweb UI予測サービスの画像アドレスを指定する必要があります。 この例では、中国 (北京) リージョンのイメージアドレスが使用されます。 有効な値:

      • 中国 (北京) リージョンの画像アドレス:

        • AIポートレート予測サービス: registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:infer. 1.0.0.pub

        • Web UI予測サービス: eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2

      • シンガポール地域の画像アドレス:

        • AIポートレート予測サービス: registry.ap-southeast-1.aliyuncs.com/mybigpai/photog_pub:infer. 1.0.0.pub

        • Web UI予測サービス: eas-registry-vpc.ap-southeast-1.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2

      ストレージ

      パス

      この例では、OSSマウントが使用されています。 検証サービスに指定したOSSバケットのパスに値を設定します。 例: oss:// examplebucket/

      WebUIモデルファイルファイルをダウンロードして解凍します。 ファイルをOSSバケットに保存します。 この例では、oss:// examplebucket/photog_oss/webuiパスが使用されています。 オブジェクトをOSSバケットにアップロードする方法については、「ossutilの概要」をご参照ください。 File Storage NASファイルシステムにファイルをアップロードする方法については、「Linux ECSインスタンスにファイルシステムをマウントする」および「ファイルの管理」をご参照ください。

      mount_path

      値を /photog_ossに設定します。

  5. [デプロイ] をクリックします。

    スケーラブルなジョブをデプロイすると、システムは自動的にキューサービスを作成し、サービスの自動スケーリング機能を有効にします。

コールサービス

サービスをデプロイした後、サービスを呼び出してAIポートレートを実装できます。

サービスを呼び出すときは、taskTypeパラメーターをクエリに設定して、リクエストが推論リクエストであることを指定する必要があります。 詳細については、「概要」トピックの「サービスの呼び出し」セクションを参照してください。

サンプルコード:

import json
from eas_prediction import QueueClient

# Create input queue objects to receive input data. 
input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_check')
input_queue.set_token('<token>')
input_queue.init()

datas = json.dumps(
    {
       'request_id'    : 12345,
       'images'        : ["xx.jpg", "xx.jpg"], # urls, a list
       'configure'     : {
            'face_reconize' : True, # Judge whether all pictures are of a person
        }
    }
)
# Set the taskType parameter to query. 
tags = {"taskType": "query"}
index, request_id = input_queue.put(f'{datas}', tags)
print(index, request_id)

# View details about the input queues. 
attrs = input_queue.attributes()
print(attrs)

関連ドキュメント