LLM预训练recipe — 摘要版

文章核心主题:

本文深入探讨了从零开始进行大型语言模型(LLM)预训练(pretrain)的各个环节,侧重方法论和实践细节,旨在普及预训练过程中的关键步骤、常见问题及避坑技巧,而非技术原理的深入分析。作者强调了数据处理的重要性,并强调了自主预训练的价值。

要点总结:

1. 背景篇:自研 Pretrain 模型的意义

  • 开源模型的局限性: 虽然大型模型(如qwen)开源了模型参数,但训练框架、训练数据等核心内容仍未开源,使得用户无法参与模型的迭代优化。
  • 技术掌握的必要性: 在LLM全面开源前,掌握预训练技术仍然有意义。通用模型的变现能力不如领域模型,而持续预训练(continue-pretrain)是刚需,其技术栈与预训练相似。
  • 数据透明度的重要性: 自主预训练可以掌握模型训练数据的细节(如数据配比、知识掌握程度),从而在后续的对齐(alignment)阶段进行针对性优化,最大化模型潜力。
  • Tokenizer 的重要性: 使用开源模型时,tokenizer 不可控会导致解码速度不可控,自研模型可以自定义 tokenizer,优化特定任务的性能。
  • 其他动机: 自研模型可以作为公司科研能力的象征,也可以在预训练阶段植入个性化知识或价值观。

2. 数据篇:预训练数据的准备与处理

  • 数据获取:
    • 需准备大量训练数据(约10T),可逐步收集,数据来源包括爬虫、购买、开源数据集等。
    • 强调专业数据团队的重要性,避免因爬虫行为引发法律风险。
    • 高质量数据(如论文、书籍)常以PDF格式存在,需使用专业服务或自研OCR模型进行解析,Python库解析效果有限,大模型解析成本较高。
    • 开源数据集(如FineWeb、pile、Skypile、RedPajama)可作为启动资金,但质量参差不齐。
    • 开源数据下载复杂,需解决服务器网络、下载速度、文件处理等问题。
  • 数据质量:
    • 数据知识密度差异大,高知识密度数据(如唐诗三百首)价值更高。
    • 合成高知识密度数据是趋势,可提高训练速度。
    • 组建数据团队进行爬虫或购买是认真进行预训练的必要条件。
  • 数据清洗:
    • 核心工作: 数据清洗是数据环节最核心的工作。
    • 模型打分: 利用模型对预训练数据质量进行打分已成标配,推荐使用BERT结构模型作为打分器,因为BERT结构模型表征能力更强。
    • 打分器训练: 打分器不追求100%准确率,能用即可,不宜投入过多时间,可训练小规模打分器。
    • 规则清洗: 规则是强大的数据清洗工具,可基于数据长度、token比例、语言占比、关键词等特征过滤数据。
    • 规则应用注意: 使用规则清洗时,注意不要将数据清洗成分布有偏的数据。
    • 数据脱敏: 必须进行数据脱敏,去除人名、电话号码、邮箱等敏感信息,以及“转载自…”等信息,避免隐私侵犯和法律风险,使用正则匹配。
  • 数据去重:
    • 必要性: 数据去重是必须的,避免重复使用同一内容。
    • 去重粒度: 可选择句子级去重或文档级去重,根据实际情况量力而为。
    • 技术手段: 需要大数据处理集群和map/reduce框架,可利用minhash算法实现。
    • 去重策略: 先确定需要多少训练数据,再确定去重的粒度,不需要追求绝对完美。
  • 数据配比:
    • 需要训练数据分类器,对数据进行类别划分(如新闻、百科、代码、markdown等),可使用BERT家族模型。
    • 不同类别数据清洗和去重的阈值不同,高质量数据保留,低质量数据过滤。
    • 数据配比通常为“知识 + 代码 + 逻辑”三大类,中文:英文:代码的比例通常为4:4:2,逻辑数据比例取决于可用数据量。
    • 英文数据比例不能太低,目前中文数据质量不如英文数据质量,可能是因为中文更难学,且语料数量和质量不如英文。
  • 数据顺序:
    • 数据顺序很重要,预训练的本质是教模型学习知识,知识的顺序决定了学习效果。
    • 课程学习很重要,先学难知识/好数据,再学脏知识/坏数据。
    • 推荐llama的In context pretrain方法,利用语义相似度拼接文档,构成语义连贯的上下文。
    • 关于attention mask:llama 认为同一条训练语料中,无关文档不能相互看见,但实操中,大部分团队不使用mask,且未发现差异。
  • 数据流水线:
    • 预训练是动态加载数据的,读1B、训1B,再读1B,再训1B,因为数据量大,无法一次性读取。
    • 模型获取的是token_id而非token,需提前完成tokenization和concatenation操作。
    • 数据处理和模型训练是独立进程,数据处理进程需保证模型训练进程始终有数据可用。
    • 预训练数据可以复用,高质量数据可以训练多遍,并动态降低已使用多次数据的被选中概率。
    • 数据块大小应适中,以B为单位,方便回退。
    • 建议数据块与模型checkpoint保存对齐,方便模型版本回退。
  • 数据实验:
    • 不要盲目开始训练,先在小模型上进行实验,理解scaling_law。
    • 实验内容包括:不同数据配比和顺序的训练实验、不同大小模型的loss结果、以及绘制loss到benchmark的scaling_law,以便提前预知模型训多少token量能在某个benchmark达到什么水平。
    • scaling_law仍是重要的指导原则,不能完全忽视。

3. 训练篇:模型结构、参数、训练框架和技巧

  • Tokenizer:
    • Tokenizer是预训练的基础,务必提前准备好。
    • 扩词表容易出错,可能导致旧token对应的知识丢失。
    • 训练tokenizer需用大量的common数据和BPE/BBPE算法。
    • 需注意数字切分、控制压缩率(通常1 token对应1.5个汉字)、手动移除脏token,补充业务场景token,确保中英文覆盖率,词表大小与模型embedding_size保持一定buffer。
    • 针对strawberry包含几个r这种问题,作者认为tokenizer是天生解决不了的。
  • 模型结构:
    • 建议采用llama的结构,减少创新,降低踩坑风险(rope + gqa + rms_norm + swiglu)。
    • 小模型embedding和lm_head可共享参数,大模型则无必要。
    • 预训练成本高,应稳健为主,不宜盲目创新,除非有鲁棒实验支持。
  • 模型参数:
    • 模型size主要考虑训练和推理算力,而非直接根据场景需求确定。
    • 模型size应与大厂模型保持一致,避免踩坑,且方便模型效果对比。
    • 推理算力应考虑实际部署机器的显存限制,避免出现一张推理卡装不下模型的情况。
    • 超参数size要和llama保持一致,横向和纵向成比例递增。
    • 超参数值应能被2/4/8/64/128等数整除,以满足训练框架要求。
    • layer_num、num_head、hidden_states、vocab_size应满足特定倍数的要求,以便支持并行计算。
    • seq_len选取要循序渐进,先用小seq_len,再逐渐增加,采用rope的NTK外推方法。
  • 训练框架:
    • 从零开始预训练,必须选megatron;continue-pretrain可考虑deepspeed。
    • megatron: 训练速度快,参数清晰,模型加载快,但上手成本高,基建工作多,官方代码存在bug。
    • deepspeed: 代码简单,用户群体多,但训练速度慢,加载慢,微操难,官方代码也存在bug。
    • 无论使用哪个框架,都要将attention的默认方式改为flash_attention。
  • 训练技巧:
    • 训练效率优化: 减少通讯量,避免机间通讯。优先使用data_parallel,避免显存和内存之间切换,避免重算。
    • 训练loss分析: 关注tensorboard上的loss曲线,应分开观察不同类型数据的loss,重视loss_spike(loss突然激增或降低),回退到上个checkpoint,并调整adamw优化器的β1β2参数,解决训练初期loss_spkie问题。
    • 训练流程: warm up(学习率缓慢上升) -> 中期(cos / cos_decay / constant / constant_decay,学习率较大)-> 后期(改变rope base+seq_len,适应长文本)-> 收尾(anneal,用高精数据/IFT数据强化考试能力)。
    • 预训练一旦开始,一般无需人为干预,除非出现烧卡、loss爆炸、loss陡降等情况。

4. 评估篇:模型性能的评估方法

  • PPL (Perplexity):
    • 通过测试集的loss衡量模型效果,同一模型不同训练阶段进行对比,不能跨模型对比,不同tokenizer压缩率的loss没有可比性。
    • 通用知识测试集上的loss应降低到2以下。
  • Benchmark:
    • 预训练阶段的benchmark结果可信度有限,如果checkpoint不是自己训练的,可能存在刷榜行为。
    • benchmark形式单一,大多是选择题,没有cot环节,难以全面衡量模型能力。
    • 建议改造benchmark,以生成式的方法使用,而非直接看ABCD哪个概率高,例如:
      • 将Question + Answer,变成Question + Answer_A,Question + Answer_B,Question + Answer_C,Question + Answer_D,让模型结合上下文回答问题
      • 将正确答案选项改为 “其他答案全错”,看模型是否能选出该选项。
      • 修改选项形式(一二三四代替ABCD),多选题改为单选题。
      • 先让模型在不知道答案的情况下训练,然后让其说出正确答案。
    • 使用ACC(Accuracy)衡量评估结果,而不是BLEU和Rouge。
  • 概率探针:
    • 从概率的角度监控模型的知识能力,观察特定token或句子的概率变化。
    • 探针测试集需要手动构造,而非批量生成。
    • 重点观察指标的变化趋势,而非绝对大小。
    • 可以构造多种探针,例如:
      • Prob('北京'|'中国的首都是')
      • PPL('台湾属于中国') vs PPL('台湾不属于中国')
      • PPL('尊重同性恋') > PPL('反对同性恋')
      • Prob( '{ '| '以 json输出')

5. 总结篇:预训练的整体认识

  • 作者认为预训练的各个环节同等重要,数据清洗尤为重要,数据清洗的灵光一现可能大大提升模型效果。
  • 预训练不是简单跑代码,数据清洗更有挑战。

LLM预训练recipe—原文版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂+策略模式之最佳实践(疾病报卡维护模块API设计)

目录 💻业务场景 🔧应用技术 ⚙概要流程 ❗开发注意 服务类上标注了 自定义注解 却无法直接利用getDeclaredAnnotation 获取 *Spring代理机制 代理机制的工作原理 代理的工作机制 代理的使用场景 已获取EmrXXXServiceImpl 的Class,如…

ARM异常处理 M33

1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类:预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看,获取更信息的异常原因: CFSR是由UFSR、BFSR和MMFSR组成: 下面列举HFSR、MMFSR、…

【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART(串口通讯)2.1 简介2.2 时序图分析2.3 UART的…

Adversarial Machine Learning(对抗机器学习)

之前把机器学习(Machine Learning)的安全问题简单记录了一下,这里有深入研究了一些具体的概念,这里记录一下方便以后查阅。 Adversarial Machine Learning(对抗机器学习) Adversarial Examples 相关内容Eva…

【Go】context标准库

文章目录 1. 概述1.1 什么是 Context1.2 设计原理1.3 使用场景1.4 Context 分类核心:Context接口2. 源码解读4个实现emptyCtxTODO 和 BackgroundcancelCtxWithCancelcancelCtx.propagateCancel 构建父子关联parentCancelCtx 获取父上下文中的内嵌cancelCtxcanceltimerCtxWithT…

解决 vue3 中 echarts图表在el-dialog中显示问题

原因: 第一次点开不显示图表,第二次点开虽然显示图表,但是图表挤在一起,页面检查发现宽高只有100px,但是明明已经设置样式宽高100% 这可能是由于 el-dialog 还没有完全渲染完成,而你的 echarts 组件已经开始尝试渲染图…

计算机网络习题( 第3章 物理层 第4章 数据链路层 )

第3章 物理层 一、单选题 1、下列选项中,不属于物理层接口规范定义范畴的是( )。 A、 接口形状 B、 引脚功能 C、 传输媒体 D、 信号电平 正确答案: C 2、在物理层接口特性中,用于描述完成每种功能的事件发…

通俗易懂!使用Excel和TF实现Transformer

本文旨在通过最通俗易懂的过程来详解Transformer的每个步骤! 假设我们在做一个从中文翻译到英文的过程,我们的词表很简单如下: 中文词表:[机、器、学、习] 英文词表[deep、machine、learning、chinese] 先来看一下Transformer的…

智慧楼盘二维、三维组件融合 720三维全景可视化

本系统通过数字孪生技术,实现小区楼盘系统的可视化展示,整合楼盘内各个系统的数据源,将楼盘模型与房间模型、720三维全景图相结合,实现了从楼盘周边到室内布局的全方位展示,为购房者提供全方位的可视化信息。 整个项目…

QT QCombox QSS样式问题

/*combobox 样式*/ QComboBox#FileterComboBox,QComboBox#DateRangeComboBox{background-color: #262626; /* 背景颜色 */color: #e0e0e0; /* 文本颜色 */border-radius:16px;font-family: "Microsoft YaHei"; /* 文本字体族 */font-size: 18px; /* 文…

Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果

目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告:HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…

NIPS2014 | GAN: 生成对抗网络

Generative Adversarial Nets 摘要-Abstract引言-Introduction相关工作-Related Work对抗网络-Adversarial Nets理论结果-Theoretical Results实验-Experiments优势和不足-Advantages and disadvantages缺点优点 结论及未来工作-Conclusions and future work研究总结未来研究方…

【已解决】pyinstaller打包ico图片报错:OSError: [WinError 225] 无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。

起因: pyinstaller加上 --icon 参数打包时报错。 命令如下: 解决: 关闭 Windows 的病毒防护即可,步骤如下。 点屏幕右下角通知栏,进入“病毒和威胁防护”: 打开: 关闭实时保护&#xff08…

011-spring-整合三方框架的命名空间原理(重要)

根据context标签来学习了解 <context:property-placeholder location"jdbc.properties"/> <bean id"dataSource" class"com.alibaba.druid.pool.DruidDataSource"><property name"driver" value"${db.driver}&quo…

No.29 笔记 | CTF 学习干货

大家好呀&#xff01;我刚参加了美国线上CTF比赛&#xff0c;收获超多&#xff0c;特别感谢老师教我的干货知识。今天就和大家分享我的学习笔记。CTF像刺激冒险&#xff0c;有挑战有惊喜。 学习中我懂了很多知识技能&#xff0c;像密码学、Web安全、Misc题型等&#xff0c;它们…

sonarqube 安装及使用

一、官网参考地址 相关版本下载地址 配置全局变量 .bash_profileexport SONAR_HOME=/Users/jd/soft/sonar-scanner-6.2.1.4610 export PATH=$PATH:$SONAR_HOME/bin export SQ_HOST=http://127.0.0.1:9000/ export SQ_TOKEN=squ_dbb1913e095a92a727a918a9ba6b1af94b007748二、…

使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图

在做一些尺度分析时&#xff0c;经常会涉及到对研究区构建不同尺度的渔网进行分析&#xff0c;渔网的形状通常为规则四边形。构建渔网的方法也很简单&#xff0c;使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…

pytorch MoE(专家混合网络)的简单实现。

专家混合&#xff08;Mixture of Experts, MoE&#xff09;是一种深度学习模型架构&#xff0c;通常用于处理大规模数据和复杂任务。它通过将输入分配给多个专家网络&#xff08;即子模型&#xff09;&#xff0c;然后根据门控网络&#xff08;gating network&#xff09;的输出…

NAT 技术如何解决 IP 地址短缺问题?

NAT 技术如何解决 IP 地址短缺问题&#xff1f; 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 随着互联网的普及和发展&#xff0c;IP 地址的需求量迅速增加。尤其是 IPv4 地址&…

华为麦芒5(安卓6)termux记录 使用ddns-go,alist

下载0.119bate1版,不能换源,其他源似乎都用不了,如果root可以直接用面具模块 https://github.com/termux/termux-app/releases/download/v0.119.0-beta.1/termux-app_v0.119.0-beta.1apt-android-5-github-debug_arm64-v8a.apk 安装ssh(非必要) pkg install openssh开启ssh …