训练、微调与数据面试题图文讲义2419 字

大模型增量预训练面试题

·全库 157 / 611

《大模型增量预训练面试题》共 6 页、0.2 万字,通篇围绕 预训练、数据集、微调、SFT 展开,归在「训练、微调与数据」这一层。

覆盖预训练数据集微调SFT显存LoRA

适合要自己训模型、或者判断这一版该不该训的人

目录骨架(4 节)
  1. SlimPajama
  2. SlimPajama Val. Loss (downstream)
  3. (downstream & upstream)
  4. Pile Val. Loss

原 PDF 已逐页还原成图,共 6 页,这里先放前 3 页。右侧文字由 OCR 按版面重排,可能有个别错字,以图为准;点图可全屏放大。

本讲义目录 · 3 页
  1. 01大模型(LLMs)增量预训练篇
  2. 02如果是真大规模炼丹,那没什么好说的,…
  3. 03可以简单测试下续写能力,验证下模型是…
011 / 3
第 1 页
第 1 页

大模型(LLMs)增量预训练篇

  • 大模型(LLMs)增量预训练篇
  • 1.为什么要增量预训练?
  • 2.进行增量预训练需要做哪些准备工作?
  • 3.增量预训练所用训练框架?
  • 4.增量预训练训练流程是怎么样?
  • 5. 增量预训练一般需要多大数据量?
  • 6.增量预训练过程中,loss 上升正常么?
  • 7.增量预训练过程中,Ir 如何设置?
  • 8.增量预训练过程中,warmup_ratio 如何设置?
  • 9.warmup 的步数对大模型继续预训练是否有影响?
  • 10. 学习率大小对大模型继续预训练后上下游任务影响?
  • 11. 在初始预训练中使用 Rewarmup 对大模型继续预训练性能影响?

1.为什么要增量预训练?

有一种观点,预训练学知识,指令微调学格式,强化学习对齐人类偏好,LIMA 等论文算是这一观点的证据。 所以要想大模型有领域知识,得增量预训练。(靠指令微调记知识不靠谱,不是几十 w 条数据能做到的。)

2.进行增量预训练需要做哪些准备工作?

  1. 模型底座选型 主流是 LLaMA,因为 scaling 法则,可能 LLaMA 做了充分预训练。(当然有版权问题) 这里备选 BLOOM,感觉基座比 LLaMA 差,但是也有 7B 版本。 Ealcon、CPM-bee、Aquila、Baichuan 待实验,license 友好,但生态和效果都是问题。其实,因为结构上都类 似 LLaMA,未来估计会出现整合这些模型的项目。

(Falcon 公布的训练语料中没有中文) 这里没列 ChatGLM 和 ChatGLM2,因为有种说法在 SFT 模型上增量预训练效果比较差。(未证实) 1. 数据收集 这里最经典的开源预训练数据还是 wudao 的 200G 和 thepile 这两个数据集(怀念一下 Open-Llama) 加起来有 1T 的文本量,足够前期玩耍了。 其实,刚开始实践的时候,不需要太多样本,先收集 GB 量级的领域文本跑通流程即可。 1. 数据清洗 当然这里数据治理可能是 chatgpt 魔法的最关键的部分,最基础的是把网页爬取数据中的广告清理掉。 Falconi 文里介绍了数据清洗的手段,对于我们很有参考意义。

  1. 增量预训练所用训练框架?
  1. 超大规模训练
022 / 3
第 2 页
第 2 页

如果是真大规模炼丹,那没什么好说的,…

如果是真大规模炼丹,那没什么好说的,直接 3D 并行。 Megatron-Deepspeed 拥有多个成功案例,炼 LLaMA 可以参考 LydiaxiaohongL 大佬的实现。(实在太强)

  • https://github.com/microsoft/Megatron-DeepSpeed/pull/139 炼 BLOOM 可以直接找到 Bigscience 的 git 仓库。 然而,转 checkpoint 还是挺费劲的。 1. 少量节点训练 小门小户一共就几台机器几张卡的话,3D 并行有点屠龙术了。 张量并行只有在 nvlink 环境下才会起正向作用,但提升也不会太明显。 可以分 2 种情況:
  • 单节点或者多节点(节点间通信快):直接 deepspeed ZeRO 吧。(笔者用了 linly 的增量预训练代码,但有 能力的最好用其他代码)比如,Open-Llama 的 fork 版本。 https://github.com/RapidAl/Open-Llama
  • 多节点(但节点间通信慢):考虑用流水线并行,参考另一个大佬的实现。 https://github.com/HuangLK/transpeeder

如果资源特别少,显存怎么也不够,可以上 LORA。 https://github.com/shibing624/MedicalGPT

  1. 增量预训练训练流程是怎么样?

1.数据预处理 参考 LLaMA 的预训练长度,也把数据处理成 2048 长度(如果不够,做补全) 这里要吐槽,tencentpretrain 数据处理脚本的默认长度竟然是 128。 1.分词器 有很多工作加 LLaMA 中文词表,但是考虑到没有定论说加中文词表会更好,先用原版的吧,500K 的

tokenizer.model。 https://github.com/ymcui/Chinese-LLaMA-A paca

  1. 原始模型 可以使用一个中文增量预训练后的版本,当然这里坑挺大的,各家框架的模型层名不太一样。 为了快速跑通,用脚本快速转一下,能成功加载就行。 1.训练参数 如果显存不够,可以 zero3+offload。其他参数暂时默认吧。(事实上没有想象中慢) 多机的话可以配一下 deepspeed 的 hostfile。 1. 观测训练进展 这一点可能是最重要的,跑通只是第一步,根据训练情况反复调整比较重要。 可以使用 wandb,记录 loss,flops,吞吐速度,已消耗的 token 数,和测试 ppl。

不同框架的 checkpoint 格式不同,还会根据并行度分成很多个文件。 以 ZeRO 为例,我的转换流程(很挫)是:

• f32 to fp16

• fp16 to huggingface 格式 1. 模型测试 转为标准 huggingface 格式后可以用各种支持 llama 的前端加载,比如 text-generation-webul.

033 / 3
第 3 页
第 3 页

可以简单测试下续写能力,验证下模型是…

可以简单测试下续写能力,验证下模型是否正常。 至此,我们获得了 1 个增量预训练过的大模型基座。

5.增量预训练一般需要多大数据量?

首先要确保你有足够大量的数据集,至少有几 B 的 token;否则几十条数据的情况我更推荐模型微调。

6.增量预训练过程中,loss 上升正常么?

通常增量预训练开始的阶段会出现一段时间的 loss 上升,随后慢慢收敛。

7.增量预训练过程中,Ir 如何设置?

  • 学习率是一个很重要的参数,因为 I 的大小会出现以下问题:
  • 如果 I 过大,那 loss 值收敛会更困难,旧能力损失的会更大;
  • 如果 I 过小,那可能难以学到新知识。 当你数据集比较小(例如 100B 以下?),那建议使用较小的学习率。例如可以使用 pre-train 阶段最大学习率的 10%。通常 7B 模型 pre-train 阶段的学习率大概是 3e-4,所以我们可以选择 3e-5。 并且需要根据你的 batch size 做相应缩放。通常 Ir 缩放倍数为 batch size 倍数的开方。例如 batch size 增大 4 倍,学 习率对应扩大 2 倍即可。

8.增量预训练过程中,warmup_ratio 如何设置?

warmup_ratio 也很重要。通常 LLM 训练的 warmup_ratio 是 epoch*1%左右。例如 pre-train 阶段一般只训一个 epoch,则 ratio 是 0.01;SFT 通常 3 个 epoch,ratio 对应为 0.03。 但是如果做 CPT,建议 warmup_ratio 调大一点。如果你的数据集很大,有几百 b,那 warmup 其实不影响最重的模 型效果。但通常我们的数据集不会有那么大,所以更小的 ratio 可以让模型"过渡“得更平滑。 学习率和 warmup_ratio 是两个相辅相成的概念,二者通常是成正比的关系。或者说如果你正在用一个较大的学习 率,那你或许可以同时尝试增加 warmup 来防止模型“烂掉”。

9.warmup 的步数对大模型继续预训练是否有影响?

  • warmup 介绍:warmup 是一种 finetune 中常用的策略,指学习率从一个很小的值慢慢上升到最大值;
  • 对比实验设计:使用不同 4 种不同预热步数(eg:0%,0.5%,1%,2%)来进行实验

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求