首页 / 资讯中心 / 文章详情

NLA数据生成管线全解:从语料到训练Parquet的4阶段流程(激活提取→文档级切分→API解释→构建)

NLA数据生成管线全解:从语料到训练Parquet的4阶段流程(激活提取→文档级切分→API解释→构建) ★ FEATURED ARTICLE
【免费下载链接】natural_language_autoencoders项目地址https://gitcode.com/gh_mirrors/na/natural_language_autoencoders点击查看免费下载NLA数据生成管线datagen pipeline是 natural_language_autoencoders 项目的数据底座它把原始语料如 Fineweb 文档逐步加工成训练所需的三个 Parquet 数据集av_sft、ar_sft、rl全程只需一条 YAML 配置驱动按激活提取→文档级切分→API解释→构建4 个阶段推进。1️⃣ 背景NLA 为什么需要专门的数据管线NLANatural Language Autoencoder由一对微调后的 LLM 组成模型方向作用AVactivation verbalizer代码中称 actor向量 → 文本把激活向量注入固定 prompt自回归生成解释ARactivation reconstructor代码中称 critic文本 → 向量截断的 K1 层 LM Linear 头从文本还原向量训练这两者需要一种特殊数据带激活向量hidden state的行每行包含源文本 模型在指定层的激活向量 可选API 生成的自然语言解释。这正是 nla/datagen/ 包的职责——它产出的三个 Parquet 由训练侧 nla/config.py 和 nla/data_source.py 直接读取两者通过Parquet sidecar YAML完全解耦设计详见 docs/design.md。2️⃣ 管线总览一条命令跑完 4 个阶段推荐方式是配置驱动运行输出路径全部从output_dir派生无需手动传路径export ANTHROPIC_API_KEYsk-... python -m nla.datagen.run_pipeline --config configs/datagen/qwen7b_fineweb_1M.yaml编排器 nla/datagen/run_pipeline.py 会把每个阶段shell out给对应的 CLI并且运行前打印完整命令——所以任何阶段都能单独重跑。中途失败比如 API 报错后用--stages 2,3从指定阶段续跑python -m nla.datagen.run_pipeline --config ... --stages 2,3 # 从阶段2恢复各阶段的输入输出关系一览摘自 nla/datagen/README.md阶段输入输出关键点0 激活提取HF 语料 基础模型base.parquet每文档采 N 个位置的原始未归一化向量1 文档级切分base.parquet3 个_raw.parquet按doc_id划分同一文档的行必进同一桶2 API 解释av/ar 子集*_explained.parquet调外部 LLM 生成 2-3 条特征解释严格提取校验3 构建各子集训练用 Parquet sidecar生成prompt/response/activation_vector列可选 shuffle任意 Parquet洗牌版本打散文档内位置聚簇3️⃣ 阶段 0激活提取stage0_extract阶段 0 是整条管线的瓶颈对每篇文档做一次完整前向传播在指定层抓取隐藏状态。入口是 nla/datagen/stage0_extract.py默认参数示例python -m nla.datagen.stage0_extract \ --base-model Qwen/Qwen2.5-7B-Instruct \ --corpus HuggingFaceFW/fineweb --corpus-config sample-10BT \ --corpus-length 100000 --positions-per-doc 10 \ --layer-index 20 \ --output /tmp/nla_run/base.parquet3.1 两个关键设计决策层的选择取约 2/3 深度。语义特征已形成、但残差流尚未被预测头占据。参考值为Qwen2.5-7B 取 L20/28Gemma-3-12B 取 L32/48Gemma-3-27B 取 L41/62Llama-3.3-70B 取 L53/80。这些常量集中在 nla/datagen/model_presets.py 一处维护避免 8 份 YAML 各自重复推导。原始向量不归一化。数据生成阶段永远存 RAW 向量sidecar 中normnone归一化是训练时的决策——一份数据集即可支持所有归一化实验见 docs/design.md。3.2 按文档键控的随机数并行可合并的关键每篇文档采样哪些位置由sha256(seed|doc_id)派生的独立 RNG 决定stage0_extract.py且只从第 50 个 token 之后、非特殊 token 的位置中选保证左侧上下文足够让激活有意义。这带来一个实用性质同一文档无论在哪台机器、哪个切片上处理采到的位置完全相同——多 GPU 并行切片的数据可以无损合并。3.3 多 GPU 加速提取默认HFExtractor用device_mapauto做模型并行把一个大模型摊到多卡本身不随 GPU 数量线性提速。scripts/datagen/stage0_multigpu.sh 则把它包成数据并行每卡一个进程、各处理不重叠的--corpus-start切片最后用 nla/datagen/merge_base.py 合并——由于上面的按文档键控 RNG合并结果与单卡串行运行逐行一致。多节点产出的分片也可以用merge_base离线合并它会校验各分片提取参数一致且切片连续。4️⃣ 阶段 1文档级三路切分stage1_splitstage1_split.py 把base.parquet按av_sft / ar_sft / rl三份比例CLI 默认 30/30/40Qwen 1M 配置用 25/25/50切成三个子集。核心规则只有一条但至关重要在文档doc_id级别切分而不是行级别。stage1_split.py阶段 0 每篇文档采样约 10 个位置行级切分会把同一文档的上下文同时泄漏到 AV/AR 与 RL 两侧污染监督学习SL与强化学习RL的数据边界。实现上切分只读取轻量的doc_id列避免百万行 × 3584 维向量触发 pyarrow int32 偏移溢出再按 65536 行分批流式写入三个文件。5️⃣ 阶段 2API 解释stage2_api_explain只有av_sft和ar_sft子集需要这一步——RL 子集的解释由 actor 在 rollout 时自己生成stage2_api_explain.py。该阶段调用外部 LLM默认 Anthropic API见 nla/datagen/providers.py对每行的源文本生成自然语言解释。5.1 NLA 指令提示词与严格提取内置的指令模板要求模型站在因果 LM 的视角识别文本截断处模型必须正在想什么的2-3 条特征语法约束、语义预期、文体惯性、领域信号等并以analysis.../analysis标签包裹、控制在 80-100 词stage2_api_explain.py。质量校验相当较真严格提取必须同时匹配开闭标签——被max_tokens截断的半成品回答直接丢弃宁可丢行也不拿半个想法去训练列表清洗剥掉- * 1. a)等列表前缀与加粗包裹输出纯净段落最少 2 条特征少于 2 条视为模型不遵守格式整行丢弃。5.2 崩溃安全与跨模型缓存复用分块落盘每处理完一个 chunk默认 512 行立即写入{output}.chunks/chunk_N.parquet重启时跳过已有 chunk——即使第 150/489 块崩溃也只损失这一个块的 API 调用--cache-from缓存以detokenized_text_truncated源文本为 join 键可复用之前跑出的解释。这意味着换基础模型但同分词器、同语料切片时解释可跨模型命中缓存省下一整轮 API 费用run_pipeline.py。6️⃣ 阶段 3构建训练 Parquetstage3_buildstage3_build.py 把 base-schema 的行转换成三种训练格式并写出完整的 sidecar数据集promptresponse说明av_sft含INJECT字面占位符的 actor 模板explanation...解释.../explanation向量注入位置由训练侧钩子定位ar_sft以固定后缀summary结尾的 critic 模板填充解释文本—构建时逐行 tokenize断言结尾 token 等于预期后缀 ID训练时直接在tokens[-1]提取免扫描、GPU 友好rl与 av_sft 相同的 prompt—无 response回答由 rollout 生成所有行始终携带溯源列n_raw_tokens/activation_layer/doc_id较重的调试列detokenized_text_truncated由--keep-debug-metadata控制默认开启生产可关。actor/critic 两个模板原文见 stage3_build.py。6.1 Sidecar{parquet}.nla_meta.yaml契约每个 Parquet 旁都写一个 sidecar YAMLnla/datagen/sidecar.py记录数据集身份、提取参数基础模型、d_model、层号、norm、注入 token ID 与左右邻居 ID、critic 后缀 ID以及训练必须逐字使用的 prompt 模板。训练启动时 nla/config.py 读取它并与活的分词器断言比对——在 prompt 格式或 token ID 漂移悄悄毒害训练之前就把问题拦下来。数据集常量如注入 token ID只进 sidecar、不进 Parquet 列每个数据集只存一份、只加载一次。6.2 可选后处理shuffle 与随机基线stage_shuffle.py按(seed, dataset_id)键控对行做整体置换打散文档内位置的空间聚簇YAML 里shuffle.enabled: true时由编排器自动执行shuffle_activations.py只打乱activation_vector列、其余列不动构造随机激活基线——如果训练它和真实数据集效果一样差/一样好就能判断注入信号是否真的携带信息。7️⃣ 上手实操从 10 篇文档冒烟测试到百万级正式运行7.1 冒烟测试10 篇文档验证全链路正式烧 GPU 和 API 额度之前先用小模型小语料跑通全流程export ANTHROPIC_API_KEYsk-... python -m nla.datagen.run_pipeline --config configs/datagen/quick_test_10docs.yamlconfigs/datagen/quick_test_10docs.yaml 用 Qwen2.5-0.5B 10 篇文档约 50 次 API 调用在单卡上几分钟即可验证 stage 0→1→2→3 每一环。7.2 正式运行一份 YAML 定义一切以 configs/datagen/qwen7b_fineweb_1M.yaml 为例——10 万 Fineweb 文档 × 每文档 10 个位置 ≈ 100 万向量按 25/25/50 切分base_model: Qwen/Qwen2.5-7B-Instruct layer_index: 20 output_dir: /tmp/nla_qwen7b_fineweb_1M corpus: name: HuggingFaceFW/fineweb config: sample-10BT start: 0 length: 100000 stage0: positions_per_doc: 10 multigpu: true # 自动调用 stage0_multigpu.sh stage1: av_sft_frac: 0.25 ar_sft_frac: 0.25 rl_frac: 0.50 stage2: provider_cls: nla.datagen.providers.AnthropicProvider provider_kwargs: {model: claude-haiku-4-5-20251001, max_tokens: 300, concurrency: 400}仓库为每个已发布模型都备好了对应配置qwen7b_ultrafineweb_100k.yaml、gemma3_12b_ultrafineweb_100k.yaml、gemma3_27b_ultrafineweb_100k.yaml、llama70b_ultrafineweb_100k.yaml1k 小样本版本则用于快速验证。临时改参数不必编辑文件--override支持点分键值python -m nla.datagen.run_pipeline --config ... --override corpus.start25000最终产物output_dir下base.parquet、splits/*.parquet中间产物、以及训练直接消费的av_sft.parquet/ar_sft.parquet/rl.parquet启用 shuffle 时另有_shuf版本每个都带.nla_meta.yamlsidecar。8️⃣ 可插拔后端换存储、换 LLM、换推理引擎管线中所有外部依赖都通过 import path 注入不改一行核心代码即可替换# 云存储输出S3/GCS --storage-cls my.module.GCSStorage # 换 LLM API如 OpenAI 兼容接口 --provider-cls my.module.OpenAIProvider \ --provider-kwargs {model: gpt-4o, concurrency: 50} # 换提取引擎如 vLLM 服务端 --extractor-cls my.module.VLLMExtractor \ --extractor-kwargs {url: http://localhost:8000}接口分别定义在 nla/datagen/storage.py、nla/datagen/providers.py 和 nla/datagen/extractors.py——子类只需实现complete()/extract()等方法批处理、重试、并发策略全部由子类自治。9️⃣ 小结NLA 数据生成管线把从语料到可训练 Parquet这件容易踩坑的事做成了四段式确定性流程激活提取多 GPU 数据并行 按文档键控 RNG结果可复现、可合并文档级切分杜绝 SL/RL 数据边界泄漏API 解释严格格式校验 分块断点续跑 跨模型缓存构建三种训练格式 sidecar 契约把格式漂移挡在训练启动之前。想深入训练侧如何消费这些数据INJECT替换、注入 forward hook、AV/AR 并行调度继续阅读 docs/design.md部署与推理细节在 docs/inference.md。赞分享【免费下载链接】natural_language_autoencoders项目地址https://gitcode.com/gh_mirrors/na/natural_language_autoencoders点击查看免费下载相关推荐PaddleNLP 预训练数据全流程实战从原始语料到 token id 的训练数据管线PaddleNLP 预训练数据全流程实战从原始语料到 token id 的训练数据管线 PaddleNLP 的 llm/tools/preprocess ht人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPConfucius4-T3PO训练管线完全解读从分段对齐数据构建到流式冷启动的完整流程Confucius4 T3PO训练管线完全解读从分段对齐数据构建到流式冷启动的完整流程 Confucius4 T3PO 是网易有道 AI 团队开源的 140SoundCloud音乐下载终极指南如何用scdl轻松收藏高品质音乐SoundCloud音乐下载终极指南如何用scdl轻松收藏高品质音乐 你是否在SoundCloud上发现了一首惊艳的独立音乐却苦于无法下载保存作为全球最大CLI音频网页爬虫上一篇Primer3-py终极指南快速掌握Python引物设计的完整教程下一篇Uno Zen主题代码高亮配置支持Prism.js的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站