69 lines
3.7 KiB
Markdown
69 lines
3.7 KiB
Markdown
# 实验记录
|
||
|
||
> 本地 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。
|