--- name: wan22-video-generation description: Wan2.2-TI2V-5B 视频生成服务 — OpenAI 兼容 API,基于 ahserver + longtasks 异步任务队列,模型常驻 GPU 内存 tags: [wan22, video-generation, ai-compute, gpu, ahserver, longtasks] --- # Wan22 Video Generation Service Wan2.2-TI2V-5B 视频生成服务,部署在 GPU 服务器 (ymq@opencomputing.net) 上。 ## 架构 ``` User/Hermes → Sage llmage/uapi → wan22-service (port 8079) → GPU 推理 ``` 独立 ahserver 应用,通过 longtasks + Redis 管理异步视频生成任务。 ## 关键文件 | 文件 | 路径 | 说明 | |------|------|------| | 主入口 | `~/wan22-service/ah.py` | ahserver + Wan22Tasks 初始化 | | 提任务 | `~/wan22-service/app/api/submit/index.dspy` | POST /api/submit | | 查状态 | `~/wan22-service/app/api/task/index.dspy` | GET /api/task?task_id=xxx | | 推理执行 | `~/wan22-service/workers/generate.py` | 惰性加载 Wan22,进程内推理 | | Wan22 类 | `~/wan22-service/workers/wan22_wrapper.py` | OpenAI 风格封装 | | 配置文件 | `~/wan22-service/conf/config.json` | 端口 8079, Redis, filesroot | | 启动脚本 | `~/wan22-service/start.sh` | WAN22_GPU_ID=2 | ## API 接口 ### 提交任务 ```bash curl -X POST http://:8079/api/submit \ -H "Content-Type: application/json" \ -d '{"prompt":"A cinematic street at dawn, blue-grey tones","size":"1280*720","frame_num":81}' ``` ### 查询状态 ```bash curl "http://:8079/api/task?task_id=xxx" ``` ### 下载视频 ```bash curl -o output.mp4 "http://:8079/idfile?path=task_id.mp4" ``` ## 设计要点 1. **串行推理锁**: `_GLOBAL_INFER_LOCK` (threading.Lock) 保证 GPU 安全 2. **模型常驻**: Wan22 实例惰性初始化,首次任务加载后跨任务复用 3. **异步队列**: longtasks (Redis) worker_cnt=1,一次处理一个任务 4. **支持任务类型**: t2v / i2v / ti2v / s2v ## 管理 ```bash ssh ymq@opencomputing.net cd ~/wan22-service ./start.sh # 启动 (后台, nohup) ./stop.sh # 停止 (kill pid) tail -f wan22-service.log # 查看日志 ``` ## Sage 集成 通过 Sage 的 llmage + uapi 方式接入: ```sql -- 注册 uapi provider INSERT INTO uapiprovider (...) VALUES ('wan22', 'Wan2.2', 'http://wan22.internal:8079'); -- 注册 API endpoint INSERT INTO uapi (providerid, apiname, path, ...) VALUES ('wan22', 'video_generations', '/api/submit', ...); -- 注册 llm 模型 INSERT INTO llm (model, ...) VALUES ('wan2.2-ti2v-5b', ...); ``` ## 注意事项 - GPU OOM 时:减少 frame_num (最小 17) 或换小分辨率 - task 未完成时返回 `PENDING` 状态,需轮询 - 任务最长超时 3600 秒 (stuck_seconds) - 已完成任务保留 24 小时 (max_age_hours)