全部产品
Search
文档中心

人工智能平台 PAI:部署写真相机在线推理服务

更新时间:Nov 18, 2024

在使用异步推理服务时,可能会遇到资源利用不充分和缩容过程中请求中断等问题。为了解决这些问题,EAS推出了弹性Job服务,该服务对订阅逻辑进行了优化。本文将指导您如何在写真相机方案中使用弹性Job服务实现推理功能。

前提条件

  • 已创建专有网络,并配置公网连接。

    1. 已创建专有网络VPC、交换机和安全组。具体操作,请参见搭建IPv4专有网络创建安全组

    2. 已为该VPC创建了公网NAT网关,并为该网关绑定了弹性公网IP、配置了SNAT条目。具体操作,请参见使用公网NAT网关SNAT功能访问互联网

  • 已准备好5-20张训练图片和1张模板图片,用于模型训练和写真制作。图片格式支持.jpg.jpeg.png等。

    • 如果进行单人写真制作,模板图片中包含单张人脸即可。多张训练图片中的人脸属于同一个人。

    • 如果进行多人写真制作,模板图片中需包含多张人脸,且人脸数量与模型训练的model_id数量一致。

    • 请确保训练图片和模板图片的尺寸大于512×512像素。

  • 已创建OSS Bucket,详情请参见创建存储空间

使用限制

仅支持在华北2(北京)和新加坡地域使用该方案。

部署推理场景弹性Job服务

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 部署核验服务。

    1. 模型在线服务(EAS)页面,单击部署服务,在自定义模型部署区域,单击自定义部署

    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 Bucket路径。例如oss://examplebucket/

        • 挂载路径:配置为/photog_oss

        运行命令

        • 运行命令配置为python app.py

        • 端口号配置为7860。

      • 资源部署信息区域中,配置以下参数:

        参数

        描述

        资源组种类

        选择公共资源组

        资源配置方法

        选择常规资源配置

        资源配置选择

        选择GPU下的gu30系列机型,推荐使用ml.gu7i.c32m188.1-gu30

        系统盘配置

        将额外系统盘配置为120 GB。

      • 异步服务配置区域中,配置以下参数:

        参数

        描述

        异步队列资源配置

        选择公共资源组

        异步队列占用资源

        • 最小实例数:1。

        • CPU:8核。

        • 内存: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. 模型在线服务(EAS)页面,单击部署服务,在自定义模型部署区域,单击自定义部署

    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 Bucket路径,与核验服务选择的OSS路径保持一致。例如oss://examplebucket/

        • 挂载路径:配置为/photog_oss

        运行命令

        • 运行命令配置为python app.py

        • 端口号配置为7860。

      • 资源部署信息区域中,配置以下参数:

        参数

        描述

        资源组种类

        选择公共资源组

        资源配置方法

        选择常规资源配置

        资源配置选择

        选择GPU下的gu30系列机型,推荐使用ml.gu7i.c32m188.1-gu30

        系统盘配置

        将额外系统盘配置为120 GB。

      • 异步服务配置区域中,配置以下参数:

        参数

        描述

        异步队列资源配置

        选择公共资源组

        异步队列占用资源

        • 最小实例数:1。

        • CPU:8核。

        • 内存: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. 模型在线服务(EAS)页面,单击部署服务,在自定义模型部署区域,单击自定义部署

    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概述。关于如何将文件上传到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)

相关文档