for fold in m2 m1 eval m1_late eval_late; do
python scripts/build_natural_folds.py build --fold "$fold" \
--data-root data --production-cache outputs/bootstrap/cache --device cuda
done
Windows(PowerShell)请用:foreach ($fold in @('m2','m1','eval','m1_late','eval_late')) { ... }。
步骤 6:训练 final base gate(rolling-m2,225 棵树)与 candidate gate(1200 棵树)。
jittor-kaisuoshifu-drbgl-b
线上总分为 **
1.43090**,其中dataset3=0.86210、dataset4=0.56879。本仓库沿用 A 榜的 自适应双分支排序:嵌入部分用 Jittor 训练 BPR-LightGCN,排序部分用 LightGBM LambdaRank 门控,并针对 B 榜的严格时间折做了训练行与权重的适配。目录结构
1. 环境安装
依赖包含
jittor、numpy、pandas、scipy、scikit-learn、lightgbm、threadpoolctl、PyYAML。Jittor 的安装与 CUDA 配置参考 Jittor 官方文档。硬件建议:dataset4 的全量推理较为吃资源,推荐 ≥128 GB 内存、≥70 GB 可用磁盘; 调小
--inference-batch-size可以降低峰值内存(耗时增加)。2. 数据准备
把赛方原始 CSV 放到:
train.csv:src,dst,time(历史边,time为 Unix 秒)test.csv:src,time,c1,...,c100(每个查询的 100 个候选)数据根目录通过
--data-root或data_root配置项指定(相对路径按仓库根目录解析)。 原始数据已被.gitignore忽略,请勿提交。跑流水线前建议先体检:3. 训练
本仓库不发布权重,因此标准流程是从原始数据训练全部中间产物。所有命令在仓库根目录 执行,中间缓存默认写在
outputs/cache/下(--cache-root可改)。步骤 1:先有一组「初始门控 + embedding」用于冷启动 bootstrap。
产出:
<output-dir>/models/base_gate.txt、candidate_gate.txt; 三组 BPR-LightGCN embedding 写在训练缓存下(形如<output-dir>/cache/*/models/lightgcn_d64_s42.npz)。把它们复制到models/:步骤 2:准备 dataset4 原始数组与时间折缓存。
步骤 3:用初始检查点跑一次完整 dataset4 推理,生成 natural fold 需要的生产曝光与 多尺度缓存:
步骤 4:构建 strict / uniform 辅助块(strict 30,000 行、uniform 每个种子 20,000 行):
步骤 5:构建 natural 时间折(
m2/m1/eval用完整推理路径特征,late 折做稳健性检查):Windows(PowerShell)请用:
foreach ($fold in @('m2','m1','eval','m1_late','eval_late')) { ... }。步骤 6:训练 final base gate(rolling-m2,225 棵树)与 candidate gate(1200 棵树)。
随后把得到的两个 gate 覆盖到
models/(base_gate.txt/candidate_gate.txt)。models/manifest.json记录了线上检查点的树数量、维度与 sha256,可用于核对。4. 评测 / 推理
一条命令复现 B 榜两份 CSV 并打包:
只跑单个数据集 / 使用其它检查点目录:
若两步推理已完成、只想重新打包:
校验产物(成员、行数、取值是否为 1~100 的序数名次、sha256):
本地 MRR 评分与单元测试:
每次运行会在
output_dir下写出:config.yamlcommand.txtinfer.logdataset3.csv/dataset4.csv*_manifest.jsonsubmission_b.zip5. 结果说明
1.43090(dataset3=0.86210、dataset4=0.56879),由赛方在 隐藏测试标签上计算,models/manifest.json记录了对应的提交与 file sha256。MRR(drbgl_b.metrics.mean_reciprocal_rank与tools/score_predictions.py): 对每个查询计算真值的平均倒数排名,用于 checkpoint 选择与折间比较;随机猜测约0.052(100 候选)。NDCG(label_gain[0, 1]):两个 LambdaRank 门控的训练目标。dataset3.csv157670 行、dataset4.csv2322538 行,每行 100 列, 取值0.01~1.00(候选序数名次除以 100,非概率)。scripts/verify_submission.py会校验行数、值域与「每行是否为 1~100 的排列」。--require-reference-hash只有在你自己训练出与 manifest 记录 完全一致的检查点时才通过;普通复跑会得到结构相同、数值略有差异的结果。--score-backend jittor改用 Jittor 计算候选点积,浮点累加顺序不同, CSV 可能与参考哈希不一致,但排序质量基本一致(默认numpy是位级稳定的路径)。BASE_GATE_*_THREADS),换机器复算冷启动名次时也可能略有差异。6. 可复现说明
--seed/runtime.seed(默认20260820)统一设置 Python / NumPy / Jittor 种子(见src/drbgl_b/config.py::set_seed),并在run_dataset3/run_dataset2入口统一生效;负采样、抓取 SVD、聚类等环节还各自使用固定种子 (LightGCN 为42/2027)。config.yaml、运行命令command.txt、日志infer.log, 以及每个数据集的*_manifest.json(含 sha256 与参考哈希)。--config与命令行参数给出,相对路径统一按仓库 根目录解析(缓存默认落在outputs/cache/,不再依赖/dev/shm)。7. 进阶:基线脚本
src/drbgl_b/baselines/下的启发式基线与 depop 家族用于对照实验(PYTHONPATH需包含src):其中
depop_v9的 memory 分支仍是 dataset3 线上流程使用的打分实现。scripts/sweep_gate_iterations.py、scripts/tune_rolling.py、scripts/tune_recent_folds.py则服务于 checkpoint 选择与本地校验。8. 第三方声明
本项目使用 Jittor、LightGBM、scikit-learn、SciPy、NumPy、pandas、PyYAML, LightGCN 传播由本仓库自行实现,来源与许可证见
NOTICE。 检查点来源与生成方式见models/README.md。9. 提交规范
提交信息建议使用前缀:
feat:/fix:/docs:/refactor:/chore:。 提交前请确保:代码可运行(python -m unittest discover -s tests)、README 命令真实可用、 未提交原始数据与大文件中间产物。