项目

一般

简介

CR-007-Backlog-批量推荐接口 SHAP 全量计算性能优化方案 » 历史记录 » 版本 1

Huarui Lin, 2026-04-12 21:32

1 1 Huarui Lin
# CR-007: [Backlog] 批量推荐接口 SHAP 全量计算性能优化方案
2
3
---
4
5
| 字段 | 内容 |
6
|------|------|
7
| **CR ID** | CR-007 |
8
| **标题** | 批量推荐接口恢复 SHAP 归因计算(多进程并行优化) |
9
| **发起人** | Henry Lin (PM) |
10
| **日期** | 2026-04-11 |
11
| **状态** | ⏸️ Deferred (Backlog) |
12
| **互斥关系** | 本文档实施时,将自动废弃 **CR-006** |
13
| **影响范围** | 规约 6.1 节(批量推荐输出)、`src/inference.py` 批量分支、服务器 CPU/内存资源基线 |
14
15
### 1. 变更描述
16
17
**原状态(CR-006 锁定)**:批量接口 `top_features` 字段固定返回空字符串,以保障 RT < 3 秒。
18
19
**变更为**:批量接口对 DataFrame 中的所有基金,全量调用 SHAP TreeExplainer 计算特征贡献度。`top_features` 字段返回具体的 Top5 正向与 Top5 负向特征拼接字符串(格式与单基金接口保持绝对一致)。
20
21
### 2. 变更原因(业务诉求预判)
22
23
在高级量化投研场景中,投研人员希望在批量导出或列表页直视所有基金的“看多/看空理由”,而不愿逐个点击进入详情页。此需求将显著提升投研人员的筛选效率,但代价是牺牲接口响应时间。
24
25
### 3. 实施路径与性能保障方案(未来技术指导)
26
27
若要恢复此功能,严禁直接在主线程串行调用 SHAP,必须采用以下并行架构:
28
- **方案一(推荐):多进程并行计算**
29
  - 使用 Python `concurrent.futures.ProcessPoolExecutor` 或 `joblib.Parallel`。
30
  - 将待预测的基金 DataFrame 切分为 N 个 Chunk(N 建议设为 CPU 物理核数的一半,如 12 核)。
31
  - 每个进程独立加载 LightGBM 模型(或利用共享内存减少拷贝),独立计算 Chunk 内的 SHAP 值。
32
  - **预期耗时**:1000 只基金,单次 5ms,12 进程并行理论耗时可降至 **0.5 - 0.8 秒**(含进程启动开销)。
33
- **方案二(高成本):GPU 加速 SHAP**
34
  - 若实体机后续引入 GPU,需重新编译 GPU 版本的 LightGBM。
35
  - 使用 `shap.GPUTreeExplainer` 替代 `shap.TreeExplainer`,可实现毫秒级批量矩阵运算。
36
  - **预期耗时**:1000 只基金可压缩至 **< 100ms**。
37
38
### 4. 风险与代价评估(实施前必读)
39
40
- **内存暴增风险**:12 个子进程同时驻留,如果每个进程加载一份模型与特征字典,内存峰值可能瞬时增加 5-8 GB。需重新评估当前 64GB 内存的余量(特别是 Docker 容器的 cgroup 限制)。
41
- **SLA 放宽**:即使采用多进程,批量接口的 P99 RT 也将从当前的 200ms 放宽至 1000ms 左右,需与前端团队重新对齐加载动画或异步轮询机制。
42
- **CI 红线移除**:实施本 CR 时,必须同步移除 CI 中针对 `inference.py` 批量分支“严禁包含 `shap` 关键字”的 AST 拦截规则。