1. Llama 系列简介
1.1 Llama1
由 Meta AI 发布,包含 7B、13B、33B 和 65B 四种参数规模的开源基座语言模型
数据集: 模型训练数据集使用的都是开源的数据集,总共 1.4T token
模型结构: 原始的 Transformer 由编码器 (Encoder)和解码器 (Decoder)两个部分构成,同时 Encoder 和 Decoder 这两部分也可以单独使用,Llama是基于 Transformer Decoder 的架构,在此基础上做了以下改进:
(1)将 Layer-Norm 改成 RMSNorm(Root Mean square Layer Normalization),并将其从 output 层,移到 input 层
(2)采用 SwiGLU 激活函数
(3)采用 RoPE 旋转位置编码
**分词器:**采用 BPE 算法,使用 SentencePiece 实现,将所有数字拆分为单独的数字,并使用字节来分解未知的 UTF-8 字符,词表大小为 32k
**优化器:**采用 AdamW,是Adam的改进,可以有效地处理权重衰减,提供训练稳定性
**Learning Rate:**使用余弦学习率调整 cosine learning rate schedule,使得最终学习率等于最大学习率的10%,设置0.1的权重衰减和1.0的梯度裁剪,warmup 的步数为 2000,并根据模型的大小改变学习率和批处理大小
**模型效果:**Llama-13B (GPT-3 1/10大小) 在多数 benchmark 上超越 GPT-3 (175B),在规模较大的端,65B 参数模型也与最好的大型模型也具有竞争力
1.2 Llama2
由 Meta AI 发布,包含7B、13B、34B、70B 四种参数规模的基座语言模型,除了 34B 其他模型均以开源且免费可商用
数据集: 模型训练数据集使用的都是开源 的数据集,相比上一代的训练数据增加了 40%,达到了增至 2T token,训练数据中的文本来源也更加的多样化。Llama2 对应的微调模型是在超过 100 万条人工标注的数据下训练而成(但是Llama2 语料库仍以英文(89.7%)为主,而中文仅占据了其中的 0.13%,这导致 Llama2 很难完成流畅、有深度的中文对话)
模型结构:
(1)Llama2 与 Llama1 的主要结构基本一致
(2)Llama2 上下文长度由之前的 2048 升级到 4096,可以理解和生成更长的文本
(3)7B 和13B 使用与 Llama1 相同的架构,34B 和 70B 模型采用了分组查询注意力(GQA)
**优化器、Learning Rate、分词器:**与 Llama1 一致
**模型效果:**从模型评估上看,Llama2 在众多的基准测试中,如推理、编程、对话能力和知识测验上,都优于 Llama1 和现有的开源大模型。Llama2 70B在 MMLU 和 GSM8K 上接近 GPT-3.5(OpenAI,2023),但在编码基准方面存在显著差距
Llama2 相比Llama1 的升级:
(1)Llama2 训练数据相比 Llama1 多出40%,上下文长度是由之前的 2048 升级到 4096,模型理解能力得以提升可以生成更长的文本
(2)模型训练数据集使用的相比上一代的训练数据增加了 40%,并且更加注重安全&隐私问题
(3)发布了Llama2-Chat,是 Llama2 微调后的模型(在公开数据集上预训练以后引入SFT(有监督微调)、RLHF(人类反馈强化学习)+拒绝采样+近端策略优化 (PPO)两个优化算法)
Meta 试图证明小模型在足够多的的数据上训练后,效果也能达到甚至超过大模型
1.3 Llama3
Llama3 有基础版和 Instruct 两个版本,每个版本拥有8B、70B 和 405B 三个参数规模的模型
数据集: Llama3 的预训练数据集增加至 15T ,这些数据都是从公开来源收集的高质量数据集(依旧强调高质量的训练数据集至关重要),其中包括了 4 倍以上的代码 token 以及 30 种语言中 5% 的非英语 token(这意味着 Llama3 在代码能力以及逻辑推理能力的性能将大幅度提升)。微调数据包括公开可用的指令数据集,以及超过1000万个人工注释的示例。预训练和微调数据集均不包含元用户数据。(主要还是以英语为主,中文占比依旧很低)
通过开发一系列数据过滤流程:包括使用启发式筛选器、NSFW 筛选器、语义重复数据删除方法和文本分类器来预测数据质量,以及使用 Llama 2 为 Llama 3 提供支持的文本质量分类器生成训练数据。
模型结构: Llama 3 总体上与 Llama2 相比没有重大变化,在 Llama 2 中只有 34B、70B 使用了分组查询注意 (GQA),为了提高模型的推理效率,Llama3 所有模型都采用了 GQA
分词器: 与 Llama2 不同的是,Llama3 将 tokenizer 由 sentencepiece 换成tiktoken ,词汇量从 32K 增加到128K ,增加了4 倍。更大的词汇库能够更高效地编码文本,增加编码效率,可以实现更好的下游性能。不过这也会导致嵌入层的输入和输出矩阵尺寸增大,模型参数量也会增大。
序列长度: 输入上下文长度从 4096(Llama 2)和 2048(Llama 1)增加到8192,但相对于 GPT-4 的 128K 来说还是相当小
**模型效果:**在多项行业基准测试中展示了最先进的性能,从下表可以看出,Llama3 性能远远高于 Llama2,Llama3 8B 性能远高于 Llama2 70B,Llama3 70B模型在五项测评中有三项高于 GPT-4,Llama3 400B 模型更是全面碾压 GPT-4
|---------------|---------------|----------------|----------------|---------------|----------------|-----------------|-------------|-----------|
| BenchMark | Llama2 7B | Llama2 13B | Llama2 70B | Llama3 8B | Llama3 70B | Llama3 400B | GPT-3.5 | GPT-4 |
| MMLU | 34.1 | 47.8 | 52.9 | 68.4 | 82 | 86.1 | 70 | 86.4 |
| GPQA | 21.7 | 22.3 | 21.0 | 34.2 | 39.5 | 48 | 28.1 | 35.7 |
| HumanEval | 7.9 | 14.0 | 25.6 | 62.2 | 81.7 | 84.1 | 48.1 | 67 |
| GSM-8K | 25.7 | 77.4 | 57.5 | 79.6 | 93 | 94.1 | 57.1 | 92 |
| MATH | 3.8 | 6.7 | 11.6 | 30.0 | 50.4 | 57.8 | 34.1 | 52.9 |
缩放定律: 制定了一系列的缩放定律,通过小模型表现可以在大模型训练前**预测大模型的表现。**根据之前 Scaling Law 推算 8B 模型对应 200B Token(2000亿),但是 Meta 使用到了 15T Token(15万亿)训练,性能还可以提升。
从目前模型效果来看,Meta 使用的 Scaling Law 法则是非常有效的,Meta 得到了一个非常强大的模型,它非常小,易于使用和推理,而且 Meta 表示,即使这样,该模型似乎也没有在标准意义上"收敛",性能还能改善。这就意味着,一直以来我们使用的 LLM 训练是不足的,远远没有达到使模型收敛的点。较大的模型在训练计算较少的情况下可以与较小模型的性能相匹配,考虑到推理过程中使效率更高,还是会选择小模型。
为了训练最大的 Llama3 模型,Meta 结合了三种类型的并行化:数据并行化、模型并行化和管道并行化。最高效的实现是在 16K GPU 上同时训练时,每个 GPU 的计算利用率超过 400 TFLOPS。在两个定制的 24000 个 GPU 集群上训练,有效训练时间超过95%,比 Llama2 训练效率提高了 3 倍
|----------------|---------------|----------|--------------|
| 模型 | 训练(GPU小时) | GPU | 训练 Token |
| Llama1 65B | 1.0 M | A100 80G | 1.4 万亿 |
| Llama2 70B | 1.7 M | A100 80G | 2 万亿 |
| Llama3 70B | 7.7 M | H100 80G | 15 万亿 |
Llama2 微调后的模型为 Llama2-Chat,Llama3 微调后的模型为Llama3-Instruct,不光用在聊天上,也用在指令跟随
**指令微调:**为了在聊天用例中充分释放预训练模型的潜力,Meta 对指令调整方法进行了创新。训练方法结合了监督微调 (SFT)、拒绝采样(RS)、近端策略优化 (PPO) 和直接策略优化 (DPO) 的组合。这种组合训练,提高了模型在复杂推理任务中的表现。
2. Llama3 预训练模型推理
2.1 下载项目与模型
下载项目
git clone https://github.com/meta-llama/llama3.git
下载模型
官网下载
https://llama.meta.com/llama-downloads/
在官网填写信息后,申请下载权限,会发送一个URL到填写的邮箱内,像这样:
进入到项目目录,执行./download.sh:
按照要求输入邮件中的URL,以及需要下载的模型,可选 8B、8B-instruct、70B 和 70B-instruct,按需下载即可,下载中:
下载完成:
huggingface 下载【推荐】
https://huggingface.co/meta-llama/Meta-Llama-3-8B
可以直接点击下载按钮在网页下载,也可以点 Clone 进行命令行下载~
2.2 环境配置
bash
# 1.安装虚拟环境
conda create -n llama python=3.11
conda activate llama
# 2.安装依赖包
cd llama3
pip3 install -e .
2.3 模型推理
1. 模型并行值
- 8B模型的模型并行 (MP) 值为1
- 70B模型的模型并行 (MP) 值为8
在 Llama3 模型中,MP 值指的是并行化模型时使用的硬件单元数。一个 MP 值为 1 的 8B 模型可能意味着整个模型可以在单个计算设备上运行,而一个 MP 值为 8 的 70B 模型可能意味着模型被分成 8 部分,每部分在不同的计算设备上运行。
2. 序列长度和批处理大小
-
所有模型支持最多 8192 个 tokens 的序列长度
-
缓存是根据 max_seg_len 和 max batch_size 值预分配的,应根据你的硬件配置这些值
3. 基于 transformers 进行预训练模型推理
python
import transformers
import torch
pipeline transformers.pipeline(
task="text-generation",
model=""/root/models/Meta-Llama-3-8B-instruct"",
model_kwargs={"torch_dtype": torch. bfloat16},
device="cuda"
)
print(pipeline("Hey how are you doing today ?"))
4. 基于 vLLM 进行预训练模型推理
安装依赖:
python
pip3 install vllm
服务部署:
python
python3 -m vllm.entrypoints.openai.api_server --model /root/models/Meta-Llama-3-8B --dtype auto --api-key 123456
另起一个终端,进行服务测试:
python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="123456"
)
print("服务连接成功")
completion=client.completions.create(
model="/root/models/Meta-Llama-3-8B",
prompt="San Francisco is a",
max_tokens=128
)
print("### San Francisco is : ")
print("Completion result: ", completion)
测试结果: