208 lines
7.0 KiB
Markdown
208 lines
7.0 KiB
Markdown
# XPUSYS Monitor — 工作流成功率预测算法
|
||
|
||
> 文档版本:2026-03-16 Rev.2
|
||
> 对应实现:`web/xpu_monitor.js` → `calcPrediction()`
|
||
|
||
---
|
||
|
||
## 1. 设计前提
|
||
|
||
### 1.1 串行回收模型
|
||
|
||
ComfyUI 工作流以**采样节点**为核心关键节点,宏观上呈串行结构:
|
||
|
||
```
|
||
文本编码 (CLIP) → 卸载 → 扩散采样 (UNet) → 卸载 → 图像解码 (VAE)
|
||
```
|
||
|
||
由于模型在各阶段依次加载、用完即卸载,工作流不需要所有模型**同时驻留**显存。
|
||
这意味着:
|
||
|
||
- **显存瓶颈** = 单个最大模型(峰值占用),而非模型总量
|
||
- **内存(RAM)** 作为模型中转区,总量超出显存时可通过回收循环运行
|
||
|
||
### 1.2 核心设计原则:只计算 ComfyUI 可控的资源
|
||
|
||
ComfyUI 只能对**自己管理的资源**做预测,第三方占用(OS、驱动、浏览器、其他 GPU 程序)一律视为不可回收的固定成本:
|
||
|
||
| 资源 | 归属 | 处理方式 |
|
||
|------|------|----------|
|
||
| `vram_allocated_gb` | PyTorch 模型权重 | ✓ 计入可回收 |
|
||
| `vram_reserved_gb` | PyTorch 缓存池 | ✓ 计入可回收 |
|
||
| `vram_free_gb` | 当前空闲 | ✓ 直接可用 |
|
||
| `sysEnv`(驱动/桌面/第三方) | 系统与环境 | ✗ 永久占用,排除 |
|
||
| `ram_free_gb` | 当前空闲 RAM | ✓ 直接可用 |
|
||
| 其他进程占用的 RAM | 第三方 | ✗ 不可预期,排除 |
|
||
|
||
### 1.3 两个独立约束
|
||
|
||
| 约束 | 变量 | 性质 | 含义 |
|
||
|------|------|------|------|
|
||
| 硬约束 | $P_{peak}$ | 决定**能否运行** | 最大单模型必须能装入显存 |
|
||
| 软约束 | $P_{load}$ | 决定**稳定性** | 总量超出显存时能否通过内存中转 |
|
||
|
||
最终成功率:
|
||
|
||
$$P_{success} = P_{peak} \times P_{load}$$
|
||
|
||
---
|
||
|
||
## 2. 输入变量
|
||
|
||
### 2.1 来自工作流扫描
|
||
|
||
| 变量 | 说明 | 来源 |
|
||
|------|------|------|
|
||
| $M_{total}$ | 所有活跃模型的磁盘文件大小之和 (GB) | `_predModels` 累加 |
|
||
| $M_{peak}$ | 单个最大模型的磁盘文件大小 (GB) | `_predModels` 取最大值 |
|
||
|
||
### 2.2 来自系统快照(`snap`)
|
||
|
||
| 变量 | 字段 | 说明 |
|
||
|------|------|------|
|
||
| $V_{free}$ | `vram_free_gb` | 当前空闲显存 |
|
||
| $V_{alloc}$ | `vram_allocated_gb` | PyTorch 已分配(模型权重/激活值) |
|
||
| $V_{rsv}$ | `vram_reserved_gb` | PyTorch 预留缓存池 |
|
||
| $R_{free}$ | `ram_free_gb` | 当前空闲物理内存 |
|
||
| $C_{used}$ | `commit_used_gb` | 已提交虚拟内存 |
|
||
| $C_{limit}$ | `commit_limit_gb` | 虚拟内存上限 |
|
||
|
||
---
|
||
|
||
## 3. 常量参数
|
||
|
||
| 常量 | 值 | 含义 |
|
||
|------|----|------|
|
||
| $\alpha$ | 0.9 | 显存碎片化折扣 |
|
||
| $\gamma$ | 平台相关 | 硬约束平台系数(见下方) |
|
||
|
||
### 3.1 平台系数 $\gamma$
|
||
|
||
不同 GPU 平台的内存架构能力差异显著,硬约束计算需引入平台系数:
|
||
|
||
| 平台 | $\gamma$ | 说明 |
|
||
|------|----------|------|
|
||
| Intel Arc (XPU) | 1.0 | 无 UVM 或 UVM 支持较弱,硬约束严格 |
|
||
| NVIDIA (CUDA) | 4.0 | CUDA Unified Memory 支持显存溢出约 4x,硬约束放宽 |
|
||
|
||
**有效显存上限(平台调整后):**
|
||
|
||
$$V_{eff}^{platform} = V_{eff} \times \gamma$$
|
||
|
||
> **说明:** 原设计中的 $\beta_v$(显存安全缓冲)和 $\beta_r$(内存系统预留)已移除。
|
||
> `sysEnv` 占用已通过 $V_{reclaim}$ 公式精确排除,`ram_free_gb` 本身已是 OS 报告的真实空闲量,无需二次扣除。
|
||
|
||
---
|
||
|
||
## 4. 中间量计算
|
||
|
||
### 4.1 可回收显存
|
||
|
||
$$V_{reclaim} = V_{free} + V_{alloc} + V_{rsv}$$
|
||
|
||
- $V_{free}$:当前已空闲
|
||
- $V_{alloc} + V_{rsv}$:PyTorch 当前占用,工作流启动前会主动释放
|
||
- $sysEnv$(驱动/桌面)= $V_{total} - V_{reclaim}$,永久占用,**不参与计算**
|
||
|
||
### 4.2 有效显存上限
|
||
|
||
$$V_{eff} = \max(0.1,\ V_{reclaim} \times \alpha)$$
|
||
|
||
对 12 GB 显卡、当前空闲 9.49 GB、无模型加载时:
|
||
$$V_{eff} = 9.49 \times 0.9 = 8.54\ \text{GB}$$
|
||
|
||
### 4.3 可用物理内存
|
||
|
||
$$C_{ram} = R_{free}$$
|
||
|
||
`ram_free_gb` 是 OS 报告的真实空闲量,已排除所有当前进程占用,直接使用。
|
||
|
||
### 4.4 可用虚拟内存
|
||
|
||
$$S_{virt} = \max(0,\ C_{limit} - C_{used})$$
|
||
|
||
与状态栏内存胶囊的"虚拟内存"显示定义一致。
|
||
|
||
---
|
||
|
||
## 5. 硬约束:$P_{peak}$(显存峰值)
|
||
|
||
### 5.1 显存缺口
|
||
|
||
$$D_{peak} = \max(0,\ M_{peak} - V_{eff})$$
|
||
|
||
### 5.2 成功率
|
||
|
||
$$P_{peak} = \begin{cases}
|
||
1.0 & D_{peak} = 0 \\[6pt]
|
||
\max\!\left(0.02,\ e^{-3 \cdot D_{peak} / V_{eff}^{platform}}\right) & D_{peak} > 0
|
||
\end{cases}$$
|
||
|
||
**曲线特性(Intel Arc, $\gamma=1.0$):**
|
||
|
||
| $D_{peak}$ | $P_{peak}$ |
|
||
|-----------|-----------|
|
||
| 0 GB(恰好装入) | 100% |
|
||
| $V_{eff} \times 0.1$(溢出 10%) | ≈ 74% |
|
||
| $V_{eff} \times 0.3$(溢出 30%) | ≈ 41% |
|
||
| $V_{eff} \times 0.5$(溢出 50%) | ≈ 22% |
|
||
| $V_{eff}$(溢出 100%) | ≈ 5% |
|
||
|
||
**曲线特性(NVIDIA, $\gamma=4.0$):**
|
||
|
||
| $D_{peak}$ | 等效溢出比例 | $P_{peak}$ |
|
||
|-----------|-------------|-----------|
|
||
| 0 GB | 0% | 100% |
|
||
| $V_{eff} \times 1.0$ | 25% | ≈ 47% |
|
||
| $V_{eff} \times 2.0$ | 50% | ≈ 22% |
|
||
| $V_{eff} \times 3.0$ | 75% | ≈ 11% |
|
||
| $V_{eff} \times 4.0$ | 100% | ≈ 5% |
|
||
|
||
---
|
||
|
||
## 6. 软约束:$P_{load}$(总量负载)
|
||
|
||
### 6.1 负载缺口
|
||
|
||
$$D_{load} = \max(0,\ M_{total} - V_{eff})$$
|
||
|
||
### 6.2 分段成功率
|
||
|
||
$$P_{load} = \begin{cases}
|
||
1.0 & D_{load} = 0 \\[8pt]
|
||
1 - 0.3 \cdot \left(\dfrac{D_{load}}{C_{ram}}\right)^{0.6} & 0 < D_{load} \leq C_{ram} \\[12pt]
|
||
0.05 + 0.65 \cdot \left(1 - \dfrac{D_{load} - C_{ram}}{S_{virt}}\right)^{2} & C_{ram} < D_{load} \leq C_{ram} + S_{virt} \\[8pt]
|
||
\max\!\left(0,\ 0.05 - 0.1 \cdot (D_{load} - C_{ram} - S_{virt})\right) & D_{load} > C_{ram} + S_{virt}
|
||
\end{cases}$$
|
||
|
||
**连续性验证:**
|
||
|
||
- $D_{load} = C_{ram}$:第一段 $= 1 - 0.3 = 0.70$,第二段 $= 0.05 + 0.65 = 0.70$ ✓
|
||
- $D_{load} = C_{ram} + S_{virt}$:第二段 $= 0.05$,第三段起点 $= 0.05$ ✓
|
||
|
||
---
|
||
|
||
## 7. 综合成功率
|
||
|
||
$$P_{success} = \text{round}\!\left(P_{peak} \times P_{load} \times 100\right)$$
|
||
|
||
### 压力等级
|
||
|
||
| 等级 | 条件 | 颜色 | 中文 | English |
|
||
|------|------|------|------|---------|
|
||
| 轻松 | $P \geq 95\%$ | `#52c41a` | 轻松 | Smooth |
|
||
| 安全 | $80\% \leq P < 95\%$ | `#afff00` | 安全 | Safe |
|
||
| 预警 | $40\% \leq P < 80\%$ | `#faad14` | 预警 | Warning |
|
||
| 危险 | $P < 40\%$ | `#ff4d4f` | 危险 | Critical |
|
||
|
||
---
|
||
|
||
## 8. 已知局限
|
||
|
||
1. **模型大小用磁盘文件估算**,量化模型(GGUF Q4/Q8)实际显存占用远小于文件大小,算法会高估压力
|
||
2. **不感知工作流拓扑**,假设全串行;并行分支会使峰值估算偏低
|
||
3. **α = 0.9 为经验常量**,刚启动时碎片极少,长时间运行后碎片可能更高
|
||
4. **$M_{peak}$ 未考虑推理时的临时张量开销**(激活值、KV cache 等)
|
||
5. **第三方 GPU 程序**(浏览器 WebGL、游戏)占用的显存会被计入 sysEnv,导致可用量低估,但这是保守方向的偏差
|
||
6. **平台系数 $\gamma$ 为经验值**:NVIDIA 的 4.0 基于典型 UVM 行为估算,实际能力因驱动版本、PCIe 带宽、系统内存速度而异;极端情况下(如系统内存紧张)实际成功率可能低于预测
|