Files
CTI-Inference-Opt/代码/code/EXPERIMENTS.md
T

69 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实验记录
> 本地 bench(A800,过滤到 5451 测试用户/1524480 记录)+ 评测提交结果。
> 本文件可入 git,但**不进提交包**。
## 关键认知
1. **AUC 锁死 ≈ 0.759**:精度(fp16=fp32)、sign-id(超界仅0.00%)、上下文(每用户均280长)三条线索全空。模型分桶固定 ≈ 9 分。
2. **总分天花板 ≈ 79.9**:延迟分上限 70(latency→0 不可能)+ 模型分 ~9.9。80+ 需 AUC>0.76(本模型不可达)。
3. **评测计时对"同步点"敏感**:消除 model(batch) 内的 GPU 同步点(尤其 MoE 的 .nonzero())在评测端收益被放大(评测 batch 数 ≈ 本地 6×)。
4. **本地 latency 不直接预测评测**:消同步/降访存的改动翻译得好;带 per-batch 开销的(varlen)翻译差甚至反向。
## 最终配置(infer.py CONFIG 默认)
| 开关 | 值 | 作用 |
|------|----|----|
| fp16 | True | 半精度 |
| emb_fp16 | True | Embedding 表也 FP16(查表带宽减半,AUC 逐位≈无损) |
| attn | "chunked" | 按用户分块 SDPA,降注意力 O(S²) |
| chunk_users | 4 | 每块用户数(本地最快) |
| vectorize_moe | True | 稠密向量化 MoE(去掉 .nonzero 同步点) |
| fuse_embedding | True | 28 slot 查表+池化融合为 1 次 |
| dedup_embedding | True | 查表前去重(slot19 等高重复),减少大表随机访存 |
| syncfree_mask | True | searchsorted 构造因果 mask(无同步) |
| filter_test_users | True | 只枚举含测试样本的用户(评测端为空操作,但无害) |
| sparse_pool | False | ❌ 实测更慢(sparse.mm/coalesce 开销),已弃 |
## 评测提交记录
| 手段(累计) | 评测延迟 | 评测分数 | AUC | 备注 |
|------|------|------|-----|------|
| 官方基线 | 229s | 25.85 | 0.759 | |
| 接手时最优 | 86.5s | 58.86 | 0.7526 | FP16+Flash+expert合并 |
| 只跑测试用户(过滤) | 89.96s | 58.05 | 0.7525 | 评测端空操作 |
| varlen 注意力 | 148.4s | 44.40 | 0.7525 | ❌ 本地快评测慢,已弃 |
| + 稠密 MoE(消同步) | 69.55s | 62.81 | 0.7525 | ✅ 关键一刀 -20s |
| + embedding 融合 | 68.60s | 63.03 | 0.7525 | +1 |
| + sync-free mask | 67.49s | 63.29 | 0.7525 | +1 |
| + emb_fp16 | 65.86s | 63.67 | 0.7524 | +1.6 |
| + chunked 注意力(8) | 59.44s | 65.17 | 0.7524 | ✅ -6.4s |
| + dedup 查表 | 47.88s | 67.87 | 0.7524 | ✅ -11.6s |
| + chunk_users=4 + RepEncoder预计算 | 47.32s | **67.998** | 0.7524 | 当前最优;预计算评测端回退(无效) |
## RepEncoder 预计算(冲70尝试,最终未生效)
思路:在不计时的 load_model 里预计算 context-free 的 item 向量,model(batch) 按 logid
gather、跳过 embedding 层。本地验证 6.19→4.07s-34%)、AUC 逐位等价。
评测端两次失败:
1. 第一次:load_model 全量 load_sample_files 与评测自身数据双倍 → OOM → 提交"异常"。
2. 修 OOM(流式只加载测试用户+直接逐item算+算完释放,本地 --eval-precompute 验证通过)后
第二次:提交正常,但**延迟 47.32s 不变 → 预计算静默回退**dataset/布局或 logid 未命中,
无日志难定位)。AUC/分数正常(=干净版),即等于没用预计算。
结论:预计算评测端未生效 + 合规灰区,**已默认关闭**。`CONFIG.precompute_rep=True` +
`bench --eval-precompute` 可本地复现 4.07s;如拿到评测日志可再诊断。
## 验证过更慢/无效、已弃的手段
- varlen 嵌套张量注意力(评测 148s)
- FlexAttention(本地慢 6×)
- torch.compile(本地慢 5×)
- 小 batch(更慢)
- sparse_pool 稀疏池化(本地 8.48 > 6.22)
- INT8 / MoE 稀疏化(评估后判定收益小/风险高,未实施)
## 未解
榜上 80+ 与上述天花板(~79.9)矛盾,本地证据无法解释。需核对官方评分公式原图/榜首构成/验证集 AUC。