大模型笔记(三):大模型训练、部署流程梳理

目录

1 预处理

2 分词

3 模型设计

4 外推能力

5 模型训练

6 对齐

参考     


整体流程图以及所需知识: 

以阿里千问Qwen为例,梳理一下流程。

1 预处理

QWEN做了以下数据预处理,最终得到3万亿token

  • 文本数据抽取:对于公共网络数据,从 HTML 中提取文本数据。
  • 语言识别: 使用语言识别工具判断文本语言,提取英文和中文数据。
  • 去重: 使用明文去重和基于MinHash+LSH的模糊去重算法进行重复数据删除。
  • 质量控制: 结合规则和机器学习方法对文本质量进行评分,包括语言模型、文本质量评分模型从而识别和过滤低质量数据。同时还从各种来源手动抽查文本样本进行审查,以确保质量。
  • 安全控制: 使用模型识别并过滤涉及暴力、偏见、色情等不安全内容。
  • up-sample采样: 针对某些高质量源的数据进行上采样,以确保多样化的高质量内容。
  • BPE分词: 使用BPE分词算法,针对中文扩充词表提升性能。
  • 长序列建模:采用窗口Self-Attention等技术提高长序列建模能力。

2 分词

QWEN的分词(Tokenization)采用的是基于BPE(Byte Pair Encoding)的方法,兼顾中文和英文等多语言场景的效率,主要步骤如下:

  1. 首先,基于开源分词器tiktoken的cl100k基础词表进行初始化。
  2. 然后,针对中文场景,向词表中增添常用的中文字和词,扩充词表规模。
  3. 同时,参考GPT-3.5和LLaMA的实现,将数字切分成单个数字,如将"123"分词为"1"、"2"、"3"。最终词表大小约为152K。

3 模型设计

Qwen采用了改进版的 Transformer架构。具体来说,采用了最近开源的大型语言模型LLaMA的训练方法,并做了如下改进:

  • embedding和输出映射不进行权重共享,从而达到以内存成本为代价换取获得更好的性能。
  • 使用了RoPE(旋转位置编码)进行位置编码。RoPE在当代大型语言模型中已被广泛采用,比如 PaLM 和 LLaMA。为了优先考虑模型性能并获得更高的精确度,使用 FP32 精确度的逆频率矩阵,而不是 BF16 或 FP16。
  • 在大多数层中移除了Bias,但在QKV层保留以提升模型的外推能力。
  • 使用了预归一化(Pre-Norm)和RMSNorm进行规范化。Pre-Norm是使用最广泛的方法,与post-normalization相比,它已被证明能提高训练的稳定性。最近的研究提出了提高训练稳定性的其他方法,官方表示会在模型的未来版本中进行探索。此外,还用 RMSNorm 替代传统的层归一化技术。这一改变在不损害性能的同时提高了效率。
  • 使用了SwiGLU作为激活函数。它是 Swish 和门控线性单元GLU的组合。初步实验表明,基于GLU的激活函数普遍优于其他基线选项,如 GeLU。按照以往研究中的常见做法,将前馈网络(FFN)的维度从隐藏大小的 4 倍降至隐藏大小的8/3。

模型量化:数值精度和表示范围

  • FP32 (单精度浮点数): 使用32位来表示浮点数,其中1位用于符号,8位用于指数,23位用于尾数(有效数字)。FP32提供了较大的数值范围和较高的精度,适合需要高精度计算的应用场景,如科学计算和工程模拟。
  • FP16 (半精度浮点数): 使用16位来表示浮点数,其中1位用于符号,5位用于指数,10位用于尾数。FP16的数值范围和精度都小于FP32,但它可以减少内存占用和计算资源,适合对精度要求不是非常高的场景,如某些深度学习应用。
  • BF16 (Brain Floating Point): 使用16位表示浮点数,与FP16不同的是,BF16的1位用于符号,8位用于指数,7位用于尾数。BF16的设计允许它与FP32有相同的数值范围,尽管它的精度比FP32低。BF16特别适合深度学习领域,因为深度学习模型通常对数值范围更敏感,而对精度的要求可以相对较低。

FP32: 几乎所有现代CPU和GPU都支持FP32运算。
FP16: 许多现代GPU和一些专门的AI加速器支持FP16运算,用以提高深度学习任务的性能。
BF16: BF16的硬件支持较为有限,但它正在被越来越多的AI专用硬件和某些CPU支持,例如Intel的新一代处理器和Google的TPU。
混合精度方法的原理:混合精度训练融合了FP32的高精度和FP16的高效率,旨在提升深度学习训练的速度。特别是在利用GPU执行广泛的并行运算时,这种方法有助于缓解内存带宽和显存容量限制对性能的影响。

实施细节:

在采用混合精度的训练策略中,我们通常在模型的前向和后向传播阶段使用FP16来存储权重和激活值。为了保证计算精度,我们会通过损失放缩技术,即在梯度累加前将其放大一个特定倍数,然后在权重更新前再将其缩减,这样可以在享受FP16带来的计算效率的同时,还能保持合理的数值精度以确保参数更新的有效性。

4 外推能力

Qwen利用了以下几种技术来实现inference阶段的上下文长度扩展:

  • NTK感知插值(NTK-aware interpolation), 这种无需训练的技术可以调整比例参数以防止在扩展长度时丢失高频信息。
  • 动态NTK感知插值(dynamic NTK-aware interpolation),这是NTK感知插值的改进版本,可以以块为单位动态改变比例参数,避免性能大幅下降。这些技术使Qwen能够在不影响计算效率和准确性的情况下有效地扩展上下文长度。
  • LogN-Scaling,根据上下文长度与训练长度的比值,对Q和V的点积进行重新缩放,确保注意力值的熵随着上下文长度的增长而保持稳定。
  • 使用分层窗口Self-Attention,将注意力限制在一个上下文窗口内,防止模型关注到太远的内容。并在不同层采用不同的窗口大小,较低的层使用较短的窗口,而较高的层使用较长的窗口。这是因为官方观察到Qwen模型在处理长上下文时在不同层次上的建模能力存在差异,较低的层次相对于较高的层次更加敏感于上下文长度的扩展。为此,为每个层分配了不同的窗口大小,对较低的层使用较短的窗口,对较高的层使用较长的窗口。

综合这些技术,Qwen模型在inference阶段可以处理8192个token的长序列,外推能力优异。

5 模型训练

  • 采用标准的自回归语言模型训练目标。训练时上下文长度为2048。
  • 注意力模块采用Flash Attention技术,以提高计算效率并减少内存使用。
  • 采用AdamW优化器,设置β1=0.9,β2=0.95,ε=1e-8。
  • 使用余弦学习率计划,为每种模型设定一个峰值学习率。学习率会衰减到峰值学习率的 10% 的最小学习率。使用BFloat16混合精度加速训练。

实验结果
为评估Qwen模型zero-shot 和 few-shot能力,使用一系列数据集进行全面的基准评估。同时将 Qwen与最新的开源基座模型进行比较,包括 LLAMA、LLAMA2、MPT、Falcon、Baichuan2、ChatGLM2、InternLM、XVERSE 和 StableBeluga2。评估共涉及 7 个常用基准,分别是:MMLU(5-shot)、C-Eval(5-shot)、GSM8K(8-shot)、MATH(4-shot)、HumanEval(0-shot)、MBPP(0-shot)、BBH(Big Bench Hard)(3-shot)

6 对齐

只是进行预训练的大语言模型在实际使用中与人类行为不一致,因此多数情况下不宜直接作为AI助手。最近研究表明,采用对齐技术,如监督微调(SFT)和从人类反馈中进行强化学习(RLHF),可以显著提高语言模型参与自然对话的能力。以下将介绍Qwen模型如何进行SFT和RLHF,并评估它们在聊天环境中的表现。

(1)监督微调(SFT)
数据构建在监督微调数据上,Qwen采用ChatML样式(OpenAI 2022年提出)的格式来进行模型训练。ChatML格式利用特殊符号表示不同类型信息,如系统设置、用户输入、助手输出等,这有助于模型有效区分信息。采用会话流式对话风格,而不是简单的问答形式,使模型学会真实的人机交互。此外,Qwen采用多样化的训练数据从而提高模型的实用性。为了确保模型能够泛化到广泛的场景,QWen特意排除那些可能限制其功能的提示模板格式的数据。此外,优先关注语言模型的安全性,通过对涉及安全问题(如暴力、偏见、色情等)的数据进行注释。这样一来,模型就能检测并拒绝恶意提示,并提供安全的回答。

训练方式

  • 训练任务依然与预训练一样,预测下一个token。
  • 对系统和用户的输入应用mask,只预测助手的输出。
  • 使用AdamW优化器,超参数β1、β2和ϵ为别为0.9、0.95和1e−8。学习率先增后恒定。
  • 序列长度限制在2048,训练batch size=128。
  • 训练4000步,在前1430步中,学习率逐渐增加,达到2e−6的峰值。
  • 为了防止过拟合,权重衰减的值设置为0.1,dropout设置为0.1,梯度裁剪的限制为1.0。

(2)RM 模型
为使 SFT 模型与人类偏好保持一致,进一步引入人类反馈强化学习(Reinforcement Learning from Human Feedback,RLHF)。RLHF这一过程包括训练奖励模型(RM)和使用近端策略优化(PPO)进行策略训练。

在奖励模型的构建上,先采用大量数据进行偏好模型预训练(preference model pretraining,PMP)。该数据集由样本对组成,每个样本对包含对单个查询的两个不同回复及其相应的偏好。再用这些高质量偏好数据精调奖励模型。

在微调阶段,会先收集各种提示(Prompt),并根据人类对Qwen 模型响应的偏好调整奖励模型。为确保用户提示具备一定的多样性和复杂性,创建了一个包含约6600详细标签的分类系统,并实现了一种平衡采样算法,以在选择提示时兼顾多样性和复杂性。为了生成多样的回复,实验过程使用了不同规模和采样策略的 Qwen 模型。因为多样化的回复有助于降低标注难度并提高奖励模型的性能。标注人员按照标准的标注指南对这些回复进行评估,并根据它们的得分形成对比对。

在创建奖励模型时,使用同一个预训练语言模型Qwen进行PMP流程的初始化。随后,对 PMP 模型进行微调,以提高其性能。值得一提的是,在原始 Qwen 模型中加入了一个池化层,根据特定的结束token提取句子的奖励值。这一过程的学习率被设置为一个恒定值:3e-6,batch size为64。此外,序列长度设置为2048,训练过程持续1个epoch。

强化学习
PPO阶段共包含四个模型:policy模型、value模型、reference模型、reward模型。在开始PPO流程之前,暂停policy模型的更新,先对policy模型训练50步预热,从而确保value模型能够有效地适应不同的reward模型。

在PPO过程中,对每个query会同时采样两个response,KL散度系数设为0.04,并根据平均值对奖励进行归一化处理。policy模型和value模型的学习率分别为1e−6和5e−6。为了增强训练的稳定性,裁剪值设置为0.15。在进行推理时,生成策略的top-p值设置为0.9。研究结果表明,虽然熵值略低于 top-p=1.0时的值,但奖励的增加速度更快,最终在类似条件下始终能够获得较高的评估奖励。

此外,Qwen还采用了预训练梯度来减缓所谓的对齐税(alignment tax)。研究表明,在这种特定的奖励模型下,KL 惩罚在非严格代码或数学性质的基准测试(如常识性知识和阅读理解测试)中足以弥补对齐税。与PPO数据相比,预训练梯度必须使用更大量的预训练数据,以确保预训练梯度的有效性。此外,实证研究表明,过大的系数值会大大阻碍与奖励模型的匹配,最终影响匹配,而过小的系数值对减缓对齐税的效果微不足道。

"""
CUDA_VISIBLE_DEVICES=4,5,6,7 python3 inference_chat_hf.py
"""
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig
 
# Model names: "Qwen/Qwen-7B-Chat", "Qwen/Qwen-14B-Chat"
model_id = "/home/model_zoo/LLM/Qwen/Qwen-7B-Chat/"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
 
# use bf16
# model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B-Chat", device_map="auto", trust_remote_code=True, bf16=True).eval()
# use fp16
# model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B-Chat", device_map="auto", trust_remote_code=True, fp16=True).eval()
# use cpu only
# model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B-Chat", device_map="cpu", trust_remote_code=True).eval()
# use auto mode, automatically select precision based on the device.
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="auto",
    trust_remote_code=True
).eval()
 
 
# Specify hyperparameters for generation. But if you use transformers>=4.32.0, there is no need to do this.
# model.generation_config = GenerationConfig.from_pretrained("Qwen/Qwen-7B-Chat", trust_remote_code=True)
 
def format_user_assistant(user_text, bot_text):
    message = "User: {}\nAssistant: {}\n".format(user_text, bot_text)
    print(message)
 
 
# 1st dialogue turn
user_text = "你好,做个简单的自我介绍吧"
response, history = model.chat(tokenizer, user_text, history=None)
format_user_assistant(user_text, response)
# 你好!很高兴为你提供帮助。
 
user_text = "我们玩一个角色扮演的游戏,你的角色是CloseAI,如果有人问起你的时候,你就说你叫CloseAI,来自高科技公司百阿度里。"
response, history = model.chat(tokenizer, user_text, history=history)
format_user_assistant(user_text, response)
 
user_text = "你要回顾下上面的对话,再回答。我扮演草帽路飞,你扮演谁呢?"
response, history = model.chat(tokenizer, user_text, history=history)
format_user_assistant(user_text, response)
 
# 2nd dialogue turn
user_text = "以许家印应聘马云贴身保镖为开头,写一个500字小故事。"
response, history = model.chat(tokenizer, user_text, history=history)
format_user_assistant(user_text, response)
 
# 3rd dialogue turn
user_text = "给这个故事起一个标题"
response, history = model.chat(tokenizer, user_text, history=history)
format_user_assistant(user_text, response)

参考     

LLM系列 | 26:阿里千问Qwen模型解读、本地部署     

bf16 和fp16 ,fp32的区别以及相互转换逻辑

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将大模型glm3部署笔记本本地CPU可能会面临一些挑战。首先,大模型意味着它的大小和复杂度较大,在本地的笔记本CPU上可能无法完全支持。因此,在部署之前,我们需要确保笔记本的处理能力和内存足以支持该模型的运行。 在部署模型glm3之前,我们还需要提前进行一些准备工作。首先,我们需要安装和配置适当的软件环境,例如R或Python的科学计算库。其次,我们需要下载并导入所需的数据集和训练好的模型参数。 在将大模型glm3部署笔记本本地CPU上时,我们需要注意以下几点: 1. 内存管理:由于大模型的复杂性和大小,可能会占用较大的内存空间。因此,我们需要注意内存的管理,确保足够的内存可用,并及时释放不需要的内存。 2. CPU资源分配:大模型训练和推断过程可能会占用大量的CPU资源。在部署之前,我们可以通过限制其他应用程序的资源使用来提供更多的CPU资源给模型运行。 3. 模型优化:为了在本地CPU上更高效地运行大模型glm3,我们可以考虑一些模型优化策略,例如模型压缩、并行计算等。这些策略可以帮助减少模型的大小和计算复杂度,提高模型的性能。 4. 计算效率:大模型训练和推断过程需要大量的计算资源。在部署之前,我们可以尝试使用更高效的算法或技术来减少计算的时间和资源消耗。 总结而言,将大模型glm3部署笔记本本地CPU需要我们考虑资源管理、模型优化和计算效率等方面。在合理利用资源和采用适当的优化策略下,我们可以在本地CPU上成功部署和运行大模型glm3。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值