错误码
公共 API 的每个拒绝都是一个 JSON 对象,包含稳定的 code、可读的 message 和本次调用的 request_id。平台知道你该改什么时,还会给出 hint 和 details。details 是扁平记录,写明受影响的任务和关键数值,例如大小和上限。el 会把它们全部打印出来。
{
"code": "DATASET_TASK_ARCHIVE_TOO_LARGE",
"message": "Task acme/claims-0042: The task archive is 40.0 MiB; a task archive can be at most 16 MiB.",
"hint": "Move large files out of the task directory (into the Runner or the task image), or split the task, then publish a new Dataset version.",
"details": [{"member_index": 3, "task": "acme/claims-0042", "size_bytes": 41943040, "limit_bytes": 16777216}],
"request_id": "6f1c…"
}
请按 code 分支处理,不要按 message。消息文字可能调整,错误码不会改名。遇到不认识的错误码时,它仍然带有消息和 HTTP 状态,可参考 HTTP API 中的状态表。
提交 Job
提交时平台会在创建 Job 之前逐个检查任务。被拒绝的提交不会创建 Job,修正输入后重新提交即可。
| 错误码 | HTTP | 含义 | 处理方式 |
|---|---|---|---|
DATASET_TASK_ARCHIVE_TOO_LARGE | 422 | 某个任务发布的压缩包超过了单任务 16 MiB 的下发上限。details 中有 size_bytes 和 limit_bytes。 | 把大文件移出任务目录:工具和模型放进 Runner 或任务的容器镜像,大数据在运行时下载。也可以拆分任务。然后发布新的 Dataset 版本再提交。 |
DATASET_DELIVERY_KEY_MISMATCH | 422 | 某个任务发布的压缩包记录不属于所选的 Dataset 版本、配置、split 和任务。 | 重新发布该 Dataset 版本。如果仍然出现,请报告 request ID。 |
DATASET_DELIVERY_INVALID | 422 | 某个任务的压缩包记录不完整或格式错误。details.reason 说明是哪一部分:delivery_missing、size_invalid、sha256_invalid、fields_unexpected、url_not_allowed、reference_invalid 或 name_invalid。 | 用当前版本的 EnvHub 客户端重新发布该 Dataset 版本。name_invalid 表示 Dataset、版本、配置、split 或任务名使用了字母、数字、.、_、- 以外的字符。 |
INVALID_RUNNER_ENVIRONMENT | 422 | Runner 或 Task 的 [environment] 表中有无效的值,消息会写明字段。 | 修正该字段并发布新版本。 |
RUNNER_UNAVAILABLE | 422 | 平台因意外原因无法准备某个任务。details 写明是哪个任务。 | 重试一次。如果再次出现,请报告 request ID,运维人员能看到完整诊断。 |
DATASET_CONFIG_REQUIRED | 409 | 该 Dataset 有多个配置且没有默认配置。 | 加上 --config NAME。 |
COMPOSE_RUNNER_DISABLED | 422 | 本平台未启用 compose(多容器)Runner。 | 请平台运维为你的项目启用,或改用非 compose Runner。 |
COMPOSE_RUNNER_DENIED | 422 | 该 compose Runner 版本、项目或任务形态未获批准。 | 请平台运维批准,或选用已批准的 Runner(el runner list)。 |
COMPOSE_TASK_REQUIRED / COMPOSE_RUNNER_REQUIRED | 422 | compose Runner 需要多容器任务,多容器任务需要 compose Runner。 | 让 Runner 与 Dataset 匹配。 |
AGENT_PROFILE_DENIED | 422 | Profile 的 Agent、模型或预算参数不被接受,消息会说明是哪一项。 | 修正 Profile(el profile get)后重新提交。 |
MODEL_ACCESS_DENIED | 422 | 该 Runner 在本项目开通了模型访问,而 Job 设置了显式 command。开通只覆盖 Runner 自己的入口。 | 去掉 --command 再提交,或请项目 Admin 撤销开通。 |
MODEL_ACCESS_PROVIDER_UNSUPPORTED、MODEL_ACCESS_UNAVAILABLE | 422 | 该 Runner 在本项目开通了模型访问,但 Job 固定了无法交付 Key 的 provider,或此时读不到开通记录。没有创建 Job。 | 提交时不要固定 provider,或稍后重试。见 Runner 的模型访问。 |
UNSUPPORTED_CAPABILITY、DIND_UNAVAILABLE、TEMPLATE_NOT_READY | 422 | 所选执行环境暂时无法运行这种 Runner 或任务形态,消息会说明原因。 | 调整资源、超时或类型;TEMPLATE_NOT_READY 稍后重试;否则报告 request ID。 |
Train Job 提交被拒绝时返回下列错误码,不会创建 Job:
| 错误码 | HTTP | 含义 | 处理方式 |
|---|---|---|---|
INVALID_TRAIN_JOB_SPEC | 422 | 请求不符合配方的 schema:某个字段、取值或记录无效,两个字段互相冲突,或者同时设置了 dataset 和 records。details 列出每个出错的字段(适用时带 record_index 或 member_index)和规则,不包含提交的值。 | 按 details 修改对应字段,有 hint 时照它操作。再对照 GET /v1/training-models 返回的 request_schema 检查请求。 |
TRAINING_DATA_UNAVAILABLE | 422 | 训练数据引用无法读取:dataset 不是本项目的 record Dataset 版本、没有这个 split、已经下线,或与固定的 manifest_sha256、sha256 或 row_count 不一致。 | 用 el data list --type dataset 核对 Dataset 和 split 名称,再重新提交。 |
TRAINING_DATA_TOO_LARGE | 422 | 所选 Dataset split 超过了单个 Train Job 的读取上限:64 MiB 或 10,000 行。 | 把数据拆到多个 Job,或从 parent checkpoint 继续训练。 |
TRAIN_JOB_IDEMPOTENCY_CONFLICT | 409 | 这个 request_id 已经属于输入不同的 Train Job。 | 重新发送原请求,或换一个新的 request_id。 |
16 MiB 上限由平台固定。通过平台的 EnvHub 发布流程(envhub:deploy)发布 Dataset 时,超过上限的任务现在会在上传前被拒绝;更早发布的版本里仍可能有这样的任务。
较旧的平台版本对这三种下发错误统一返回 INVALID_DATASET_DELIVERY,有些拒绝只返回通用的 INVALID_REQUEST。
Trial 失败
已经开始运行的 Trial 失败时会记录自己的 error 错误码。el job get、el job result 和 el trial get 会为每个失败的 Trial 打印一行,例如:
Trial trial_01… failed: EXECUTOR_INTERNAL_ERROR during scheduling - PermissionError: [Errno 13] Permission denied
JSON 中有同样的字段:error、error_message(平台记录了原因时提供的一行文字)和 failed_phase(Trial 失败时所处的阶段:scheduling 或 running)。Job 事件中也带有这些字段。Train Job 的错误码同时出现在 Job 的 training.error_code 中。
| 错误码 | 含义 | 处理方式 |
|---|---|---|
EXECUTOR_INTERNAL_ERROR | 平台在准备或运行 Trial 时遇到意外错误。error_message 给出错误类型。这不是你的任务导致的。 | 重试该 Job。如果再次出现,请报告 Job ID 和时间,运维人员能看到完整诊断。 |
EXECUTOR_PERMISSION_DENIED、EXECUTOR_FILE_NOT_FOUND、EXECUTOR_IO_ERROR、EXECUTOR_TIMEOUT | 平台无法读写自己的某个文件或目录,或平台操作超时。这是平台问题,不是你的任务导致的。 | 报告 Job ID 和时间;运维修复前重试通常会以同样方式失败。 |
DATASET_DELIVERY_UNAVAILABLE | 平台无法为任务下载签发授权。 | 稍后重试;持续出现请报告。 |
TIMEOUT | Trial 运行时间超过了时限。 | 调大 Runner 的超时时间,或让任务更快完成。 |
SANDBOX_START_FAILED | 平台已为 Trial 创建沙箱,但它没有启动:启动过程中停止、镜像没有可用的 /bin/sh,或执行环境让它等待超过了平台的启动上限(例如没有容量,或大镜像拉取太慢、无法拉取)。沙箱已删除,没有运行任何内容,不计费。这是基础设施失败,不是你的任务导致的。 | 用新的 request_id 重新提交。同一 Runner 反复出现时,确认其镜像是公开的或平台可以拉取,再报告 Job ID。 |
EXECUTION_QUEUE_TIMEOUT | Trial 或 Train Job 等待执行名额的时间超过了平台的排队上限,默认 30 分钟(平台设置 EXECUTION_QUEUE_TIMEOUT_SEC)。执行 provider 或项目并发 Trial 上限已满时,Agent 或 Sandbox Trial 会排队。等待本 Job 预算的时间不计入。有多个 Trial 的 Train Job 中,后面的 Trial 等前一个 Trial 结束,上限从那时开始计时。没有运行任何内容,也没有分配 GPU。 | 稍后用新的 request_id 重新提交。 |
TRAINING_TIMEOUT | Train Job 的 Trial 达到了配方的时间上限,平台停止了它。上限从 Trial 开始时计时,同一个 Job 的每个 Trial 都有完整的上限,排队时间不计入。Job 和 Trial 以 failed 结束。你主动停止的 Job 以 cancelled 结束,不带这个错误码。 | 从 GET /v1/training-models 读取该配方的 limits.timeout_seconds(见运行时长上限)。减少 max_steps、记录数或 max_length,再用新的 request_id 提交新 Job。 |
RUNNER_COMMAND_FAILED | Runner 命令以错误退出。 | 用 el job log JOB_ID 查看 Trial 日志。 |
MODEL_ENV_SETUP_FAILED | 沙箱已启动,但没能收到 Runner 的模型凭据文件。这是基础设施故障,不是任务本身的结果。 | 用新的 request_id 重新提交;反复出现时报告 Job ID。 |
MODEL_ACCESS_UNAVAILABLE、MODEL_ACCESS_PROVIDER_UNSUPPORTED、LLM_KEY_UNAVAILABLE | 该 Runner 在本项目开通了模型访问,但平台此时无法为这个 Trial 提供。没有启动任何资源。 | 查看项目执行设置里的 model_access,再联系平台运营方。见 Runner 的模型访问。 |
BUDGET_EXCEEDED | Job 达到了 budget.max_cost_usd。对 Train Job,也表示某个 Trial 因为剩余预算不够跑满它的整个时长上限而没有启动。Trial 以 cancelled 结束;被停止的 Train Trial 不登记 Checkpoint。 | 查看 Job 的 cost。Train Job 可以把上限和 GET /v1/training-models 返回的 limits.max_trial_cost_usd 比较,然后用新的 request_id 提交新 Job,提高上限或减少 Trial 数(Train Job 的花费上限)。 |
BUDGET_UNMETERED | Job 的部分用量,或 Train Job 配方的 GPU,没有价格,所以上限无法执行。没有启动新的内容。 | 不带上限重新提交,或报告 Job ID。 |
INSUFFICIENT_BALANCE | 工作区可用余额不足以支持本次运行。Inference Job 或端点被拒时,details 给出副本需要预先预留的金额(见提交 Inference Job)。 | 请具备账务权限的工作区成员检查后重试。 |
EXECUTION_FAILED | 该失败没有公开的错误码。 | 查看 Trial 日志;日志无法说明原因时请报告 Job ID。 |
错误消息从不包含 URL、文件路径、存储键或凭据。如果不暴露这些就无法说得更具体,平台只给出错误类型,详细信息留给运维人员。
Train Job 失败
失败的 Train Job 在 training.error_code 中给出错误码,它的 Trial 在 error 中带同一个错误码。Trial 的 failed_phase 在训练开始运行之前失败时为 scheduling,之后为 running。error_message 是这个错误码对应的固定说明。上文的 TRAINING_TIMEOUT、EXECUTION_QUEUE_TIMEOUT 和 INSUFFICIENT_BALANCE 同样适用。
| 错误码 | 含义 | 处理方式 |
|---|---|---|
GPU_JOB_FAILED | GPU 任务失败。failed_phase 为 scheduling 时训练从未开始,例如没能拿到 GPU;为 running 时训练进程出错退出。 | scheduling:稍后用新的 request_id 重新提交,这是平台或容量问题,与你的数据无关。running:用 el job log JOB_ID --source runtime 查看训练错误,修正数据或参数。日志无法说明原因时请报告 Job ID。 |
CHECKPOINT_NOT_DURABLE | 训练已经完成,但 checkpoint 没能保存到持久存储。 | 报告 Job ID。如果现在就需要 checkpoint,用新的 request_id 重新提交。 |
BATCH_INPUTS_UNAVAILABLE | 平台无法准备训练输入,没有分配 GPU。training.error_detail 指出出错的输入、记录和规则。 | 修正指出的记录或参数,提交新 Job。 |
BATCH_DRY_RUN_NOT_EXECUTED | 仅出现在不使用 GPU、只规划 Train Job 的部署上:输入已经打包,没有启动 GPU 任务。Job 以 cancelled 结束。 | 无需处理;需要真实训练时使用能运行训练的部署。 |
PRICE_MISSING | 配方需要的 GPU 在本平台没有价格,无法预留。 | 联系平台支持。 |
RESERVATION_CONFLICT | Trial 的计费预留与已有预留冲突。 | 用新的 request_id 重新提交;反复出现时报告 Job ID。 |
TRAINING_BILLING_REQUIRED | 该工作区没有可用的训练计费,Trial 没有启动。 | 联系平台支持。 |
TRAINING_BACKEND_UNAVAILABLE | 本平台没有开放 Runner 训练,Trial 没有启动。 | 联系平台支持。 |
PROFILE_AUTHORIZATION_UNAVAILABLE | Trial 的 Profile 输入不再对本项目授权,Trial 没有启动。 | 检查 Profile(el profile get)及其输入,再重新提交。 |
TRAIN_RUNNER_LAUNCH_REJECTED | 平台拒绝启动 Runner 训练容器。 | 对照 Runner 训练 检查 Runner 和资源,再重新提交。 |
TRAIN_RUNNER_TIMEOUT | Runner 训练容器运行超过了时限,被停止。 | 调大 timeout_seconds,或缩短训练。 |
TRAIN_RUNNER_PROCESS_FAILED | Runner 训练命令以非零退出码结束。 | 用 el job log JOB_ID 查看 Trial 日志。 |
TRAIN_RUNNER_RESULT_INCOMPLETE | Runner 训练容器结束时没有完整结果。 | 查看 Trial 日志,确认命令写出了声明的输出。 |
TRAIN_RUNNER_OUTPUTS_FAILED | 无法收集 Runner 声明的输出。 | 检查 execution.outputs 和命令写出的文件。 |
TRAIN_RUNNER_CHECKPOINT_FAILED | 无法登记 Runner 的 checkpoint 输出。 | 对照 Runner 训练 检查 checkpoint 输出。 |
NATIVE_TRAIN_FAILED、NATIVE_TRAIN_INTERRUPTED | 仅限本地部署:进程内训练失败,或被重启打断。 | 用新的 request_id 重新提交。 |
TRIAL_CLEANUP_UNKNOWN | 平台无法确认 Trial 的资源已经释放。 | 报告 Job ID;不要假设资源已经释放。 |
等待与待确认状态
这些错误码说明 Job 还没有结束,它们不是失败。
| 错误码 | 出现位置 | 含义 | 处理方式 |
|---|---|---|---|
EXECUTION_RECONCILING | 未结束 Trial 的 error;Train Job 的 training.error_code | 平台正在向 provider 核实某个 Trial 的执行结果,例如平台重启之后。核实完成前 Job 状态为 unknown。 | 不要重复提交相同的工作。稍后再读取 Job,结果确认后它会变为实际状态。 |
BATCH_PROVIDER_UNAVAILABLE | 未结束 Train Job 的 training.error_code | 平台无法从 provider 读取 GPU 任务的状态。读取成功前 Job 状态为 unknown。 | 同 EXECUTION_RECONCILING。 |
unknown 不是最终状态。只要 Job 有未结束的 Trial 带 EXECUTION_RECONCILING,或 Train Job 带上面两个错误码之一,Job 就显示 unknown。正在取消或已经结束的 Job 保持原来的状态。
服务超时
API 背后的平台服务没有应答时,API 返回这些错误码。
| 错误码 | HTTP | 含义 | 处理方式 |
|---|---|---|---|
UPSTREAM_TIMEOUT | 504 | API 已经转发请求,但平台没有在时限内应答。请求可能已经被处理。 | 重试写操作前先查看资源。提交 Job 时先查看 el job list。如果提交带有 request_id,也可以原样再次提交:相同的重试会返回已经存在的 Job。 |
CANCELLATION_TIMEOUT | 504 | 停止请求没有在时限内得到确认。Job 可能仍在停止中。 | 再次停止前先查看 Job 状态。 |
SOURCE_UNAVAILABLE | 503 | API 无法连接平台服务,或服务意外出错。 | 稍后重试。重试写操作前,按 UPSTREAM_TIMEOUT 的方式先查看资源。 |
较旧的平台版本对超时返回 503 SOURCE_UNAVAILABLE。
el 的连接错误
这些错误码由客户端产生,不来自 API。
| 错误码 | 含义 | 处理方式 |
|---|---|---|
NETWORK_ERROR | 客户端无法建立连接:DNS、TLS、代理问题或服务不可达。请求没有发出。 | 检查 API 地址和网络后重试。 |
REQUEST_TIMEOUT | 请求已经发出,但在时限内没有收到应答。 | 请求可能已经被处理。重新提交前先查看 Job 或资源(el job list)。 |
RESPONSE_INTERRUPTED | 应答完成前连接被关闭,服务可能出错或重启。 | 与 REQUEST_TIMEOUT 相同。反复出现时请报告发生时间。 |
报告问题时请附上错误码、HTTP 状态和 request_id。参见故障排查。