V2 独立版愿景

智能重试

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_strategystringretry_new_node重试策略
max_retriesint3最大重试次数
memory_mbint2048任务内存限制(MB)
retry_delayint30重试延迟(秒)

使用示例

提交带重试策略的任务

# 使用 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