跳转到主要内容
首次操作时,请先完成账号的注册、实名认证和账户充值。详情请参见新手指引 本文以部署一个 runpod/worker-comfyui:5.5.0-flux1-dev 为例,介绍如何创建一个 Async Serverless Endpoint。

1. 准备容器镜像

您需要提前将运行环境打包成 Docker 镜像,并上传至镜像仓库。支持指定公共镜像仓库地址和私有镜像仓库地址(需提供镜像仓库认证凭证)。
  • 您可以将镜像上传至 Docker Hub,目前平台已针对该站点提供镜像预热服务。详情请参见使用镜像预热服务
本示例使用 runpod/worker-comfyui:5.5.0-flux1-dev 模型镜像,在使用 worker-comfyui 镜像时,请配置 BUCKET_ENDPOINT_URL 等 对象存储 相关配置,这些配置将会保证您通过 async serverelss endpoint 产生的 图片、视频会被上传到 对象存储的 BUCKET 中;

2. 选择实例规格

目前Async Serverless Endpoint 支持以下两种 GPU 实例规格:
  • RTX 4090 24GB
  • H100 SXM 80GB
如有更多需求,请联系我们

3. 创建云存储(可选)

如果有共享存储和持久化存储的需求,可以在存储管理页面创建云存储,然后在创建实例时为容器挂载云存储。详情请参见管理云存储

4.创建 Endpoint

  1. 进入 Serverless GPUs 页面,选择规格,单击「创建 Endpoint」。
  2. 完成 Endpoint 的参数配置。
  • Endpoint 名称:用于唯一标识 Endpoint,在创建job时是URL的一部分。系统会自动生成一个默认随机生产的名称,支持自定义,请优先用默认的名称。
  • Worker 配置
    配置项说明
    最小 Worker 数Endpoint 最少需要保留的实例数。设置最小实例数可以帮助减少冷启动时间。如果设置为0,则服务没有请求时不会保留任何实例,这可能会导致无法快速响应后续的请求,因此对于响应时间要求较高的场景,请谨慎设置为0。
    最大 Worker 数Endpoint 最大可以扩展的实例数。当服务请求增加,触发自动扩容机制时,会增加 Worker 数,因此限制最大 Worker 数可以帮助控制成本。
    空闲超时(秒)当触发自动缩容机制而准备释放 Worker 时,在指定的时间内(即空闲超时),平台会为您保留该 Worker ,以便快速应对后续可能上涨的请求量。请注意,平台会收取这段时间对应的 Worker 费用。
    最大并发数每个 Worker 能处理的请求最大并发数,当并发数超过最大值时,会将请求调度到其他 Worker 上。如果所有 Worker 并发都被打满,则会将请求存放到队列中等待被执行。
    GPUs / Worker每个 Worker 占用的 GPU 卡数。
    CUDA 版本支持指定 CUDA 版本。
  • Type
    • Endpoint类型,请选择 异步(Async)
  • 弹性策略
    • 队列请求数策略:根据队列中的请求数调整 Worker 数量,默认每 worker 每次只能处理一个 job;此时您需要配置一个 worker 所支持的最大请求数,目前这个值只支持1。
  • 镜像配置
    • 镜像地址:要部署的镜像的地址。例如 runpod/worker-comfyui:5.5.0-flux1-dev
    • 镜像仓库凭证:如果指定的镜像为私有镜像,需要配置镜像仓库访问凭证才能拉取镜像。您可以在安全凭证管理页面创建凭证。
    • HTTP 端口:Worker 对外开放的 HTTP 端口。
    • 容器启动命令:容器启动时执行的命令。
  • 存储配置
    • 系统盘:每个 Worker 的系统盘容量大小。
    • 云存储:如果要挂载云存储,请选择云存储。详情请参见管理云存储
  • 其他
    • 健康检查路径:此参数暂未启用。
    • 环境变量:设置服务所需的环境变量,以便在 Worker 启动时自动初始化。以腾讯云对象存储 COS 示例如下:
    Bash
      BUCKET_ENDPOINT_URL=https://<your-bucket-name>cos.<region>.myqcloud.com
      BUCKET_ACCESS_KEY_ID=AKIASVYYYN6L4S6TTTTTT
      BUCKET_SECRET_ACCESS_KEY=maVz2OwY98UUUUUUGjMsmR/Yo8/Zzw0qWMMMMMMM
    
    在使用 worker-comfyui 这个镜像时,强烈推荐配置对象存储相关配置,将输出图片上传到对象存储的 Bucket 中;最终的图片上传效果取决于上传代码的实现;可以在 handler.py 中自行 使用 cos 提供的 SDK 来完成上传工作,并最终打出所需的 worker-comfyui 镜像,此时使用自己的镜像替换 runpod 所提供镜像即可;
  1. 确认费用信息,单击「一键部署」。

5.访问服务

  1. Serverless GPUs 页面,找到新创建的 Endpoint,确认状态已变为运行中
  2. 确认 Endpoint 中至少有一个 Worker 处于运行中。
  3. 确认拥有对应的 API Key 用于调用鉴权,创建Endpoint的用户与 API Key 对应的用户应处于同一团队中;

5.1 通过Curl的方式来创建job 以及获取执行结果

创建Job 这里给出一个 worker-comfyui worker 中实际可执行的例子,url 中的 0f43a6867e05fddd 需要替换为真实的 endpointName,此外需要将例子中的 API Key 替换为真实用户的 API Key; 请注意:Async Serverless Endpoint 所能接受最大的 job size 大小为 4MiB
Bash
curl -X POST https://async.ppio.com/v1/0f43a6867e05fddd/run \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_xxxx' \
  -d '{
    "input": {
        "workflow": {
            "8": {
                "inputs": {
                    "samples": [
                        "31",
                        0
                    ],
                    "vae": [
                        "39",
                        0
                    ]
                },
                "class_type": "VAEDecode",
                "_meta": {
                    "title": "VAE解码"
                }
            },
            "9": {
                "inputs": {
                    "filename_prefix": "ComfyUI",
                    "images": [
                        "8",
                        0
                    ]
                },
                "class_type": "SaveImage",
                "_meta": {
                    "title": "保存图像"
                }
            },
            "27": {
                "inputs": {
                    "width": 1024,
                    "height": 1024,
                    "batch_size": 1
                },
                "class_type": "EmptySD3LatentImage",
                "_meta": {
                    "title": "空Latent图像(SD3)"
                }
            },
            "31": {
                "inputs": {
                    "seed": 890266796055272,
                    "steps": 20,
                    "cfg": 1,
                    "sampler_name": "euler",
                    "scheduler": "simple",
                    "denoise": 1,
                    "model": [
                        "38",
                        0
                    ],
                    "positive": [
                        "41",
                        0
                    ],
                    "negative": [
                        "42",
                        0
                    ],
                    "latent_image": [
                        "27",
                        0
                    ]
                },
                "class_type": "KSampler",
                "_meta": {
                    "title": "K采样器"
                }
            },
            "38": {
                "inputs": {
                    "unet_name": "flux1-dev.safetensors",
                    "weight_dtype": "default"
                },
                "class_type": "UNETLoader",
                "_meta": {
                    "title": "UNet加载器"
                }
            },
            "39": {
                "inputs": {
                    "vae_name": "ae.safetensors"
                },
                "class_type": "VAELoader",
                "_meta": {
                    "title": "加载VAE"
                }
            },
            "40": {
                "inputs": {
                    "clip_name1": "clip_l.safetensors",
                    "clip_name2": "t5xxl_fp8_e4m3fn.safetensors",
                    "type": "flux",
                    "device": "default"
                },
                "class_type": "DualCLIPLoader",
                "_meta": {
                    "title": "双CLIP加载器"
                }
            },
            "41": {
                "inputs": {
                    "clip_l": "A beautiful fantasy dog with long curly red hair and big blue eyes, wearing a green transparent fairy dress with lace and puffed sleeves. Surrounded by iridescent butterflies and giant glass roses, dreamy lighting, ethereal atmosphere, soft glow, magical realism, highly detailed, cinematic, 8K render.\n",
                    "t5xxl": "A fairy tale scene of a fire dog with red curly hair wearing a delicate blue dress, standing among crystal butterflies and glowing glass roses. The scene is filled with soft magical light, like a dream from a fantasy world.",
                    "guidance": 3.5,
                    "clip": [
                        "40",
                        0
                    ]
                },
                "class_type": "CLIPTextEncodeFlux",
                "_meta": {
                    "title": "CLIP文本编码Flux"
                }
            },
            "42": {
                "inputs": {
                    "conditioning": [
                        "41",
                        0
                    ]
                },
                "class_type": "ConditioningZeroOut",
                "_meta": {
                    "title": "条件零化"
                }
            }
        }
    }
}'
创建成功得到的 response 如下,其中的 idjob_id
JSON
{"id": "8cb6a77c-62aa-4eb4-9226-1ca5724fd9dd","status":"PENDING"}
查看job状态及获取执行结果: 请注意:您能通过 Async Service Endpoint 的 status 接口能获取到的最大 output size 为 4MiB;所以请通过配置 S3 环境变量的方式在 handler.py 中将输出的图片或视频上传到 S3 对象存储,这种情况下 output 的大小不受限制; 请注意:Job执行结束后,执行结果在Async serverless Endpoint中最多保存 6 小时
Bash
curl -X GET https://async.ppio.com/v1/0f43a6867e05fddd/status/33a0bc4b-7312-41f6-ad15-eb9016bd68f9 \
-H "Authorization: Bearer sk_yyy"
Cancel(取消) Job :
Bash
curl -X GET https://async.ppio.com/v1/0f43a6867e05fddd/cancel/e5f3c3c0-c3b1-49c2-9452-bb96eaa34ce6 \
 -H "Authorization: Bearer sk_yyy"
查看Endpoint Job队列状态:
Bash
curl -X GET https://async.ppio.com/v1/e41a4c7e58a4eddd/stats \
-H 'Authorization: Bearer sk_yyy'
得到的 response 如下:
JSON
{"busy_workers":0,"endpoint":"e41a4c7e58a4eddd","in_progress":0,"pending":0,"total_workers":0}

5.2 通过 Runpod SDK 来创建Job 及获取执行结果

Python
import runpod
import os

runpod.api_key = "sk_xxx" # appkey
runpod.endpoint_url_base = "https://async.ppio.com/v1"
input_payload = { xxxx } 


endpoint = runpod.Endpoint("0f43a6867e05fddd") # here is endpointName
run_request = endpoint.run(input_payload)

# Initial check without blocking, useful for quick tasks
status = run_request.status()
print(f"Initial job status: {status}")

if status != "COMPLETED":
    # Polling with timeout for long-running tasks
    output = run_request.output(timeout=60)
else:
    output = run_request.output()
print(f"Job output: {output}")

6. 管理 Async Serverless Endpoint

参考 管理 serverless Endpoint 文档;