Axolotl 继续预训练实战:流式训练快速上手
【免费下载链接】axolotlGo ahead and axolotl questions项目地址: https://gitcode.com/GitHub_Trending/ax/axolotl
单张 24GB 显存的消费级 GPU 上,用仓库自带示例 5 分钟内就能跑通一次基于 SmolLM2-135M 的流式继续预训练,并产出可恢复的检查点。如果你的领域语料大到装不进内存、又不想自己搭预处理管道,Axolotl 的流式继续预训练就是为这个场景设计的。
为什么选流式继续预训练
继续预训练是在通用底座上喂领域语料、补知识缺口的做法;流式则是指训练时边读边分词,不把整个数据集载入内存。相比从零训练,它省掉绝大部分算力;相比 SFT 微调,它改的是模型的知识分布而非对话格式,适合语料以长文为主、没有"问题-回答"结构的场景。
| 方案 | 上手成本 | 所需资源 | 预期效果 |
|---|---|---|---|
| 从零预训练 | 高,需自建数据与集群 | 数十卡起 | 知识最完整,但周期以月计 |
| SFT / LoRA 微调 | 低 | 单卡可跑 | 只调行为风格,补不进领域知识 |
| Axolotl 流式继续预训练 | 低,改一个 YAML 即可 | 单卡到多卡 | 领域困惑度下降,长文本知识内化 |
流式对超大语料的优势在于:不需要先跑一遍axolotl preprocess,数据在训练时按需分词,磁盘占用可控。文档对适用边界写得比较清楚,见 流式数据集文档。
5 分钟跑通最小配置
仓库里 examples/streaming/pretrain.yaml 就是为快速验证写的:最小的 135M 模型加一个公开语料子集,任何 GPU 都能跑。下面这份最小配置摘掉了日志、wandb 等无关项,只保留能跑起来所必需的字段:
base_model: HuggingFaceTB/SmolLM2-135M pretraining_dataset: - path: HuggingFaceFW/fineweb-edu name: sample-10BT type: pretrain text_column: text split: train streaming_multipack_buffer_size: 10000 shuffle_merged_datasets: true max_steps: 1000 sequence_len: 1024 sample_packing: true pretrain_multipack_attn: true micro_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 5e-4注意pretraining_dataset本身就会自动开启流式,不用额外写streaming: true;而max_steps是流式场景的硬性要求,因为框架无法预知数据集总量。
硬件需求可以参考这个量级:
| 模型规模 | 最低配置 | 推荐配置 | 速度估算口径 |
|---|---|---|---|
| 135M-1B | 单卡 24GB | 单卡 24GB + 稳定网络 | 每步 token 数 = sequence_len × micro_batch_size × 累积步数 × GPU 数 |
| 8B 级 | 单卡 A100 40GB 起步 | 多卡 + 梯度检查点 | 同上,可配合attn_implementation: flash_attention_2 |
仓库中 8B 级的完整参考配置在 examples/llama-3/ 目录,比如 fft-8b.yaml 里就带了gradient_checkpointing: true。
关键参数逐项说明
| 参数 | 作用 | 推荐值 | 调整依据 |
|---|---|---|---|
| streaming_multipack_buffer_size | 打包前缓冲多少条样本再拼成完整序列 | 10000(默认) | 越大打包越满、GPU 利用率越高,但缓冲占内存 |
| sample_packing | 把多条短样本拼进一条序列,减少 padding 浪费 | true | 语料长短不一时收益最大 |
| pretrain_multipack_attn | 阻止同一条打包序列里的样本互相"看见" | true | 预训练下必须开,否则会引入错误注意力 |
| shuffle_merged_datasets | 用缓冲区打乱流式顺序 | true | 语料本身有序(如按文档排序)时建议开 |
| sequence_len | 每条训练序列长度 | 1024 起步 | 显存够就拉长,长文本领域数据收益明显 |
| max_steps | 流式下总步数,必须显式给出 | 按目标 token 数倒推 | 每步 token 数见上表口径 |
max_steps的取法值得多说一句:先用"每步 token 数"公式算出你计划喂入的总 token 量对应的步数,再留一点余量。宁可从偏小的步数起步验证全流程,再放大,避免第一次跑就烧掉几个小时。
准备你自己的语料
格式要求很简单:JSONL,每行一个对象,只含text字段,完整说明见 数据集格式文档。两行示例:
{"text": "急性心肌梗死的临床表现包括胸骨后压榨性疼痛,可放射至左肩..."} {"text": "法律行为的成立要件包括当事人、意思表示和标的三个要素..."}清洗原则:保留原始术语与句式结构,别做过度改写;短文档不用手动切分,超长文本在completion(非流式)模式下会按sequence_len自动拆条,流式模式下交给打包机制即可。验证方式:正式训练前把max_steps调成个位数、sequence_len调小,用axolotl train试跑,确认没有字段缺失或编码报错再放大参数。另外提醒一点,目前流式只支持单个数据集,多语料混合需要等后续版本或改用非流式加载。
启动训练与指标监控
启动命令就一条,第二个带断点续跑参数,中断后从最近检查点继续:
axolotl train examples/streaming/pretrain.yaml axolotl train examples/streaming/pretrain.yaml --auto-resume-from-checkpoints示例配置里save_steps: 250、save_total_limit: 3,即每 250 步落一个检查点、最多保留 3 份,恢复时自动挑最新的。训练时盯三个指标:一是训练损失,warmup 结束后应平稳下行、无持续尖峰;二是显存占用,留出 10% 以上余量,逼近上限说明该降sequence_len或buffer_size;三是数据吞吐,若 GPU 利用率周期性掉零,通常是远程数据源网络瓶颈,可考虑把常用小数据集先落本地。
判断该停了:流式下没有 epoch 概念,以max_steps为准。跑到损失曲线明显走平、再延长步数验证集指标不再改善时,就足够了。评估用一条命令,对着一个写有val数据集的配置文件跑:
axolotl evaluate your-eval-config.yml命令行各子命令的完整用法可查 CLI 文档。
效果怎么看
下面的数字是参考值而非实测,测试条件为:SmolLM2-135M、fineweb-edu sample-10BT 子集、单卡 24GB、max_steps: 1000。你自己的领域任务请按同样流程在训练前后各跑一次axolotl evaluate,把真实值填进这张表再下结论:
| 指标 | 训练前(参考值) | 1000 步后(参考值) | 说明 |
|---|---|---|---|
| 训练损失 | 按语料词表大小有一个较高起点 | 明显下降并趋于平缓 | 以曲线趋势为准 |
| 领域验证集困惑度 | 偏高(对领域术语"陌生") | 应显著下降 | 下降幅度因语料而异 |
| 显存占用 | — | 稳定在峰值且不再增长 | 增长则检查 buffer 配置 |
排障速查
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
启动即报缺少max_steps | 流式数据集大小无法推断,必须显式给步数 | 按"每步 token 数"公式倒推补上max_steps |
| 训练中 OOM | sequence_len、buffer_size或 batch 偏大 | 先降streaming_multipack_buffer_size,再降sequence_len;大模型加gradient_checkpointing: true |
| 损失震荡或 GPU 利用率周期性掉零 | 语料未打乱导致局部重复;或远程数据源读数据慢 | 开shuffle_merged_datasets: true;把常用数据集下载到本地 |
更多边界情况(评估集不参与流式、多数据集限制等)见 流式文档的注意事项一节。
小结
完整链路是:改好一份 YAML → 一条命令启动 → 盯损失与显存 → 用axolotl evaluate前后对比。跑通后值得继续看两个方向:用attn_implementation和梯度检查点把 8B 级模型压进单卡,以及参考 examples/ 里各模型目录的配置模板做更大规模的正式训练。仓库文档和讨论区有持续更新,配置拿不准时先翻 examples/streaming/README.md 里的参数说明。
【免费下载链接】axolotlGo ahead and axolotl questions项目地址: https://gitcode.com/GitHub_Trending/ax/axolotl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考