寫真相機方案實現了自動化訓練使用者專屬的LoRA模型,並利用LoRA模型和模板圖片產生使用者個人化的寫真照片。模型線上服務(EAS)是PAI提供的模型服務平台。該方案定義了一套演算法流程,可以部署為EAS模型線上服務,並提供了相關的調用介面,用於實現AI寫真。本文為您介紹如何部署相關的EAS模型線上服務並調用介面實現AI寫真。
背景資訊
EAS相關功能說明
EAS是PAI提供的模型服務平台,在寫真相機方案中,使用的核心功能包括:
通過自訂鏡像部署模型服務(包括核驗服務、訓練服務和預測服務),基於PAI的寫真相機演算法流程提供了映像核驗、LoRA訓練和映像產生三個API介面服務,同時支援要求的負載平衡和GPU執行個體的自動擴縮容。
該功能支援非同步隊列操作,可以查詢和操作隊列消費狀態,並且可以設定隊列優先順序。詳情請參見非同步推理服務。
提供了Python和Java的SDK,支援透傳業務定義的自訂參數。詳情請參見服務調用SDK。
寫真相機演算法流程介紹
前提條件
已建立專用網路,並配置公網串連。
已建立Virtual Private Cloud、交換器和安全性群組。具體操作,請參見搭建IPv4專用網路和建立安全性群組。
已為該VPC建立了公網NAT Gateway,並為該網關綁定了Elastic IP Address、配置了SNAT條目。具體操作,請參見使用公網NAT GatewaySNAT功能訪問互連網。
已開通PAI-EAS並建立預設工作空間,詳情請參見開通並建立預設工作空間。
如果使用RAM使用者來部署模型,需要為RAM使用者授予PAI-EAS的系統管理權限,詳情請參見雲產品依賴與授權:EAS。
已準備好5~20張訓練圖片和1張模板圖片,用於模型訓練和寫真製作。圖片格式支援.jpg、.jpeg和.png等,請確保圖片的尺寸大於512×512像素。
單人寫真製作:模板圖片中包含單張人臉,多張訓練圖片中的人臉屬於同一個人。
多人寫真製作:模板圖片中需包含多張人臉,且人臉數量與模型訓練的model_id數量一致。
使用限制
僅支援在華北2(北京)和新加坡地區使用該方案。
部署PAI-EAS模型服務
部署核驗服務
登入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。
NAS
选择文件系统:選擇NAS檔案系統。
文件系统挂载点:選擇NAS掛載點。
文件系统路径:配置為需要掛載的NAS中的源路徑,例如
/。挂载路径:配置為
/photog_oss。
运行命令
配置為
python app.py。端口号
配置為7860。
在资源信息地區中,配置以下參數:
參數
描述
资源类型
選擇公共资源。
部署资源
資源規格選擇GPU類型的GU30系列機型,推薦使用
ml.gu7i.c32m188.1-gu30。配置系统盘
配置為120 GiB。
在非同步退欄區域,配置以下參數:
參數
描述
资源类型
選擇公共资源组。
部署资源
配置以下參數:
最小執行個體數: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 } ] }
單擊部署。
當服务状态為运行中時,服務部署成功。
部署訓練服務
登入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。
NAS
选择文件系统:選擇NAS檔案系統。
文件系统挂载点:選擇NAS掛載點。
文件系统路径:配置為需要掛載的NAS中的源路徑,例如
/。挂载路径:配置為
/photog_oss。
运行命令
配置為
python app.py。端口号
配置為7860。
在资源信息地區中,配置以下參數:
參數
描述
资源类型
選擇公共资源。
部署资源
資源規格選擇GPU類型的GU30系列機型,推薦使用
ml.gu7i.c32m188.1-gu30。配置系统盘
配置為120 GiB。
在异步队列地區中,配置以下參數:
參數
描述
资源类型
選擇公共资源。
部署资源
配置以下參數:
最小執行個體數: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 } ] }
單擊部署。
當服务状态為运行中時,服務部署成功。
部署預測服務
登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS。
在推理服务頁簽,單擊部署服务,然後在自定义模型部署地區,單擊自定义部署。
在自定义部署頁面,配置以下關鍵參數。
在基本信息地區中,參考介面提示,自訂服務名稱。例如photog_pre_pmml。
在环境信息地區中,配置以下參數:
參數
描述
部署方式
選擇镜像部署,並選中异步队列。
镜像配置
選中镜像地址,並在文字框中輸入鏡像地址。需要同時配置AI寫真預測服務和WebUI預測服務鏡像地址,在該地區中只需要配置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。
存储挂载
進行代碼配置。支援以下掛載方式,本方案選擇OSS掛載。
OSS
Uri:選擇您自己的OSS Bucket路徑,與核驗服務選擇的OSS路徑保持一致。例如
oss://examplebucket/。挂载路径:配置為
/photog_oss。
NAS
选择文件系统:選擇NAS檔案系統。
文件系统挂载点:選擇NAS掛載點。
文件系统路径:配置為需要掛載的NAS中的源路徑,例如
/。挂载路径:配置為
/photog_oss。
您需要下載並解壓WebUI所需的模型檔案,並將其按照下圖布局方式存放到您的OSS Bucket路徑
oss://examplebucket/photog_oss/webui或NAS路徑/photog_oss/webui中。關於如何將檔案上傳到OSS Bucket路徑,詳情請參見命令列工具ossutil 1.0。關於如何將檔案上傳到NAS路徑,詳情請參見快速入門(Linux)和使用Workbench管理ECS上的檔案。
环境变量
單擊添加,配置以下兩個環境變數:
變數名:
URL;變數值:http://127.0.0.1:8000。變數名:
AUTHORIZATION;變數值:=。
运行命令
配置為
python app.py。端口号
配置為7860。
在资源信息地區中,配置以下參數:
參數
描述
资源类型
選擇公共资源。
部署资源
資源規格選擇GPU類型的GU30系列機型,推薦使用
ml.gu7i.c32m188.1-gu30。配置系统盘
配置為120 GiB。
在异步队列地區中,配置以下參數:
參數
描述
资源类型
選擇公共资源。
部署资源
配置以下參數:
最小執行個體數:1。
CPU:8核。
記憶體:64GB。
单一输入请求最大数据
配置為20480 KB。避免隊列中每個請求的儲存空間不足。
单一输出返回最大数据
在网络信息地區中,選擇已建立的VPC、交換器和安全性群組。
在服务配置地區中,添加以下配置,您可以參考下方的完整配置樣本,來添加新增的參數。
欄位
新增的參數
metadata
增加以下參數:
"rpc": { "keepalive": 3600000, "worker_threads": 1 }keepalive:單個請求的最長處理時間,單位為毫秒,配置為3600000。
worker_threads:EAS每個執行個體中用於並發處理請求的線程數。
預設為5,表示最先進入隊列的前五個任務會被分配到同一個執行個體上。建議將該參數設定為1,這樣可以確保請求按順序排隊處理。
containers
增加以下參數:
{ "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/" }分別表示WebUI預測服務鏡像以及對應的運行命令和連接埠號碼。
queue
增加參數
"max_delivery": 1,防止失敗後多次重複投遞。完整的配置樣本如下:
{ "metadata": { "name": "photog_pre_pmml", "instance": 1, "rpc": { "keepalive": 3600000, "worker_threads": 1 }, "type": "Async" }, "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/" } ] }
單擊部署。
當服务状态為运行中時,服務部署成功。
調用介面
步驟一:調用映像核驗介面
首先您需要在模型在线服务(EAS)頁面,單擊核驗服務名稱進入概览頁面,在基本信息地區單擊查看调用信息,在异步调用頁簽,擷取服務訪問地址和Token。

使用如下代碼建立輸入隊列進行圖片核驗,並擷取隊列資訊。
調用樣本如下:
Python SDK
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 } } ) index, request_id = input_queue.put(f'{datas}') print(index, request_id) # 查看輸入隊列的詳情。 attrs = input_queue.attributes() print(attrs)其中關鍵配置說明如下:
關鍵配置
描述
預設值
是否必填
input_queue
配置為已擷取的核驗服務的訪問地址,請參考上述程式碼範例進行配置,STRING類型。
無
是
<token>
替換為已擷取的核驗服務的Token,STRING類型。
無
是
request_id
請求ID,STRING類型。
無
是
images
配置為模型訓練使用圖片的URL地址,LIST類型。
無
是
configure
face_reconize
判斷多張圖片中的人臉是否為同一個人,BOOL類型。
False
否
Java SDK
import com.aliyun.openservices.eas.predict.http.HttpConfig; import com.aliyun.openservices.eas.predict.http.QueueClient; import com.aliyun.openservices.eas.predict.queue_client.QueueUser; import org.apache.commons.lang3.tuple.Pair; public class AsyncTest { public static void main(String[] args) throws Exception { /** 建立佇列服務用戶端 */ String queueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com"; String inputQueueName = "photog_check"; String queueToken = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****=="; QueueClient inputQueue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser()); /** 請求資料 */ String data = "{\n" + " 'request_id': 12345,\n" + " 'images' : [\"xx.jpg\", \"xx.jpg\"],\n" + " 'configure' : {\n" + " 'face_reconize' : True,\n" + " }\n" + "}"; Pair<Long, String> entry = inputQueue.put(data.getBytes(), null); System.out.println(String.format("index = %s, request id = %s", entry.getKey(), entry.getValue())); // 查看輸入隊列的詳情 System.out.println(inputQueue.attributes()); /** 關閉用戶端 */ inputQueue.shutdown(); } }其中:
關鍵配置
描述
預設值
是否必填
queueEndpoint
配置為已擷取的核驗服務的訪問地址,STRING類型。
無
是
inputQueueName
配置為核驗服務的名稱,STRING類型。
無
是
queueToken
替換為已擷取的核驗服務的Token,STRING類型。
無
是
request_id
請求ID,STRING類型。
無
是
images
配置為模型訓練使用圖片的URL地址,LIST類型。
無
是
configure
face_reconize
判斷多張圖片中的人臉是否為同一個人,BOOL類型。
False
否
系統返回結果如下:
Python SDK
1 6bdea119-01f3-4728-b3d3-b0af366ad3eb {'consumers.list.[0]': 'Id: photog_check.photog-check-738569a9-798897bdf5-76****, Index: 0, Pending: 0, Status: Running, Idle: 1h10m4.997s, Window: 1, Slots: 1, AutoCommit: false', 'consumers.stats.total': '1', 'consumers.status.total': '1', 'groups.list.[0]': 'Id: photog_check, Index: 1, Pending: 1, Delivered: 2, Consumers: 1', 'meta.header.group': 'X-EAS-QueueService-Gid', 'meta.header.priority': 'X-EAS-QueueService-Priority', 'meta.header.user': 'X-EAS-QueueService-Uid', 'meta.name': 'photog-check-queue-95e006df', 'meta.state': 'Normal', 'stream.approxMaxLength': '1439', 'stream.firstEntry': '1', 'stream.lastEntry': '1', 'stream.length': '1', 'stream.maxPayloadBytes': '20971520'}Java SDK
index = 2, request id = 61132b43-a527-40dc-89bb-a9a48316ddea {"meta.header.priority":"X-EAS-QueueService-Priority","consumers.status.total":"1","stream.firstEntry":"2","stream.maxPayloadBytes":"20971520","consumers.stats.total":"1","stream.approxMaxLength":"1439","stream.length":"1","groups.list.[0]":"Id: photog_check, Index: 2, Pending: 1, Delivered: 3, Consumers: 1","meta.header.group":"X-EAS-QueueService-Gid","stream.lastEntry":"2","consumers.list.[0]":"Id: photog_check.photog-check-738569a9-798897bdf5-76j48, Index: 2, Pending: 0, Status: Running, Idle: 19m11.174s, Window: 1, Slots: 1, AutoCommit: false","meta.name":"photog-check-queue-95e006df","meta.state":"Normal","meta.header.user":"X-EAS-QueueService-Uid"} Process finished with exit code 0其中:
index:表示該請求是EAS中的第幾個請求。
request_id:表示該請求的ID,後續使用該ID擷取輸出結果。
其他內容表示輸入隊列詳情。
使用如下代碼建立輸出隊列並擷取返回結果,通過返回結果來確認圖片是否符合要求。
調用樣本如下:
Python SDK
# 建立輸出隊列對象,用於訂閱讀取輸出結果資料。 sink_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_check/sink') sink_queue.set_token('<token>') sink_queue.init() sink_queue.get(request_id, auto_delete=True)[0].data.decode('utf-8')其中:
sink_queue:配置為已擷取的核驗服務的訪問地址。
<token>:替換為已擷取的核驗服務的Token。
auto_delete:預設為True。如果在查詢隊列時直接使用request_id,但沒有設定
auto_delete參數,那麼將會刪除該隊列的結果。由於輸出隊列通常需要刪除隊列內容,建議將auto_delete參數設定為True。
Java SDK
import com.aliyun.openservices.eas.predict.http.HttpConfig; import com.aliyun.openservices.eas.predict.http.QueueClient; import com.aliyun.openservices.eas.predict.queue_client.DataFrame; import com.aliyun.openservices.eas.predict.queue_client.QueueUser; import org.apache.commons.lang3.tuple.Pair; import java.util.HashMap; import java.util.Map; public class AsyncPhotoTest { public static void main(String[] args) throws Exception { /** 建立佇列服務用戶端 */ String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com"; String inputQueueName = "photog_check"; String sinkQueueName = String.format("%s/sink", inputQueueName); String queueToken = "YjczMzFlYmRkMDU4YmZmMGQ4NTEwODA4NDk3NmFhODE5N2ExMzEy****"; QueueClient inputQueue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser()); QueueClient sinkQueue = new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser()); /** 請求資料 */ String data = "{\n" + " \"request_id\": 12345,\n" + " \"images\": [\"xx.jpg\", \"xx.jpg\"],\n" + " \"configure\": {\n" + " \"face_reconize\": true\n" + " }\n" + "}"; Pair<Long, String> entry = inputQueue.put(data.getBytes(), null); Long index = entry.getKey(); final String requestId = entry.getValue(); System.out.println(String.format("index = %d, request id = %s", index, requestId)); // 查看輸入隊列的詳情 System.out.println(inputQueue.attributes()); // 查看輸入資料 Map<String, String> tags = new HashMap<String, String>() { { put("requestId", requestId); } }; DataFrame[] dfs = inputQueue.get(0, 1L, 0, false, tags); if (dfs.length > 0) { System.out.println(String.format("Successfully get input data = %s, index = %d, tags = %s", new String(dfs[0].getData()), dfs[0].getIndex(), dfs[0].getTags())); } else { System.out.println("no data"); } // 查看輸出資料 while (true) { dfs = sinkQueue.get(0, 1L, 0, true, tags); if (dfs.length > 0) { System.out.println(String.format("Successfully get sink data = %s, tags = %s", new String(dfs[0].getData()), dfs[0].getTags())); break; } else { System.out.println("no data"); Thread.sleep(5000); } } /** 關閉用戶端 */ inputQueue.shutdown(); sinkQueue.shutdown(); } }其中:
queueEndpoint:配置為已擷取的核驗服務訪問地址。
inputQueueName:配置為核驗服務的名稱。
queueToken:替換為已擷取的核驗服務的Token。
image:配置為模型訓練使用的圖片的URL地址。
系統返回如下結果:
Python SDK
'{"request_id": "12345", "code": "OK", "message": "success", "data": {"request_id": 12345, "images": ["xx.jpg", "https://xxx.oss-cn-beijing.aliyuncs.com/photog/user_images/foto/train/0.jpg"], "configure": {"face_reconize": true}, "cost_time": 9.820043325424194, "check_results": [{"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", "message": "success", "code": 1, "frontal": true}, {"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/0.jpg", "message": "success", "code": 1, "frontal": false}]}}'Java SDK
Successfully get sink data = {"request_id": "12345", "code": "OK", "message": "success", "data": {"request_id": 12345, "images": ["xx.jpg", "xx.jpg"], "configure": {"face_reconize": true}, "cost_time": 0.2047882080078125, "check_results": [{"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", "message": "success", "code": 1, "frontal": true}, {"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/0.jpg", "message": "success", "code": 1, "frontal": false}]}}參數說明如下:
參數
描述
request_id
請求ID,STRING類型。
code
請求狀態代碼,STRING類型:
OK:表示已完成核驗。
error:表示未完成核驗。
message
請求狀態的詳細資料。如果返回結果為success表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。
data
返回內容詳情,內部欄位說明如下:
check_results:表示輸入的每張圖片的檢測結果。
url:圖片的URL地址。
message:圖片檢測詳情。success表示核驗成功。更多關於message返回結果的可能取值和對應的code,請參見message詳情。
frontal:圖片是否為正面。
cost_time:本次API調用花費的服務端計算時間長度。
images:核驗的圖片URL列表,List類型。
request_id:請求流水號,STRING類型。
步驟二:調用LoRA訓練介面
首先您需要在模型在线服务(EAS)頁面,單擊訓練服務名稱進入概览頁面,在基本信息地區單擊查看调用信息,在异步调用頁簽,擷取服務訪問地址和Token。

使用如下代碼建立輸入隊列進行Lora訓練並擷取隊列資訊。
調用樣本如下:
Python SDK
photog_train_pmmln import json from eas_prediction import QueueClient # 建立輸入隊列對象,用於寫入輸入資料。 input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_train_pmml') input_queue.set_token('<token>') input_queue.init() datas = json.dumps( { 'request_id' : 12345, 'images' : ["xx.jpg", "xx.jpg"], # urls 'configure' : { 'user_id' : "zhoumo", # user id } } ) index, request_id = input_queue.put(f'{datas}') print(index, request_id) # 查看輸入隊列的詳情。 attrs = input_queue.attributes() print(attrs)其中關鍵配置說明如下:
關鍵配置
描述
預設值
是否必填
input_queue
配置為已擷取的訓練服務的訪問地址,請參考上述程式碼範例進行配置,STRING類型。
無
是
<token>
替換為已擷取訓練服務的Token,STRING類型。
無
是
request_id
請求ID。STRING類型。
無
是
images
配置為訓練圖片的URL地址,LIST類型。
無
是
configure
user_id
使用者的ID,STRING類型。
無
是
sex
訓練圖片中人物的性別。
secret
否
max_train_steps
總訓練步數。
400
否
val_save_checkpointing_steps
訓練的驗證步數。
50
否
Java SDK
import com.aliyun.openservices.eas.predict.http.HttpConfig; import com.aliyun.openservices.eas.predict.http.QueueClient; import com.aliyun.openservices.eas.predict.queue_client.QueueUser; import org.apache.commons.lang3.tuple.Pair; public class AsyncTest { public static void main(String[] args) throws Exception { /** 建立佇列服務用戶端 */ String queueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com"; String inputQueueName = "photog_train_pmml"; String queueToken = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****=="; QueueClient inputQueue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser()); /** 請求資料 */ String data = "{\n" + " 'request_id' : 12345,\n" + " 'images' : [\"xx.jpg\", \"xx.jpg\"],\n" + " 'configure' : {\n" + " 'user_id' : \"zhoumo\",\n" + " }\n" + " }"; Pair<Long, String> entry = inputQueue.put(data.getBytes(), null); System.out.println(String.format("index = %s, request id = %s", entry.getKey(), entry.getValue())); // 查看輸入隊列的詳情 System.out.println(inputQueue.attributes()); /** 關閉用戶端 */ inputQueue.shutdown(); } }其中關鍵配置說明如下:
關鍵配置
描述
預設值
是否必填
queueEndpoint
配置為已擷取的訓練服務的訪問地址,STRING類型。
無
是
inputQueueName
配置為訓練服務的名稱,STRING類型。
無
是
queueToken
替換為已擷取訓練服務的Token,STRING類型。
無
是
request_id
請求ID。STRING類型。
無
是
images
配置為訓練圖片的URL地址,LIST類型。
無
是
configure
user_id
使用者的ID,STRING類型。
無
是
sex
訓練圖片中人物的性別。
secret
否
max_train_steps
總訓練步數。
400
否
val_save_checkpointing_steps
訓練的驗證步數。
50
否
系統返回如下結果:
Python SDK
2 bb4ce34d-47e4-425d-bee7-b806e29c6d78 {'consumers.list.[0]': 'Id: photog_train_pmml.photog-train-pmml-78550f91-7545766654-jpdtp, Index: 2, Pending: 0, Status: Running, Idle: 18h46m24.039s, Window: 1, Slots: 1, AutoCommit: false', 'consumers.stats.total': '1', 'consumers.status.total': '1', 'groups.list.[0]': 'Id: photog_train_pmmln, Index: 2, Pending: 1, Delivered: 3, Consumers: 1', 'meta.header.group': 'X-EAS-QueueService-Gid', 'meta.header.priority': 'X-EAS-QueueService-Priority', 'meta.header.user': 'X-EAS-QueueService-Uid', 'meta.name': 'photog-train-pmmln-queue-7a5e7cc6', 'meta.state': 'Normal', 'stream.approxMaxLength': '1438', 'stream.firstEntry': '2', 'stream.lastEntry': '2', 'stream.length': '1', 'stream.maxPayloadBytes': '20971520'}Java SDK
index = 3, request id = ec3b7c21-c395-4490-ae42-8f66d06e9d4d {"meta.header.priority":"X-EAS-QueueService-Priority","consumers.status.total":"1","stream.firstEntry":"3","stream.maxPayloadBytes":"20971520","consumers.stats.total":"1","stream.approxMaxLength":"1438","stream.length":"1","groups.list.[0]":"Id: photog_train_pmml, Index: 3, Pending: 1, Delivered: 4, Consumers: 1","meta.header.group":"X-EAS-QueueService-Gid","stream.lastEntry":"3","consumers.list.[0]":"Id: photog_train_pmmln.photog-train-pmmln-78550f91-7545766654-jpdtp, Index: 3, Pending: 0, Status: Running, Idle: 2h30m57.08s, Window: 1, Slots: 1, AutoCommit: false","meta.name":"photog-train-pmmln-queue-7a5e7cc6","meta.state":"Normal","meta.header.user":"X-EAS-QueueService-Uid"} Process finished with exit code 0其中:
index:表示該請求是EAS中的第幾個請求。
request_id:表示該請求的ID,後續使用該ID擷取輸出結果。
其他內容表示擷取的隊列資訊。
使用以下代碼,建立輸出隊列並訂閱讀取輸出結果資料,以判斷模型訓練是否成功。
調用樣本如下:
Python SDK
# 建立輸出隊列對象,用於訂閱讀取輸出結果資料。 sink_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_train_pmml/sink') sink_queue.set_token('<token>') sink_queue.init() sink_queue.get(request_id, auto_delete=True)[0].data.decode('utf-8')其中:
sink_queue:配置為已擷取的訓練服務訪問地址。
<token>:替換為已擷取訓練服務的Token。
Java SDK
import com.aliyun.openservices.eas.predict.http.HttpConfig; import com.aliyun.openservices.eas.predict.http.QueueClient; import com.aliyun.openservices.eas.predict.queue_client.DataFrame; import com.aliyun.openservices.eas.predict.queue_client.QueueUser; import org.apache.commons.lang3.tuple.Pair; import java.util.HashMap; import java.util.Map; public class AsyncPhotoTest { public static void main(String[] args) throws Exception { /** 建立佇列服務用戶端 */ String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com"; String inputQueueName = "photog_train_pmml"; String sinkQueueName = String.format("%s/sink", inputQueueName); String queueToken = "N2E2YWI0Y2MyNjZmNjdlMWFmZjNhOTM5M2E5ZGNlMGY1NDQwZGYw****"; QueueClient inputQueue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser()); QueueClient sinkQueue = new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser()); /** 請求資料 */ String data = "{\n" + " \"request_id\": 12345,\n" + " \"images\": [\"xx.jpg\", \"xx.jpg\"],\n" + " \"configure\": {\n" + " \"user_id\": \"zhoumo\"\n" + " }\n" + "}"; Pair<Long, String> entry = inputQueue.put(data.getBytes(), null); Long index = entry.getKey(); final String requestId = entry.getValue(); System.out.println(String.format("index = %d, request id = %s", index, requestId)); // 查看輸入隊列的詳情 System.out.println(inputQueue.attributes()); // 查看輸入資料 Map<String, String> tags = new HashMap<String, String>() { { put("requestId", requestId); } }; DataFrame[] dfs = inputQueue.get(0, 1L, 0, false, tags); if (dfs.length > 0) { System.out.println(String.format("Successfully get data = %s, index = %d, tags = %s", new String(dfs[0].getData()), dfs[0].getIndex(), dfs[0].getTags())); } else { System.out.println("no data"); } // 查看輸出資料 while (true) { dfs = sinkQueue.get(0, 1L, 0, true, tags); if (dfs.length > 0) { System.out.println(String.format("Successfully get data = %s, tags = %s", new String(dfs[0].getData()), dfs[0].getTags())); break; } else { System.out.println("no data"); } } /** 關閉用戶端 */ inputQueue.shutdown(); sinkQueue.shutdown(); } }其中:
queueEndpoint:配置為已擷取的訓練服務的訪問地址。
inputQueueName:配置為訓練服務的名稱。
queueToken:替換為已擷取的訓練服務的Token。
images:配置為模型訓練使用圖片的URL地址。
系統返回結果如下:
Python SDK
'{"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "cost_time": 272.7406361103058}}'說明當返回結果中的code為502時,表示訓練進行中中。
Java SDK
... no data no data Successfully get data = {"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "cost_time": 260.7540729045868}}說明當返回結果中顯示
no data時,表示訓練進行中中。參數說明如下:
參數
描述
request_id
請求ID,STRING類型。
code
是否已完成訓練:
OK:表示已完成訓練。
error:表示未完成訓練。
message
返回的運行情況詳細資料。success表示模型訓練成功。
data
返回內容詳情,內部欄位說明如下:
user_id:使用者ID。
cost_time:本次API調用花費的服務端計算時間長度。
步驟三:調用映像產生介面
首先您需要在模型在线服务(EAS)頁面,單擊預測服務名稱進入概览頁面,在基本信息地區單擊查看调用信息,在异步调用頁簽,擷取服務訪問地址和Token。

使用如下代碼建立輸入隊列進行圖片預測,並擷取隊列資訊。
調用樣本如下:
Python SDK
import json from eas_prediction import QueueClient # 建立輸入隊列對象,用於寫入輸入資料。 input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_pre_pmml') input_queue.set_token('<token>') input_queue.init() datas = json.dumps({ 'request_id' : 12345, 'template_image': "xx.jpg", 'configure' : { 'user_id' : "zhoumo", # threshold to get tags. } }) index, request_id = input_queue.put(f'{datas}') print(index, request_id) # 查看輸入隊列的詳情。 attrs = input_queue.attributes() print(attrs) # 利用request_id查詢某個特定的請求 print(input_queue.get(request_id, auto_delete=False)[0].data.decode('utf-8'))其中關鍵配置說明如下:
關鍵配置
描述
預設值
是否必填
input_queue
配置為已擷取的預測服務的訪問地址,請參考上述程式碼範例進行配置,STRING類型。
無
是
<token>
替換為已擷取預測服務的Token,STRING類型。
無
是
request_id
請求ID。STRING類型。
無
是
template_image
配置為模型訓練使用的圖片的URL地址。
無
是
configure
user_id
使用者的ID,STRING類型。
無
是
sex
訓練圖片中人物的性別,STRING類型。
secret
否
first_diffusion_steps
第一次diffusion的步數,INT類型。
50
否
first_denoising_strength
第一次diffusion的強度,FLOAT類型。
0.45
否
second_diffusion_steps
第二次diffusion的步數,INT類型。
20
否
second_denoising_strength
第二次diffusion的強度,FLOAT類型。
0.30
否
more_like_me_before
第一次人臉融合比例,值越大越像,FLOAT類型。
0.50
否
more_like_me
第二次人臉融合比例,值越大越像,FLOAT類型。
0.50
否
mask_region
STRING類型,取值如下:
edge:表示第二次diffusion只對邊緣重建。
face:表示代表第二次diffusion對整個臉部重建。
edge
否
crop_face_preprocess
是否在裁剪人像地區後進行重建。BOOL類型。
True
否
apply_face_fusion_before
是否進行第一次臉部融合,BOOL類型。
True
否
apply_face_fusion_after
是否進行第二次臉部融合,BOOL類型。
True
否
color_shift_middle
是否進行第一次臉部色彩平衡,BOOL類型。
True
否
color_shift_last
是否進行第二次臉部色彩平衡,BOOL類型。
True
否
background_restore
是否對背景進行重建,BOOL類型。
False
否
skin_retouching_bool
是否進行皮膚平滑,BOOL類型。
True
否
photo_enhancement_bool
是否進行人像增強,BOOL類型。
True
否
photo_enhancement_method
人像增強方式,取值如下:
photo_fix
super_resolution
photo_fix
否
makeup_transfer
是否進行妝容遷移,BOOL類型。
False
否
makeup_transfer_ratio
妝容遷移比例,FLOAT類型。
0.50
否
Java SDK
import com.aliyun.openservices.eas.predict.http.HttpConfig; import com.aliyun.openservices.eas.predict.http.QueueClient; import com.aliyun.openservices.eas.predict.queue_client.DataFrame; import com.aliyun.openservices.eas.predict.queue_client.QueueUser; import org.apache.commons.lang3.tuple.Pair; import java.util.HashMap; import java.util.Map; public class AsyncTest { public static void main(String[] args) throws Exception { /** 建立佇列服務用戶端 */ String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com"; String inputQueueName = "photog_pre_pmml"; String queueToken = "NjViMTI2NGQxZWQxYTI1NGE5MGQ1YTQ5Y2Y2MGZjY2VlZTVmNWE1****"; QueueClient inputQueue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser()); /** 請求資料 */ String data = "{\n" + " 'request_id' : 12345, \n" + " 'template_image': \"xx.jpg\", \n" + " 'configure' : { \n" + " 'user_id' : \"zhoumo\",\n" + " } \n" + "}"; Pair<Long, String> entry = inputQueue.put(data.getBytes(), null); System.out.println(String.format("index = %s, request id = %s", entry.getKey(), entry.getValue())); // 查看輸入隊列的詳情 System.out.println(inputQueue.attributes()); // 利用request_id查詢某個特定的請求 final String requestId = entry.getValue(); Map<String, String> tags = new HashMap<String, String>() { { put("requestId", requestId); } }; DataFrame df = inputQueue.get(0, 1L, 0, false, tags)[0]; System.out.println(String.format("Successfully get data = %s, tags = %s", new String(df.getData()), df.getTags())); /** 關閉用戶端 */ inputQueue.shutdown(); } }其中關鍵配置說明如下:
關鍵配置
描述
預設值
是否必填
queueEndpoint
配置為已擷取的預測服務的訪問地址,STRING類型。
無
是
inputQueueName
配置為預測服務的名稱。
無
是
queueToken
替換為已擷取預測服務的Token,STRING類型。
無
是
request_id
請求ID。STRING類型。
無
是
template_image
配置為模型訓練使用的圖片的URL地址。
無
是
configure
user_id
使用者的ID,STRING類型。
無
是
sex
訓練圖片中人物的性別,STRING類型。
secret
否
first_diffusion_steps
第一次diffusion的步數,INT類型。
50
否
first_denoising_strength
第一次diffusion的強度,FLOAT類型。
0.45
否
second_diffusion_steps
第二次diffusion的步數,INT類型。
20
否
second_denoising_strength
第二次diffusion的強度,FLOAT類型。
0.30
否
more_like_me_before
第一次人臉融合比例,值越大越像,FLOAT類型。
0.50
否
more_like_me
第二次人臉融合比例,值越大越像,FLOAT類型。
0.50
否
mask_region
STRING類型,取值如下:
edge:表示第二次diffusion只對邊緣重建。
face:表示代表第二次diffusion對整個臉部重建。
edge
否
crop_face_preprocess
是否在裁剪人像地區後進行重建,並開啟大圖功能。BOOL類型。
True
否
apply_face_fusion_before
是否進行第一次臉部融合,BOOL類型。
True
否
apply_face_fusion_after
是否進行第二次臉部融合,BOOL類型。
True
否
color_shift_middle
是否進行第一次臉部色彩平衡,BOOL類型。
True
否
color_shift_last
是否進行第二次臉部色彩平衡,BOOL類型。
True
否
background_restore
是否對背景進行重建,BOOL類型。
False
否
skin_retouching_bool
是否進行皮膚平滑,BOOL類型。
True
否
photo_enhancement_bool
是否進行人像增強,BOOL類型。
True
否
photo_enhancement_method
人像增強方式,取值如下:
photo_fix
super_resolution
photo_fix
否
makeup_transfer
是否進行妝容遷移,BOOL類型。
False
否
makeup_transfer_ratio
妝容遷移比例,FLOAT類型。
0.50
否
系統返回如下結果:
Python SDK
1 069173d0-dce9-4ed6-913e-cc5fdda38764 {'consumers.list.[0]': 'Id: photog_pre_pmml.photog-pre-pmml-835253f3-686f87d4f-d****, Index: 0, Pending: 0, Status: Running, Idle: 21h41m4.995s, Window: 1, Slots: 1, AutoCommit: false', 'consumers.stats.total': '1', 'consumers.status.total': '1', 'groups.list.[0]': 'Id: photog_pre_pmml, Index: 1, Pending: 1, Delivered: 2, Consumers: 1', 'meta.header.group': 'X-EAS-QueueService-Gid', 'meta.header.priority': 'X-EAS-QueueService-Priority', 'meta.header.user': 'X-EAS-QueueService-Uid', 'meta.name': 'photog-pre-pmml-queue-912f2cdb', 'meta.state': 'Normal', 'stream.approxMaxLength': '1439', 'stream.firstEntry': '1', 'stream.lastEntry': '1', 'stream.length': '1', 'stream.maxPayloadBytes': '20971520'} {"request_id": 12345, "template_image": "https://xx.oss-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", "configure": {"user_id": "zhoumo"}}Java SDK
index = 4, request id = 996cb029-133e-4f18-bb03-e696fc6ae4a1 {"meta.header.priority":"X-EAS-QueueService-Priority","consumers.status.total":"1","stream.firstEntry":"4","stream.maxPayloadBytes":"20971520","consumers.stats.total":"1","stream.approxMaxLength":"1436","stream.length":"1","groups.list.[0]":"Id: photog_pre_pmml, Index: 4, Pending: 1, Delivered: 5, Consumers: 1","meta.header.group":"X-EAS-QueueService-Gid","stream.lastEntry":"4","consumers.list.[0]":"Id: photog_pre_pmml.photog-pre-pmml-835253f3-686f87d4f-d****, Index: 4, Pending: 0, Status: Running, Idle: 2m12.017s, Window: 1, Slots: 1, AutoCommit: false","meta.name":"photog-pre-pmml-queue-912f2cdb","meta.state":"Normal","meta.header.user":"X-EAS-QueueService-Uid"} Successfully get data = { 'request_id' : 12345, 'template_image': "https://xx.oss-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", 'configure' : { 'user_id' : "zhoumo", } }, tags = {requestId=996cb029-133e-4f18-bb03-e696fc6ae4a1, ts@source=169778191****} Process finished with exit code 0其中:
index:表示該請求是EAS中的第幾個請求。
request_id:表示該請求的ID,後續使用該ID擷取輸出結果。
其他內容表示擷取的隊列資訊。
使用以下代碼,建立輸出隊列並擷取返回結果。在返回結果中,您可以查看擷取到的Base64編碼圖片。
調用樣本如下:
Python SDK
# 建立輸出隊列對象,用於訂閱讀取輸出結果資料。 sink_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_pre_pmml/sink') sink_queue.set_token('<token>') sink_queue.init() sink_queue.get(request_id, auto_delete=True)[0].data.decode('utf-8')其中:
sink_queue:配置為已擷取的預測服務的訪問地址。
<token>:替換為已擷取的預測服務的Token。
Java SDK
import com.aliyun.openservices.eas.predict.http.HttpConfig; import com.aliyun.openservices.eas.predict.http.QueueClient; import com.aliyun.openservices.eas.predict.queue_client.DataFrame; import com.aliyun.openservices.eas.predict.queue_client.QueueUser; import org.apache.commons.lang3.tuple.Pair; import java.util.HashMap; import java.util.Map; public class AsyncPhotoTest { public static void main(String[] args) throws Exception { /** 建立佇列服務用戶端 */ String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com"; String inputQueueName = "photog_pre_pmml"; String sinkQueueName = String.format("%s/sink", inputQueueName); String queueToken = "NjViMTI2NGQxZWQxYTI1NGE5MGQ1YTQ5Y2Y2MGZjY2VlZTVmNWE1****"; QueueClient inputQueue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser()); QueueClient sinkQueue = new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser()); /** 請求資料 */ String data = "{\n" + " \"request_id\": 12345,\n" + " \"template_image\": \"xx.jpg\",\n" + " \"configure\": {\n" + " \"user_id\": \"zhoumo\"\n" + " }\n" + "}"; Pair<Long, String> entry = inputQueue.put(data.getBytes(), null); Long index = entry.getKey(); final String requestId = entry.getValue(); System.out.println(String.format("index = %d, request id = %s", index, requestId)); // 查看輸入隊列的詳情 System.out.println(inputQueue.attributes()); // 查看輸入資料 Map<String, String> tags = new HashMap<String, String>() { { put("requestId", requestId); } }; DataFrame[] dfs = inputQueue.get(0, 1L, 0, false, tags); if (dfs.length > 0) { System.out.println(String.format("Successfully get data = %s, index = %d, tags = %s", new String(dfs[0].getData()), dfs[0].getIndex(), dfs[0].getTags())); } else { System.out.println("no data"); } // 查看輸出資料 while (true) { dfs = sinkQueue.get(0, 1L, 0, true, tags); if (dfs.length > 0) { System.out.println(String.format("Successfully get data = %s, tags = %s", new String(dfs[0].getData()), dfs[0].getTags())); break; } else { System.out.println("no data"); } } /** 關閉用戶端 */ inputQueue.shutdown(); sinkQueue.shutdown(); } }其中:
queueEndpoint:配置為已擷取的預測服務的訪問地址。
inputQueueName:配置為預測服務的名稱。
queueToken:替換為已擷取的預測服務的Token。
template_image:配置為圖片的URL地址。
系統返回如下結果:
Python SDK
'{"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "image": "iVBORw*****CYII=", "cost_time": 329.69798278808594}}'說明當返回結果中的code為502時,表示正在產生圖片。
Java SDK
... no data no data Successfully get data = {"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "image": "iVBORw0KGgoAAA****ABJRU5ErkJggg==", "cost_time": 21.584840059280396}}說明當返回結果中顯示
no data時,表示正在產生圖片。參數說明如下:
參數
描述
request_id
請求ID,STRING類型。
code
請求狀態代碼:
OK:表示請求成功。
error:表示請求失敗。
message
請求狀態的詳細資料。如果返回結果為success表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。
data
返回內容詳情。內部欄位說明如下:
user_id:使用者ID。
image:產生的Base64編碼圖片。
cost_time:消耗的時間,FLOAT類型。