feat(deploy): GPU节点自动部署配置文件入库(musetalk-worker+gpu-poll+setup/update脚本) #1999

Merged
xiaoxia merged 3 commits from feat/gpu-node-auto-deploy into develop 2026-09-20 11:02:09 +08:00
Owner

背景

RTX2060 GPU渲染节点已手动部署完成,systemd托管+自动更新机制已验证。把部署配置文件入库,方便后续新节点部署和维护。

新增文件(7个,337行)

systemd单元(3个)

  • musetalk-worker.service — MuseTalk推理API常驻服务(User=ying, WorkingDirectory=/home/ying/projects/MuseTalk, 自动重启, 日志走journal)
  • gpu-poll.service — 自动更新轮询oneshot(执行poll_and_update.sh)
  • gpu-poll.timer — 每30秒触发轮询(OnBootSec=30, OnUnitActiveSec=30, AccuracySec=5)

运维脚本(3个,均chmod +x)

  • scripts/update-gpu-worker.sh — 自动更新主脚本:
    • 备份当前musetalk_server.py/gpu_worker.py(带时间戳后缀)
    • wget拉取develop分支最新代码
    • requirements.txt有diff则pip install
    • 顺序重启musetalk-worker → xiaoxia-gpu-worker
    • curl /health健康检查
    • 失败自动回滚到最新备份+重启
  • scripts/poll_and_update.sh — 轮询Gitea API:
    • 取deploy/gpu_worker/路径最新commit SHA
    • 与~/.last_commit比对,无变更直接退出
    • 首次运行只记录SHA不更新
    • 网络失败跳过,不触发误重启
  • scripts/setup-gpu-node.sh — 新节点一键初始化:
    1. apt安装系统依赖(python3/ffmpeg/wget/curl/git)
    2. 创建目录(~/projects/MuseTalk, ~/projects/gpu-webhook, /opt/xiaoxia-gpu-worker)
    3. 从仓库拉取3个service+2个脚本
    4. 安装systemd单元到/etc/systemd/system/
    5. 写入sudoers.d/ying-gpu-update(最小化免密:仅restart/status两个服务+daemon-reload+journalctl+cp/chmod/tee)
    6. 首次拉代码+daemon-reload+enable+start

文档

  • README.md 追加第七章「自动部署」(128行):服务架构表、新节点部署步骤(前置手动准备+一键setup+初始化检查)、自动更新机制(push→30s内拉取→健康检查→失败回滚)、手动更新命令、日志位置、仓库文件清单、注意事项

明确不改动

  • 现有文件不动:gpu_worker.py、musetalk_server.py、requirements.txt、xiaoxia-gpu-worker.service、.env.example
  • 不改CI配置、不加Docker、不加镜像构建步骤
  • 脚本路径写死/home/ying/projects/和/opt/xiaoxia-gpu-worker/,多节点需求再参数化

使用方式

新节点:前置准备NVIDIA驱动+CUDA+MuseTalk代码+模型权重+venv后,wget setup-gpu-node.sh执行即可。

现有节点(RTX2060):setup已手跑过,现在push到develop即自动更新;可手动bash ~/projects/update-gpu-worker.sh立即触发。

注意事项

  • 首次部署需手动准备MuseTalk模型权重(models/musetalk/,几GB)和Python虚拟环境(含CUDA版PyTorch),这些体积大不适合自动下载
  • 回滚只回滚.py文件,不回滚pip依赖
  • poll脚本Gitea API失败直接跳过,不误重启服务
  • sudo免密范围最小化,不放行全量root
## 背景 RTX2060 GPU渲染节点已手动部署完成,systemd托管+自动更新机制已验证。把部署配置文件入库,方便后续新节点部署和维护。 ## 新增文件(7个,337行) ### systemd单元(3个) - `musetalk-worker.service` — MuseTalk推理API常驻服务(User=ying, WorkingDirectory=/home/ying/projects/MuseTalk, 自动重启, 日志走journal) - `gpu-poll.service` — 自动更新轮询oneshot(执行poll_and_update.sh) - `gpu-poll.timer` — 每30秒触发轮询(OnBootSec=30, OnUnitActiveSec=30, AccuracySec=5) ### 运维脚本(3个,均chmod +x) - `scripts/update-gpu-worker.sh` — 自动更新主脚本: - 备份当前musetalk_server.py/gpu_worker.py(带时间戳后缀) - wget拉取develop分支最新代码 - requirements.txt有diff则pip install - 顺序重启musetalk-worker → xiaoxia-gpu-worker - curl /health健康检查 - 失败自动回滚到最新备份+重启 - `scripts/poll_and_update.sh` — 轮询Gitea API: - 取deploy/gpu_worker/路径最新commit SHA - 与~/.last_commit比对,无变更直接退出 - 首次运行只记录SHA不更新 - 网络失败跳过,不触发误重启 - `scripts/setup-gpu-node.sh` — 新节点一键初始化: 1. apt安装系统依赖(python3/ffmpeg/wget/curl/git) 2. 创建目录(~/projects/MuseTalk, ~/projects/gpu-webhook, /opt/xiaoxia-gpu-worker) 3. 从仓库拉取3个service+2个脚本 4. 安装systemd单元到/etc/systemd/system/ 5. 写入sudoers.d/ying-gpu-update(最小化免密:仅restart/status两个服务+daemon-reload+journalctl+cp/chmod/tee) 6. 首次拉代码+daemon-reload+enable+start ### 文档 - `README.md` 追加第七章「自动部署」(128行):服务架构表、新节点部署步骤(前置手动准备+一键setup+初始化检查)、自动更新机制(push→30s内拉取→健康检查→失败回滚)、手动更新命令、日志位置、仓库文件清单、注意事项 ## 明确不改动 - 现有文件不动:gpu_worker.py、musetalk_server.py、requirements.txt、xiaoxia-gpu-worker.service、.env.example - 不改CI配置、不加Docker、不加镜像构建步骤 - 脚本路径写死/home/ying/projects/和/opt/xiaoxia-gpu-worker/,多节点需求再参数化 ## 使用方式 **新节点**:前置准备NVIDIA驱动+CUDA+MuseTalk代码+模型权重+venv后,wget setup-gpu-node.sh执行即可。 **现有节点(RTX2060)**:setup已手跑过,现在push到develop即自动更新;可手动`bash ~/projects/update-gpu-worker.sh`立即触发。 ## 注意事项 - 首次部署需手动准备MuseTalk模型权重(models/musetalk/,几GB)和Python虚拟环境(含CUDA版PyTorch),这些体积大不适合自动下载 - 回滚只回滚.py文件,不回滚pip依赖 - poll脚本Gitea API失败直接跳过,不误重启服务 - sudo免密范围最小化,不放行全量root
xiaoxia added 3 commits 2026-09-20 10:30:33 +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>
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
feat(deploy): #1978 GPU节点自动部署配置文件入库
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m53s
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 API Image (pull_request) Successful in 1m17s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m19s
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
AI Code Review / AI Code Review (pull_request) Successful in 7m47s
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 8m44s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m37s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 29m54s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 28m18s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 27m55s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 24s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 7m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 40m20s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 1h36m46s
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 4s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
db621b4fcb
新增 deploy/gpu_worker/ 下 3 个 systemd 单元 + 3 个运维脚本:
- musetalk-worker.service: MuseTalk 推理 API systemd 服务
- gpu-poll.service + gpu-poll.timer: 每30秒轮询Gitea最新commit
- scripts/update-gpu-worker.sh: 备份→拉代码→重启→健康检查→失败回滚
- scripts/poll_and_update.sh: SHA比对触发update
- scripts/setup-gpu-node.sh: 新节点一键初始化(apt依赖+目录+systemd+sudo免密+首次启动)
- README.md 追加第七章「自动部署」说明服务架构/部署步骤/更新机制/日志/注意事项

不改动现有 gpu_worker.py/musetalk_server.py/requirements.txt/xiaoxia-gpu-worker.service/.env.example
不改动CI/Docker/镜像构建。脚本路径写死/home/ying,后续多节点再参数化。

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1999 | | 预览链接 | [https://pr-1999.preview.xiaoxiajianji.com](https://pr-1999.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia merged commit 0764a7820c into develop 2026-09-20 11:02:09 +08:00

🗑️ 预览环境已清理

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

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

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