Pretrain Dataset
本目录保存 laoyao 2B MoE 预训练数据的构建代码和元数据。数据集按 curriculum stage 分开维护,避免 Stage 1 的基础预训练配比和 Stage 2 的能力增强配比混用。
Stage 1: base pretraining
Stage 1 是已经用于当前 base model 训练的 200B 级别 rebalanced 预训练数据。
目标配比
| 类别 | 比例 | 主要来源 |
|---|---|---|
| english_web | 40% | ModelScope Ultra-FineWeb/FineWeb 英文 shard |
| english_edu | 20% | FineWeb-Edu / Ultra-FineWeb 高质量教育文本 |
| chinese_clean | 10% | Ultra-FineWeb zh,后续可接 CCI3-HQ/SkyPile |
| science | 10% | medmcqa、proofwriter、scienceqa、sciq、qasc、openbookqa;不足由 english_edu 补齐 |
| logic | 10% | Jiayi scored education/text 数据中的逻辑类样本 + Proof-Pile-2/OpenWebMath/arXiv/AlgebraicStack 的高推理密度文本 |
| math | 5% | Jiayi scored math/knowledge 数据 |
| code | 5% | Jiayi cleaned multilingual code 数据 |
数据本体
真实数据实际保留在:
/mnt/beegfs/yi/laoyao_2b_moe_pretraining_dataset/train/pretrain_rebalanced_web40_edu20_chinese10_science10_logic10_math5_code5_200b_v1_20260701
不要再把 405G 数据复制到 repo 内。BeegFS hardlink 不被允许,rsync 会造成空间翻倍并可能失败。训练脚本应直接读取该源目录。
Logic 补充源
wait_and_build_rebalanced_pretrain_200b.sh 默认将以下本地 Proof-Pile-2 子集作为显式 --logic-input:
/mnt/beegfs/cjy/cjy-training/laoyao_model/data/raw/hf_datasets/EleutherAI__proof-pile-2/open-web-math/train/*.jsonl.zst
/mnt/beegfs/cjy/cjy-training/laoyao_model/data/raw/hf_datasets/EleutherAI__proof-pile-2/arxiv/train/*.jsonl.zst
/mnt/beegfs/cjy/cjy-training/laoyao_model/data/raw/hf_datasets/EleutherAI__proof-pile-2/algebraic-stack/train/*.jsonl.zst
这些 .jsonl.zst 文件由 build_rebalanced_pretrain_dataset.py 通过系统 zstd -dc 流式读取,不需要先解压到 BeegFS。后续如果下载了 StackExchange 或 PhilPapers,可用冒号分隔的 LOGIC_INPUT_EXTRA 追加:
LOGIC_INPUT_EXTRA='/path/to/stackexchange/**/*.jsonl.zst:/path/to/philpapers/**/*.jsonl.zst' \
bash dataset/pretrain/scripts/wait_and_build_rebalanced_pretrain_200b.sh
Stage 2: capability-focused continued pretraining
早期 general55/code15/math15/science15 配方和不含中文的 Stage 2-1/2-2 v1
配方只用于历史复现。2026-07-19 的 zh10 v3 用于保留历史实验;当前训练使用
2026-07-22 的 plain-QA CPT v4。v4 保留每阶段 10% 中文,同时去掉 QA 文本中的
GLM chat role/control token,使这一阶段保持纯 continuation pretraining 语义。
Stage 2 的目标是 100B tokens,面向继续预训练而不是 QA/SFT。该阶段不使用旧的 science QA 数据;Science 优先使用 Darwin-Science 这类连续科学文本、refined text 或 cognitive completion。
当前目标配比
| 阶段 | General | Code | Science | QA | 中文 knowledge | 中文 QA |
|---|---|---|---|---|---|---|
| Stage 2-1 | 10% | 30% | 30% | 30% | 5% | 5% |
| Stage 2-2 | 18% | 2% | 10% | 70% | 5% | 5% |
中文 knowledge 使用 CCI3-HQ 和 SkyPile;中文 QA 使用 OpenBMB Ultra-FineWeb-L3 zh QA。每阶段中文 token 合计 10%。完整来源、重放策略和 GLM QA 格式见 docs/stage2_data_and_glm_qa_policy_20260717.md。
Stage 2 数据源策略
- General English 使用 DaVinci classified HQ 和 Nemotron Wiki Rewrite。
- 中文 knowledge 使用 CCI3-HQ 与 SkyPile,两个来源各占每阶段 2.5%。
- 中文 QA 使用 Ultra-FineWeb-L3 zh QA,占每阶段 5%;它是唯一允许的高质量语义重放例外。
- Code、Science 和英文 QA 沿用 v1 下载池,但全部使用新 recipe 重新分区。
- QA 使用 GLM role template 并计算 full-sequence causal LM loss;这不是 assistant-only SFT。
Stage 2 入口
下载、构建、审计并转换两个阶段:
HF_TOKEN=... MODELSCOPE_TOKEN=... \
bash scripts/rebuild_stage2_curriculum_plainqa_cpt.sh all
单独传入 1 或 2 只处理一个阶段。脚本会先运行 strict normalized audit,再做
Megatron 8192-token 转换;审计不通过时不会生成可训练入口。需要复现 zh10 v3
时使用 scripts/rebuild_stage2_curriculum_zh10.sh。
Stage 2-1/2-2 文件级并行构建
build_stage2_curriculum_dataset.py 使用文件级多进程。推荐在 256 CPU
机器上配置为 32 个文件进程、每进程 8 个 tokenizer 线程:
python3 dataset/pretrain/scripts/build_stage2_curriculum_dataset.py \
--recipe dataset/pretrain/configs/stage2_1_general10_zh10_code30_science30_qa30_50b_v3_20260719.json \
--catalog dataset/pretrain/configs/stage2_source_catalog_20260717.json \
--raw-root /data/yi/laoyao-2b-pretraining/raw/stage2_curriculum_v1 \
--output-dir /data/yi/laoyao-2b-pretraining/normalized/stage2_1_zh10_50b_v3_20260719 \
--tokenizer tokenizer/glm5.2 \
--exclude-hash-db /data/yi/laoyao-2b-pretraining/no_replay/stage1_2_text_hashes.sqlite3 \
--exclude-hash-mode memory \
--parallel-files 32 \
--tokenizer-threads-per-file 8 \
--tokenizer-batch-size 1024 \
--output-shard-rows 100000
这里的总 tokenizer 并行度是 32 x 8 = 256。不要把单个进程的
RAYON_NUM_THREADS 设为 224;GLM tokenizer 实测会因线程调度和内存带宽
竞争而显著变慢。Stage 1 排除哈希在父进程中载入一次,并通过 Linux
fork 只读共享给文件 worker,不会产生 32 份约 7 GiB 的哈希集合。
父进程按 source 文件顺序提交 worker 产物,并在 source quota 的最后一个
shard 上截断。build_state.json 在每个已提交文件后更新,因此同一命令可
直接断点续跑;只有退出时正在处理、尚未提交的一批文件会重算。