本文将指导您如何在写真相机方案中使用弹性Job服务实现推理功能,以解决资源利用不充分和缩容过程中请求中断等问题。
前提条件
- 已创建专有网络,并配置公网连接。 - 已创建专有网络VPC、交换机和安全组。具体操作,请参见搭建IPv4专有网络和创建安全组。 
- 已为该VPC创建了公网NAT网关,并为该网关绑定了弹性公网IP、配置了SNAT条目。具体操作,请参见使用公网NAT网关SNAT功能访问互联网。 
 
- 已准备好5~20张训练图片和1张模板图片,用于模型训练和写真制作。图片格式支持.jpg、.jpeg和.png等,请确保图片的尺寸大于512×512像素。 - 单人写真制作:模板图片中包含单张人脸,多张训练图片中的人脸属于同一个人。 
- 多人写真制作:模板图片中需包含多张人脸,且人脸数量与模型训练的model_id数量一致。 
 
- 已创建OSS Bucket,详情请参见创建存储空间。 
使用限制
仅支持在华北2(北京)和新加坡地域使用该方案。
部署推理场景弹性Job服务
部署核验服务
- 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。 
- 单击部署服务,然后在自定义模型部署区域,单击自定义部署。 
- 在自定义部署页面,配置以下关键参数,其他参数取默认配置即可,更多参数配置说明,请参见控制台自定义部署参数说明。 - 在基本信息区域,配置服务名称。例如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类型的挂载方式,并配置以下参数: - Uri:选择您自己的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,防止失败后多次重复投递。
 
- 单击部署。 
部署训练服务
- 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。 
- 单击部署服务,然后在自定义模型部署区域,单击自定义部署。 
- 在自定义部署页面,配置以下关键参数,其他参数取默认配置即可,更多参数配置说明,请参见控制台自定义部署参数说明。 - 在基本信息区域,配置服务名称。例如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类型的挂载方式,并配置以下参数: - Uri:选择您自己的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,防止失败后多次重复投递。
 
- 单击部署。 
部署预测服务
本方案将预测服务部署为弹性Job服务,具体操作步骤如下:
- 单击部署服务,然后在自定义模型部署区域,单击JSON独立部署。 
- 在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/webui/" } ] }- 其中关键参数说明如下,其他参数配置详情,请参见JSON部署参数说明。 - 参数 - 描述 - 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)和文件管理。 - mount_path - 配置为 - /photog_oss。
- 单击部署。 - 弹性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)相关文档
- 使用异步推理服务实现AI写真的具体操作,请参见写真相机方案。 
- 如何在训练场景使用弹性Job服务,请参见部署弹性伸缩的Kohya训练服务。 
- 关于弹性Job服务更详细的内容介绍,请参见弹性Job服务功能介绍。