全部產品
Search
文件中心

Platform For AI:部署寫真相機線上推理服務

更新時間:Nov 30, 2024

在使用非同步推理服務時,可能會遇到資源利用不充分和縮容過程中請求中斷等問題。為瞭解決這些問題,EAS推出了彈性Job服務,該服務對訂閱邏輯進行了最佳化。本文將指導您如何在寫真相機方案中使用彈性Job服務實現推理功能。

前提條件

  • 已建立專用網路,並配置公網串連。

    1. 已建立Virtual Private Cloud、交換器和安全性群組。具體操作,請參見搭建IPv4專用網路建立安全性群組

    2. 已為該VPC建立了公網NAT Gateway,並為該網關綁定了Elastic IP Address、配置了SNAT條目。具體操作,請參見使用公網NAT GatewaySNAT功能訪問互連網

  • 已準備好5-20張訓練圖片和1張模板圖片,用於模型訓練和寫真製作。圖片格式支援.jpg.jpeg.png等。

    • 如果進行單人寫真製作,模板圖片中包含單張人臉即可。多張訓練圖片中的人臉屬於同一個人。

    • 如果進行多人寫真製作,模板圖片中需包含多張人臉,且人臉數量與模型訓練的model_id數量一致。

    • 請確保訓練圖片和模板圖片的尺寸大於512×512像素。

  • 已建立OSS Bucket,詳情請參見建立儲存空間

使用限制

僅支援在華北2(北京)和新加坡地區使用該方案。

部署推理情境彈性Job服務

  1. 登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS

  2. 部署核驗服務。

    1. 單擊部署服務,然後在自訂模型部署地區,單擊自訂部署

    2. 自訂部署頁面,配置以下關鍵參數,其他參數取預設配置即可,更多參數配置說明,請參見控制台上傳部署

      • 基本資料地區,佈建服務名稱。例如photog_check。

      • 環境資訊地區中,配置以下參數:

        參數

        描述

        部署方式

        選擇鏡像部署,並選中非同步服務

        鏡像配置

        選中鏡像地址,並在文字框中輸入鏡像地址,取值如下:

        • 華北2(北京)的鏡像地址為:registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:check.1.0.0.pub

        • 新加坡的鏡像地址為:registry.ap-southeast-1.aliyuncs.com/mybigpai/photog_pub:check.1.0.0.pub

        代碼配置

        選擇OSS類型的掛載方式,並配置以下參數:

        • OSS:選擇您自己的OSS Bucket路徑。例如oss://examplebucket/

        • 掛載路徑:配置為/photog_oss

        運行命令

        配置為python app.py

        連接埠號碼

        配置為7860。

      • 資源部署地區中,配置以下參數:

        參數

        描述

        資源類型

        選擇公用資源

        部署資源

        資源規格選擇GPU類型的GU30系列機型,推薦使用ml.gu7i.c32m188.1-gu30

        額外系統硬碟

        配置為120 GB。

      • 非同步服務地區中,配置以下參數:

        參數

        描述

        資源類型

        選擇公用資源

        部署資源

        • 最小執行個體數:1。

        • CPU(核心數):8核。

        • 記憶體(GB):64 GB。

        單一輸入請求最巨量資料

        配置為20480 KB。避免隊列中每個請求的儲存空間不足。

        單一輸出返回最巨量資料

      • 專用網路地區中,選擇已建立的VPC、交換器和安全性群組。

      • 服務配置地區中,添加以下配置,您可以參考下方的完整配置樣本,來添加新增的參數。

        欄位

        新增的參數

        metadata

        增加以下參數:

        "rpc": {
                    "keepalive": 3600000,
                    "worker_threads": 1
                }
        • keepalive:單個請求的最長處理時間,單位為毫秒,配置為3600000。

        • worker_threads:EAS每個執行個體中用於並發處理請求的線程數。

          預設為5,表示最先進入隊列的前五個任務會被分配到同一個執行個體上。建議將該參數設定為1,這樣可以確保請求按順序排隊處理。

        queue

        增加參數"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. 自訂部署頁面,配置以下關鍵參數,其他參數取預設配置即可,更多參數配置說明,請參見控制台上傳部署

      • 基本資料地區,佈建服務名稱。例如photog_train_pmml。

      • 環境資訊地區中,配置以下參數:

        參數

        描述

        部署方式

        選擇鏡像部署,並選中非同步服務

        鏡像配置

        選中鏡像地址,並在文字框中輸入鏡像地址,取值如下:

        • 華北2(北京)的鏡像地址為:registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:train.1.0.0.pub

        • 新加坡的鏡像地址為:registry.ap-southeast-1.aliyuncs.com/mybigpai/photog_pub:train.1.0.0.pub

        代碼配置

        選擇OSS類型的掛載方式,並配置以下參數:

        • OSS:選擇您自己的OSS Bucket路徑,與核驗服務選擇的OSS路徑保持一致。例如oss://examplebucket/

        • 掛載路徑:配置為/photog_oss

        運行命令

        配置為python app.py

        連接埠號碼

        配置為7860。

      • 資源部署地區中,配置以下參數:

        參數

        描述

        資源類型

        選擇公用資源

        部署資源

        資源規格選擇GPU類型的GU30系列機型,推薦使用ml.gu7i.c32m188.1-gu30

        額外系統硬碟

        配置為120 GB。

      • 非同步服務地區中,配置以下參數:

        參數

        描述

        資源類型

        選擇公用資源

        部署資源

        • 最小執行個體數:1。

        • CPU(核心數):8核。

        • 記憶體(GB):64 GB。

        單一輸入請求最巨量資料

        配置為20480 KB。避免隊列中每個請求的儲存空間不足。

        單一輸出返回最巨量資料

      • 專用網路地區中,選擇已建立的VPC、交換器和安全性群組。

      • 服務配置地區中,添加以下配置,您可以參考下方的完整配置樣本,來添加新增的參數。

        欄位

        新增的參數

        autoscaler

        (可選)水平自動擴縮容配置,詳情請參見水平自動擴縮容功能

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

        metadata

        增加以下參數:

        "rpc": {
                    "keepalive": 3600000,
                    "worker_threads": 1
                }
        • keepalive:單個請求的最長處理時間,單位為毫秒,配置為3600000。

        • worker_threads:EAS每個執行個體中用於並發處理請求的線程數。

          預設為5,表示最先進入隊列的前五個任務會被分配到同一個執行個體上。建議將該參數設定為1,這樣可以確保請求按順序排隊處理。

        queue

        增加參數"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. 部署預測服務。

    本方案將預測服務部署為彈性Job服務,具體操作步驟如下:

    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/"
              }
          ]
      }

      其中關鍵參數說明如下,其他參數配置詳情,請參見服務模型所有相關參數說明

      參數

      描述

      metadata

      name

      自訂服務名稱,在同地區內唯一。

      type

      配置為ScalableJob,非同步推理服務會以彈性Job的形式進行部署。

      containers

      image

      需要同時配置AI寫真預測服務和WebUI預測服務鏡像地址。支援配置的鏡像列表如下,本方案選擇華北2(北京)地區的鏡像地址。

      • 華北2(北京)鏡像地址:

        • AI寫真預測服務:registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:infer.1.0.0.pub

        • WebUI預測服務: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

        • WebUI預測服務:eas-registry-vpc.ap-southeast-1.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2

      storage

      path

      本方案以OSS掛載為例,配置為您自己的OSS Bucket路徑,與核驗服務選擇的OSS路徑保持一致,例如oss://examplebucket/

      您需要下載並解壓WebUI所需的模型檔案,並將其按照下圖布局方式存放到您的OSS Bucket路徑oss://examplebucket/photog_oss/webui中。關於如何將檔案上傳到OSS Bucket路徑,詳情請參見命令列工具ossutil 1.0。關於如何將檔案上傳到NAS路徑,詳情請參見快速入門(Linux)檔案管理image.png

      mount_path

      配置為/photog_oss

  5. 單擊部署

    彈性Job服務部署成功後,會自動建立佇列服務,同時預設啟動Autoscaler(水平自動擴縮容)功能。

調用服務

服務部署成功後,您可以通過調用服務實現AI寫真。

調用服務時,您需要參考服務調用指定taskType為query,來標識發送的是推理請求,範例程式碼如下:

import json
from eas_prediction import QueueClient

# 建立輸入隊列對象,用於寫入輸入資料。
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
        }
    }
)
# 指定taskType為query。
tags = {"taskType": "query"}
index, request_id = input_queue.put(f'{datas}', tags)
print(index, request_id)

# 查看輸入隊列的詳情。
attrs = input_queue.attributes()
print(attrs)

相關文檔