智能重试
HeteroFlow 是本站的异构算力与大模型调度产品。智能重试。智能重试 HeteroFlow V2 的智能重试系统能够根据任务失败的类型和原因,自动选择最优的重试策略。系统区分临时性错误和永久性错误,对 OOM(内存不足)等可恢复错误提供智能升级重试机制。 重试策略概览 系统提供三种重试策略,可在任务提交时通过 参数指定: 策略 说明 适用…
智能重试
HeteroFlow V2 的智能重试系统能够根据任务失败的类型和原因,自动选择最优的重试策略。系统区分临时性错误和永久性错误,对 OOM(内存不足)等可恢复错误提供智能升级重试机制。
重试策略概览
系统提供三种重试策略,可在任务提交时通过 retry_strategy 参数指定:
| 策略 | 说明 | 适用场景 |
|---|---|---|
retry_same_node | 在原节点重试 | 临时性错误(网络抖动、短暂不可用) |
retry_new_node | 迁移到新节点重试 | 节点故障、资源不满足 |
no_retry | 不重试 | 用户明确要求不重试或测试场景 |
默认策略: retry_new_node(推荐,确保最大成功率)
错误分类与处理
OOM(内存不足)处理
当任务因内存不足(OOM)失败时,系统自动执行内存升级重试:
CPU 内存 OOM:
1. 捕获 OOM Kill 信号
2. 将任务内存限制翻倍(例如 2GB → 4GB → 8GB)
3. 在同一节点重试(节点有足够内存时)或迁移到内存更大的节点
4. 内存上限为 16GB,超过后标记为永久失败
GPU 显存 OOM:
1. 检测 CUDA Out of Memory 错误
2. 查找集群中 GPU 显存更大的节点
3. 自动迁移任务到显存更充足的节点
4. 例如:从 8GB GPU 节点迁移到 24GB GPU 节点
内存升级流程:
任务 OOM 失败
├── 检测 OOM 类型
│ ├── CPU OOM → memory_mb *= 2
│ │ └── memory_mb <= 16384 ? 重试 : 永久失败
│ └── GPU OOM → 查找更大 VRAM 节点
│ └── 找到 ? 迁移重试 : 永久失败
└── 记录重试历史节点/容器错误处理
| 错误类型 | 处理方式 | 迁移策略 |
|---|---|---|
| 节点离线 | 迁移到健康节点 | retry_new_node |
| Docker daemon 异常 | 迁移到正常节点 | retry_new_node |
| 容器启动超时 | 在原节点重试1次,失败后迁移 | retry_same_node → retry_new_node |
| GPU 设备不可用 | 迁移到 GPU 正常的节点 | retry_new_node |
| 镜像拉取超时 | 更换镜像源重试 | retry_same_node |
永久错误(不重试)
以下错误类型为永久性错误,系统 不会 自动重试:
ImageNotFound- 镜像不存在PermissionDenied- 权限不足InvalidConfig- 配置错误(如无效的环境变量)ResourceLimitExceeded- 超过集群资源上限ImagePullBackOff- 镜像认证失败TaskCancelled- 用户手动取消
临时错误(原节点重试)
以下错误类型为临时性错误,系统在 同一节点 重试:
NetworkTimeout- 网络超时TransientError- 短暂不可用ContainerRuntimeError- 容器运行时临时故障DiskPressure- 磁盘压力(清理后可恢复)
Agent 端 GPU 镜像内存自动提升
当 Agent 检测到任务使用 GPU 推理镜像(如 vLLM、llama.cpp)时,自动将默认内存从 2048MB 提升到 8192MB,避免推理引擎因内存不足而崩溃:
Agent 检测到 GPU 推理镜像
├── memory_mb == 2048 (默认值)?
│ └── 是 → 自动调整为 8192MB
├── memory_mb > 2048?
│ └── 保持用户设定值
└── 记录日志: "Auto-boost GPU inference memory: 2048 → 8192MB"配置参数
全局配置(config.yaml)
scheduler:
retry:
max_retries: 3 # 最大重试次数(默认 3)
default_strategy: "retry_new_node" # 默认重试策略
oom_memory_limit: 16384 # OOM 内存升级上限(MB)
retry_delay: 30 # 重试间隔(秒)
backoff_multiplier: 2 # 退避倍数任务级配置
提交任务时可通过参数覆盖全局配置:
{
"name": "training-job",
"image": "pytorch/pytorch:latest",
"retry_strategy": "retry_new_node",
"max_retries": 5,
"memory_mb": 4096,
"command": "python train.py"
}| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
retry_strategy | string | retry_new_node | 重试策略 |
max_retries | int | 3 | 最大重试次数 |
memory_mb | int | 2048 | 任务内存限制(MB) |
retry_delay | int | 30 | 重试延迟(秒) |
使用示例
提交带重试策略的任务
# 使用 retry_new_node 策略(推荐)
curl -X POST http://localhost:3333/api/v1/tasks
-H "Authorization: Bearer <token>"
-H "Content-Type: application/json"
-d '{
"name": "gpu-training",
"image": "pytorch/pytorch:2.0-cuda11.7",
"gpu_count": 2,
"memory_mb": 4096,
"retry_strategy": "retry_new_node",
"max_retries": 5,
"command": "python train.py --epochs 100"
}'查看任务重试历史
curl -X GET http://localhost:3333/api/v1/tasks/{task_id}/retries
-H "Authorization: Bearer <token>"响应示例:
{
"task_id": "task-abc123",
"retries": [
{
"attempt": 1,
"node_id": "node-1",
"error": "OOM Killed",
"memory_mb": 4096,
"timestamp": "2026-05-20T10:30:00Z"
},
{
"attempt": 2,
"node_id": "node-1",
"error": "OOM Killed",
"memory_mb": 8192,
"timestamp": "2026-05-20T10:31:00Z"
},
{
"attempt": 3,
"node_id": "node-2",
"error": null,
"memory_mb": 8192,
"status": "running",
"timestamp": "2026-05-20T10:32:00Z"
}
]
}禁用自动重试
curl -X POST http://localhost:3333/api/v1/tasks
-H "Authorization: Bearer <token>"
-H "Content-Type: application/json"
-d '{
"name": "test-job",
"image": "alpine:latest",
"retry_strategy": "no_retry",
"command": "echo hello"
}'重试状态机
PENDING → RUNNING → SUCCESS
↘ FAILED
├── 可重试?
│ ├── 是 → 判断策略
│ │ ├── retry_same_node → 原节点重新调度
│ │ └── retry_new_node → 重新调度到新节点
│ │ └── OOM? → 内存翻倍 / 迁移大VRAM节点
│ └── 否 → 标记为 PERMANENT_FAILURE
└── max_retries 已用尽 → 标记为 FAILED