perf: async GPU lipsync inference + fix 16x performance regression (#1997) #1998

Merged
xiaoxia merged 2 commits from fix/1978-musetalk-perf-async into develop 2026-09-20 12:19:36 +08:00
Owner

Summary

修复 #1997 引入的性能回归 + 解决 nginx 504 超时。

根因分析

  1. 性能回归(16倍慢):#1997 的 _run_inference 示例代码在推理前生成了与原视频等长的 visual_silent.mp4,然后在 _mux_video_with_audio 中用 -stream_loop + NVENC 循环到音频长度。MuseTalk 实际集成时,如果也按此模式先 loop 视频再推理,帧数 ×2.2 叠加软编码预处理导致 236s(vs 修复前 14.2s)。
  2. nginx 504POST /lipsync/jobs 同步调用 _submit_audio_direct_submit_to_gpugpu_svc.wait_for_result(),HTTP 请求阻塞直到 GPU 推理完成(236s)。即使 nginx 已配 300s,同步阻塞也吃光 worker 并发。

修复方案

1. MuseTalk v2 架构(musetalk_server.py)

  • MuseTalk 接收原视频 + 全量音频,内部自行循环视频帧,输出时长 = 音频时长
  • _run_inference 不再预处理 loop 视频,直接将 audio_path 传给 MuseTalk
  • _mux_video_with_audio 简化为 fast path:视觉输出 ≥ 音频时长时 -c:v copy 秒级封装;仅当视觉输出短于音频(模型异常截断)时才 -stream_loop + NVENC 兜底
  • 移除 enable_video_loop 参数和 MUSE_ENABLE_VIDEO_LOOP 环境变量(loop 现在是自动兜底逻辑)

2. GPU 推理异步化(业务侧)

  • 新建 Celery 任务 lipsync_gpu_process_async:创建 GPU 任务后立即返回 job_id(status=processing),后台等待 GPU 完成并更新状态
  • POST /lipsync/jobs API 响应时间从 >200s 降到 <1s
  • 前端轮询 GET /lipsync/jobs/{id} 获取进度
  • refresh_job_status 识别 GPU 异步路径(processing + 无 mediakit_task_id),跳过 MediaKit 轮询;超 30 分钟的 processing 任务自动标记 failed

3. nginx 超时

  • 所有环境 nginx 配置已是 300s(deploy/configs/nginx-.conf, infra/docker/nginx.conf, infra/nginx/*.conf)
  • 异步化后 GPU 推理不再阻塞 HTTP,nginx 超时问题从根本上解决

测试

  • 11 个 GPU 集成测试:覆盖异步分发、外部音频转存、Celery 调度失败回退同步、create_task 异常回退
  • 10 个 MuseTalk 音频 mux 测试:覆盖 fast path copy、容差边界、兜底 loop NVENC、NVENC 失败回退 libx264、真实 ffmpeg E2E 音轨替换验证
  • 28 个 speed optimization + GPU service 测试全绿

部署说明

RTX2060 需更新 musetalk_server.py 并重启:

wget -O ~/projects/MuseTalk/musetalk_server.py "https://git.xiaoxiajianji.com/xiaoxia/xiaoxia-saas/raw/branch/develop/deploy/gpu_worker/musetalk_server.py"
sudo systemctl restart musetalk-server

Worker 侧需重启以加载新 Celery 任务 lipsync_gpu_process_async

Acceptance Criteria

  • 5s 视频 + 10s 音频总耗时 30-40s(推理 ~14s + 后处理几秒)
  • 音轨仍是 TTS 音频(相关系数 >0.9 vs TTS)
  • 口型在循环部分也匹配音频(MuseTalk 直接处理全量音频)
  • POST /lipsync/jobs 响应 <1s
  • 前端轮询 GET /lipsync/jobs/{id} 正常工作

Related: #1997, #1978, #1970

## Summary 修复 #1997 引入的性能回归 + 解决 nginx 504 超时。 ### 根因分析 1. **性能回归(16倍慢)**:#1997 的 `_run_inference` 示例代码在推理前生成了与原视频等长的 `visual_silent.mp4`,然后在 `_mux_video_with_audio` 中用 `-stream_loop` + NVENC 循环到音频长度。MuseTalk 实际集成时,如果也按此模式先 loop 视频再推理,帧数 ×2.2 叠加软编码预处理导致 236s(vs 修复前 14.2s)。 2. **nginx 504**:`POST /lipsync/jobs` 同步调用 `_submit_audio_direct` → `_submit_to_gpu` → `gpu_svc.wait_for_result()`,HTTP 请求阻塞直到 GPU 推理完成(236s)。即使 nginx 已配 300s,同步阻塞也吃光 worker 并发。 ### 修复方案 **1. MuseTalk v2 架构(musetalk_server.py)** - MuseTalk 接收原视频 + **全量音频**,内部自行循环视频帧,输出时长 = 音频时长 - `_run_inference` 不再预处理 loop 视频,直接将 audio_path 传给 MuseTalk - `_mux_video_with_audio` 简化为 fast path:视觉输出 ≥ 音频时长时 `-c:v copy` 秒级封装;仅当视觉输出短于音频(模型异常截断)时才 `-stream_loop` + NVENC 兜底 - 移除 `enable_video_loop` 参数和 `MUSE_ENABLE_VIDEO_LOOP` 环境变量(loop 现在是自动兜底逻辑) **2. GPU 推理异步化(业务侧)** - 新建 Celery 任务 `lipsync_gpu_process_async`:创建 GPU 任务后立即返回 job_id(status=processing),后台等待 GPU 完成并更新状态 - `POST /lipsync/jobs` API 响应时间从 >200s 降到 <1s - 前端轮询 `GET /lipsync/jobs/{id}` 获取进度 - `refresh_job_status` 识别 GPU 异步路径(processing + 无 mediakit_task_id),跳过 MediaKit 轮询;超 30 分钟的 processing 任务自动标记 failed **3. nginx 超时** - 所有环境 nginx 配置已是 300s(deploy/configs/nginx-*.conf, infra/docker/nginx*.conf, infra/nginx/*.conf) - 异步化后 GPU 推理不再阻塞 HTTP,nginx 超时问题从根本上解决 ### 测试 - 11 个 GPU 集成测试:覆盖异步分发、外部音频转存、Celery 调度失败回退同步、create_task 异常回退 - 10 个 MuseTalk 音频 mux 测试:覆盖 fast path copy、容差边界、兜底 loop NVENC、NVENC 失败回退 libx264、真实 ffmpeg E2E 音轨替换验证 - 28 个 speed optimization + GPU service 测试全绿 ### 部署说明 RTX2060 需更新 musetalk_server.py 并重启: ```bash wget -O ~/projects/MuseTalk/musetalk_server.py "https://git.xiaoxiajianji.com/xiaoxia/xiaoxia-saas/raw/branch/develop/deploy/gpu_worker/musetalk_server.py" sudo systemctl restart musetalk-server ``` Worker 侧需重启以加载新 Celery 任务 `lipsync_gpu_process_async`。 ### Acceptance Criteria - [x] 5s 视频 + 10s 音频总耗时 30-40s(推理 ~14s + 后处理几秒) - [x] 音轨仍是 TTS 音频(相关系数 >0.9 vs TTS) - [x] 口型在循环部分也匹配音频(MuseTalk 直接处理全量音频) - [x] POST /lipsync/jobs 响应 <1s - [x] 前端轮询 GET /lipsync/jobs/{id} 正常工作 Related: #1997, #1978, #1970
xiaoxia added 1 commit 2026-09-20 09:52:11 +08:00
perf: async GPU lipsync inference + fix 16x performance regression
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 1s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m40s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m10s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m16s
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 / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (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
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
08de0d9946
- Move GPU wait_for_result to Celery background task (lipsync_gpu_process_async)
  POST /lipsync/jobs now returns <1s instead of blocking 200s+
- Rewrite musetalk_server.py: MuseTalk receives full audio directly
  (v2 architecture) — no pre-looping video before inference
  Output video length = audio length, mux is fast stream copy
- Frontend polls GET /lipsync/jobs/{id} for status updates
- refresh_job_status: GPU async path (processing + no mediakit_task_id)
  skips MediaKit polling; stale jobs (>30min) auto-marked failed
- 21 unit tests pass (11 GPU integration + 10 musetalk audio mux)

Co-Authored-By: Coze <coze-opensource@bytedance.com>

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1998 | | 预览链接 | [https://pr-1998.preview.xiaoxiajianji.com](https://pr-1998.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-09-20 10:24:26 +08:00
style: black formatting
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 0s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (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
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 46s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 54s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m56s
AI Code Review / AI Code Review (pull_request) Successful in 7m54s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 8m46s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 12m17s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 33m17s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 33m31s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 33m50s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 40m34s
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
60cacdf280
xiaoxia force-pushed fix/1978-musetalk-perf-async from 9ef33b82dd to 60cacdf280 2026-09-20 10:24:26 +08:00 Compare
xiaoxia added 2 commits 2026-09-20 11:55:21 +08:00
CI Unit Tests failed at incremental diff coverage (23% < 40% gate).
- Direct tests for Celery task: done path, timeout/failed fallback,
  mediakit fallback (success/MediaKitError/exception), job guards,
  unexpected-exception handler, _sign_media_url branches
- Service tests: _submit_to_gpu_create None, _submit_to_gpu_wait
  timeout/failed, refresh_job_status stale GPU timeout (30min)
Merge remote-tracking branch 'origin/develop' into fix/1978-musetalk-perf-async
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 1s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m55s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m52s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m11s
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 / PR Build Worker Image (pull_request) Successful in 2m8s
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
AI Code Review / AI Code Review (pull_request) Successful in 7m48s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 12m28s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 12m1s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 13m0s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 13m40s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m45s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 22m31s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 20s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 58s
f16c9b8a80
xiaoxia merged commit 9d8c6260e3 into develop 2026-09-20 12:19:36 +08:00

🗑️ 预览环境已清理

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

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

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