fix(gpu): #1970 MuseTalk worker 推理期心跳/超时900/重试收敛/短视频前置失败 #1990

Merged
auto-approve-bot merged 3 commits from fix/1970-gpu-worker-heartbeat-timeout into develop 2026-09-19 15:06:53 +08:00
Owner

背景

GPU Worker 端到端链路已通,但 MuseTalk 推理环节有四个问题(RTX2060 6G,22s 720p 视频推理 >5min):

  1. GPU_TASK_TIMEOUT_SECONDS=300 与 worker REQUEST_TIMEOUT=300 太短
  2. worker 推理阻塞主循环期间无心跳,服务端误判超时把任务回退 pending
  3. worker 本地重试 2 次 × 服务端 MAX_ATTEMPTS=3 = 最多 9 次推理放大
  4. <3s 短视频 MuseTalk division by zero,白白浪费 GPU 时间

修改

超时

  • gpu_task_timeout_seconds 默认 300→900(base.py / .env.example / .env.staging / .env.production)
  • worker REQUEST_TIMEOUT 默认 300→900,与服务端对齐

推理期任务心跳

  • worker 新增 TaskHeartbeat daemon 线程:_handle_task 开始即启动,每 30s(TASK_HEARTBEAT_INTERVAL)POST /gpu/register 携带 task_id,覆盖下载/推理/上报全过程,结束 stop
  • register schema 新增可选 task_id;service _touch_task_heartbeat 只刷新属于该 worker 且仍 processing 的任务心跳;已完成/已被超时回收重派/不存在的过期心跳静默忽略
  • 服务端回收语义不变:仅任务心跳真正停滞超过 900s(崩溃/断网)才回退,MAX_ATTEMPTS=3 保持不变 → 不会因 worker 忙于推理而误回退

重试收敛

  • worker TASK_MAX_RETRY 2→1,且仅对瞬时错误(连接失败/超时/HTTP 5xx,retryable=True)重试;4xx、结果过小等确定性失败不本地重试,直接上报服务端
  • 总尝试次数:本地最多 2 次瞬时尝试,服务端跨 worker 最多 3 轮

短视频前置拦截

  • 下载后 ffprobe 读时长,<3s(MIN_VIDEO_DURATION_SECONDS)直接上报 failed 视频过短(x.xxs < 3s),MuseTalk 无法处理,不调推理;ffprobe 不可用(0.0)不拦截避免误杀

测试

  • 新增 11 个单测:worker 独立部署脚本按文件路径动态加载(config 默认值、register 带 task_id、心跳线程启停、短视频拦截、probe 失败不拦截、4xx/5xx/连接错误 retryable 语义、handle_task 重试/不重试路径);服务端补任务心跳刷新/过期心跳忽略/默认 900 共 4 个测试
  • pytest tests/unit:15839 passed, 28 skipped;black/isort/ruff 通过

部署提醒(worker 本机 192.168.0.193)

服务端随 develop 自动部署;worker 脚本需更新(替换 gpu_worker.py + 重启),新默认值无需改 .env;如旧 .env 里显式写了 REQUEST_TIMEOUT=300/TASK_MAX_RETRY=2 需删掉或改成 900/1。

已知

Staging E2E 近期持续因登录 429 限流/页面超时失败(前几个 develop 提交同样),属预存环境问题,与本次代码无关。

## 背景 GPU Worker 端到端链路已通,但 MuseTalk 推理环节有四个问题(RTX2060 6G,22s 720p 视频推理 >5min): 1. `GPU_TASK_TIMEOUT_SECONDS=300` 与 worker `REQUEST_TIMEOUT=300` 太短 2. worker 推理阻塞主循环期间无心跳,服务端误判超时把任务回退 pending 3. worker 本地重试 2 次 × 服务端 MAX_ATTEMPTS=3 = 最多 9 次推理放大 4. <3s 短视频 MuseTalk division by zero,白白浪费 GPU 时间 ## 修改 **超时** - `gpu_task_timeout_seconds` 默认 300→900(base.py / .env.example / .env.staging / .env.production) - worker `REQUEST_TIMEOUT` 默认 300→900,与服务端对齐 **推理期任务心跳** - worker 新增 `TaskHeartbeat` daemon 线程:`_handle_task` 开始即启动,每 30s(`TASK_HEARTBEAT_INTERVAL`)POST `/gpu/register` 携带 `task_id`,覆盖下载/推理/上报全过程,结束 stop - register schema 新增可选 `task_id`;service `_touch_task_heartbeat` 只刷新**属于该 worker 且仍 processing** 的任务心跳;已完成/已被超时回收重派/不存在的过期心跳静默忽略 - 服务端回收语义不变:仅任务心跳真正停滞超过 900s(崩溃/断网)才回退,MAX_ATTEMPTS=3 保持不变 → 不会因 worker 忙于推理而误回退 **重试收敛** - worker `TASK_MAX_RETRY` 2→1,且仅对瞬时错误(连接失败/超时/HTTP 5xx,retryable=True)重试;4xx、结果过小等确定性失败不本地重试,直接上报服务端 - 总尝试次数:本地最多 2 次瞬时尝试,服务端跨 worker 最多 3 轮 **短视频前置拦截** - 下载后 ffprobe 读时长,`<3s`(`MIN_VIDEO_DURATION_SECONDS`)直接上报 failed `视频过短(x.xxs < 3s),MuseTalk 无法处理`,不调推理;ffprobe 不可用(0.0)不拦截避免误杀 ## 测试 - 新增 11 个单测:worker 独立部署脚本按文件路径动态加载(config 默认值、register 带 task_id、心跳线程启停、短视频拦截、probe 失败不拦截、4xx/5xx/连接错误 retryable 语义、handle_task 重试/不重试路径);服务端补任务心跳刷新/过期心跳忽略/默认 900 共 4 个测试 - `pytest tests/unit`:**15839 passed, 28 skipped**;black/isort/ruff 通过 ## 部署提醒(worker 本机 192.168.0.193) 服务端随 develop 自动部署;worker 脚本需更新(替换 gpu_worker.py + 重启),新默认值无需改 .env;如旧 .env 里显式写了 `REQUEST_TIMEOUT=300`/`TASK_MAX_RETRY=2` 需删掉或改成 900/1。 ## 已知 Staging E2E 近期持续因登录 429 限流/页面超时失败(前几个 develop 提交同样),属预存环境问题,与本次代码无关。
xiaoxia added 1 commit 2026-09-19 14:36:59 +08:00
fix(gpu): #1970 MuseTalk worker 推理期心跳/超时 900/重试收敛/短视频前置失败
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m23s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m23s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m3s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m0s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m1s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m5s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m19s
AI Code Review / AI Code Review (pull_request) Successful in 6m27s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 6m44s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 8m42s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m54s
a8f1069cd2
- GPU_TASK_TIMEOUT_SECONDS 默认 300→900(base.py + env 模板),worker
  REQUEST_TIMEOUT 默认同步 300→900,RTX2060 6G 处理 720p 长视频不再超时
- worker 新增 TaskHeartbeat daemon 线程:任务处理期间每 30s POST
  /gpu/register(task_id=...) 续任务心跳,服务端只在任务心跳真正停滞
  超过 900s(崩溃/断网)或 worker 明确上报 failed 时才回退 pending,
  长推理阻塞主循环不再导致误回退
- register schema/service 支持 task_id:_touch_task_heartbeat 只刷新
  属于该 worker 且仍 processing 的任务,已完成/已被回收重派的过期心跳忽略
- worker 本地 TASK_MAX_RETRY 2→1,且仅对瞬时错误(连接失败/超时/5xx)重试;
  4xx、结果过小等确定性失败不本地重试,服务端 MAX_ATTEMPTS=3 不变,
  消除 3×3=9 次推理放大
- <3s 输入视频(MuseTalk division by zero)下载后 ffprobe 前置校验,
  直接上报 failed"视频过短",不调用推理;ffprobe 不可用时不拦截
- 新增 11 个单测(worker 独立脚本按路径加载),全量 15839 passed

🚀 预览环境已部署

项目 详情
PR号 #1990
预览链接 https://pr-1990.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1990 | | 预览链接 | [https://pr-1990.preview.xiaoxiajianji.com](https://pr-1990.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-09-19 14:52:28 +08:00
fix(gpu): TaskHeartbeat 的 _stop 属性改名 _stop_event,避免覆盖 Thread._stop 方法
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 38s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 59s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m21s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m34s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m54s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m53s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m59s
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
10294e9eb9
CI 单测报错 'Event' object is not callable:threading.Thread 内部存在
_stop() 方法(join/GC 时调用),子类用 self._stop = Event() 覆盖了它,
线程回收时 TypeError。本地因时序差异未复现。
xiaoxia added 1 commit 2026-09-19 14:57:25 +08:00
style(gpu): black/ruff 整理(顺带移除 worker 未使用的 import json)
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 29s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 30s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m14s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m24s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m48s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m55s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m0s
AI Code Review / AI Code Review (pull_request) Successful in 6m25s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m54s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 8m43s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m32s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 30s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m16s
19ace80123
auto-approve-bot merged commit 1591259bb8 into develop 2026-09-19 15:06:53 +08:00
auto-approve-bot deleted branch fix/1970-gpu-worker-heartbeat-timeout 2026-09-19 15:06:56 +08:00

🗑️ 预览环境已清理

PR #1990 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1990 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.