简介:本文给出一套可复现的图像生成模型API评测流程,涵盖测试环境、样本集、延迟与吞吐压测、提示遵循度评分和异常容错。读者可运行配套脚本,用P50、P95、P99延迟、失败率与基线模型对比,据此判断延迟、质量和单图成本能否满足自身业务。本文不预设结论,所有数值需在自有环境中实测后填写。
同一模型在不同版本、不同分辨率、不同并发和不同网络条件下,表现可能相差很大。评测结论只有在版本、参数、环境和样本量都写明时才有比较价值。原始资料只描述了”某实验室发布的新模型”,没有给出可核验的模型名称和版本,因此本文不判断该模型的优劣,只提供可执行的测试方法。
测试前,先在下表中登记测试对象的信息。
| 项目 | 记录内容 | 来源 |
|---|---|---|
| 模型名称与版本号 | 以供应商模型页或接口文档为准 | 供应商文档 |
| API提供方与区域 | 服务域名、部署地域 | 接口文档 |
| 发布日期与测试日期 | 便于追溯版本变化 | 公告与测试日志 |
| 单价与计费规则 | 按张、按像素或按步数计费 | 当期价目表 |
| 分辨率与模式参数 | 标准、高清、原生等模式的具体参数 | 请求体 |
| 基线模型 | 前代模型的名称与版本 | 同上 |
基线模型必须与待测模型使用相同分辨率、相同提示词和相同并发设置。
客户端环境要写清楚。记录发起请求的机器型号、CPU、内存、出口带宽,以及到API区域的往返延迟。延迟可用 ping 或 traceroute 测量,并保存结果。
如果涉及自建推理,还要记录GPU型号与数量、显存大小、驱动版本、CUDA版本和推理框架版本。这些信息缺失时,延迟数据无法复现。
测试时间建议固定在同一时段,每组实验至少重复3轮。每轮开始前先发送10次预热请求,预热结果不计入统计。超时参数统一设置为连接5秒、读取120秒。
样本集建议包含300条提示词,按下列比例划分。
| 类别 | 数量 | 目的 |
|---|---|---|
| 简单单主体 | 60 | 验证基础生成能力 |
| 多主体多属性 | 120 | 检验属性绑定与元素完整性 |
| 长文本(超过200字) | 40 | 检验长提示词的理解能力 |
| 指定艺术风格 | 40 | 检验风格遵循度 |
| 要求画面文字 | 20 | 检验文字渲染准确性 |
| 异常与边界输入 | 20 | 检验容错与安全拒答 |
每条样本以JSONL格式保存,字段包括id、category、prompt和key_elements。key_elements 是该提示词包含的关键元素列表,用于后续评分。样本集需固定随机种子,保证每次测试使用同一批数据。
下面的脚本使用异步并发发起请求,记录每次请求的耗时与状态码,并计算分位数延迟和吞吐。API地址、密钥和模型名称都从环境变量读取,不写入代码。
```python
import asyncio
import json
import os
import random
import time
from collections import Counter
import httpx
API_URL = os.environ[“IMG_API_URL”]
API_KEY = os.environ[“IMG_API_KEY”]
MODEL = os.environ[“IMG_MODEL”]
CONCURRENCY = int(os.environ.get(“CONCURRENCY”, “10”))
TOTAL = int(os.environ.get(“TOTAL_REQUESTS”, “200”))
PROMPT_FILE = os.environ.get(“PROMPT_FILE”, “prompts.jsonl”)
OUT_FILE = os.environ.get(“OUT_FILE”, f”result_c{CONCURRENCY}.jsonl”)
IMG_SIZE = os.environ.get(“IMG_SIZE”, “1024x1024”)
MAX_RETRY = 2
RETRYABLE_STATUS = {429, 500, 502, 503, 504}
TIMEOUT = httpx.Timeout(connect=5.0, read=120.0, write=10.0, pool=10.0)
def percentile(values, p):
if not values:
return None
s = sorted(values)
k = (len(s) - 1) p / 100
lo = int(k)
hi = min(lo + 1, len(s) - 1)
return s[lo] + (s[hi] - s[lo]) (k - lo)
async def call_once(client, prompt):
payload = {“model”: MODEL, “prompt”: prompt, “size”: IMG_SIZE, “n”: 1}
headers = {“Authorization”: f”Bearer {API_KEY}”}
start = time.perf_counter()
try:
r = await client.post(API_URL, json=payload, headers=headers)
latency = time.perf_counter() - start
# 注意:部分接口在HTTP 200时仍在响应体中返回错误,需按接口文档检查图像字段ok = r.status_code == 200return r.status_code, latency, okexcept httpx.TimeoutException:return "time