批量推理

更新时间:
复制 MD 格式

批量推理支持一次性提交大量请求并异步执行,完成后统一下载结果。您可以在控制台直接操作,也可以通过 API 调用。接口与 OpenAI Batch API 兼容,可直接用官方 SDK 调用。

功能概述

批量推理适用于以下场景:

  • 评测:批量提交测试用例,评估模型性能。

  • 数据标注:批量处理待标注数据,生成标注结果。

  • 离线生成:批量生成内容,如文章、代码等。

  • 回归验证:批量验证模型更新后的输出质量。

接口与 OpenAI Batch API 兼容,支持以下三种接口路径:

  • /v1/chat/completions

  • /v1/responses

  • /v1/completions

前置条件

使用批量推理功能前,需要完成以下配置:

  • 配置 Redis:批量处理依赖 Redis 存储任务状态。需为工作站配置可达的 Redis 实例,否则批量处理功能不可用。

  • 配置 OSS 存储:批量处理的输入与结果文件存放在 OSS。在控制台批量推理页面点击配置 OSS 存储按钮,配置OSS路径后即可开始创建任务。

输入文件格式(JSONL)

无论通过控制台还是 API 调用,输入文件均需使用 JSONL 格式(每行一个 JSON 对象)。

格式要求

  • 每行是一个独立的 JSON 对象(一个请求),不要写成 JSON 数组。

  • 最多 50000 行,单文件不超过 200MB。

字段说明

字段

必填

说明

custom_id

是

请求的唯一标识,会原样写回到对应结果行,用于关联请求与响应。

method

是

固定为 "POST"。

url

是

调用的接口路径,支持 /v1/chat/completions、/v1/responses、/v1/completions。

body

是

该请求的完整请求体,格式与直接调用对应接口时一致(含 model、messages 等)。

示例输入(每行一个请求)

{"custom_id": "request-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "qwen-plus", "messages": [{"role": "user", "content": "你好"}]}}
{"custom_id": "request-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "qwen-plus", "messages": [{"role": "user", "content": "今天天气怎么样"}]}}
{"custom_id": "request-3", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "qwen-plus", "messages": [{"role": "user", "content": "帮我写一首诗"}]}}

通过控制台操作

在控制台批量推理页面,您可以直接完成上传文件、创建任务、查看状态和下载结果的全部操作。

上传输入文件

  1. 在批量推理页面,切换到文件页签。

  2. 点击上传文件按钮,选择本地 JSONL 文件上传。

  3. 上传完成后,可以对文件进行预览、下载、新建任务或删除操作。

创建任务

  1. 在批量推理页面,切换到任务页签。

  2. 点击新建任务按钮,选择已上传的文件,或点击上传新文件直接上传 JSONL 文件。

  3. 在接口下拉框中选择要调用的接口路径,支持 /v1/chat/completions、/v1/responses、/v1/completions。

  4. (可选)在备注中输入任务备注信息,如用途、模型名等。

  5. (可选)在并发线程数(分片数)中填写分片数。

    • 留空则按默认每片约 1000 条请求自动切分(分片数 = 总请求数 ÷ 1000,向上取整)。

    • 填写则将任务切成指定的分片数,每个分片由一个线程处理,即本任务最多可并行的线程数。系统按「总请求数 ÷ 分片数」均分到各片(最后一片为余数)。该参数仅影响本任务。

  6. 点击创建按钮,任务创建成功后会出现在任务列表中。

查看结果

任务状态变为已完成后,可以查看或预览结果:

  • 在任务页签中,点击任务操作列的下载结果按钮直接下载。

  • 切换到文件页签,找到任务产出的输出文件(状态为成功)可以预览或下载结果。

通过 API 调用

如果您需要通过代码自动化执行批量推理,可以使用与 OpenAI Batch API 兼容的接口。

核心流程分为四步:上传输入文件 → 创建任务 → 轮询状态 → 下载结果。

curl / Shell 示例

# 0. 准备:把 API Key 放进环境变量; 调用地址请单击工作站右上角的调用信息查看
export LLM_GATEWAY_API_KEY="<YOUR-API-KEY>"
BASE="<YOUR-BASE-URL>"

# 1. 上传输入文件(JSONL),purpose 固定为 batch
curl -X POST "$BASE/v1/files" \
  -H "Authorization: Bearer $LLM_GATEWAY_API_KEY" \
  -F "purpose=batch" \
  -F "file=@batch_input.jsonl"
# → {"id": "batch_input_xxx", ...}  记下这个 id

# 2. 用该文件创建批处理任务
#    num_shards 可选:把任务切成几个分片(=最多可并行处理本任务的线程数),
#    系统按"总请求数 ÷ 分片数"均分(最后一片为余数);
#    不填则按默认每片行数切分(默认每片 1000 条)
curl -X POST "$BASE/v1/batches" \
  -H "Authorization: Bearer $LLM_GATEWAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_file_id": "batch_input_xxx",
    "endpoint": "/v1/chat/completions",
    "completion_window": "24h",
    "num_shards": 2
  }'
# → {"id": "batch_xxx", "status": "pending", ...}

# 3. 轮询任务状态(validating → in_progress → completed)
curl "$BASE/v1/batches/batch_xxx" \
  -H "Authorization: Bearer $LLM_GATEWAY_API_KEY"

# 4. 完成后用 output_file_id 下载结果
curl "$BASE/v1/files/<output_file_id>/content" \
  -H "Authorization: Bearer $LLM_GATEWAY_API_KEY" -o output.jsonl

# (可选)取消进行中的任务
curl -X POST "$BASE/v1/batches/batch_xxx/cancel" \
  -H "Authorization: Bearer $LLM_GATEWAY_API_KEY"

Python (OpenAI SDK) 示例

# 接口与 OpenAI Batch API 兼容,可直接用官方 openai SDK
# pip install openai
import time
from openai import OpenAI

client = OpenAI(
    base_url="<YOUR-BASE-URL>/v1",
    api_key="<YOUR-API-KEY>",
)

# 1. 上传输入文件
inp = client.files.create(
    file=open("batch_input.jsonl", "rb"),
    purpose="batch",
)

# 2. 创建批处理任务
#    num_shards 可选:分片数(=最多可并行的线程数),按"总请求数 ÷ 分片数"均分;
#    它是扩展参数,用 extra_body 透传(不填则按默认每片行数切分,默认每片 1000 条)
batch = client.batches.create(
    input_file_id=inp.id,
    endpoint="/v1/chat/completions",
    completion_window="24h",
    extra_body={"num_shards": 2},
)

# 3. 轮询直到结束
terminal = {"completed", "failed", "expired", "cancelled"}
while batch.status not in terminal:
    time.sleep(10)
    batch = client.batches.retrieve(batch.id)
    print(batch.status, batch.request_counts)

# 4. 下载结果与错误
if batch.output_file_id:
    print(client.files.content(batch.output_file_id).text)
if batch.error_file_id:
    print(client.files.content(batch.error_file_id).text)

注意事项

  • endpoint 与 url:需使用受支持的接口:/v1/chat/completions、/v1/responses、/v1/completions。

  • completion_window:目前固定为 "24h";任务超过 24 小时未完成会自动过期。

  • num_shards:可选,将任务拆分为指定分片数(即本任务最大可并行的线程数),系统按「总请求数 ÷ 分片数」均分;留空则按默认每片行数自动切分(默认每片约 1000 条,可由部署方调整)。实际并行还受全局并发线程数与后端实例数限制。

  • 输入文件限制:最多 50000 行、不超过 200MB;失败的请求会写入单独的错误文件。

  • 鉴权:使用 Bearer API Key;在控制台页面操作时会自动复用当前登录身份,任务执行时使用对应 API Key 回调网关。