# 接口2 女性生发 — 耗时分析与优化方案 > 分析日期:2026-07-18 > 基准数据:19张图片 × 5种发际线 = 95次调用,平均 11.1s,最快 8.3s,最慢 14.0s --- ## 一、完整调用链与耗时拆解 以 `girl1.jpg` 单次调用(13.66s)为例,从 [hairline_grow.log](file:///home/ubuntu/hair/log/hairline_grow.log) 提取的精确时间: ``` 接口2 generate_grow_results_swap() │ ├─ ① extract_context() ~1.8s │ ├─ FaceLandmarker (MediaPipe) 检测 ~0.5s │ ├─ FaceParser (SegFormer CPU) 头发分割 ~0.9s ← 瓶颈③ │ └─ 3D提升 + 平滑 ~0.4s │ ├─ ② generate_hairline_redraw() ~5.8s │ ├─ detector.detect (MediaPipe) ~0.01s │ ├─ SegFormer CPU 头发分割 ~0.9s ← 瓶颈③(重复!) │ ├─ 遮罩计算 ~0.08s │ ├─ _call_swap → swapHair HTTP (:8801) ~4.8s ← 瓶颈①(35%) │ │ └─ change_hair → webui SD1.5 img2img │ └─ 接缝融合 + band_mask ~0.05s │ └─ ③ _call_local_redraw → ComfyUI Flux-2 ~6.0s ← 瓶颈②(44%) ├─ 上传图片 + 提交工作流 ~0.3s ├─ Flux-2 推理 (steps=4) ~4.5s ├─ 轮询 /history (sleep=1.0s) ~0.5s ← 可优化 └─ 下载结果图 ~0.7s ``` ### 耗时占比 | 步骤 | 耗时 | 占比 | 可优化 | |------|------|------|--------| | swapHair HTTP (webui SD推理) | 4.8s | 35% | ✅ | | ComfyUI Flux-2 推理 | 6.0s | 44% | ✅ | | SegFormer CPU × 2次 | 1.8s | 13% | ✅ | | 其他(MediaPipe+3D+融合) | 1.0s | 8% | — | --- ## 二、优化方案(按收益排序) ### 优化1:ComfyUI 轮询间隔 1.0s → 0.2s(省 ~0.5-0.8s) **问题**:[comfyui.py:148](file:///home/ubuntu/hair/hairline/comfyui.py#L148) `time.sleep(1.0)` — 每次轮询固定等1秒,Flux-2推理只需~4.5s,但轮询可能多等0.5-1s。 **改法**: ```python # comfyui.py:148 time.sleep(1.0) → time.sleep(0.2) ``` **收益**:每次调用省 0.5-0.8s,95次省 ~60s。 --- ### 优化2:避免重复 SegFormer 推理(省 ~0.9s) **问题**:`extract_context()` 在 [service.py:128](file:///home/ubuntu/hair/hairline/service.py#L128) 跑了一次 SegFormer,`_grow_core()` 在 [hairline_grow.py:879](file:///home/ubuntu/hair/face_analysis/hairline_grow.py#L879) 又跑一次 SegFormer。同一张图做了两次相同的头发分割。 **改法**:让 `generate_hairline_redraw` 接受外部传入的 `parse_map`,跳过内部重复分割。 **收益**:每次调用省 ~0.9s,95次省 ~85s。 --- ### 优化3:SegFormer 移到 GPU(省 ~0.9s,需换 torch cu128) **问题**:[service.py:61](file:///home/ubuntu/hair/hairline/service.py#L61) 注释: ``` ⚠️ 本 worker 是 RTX 5090(sm_120),torch 2.2.2(cu121) 只编到 sm_90 SegFormer 默认走 CPU(~2.5s/张) ``` **改法**: 1. 升级 torch 到 cu128:`pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128` 2. 设置环境变量:`SEG_DEVICE=cuda` **收益**:SegFormer CPU 0.9s → GPU 0.05s,省 ~0.85s。 --- ### 优化4:Flux-2 工作流 steps=4 → 2-3(省 ~1-2s) **问题**:[0716add-hair-api.json](file:///home/ubuntu/hair/0716add-hair-api.json) 的 KSampler steps=4,每步约 1.1s。 **改法**:修改工作流 JSON 中 KSampler 节点的 `steps` 值。需质量验证。 **收益**:steps 4→2 省 ~2.2s;steps 4→3 省 ~1.1s。 --- ### 优化5:swapHair webui 推理优化(省 ~1-2s) **问题**:swapHair 调 change_hair:8801 → webui:57860 SD1.5 img2img,denoising_strength=0.6。 **可能方向**: - 降低 denoising_strength(0.6→0.45) - webui 启用 `--medvram` 或 `--xformers`(已启用 xformers) - 检查是否可换更快的 sampler(如 DPM++ 2M Karras) **收益**:需实测验证。 --- ### 优化6:base64 编解码优化(省 ~0.2s) **问题**:`_call_swap` 把图片编成 base64 JSON 传输([hairline_grow.py:516-521](file:///home/ubuntu/hair/face_analysis/hairline_grow.py#L516-L521)),`_call_local_redraw` 又解一次。大图 base64 编解码耗时显著。 **改法**:用 multipart 上传代替 base64 JSON。 --- ## 三、预期收益汇总 | 优化项 | 难度 | 单次省时 | 累计省时(95次) | |--------|------|---------|---------------| | 轮询 1s→0.2s | 极简 | 0.5s | 48s | | 避免重复SegFormer | 中 | 0.9s | 86s | | SegFormer→GPU | 中(需换torch) | 0.85s | 81s | | Flux-2 steps 4→2 | 简单(需验证) | 2.2s | 209s | | swapHair优化 | 复杂 | 1.5s | 143s | | base64优化 | 中 | 0.2s | 19s | ### 乐观预期 | 阶段 | 平均耗时 | 95次总耗时 | |------|---------|-----------| | 当前 | 11.1s | ~17.6分钟 | | 优化1-3(立即可做) | ~8.8s | ~14分钟 | | 优化1-4(含Flux-2) | ~6.6s | ~10.5分钟 | | 全部优化 | ~5.5s | ~8.7分钟 | --- ## 四、推荐优先级 1. **立即做**(无风险,无需换 torch): - 优化1:轮询间隔 0.2s - 优化2:避免重复 SegFormer - 优化4:Flux-2 steps 4→3(先验证质量) 2. **短期做**(需换 torch): - 优化3:SegFormer→GPU 3. **中期探索**: - 优化5:swapHair webui 参数调优 - 优化6:base64→multipart