MPT-7B-8k 是一种解码器风格的 transformer 模型,它在 MPT-7B 的基础上进行预训练,将序列长度更新为 8k,并额外训练了 5000 亿个 token,因此文本和代码的训练总量达到了 1.5 万亿个 token。 此模型由 MosaicML 训练。
MPT-7B-8k 是 Mosaic 预训练 Transformer(MPT)模型家族的一员,该系列模型采用经过修改的 transformer 架构,旨在优化训练和推理效率。
这些架构上的改进包括性能优化的层实现,以及通过使用带线性偏置的注意力机制(ALiBi)替代位置嵌入,从而消除了上下文长度的限制。 得益于这些修改,MPT 模型能够以高吞吐量效率进行训练,并实现稳定收敛。 MPT 模型还可以通过标准的 HuggingFace 流水线和 NVIDIA 的 FasterTransformer 进行高效部署。
该模型使用 MosaicML LLM 代码库,该代码库可在 llm-foundry 仓库 中找到。它由 MosaicML 的 NLP 团队在 MosaicML 平台 上训练,用于 LLM 的预训练、微调及推理。
MPT-7B-8k 具有以下特点:
以下模型均在 MPT-7B-8k 的基础上进行了微调:
MPT-7B-8k-Instruct:一款适用于长文本指令遵循的模型(尤其擅长摘要和问答任务)。 通过在多个精心筛选的数据集上对 MPT-7B-8k 进行微调构建而成。
MPT-7B-8k-Chat:一款类聊天机器人模型,用于对话生成。 通过在约 15 亿 tokens 的聊天数据上对 MPT-7B-8k 进行微调构建而成。
2023 年 7 月 18 日
Apache-2.0
该模型最适合配合 MosaicML 的 llm-foundry 代码库 进行训练和微调。
import transformers
model = transformers.AutoModelForCausalLM.from_pretrained(
'mosaicml/mpt-7b-8k',
trust_remote_code=True
)注意:此模型要求将 trust_remote_code=True 传递给 from_pretrained 方法。
这是因为我们使用了自定义的 MPT 模型架构,该架构尚未集成到 Hugging Face 的 transformers 包中。
MPT 包含许多训练效率功能选项,例如 FlashAttention、ALiBi、QK LayerNorm 等。
要使用 FlashAttention 的优化 triton 实现,您可以在 GPU(cuda:0)上加载模型,并设置 attn_impl='triton' 和 bfloat16 精度:
import torch
import transformers
name = 'mosaicml/mpt-7b-8k'
config = transformers.AutoConfig.from_pretrained(name, trust_remote_code=True)
config.attn_config['attn_impl'] = 'triton'
config.init_device = 'cuda:0' # For fast initialization directly on GPU!
model = transformers.AutoModelForCausalLM.from_pretrained(
name,
config=config,
torch_dtype=torch.bfloat16, # Load model weights in bfloat16
trust_remote_code=True
)尽管该模型是在序列长度为 2048 的条件下进行训练的,但 ALiBi 允许用户在微调过程和/或推理阶段增加最大序列长度。例如:
import transformers
name = 'mosaicml/mpt-7b-8k'
config = transformers.AutoConfig.from_pretrained(name, trust_remote_code=True)
config.max_seq_len = 10000 # (input + output) tokens can now be up to 10000
model = transformers.AutoModelForCausalLM.from_pretrained(
name,
config=config,
trust_remote_code=True
)该模型使用 MPT-7B-8k tokenizer 进行训练,该 tokenizer 与 EleutherAI/gpt-neox-20b tokenizer 完全相同。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('mosaicml/mpt-7b-8k')例如,该模型可用于文本生成流水线中。
注意:在以较低精度运行 Torch 模块时,最佳实践是使用 torch.autocast context manager。
from transformers import pipeline
with torch.autocast('cuda', dtype=torch.bfloat16):
inputs = tokenizer('Here is a recipe for vegan banana bread:\n', return_tensors="pt").to('cuda')
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True))
# or using the HF pipeline
pipe = pipeline('text-generation', model=model, tokenizer=tokenizer, device='cuda:0')
with torch.autocast('cuda', dtype=torch.bfloat16):
print(
pipe('Here is a recipe for vegan banana bread:\n',
max_new_tokens=100,
do_sample=True,
use_cache=True))该架构是对标准仅解码器 transformer 的一种改进。
该模型在标准 transformer 的基础上进行了如下改进:
| 超参数 | 数值 |
|---|---|
| 参数数量 | 6.7B |
| 层数 | 32 |
| 头数 | 32 |
| 模型维度 | 4096 |
| 词汇表大小 | 50432 |
| 序列长度 | 2048 |
数据采用 MosaicML StreamingDataset 库进行格式化,将数据存储在对象存储中,并在训练期间高效地流式传输到计算集群。 StreamingDataset 无需在开始训练前下载整个数据集,并允许从数据集中的任意点即时恢复训练。
该模型共训练了 ___T 个 token。首先,在以下数据混合上训练了 1T 个 token(批大小为 1760,序列长度为 2048):
| 数据来源 | 来源中的 token 数量 | 占比 | 有效 token 数量 | 轮次 |
|---|---|---|---|---|
| mC4 3.1.0 - 英语 | 417.99 B | 0.33 | 330 B | 0.14 |
| C4 - 英语 - SemDedup 80% | 100.42 B | 0.299 | 299 B | 2.98 |
| RedPajama - CommonCrawl | 878.45 B | 0.1 | 100 B | 0.11 |
| The Stack - 精选语言 | 463.78 B | 0.1 | 100 B | 0.22 |
| RedPajama - Wikipedia - 英语 | 4.87 B | 0.04 | 40 B | 8.21 |
| The Stack - Markdown | 107.07 B | 0.035 | 35 B | 0.33 |
| S2ORC | 48.85 B | 0.033 | 33 B | 0.68 |
| RedPajama - 书籍 | 26.02 B | 0.03 | 30B | 1.15 |
| RedPajama - arXiv | 28.10 B | 0.019 | 19 B | 0.68 |
| RedPajama - StackExchange | 20.54 B | 0.014 | 14 B | 0.68 |
我们从长度超过 4096 token 的文档样本中提取了 80B token,并从符合“基线”长度分布的不同文档样本长度中提取了 120B token,总共构成一个包含 200B token 的单一数据集。 然后,我们以 8192 的最大序列长度对 MPT-7B 进行了 500B token 的训练,得到了 MPT-7B-8k。由于我们使用 200B token 训练了 500B token,几乎每个子集都恰好训练了 2.5 轮。
| 序列长度分布 | 来源中的 token 数量(十亿) | 占比 | 有效 token 数量(十亿) | 轮次 |
|---|---|---|---|---|
| mC4 3.1.0 - 英语(200+ 词)- 基线 | 33.60 | 16.80% | 84.00 | 2.50 |
| mC4 3.1.0 - 英语(200+ 词)- ≥4096 token | 23.04 | 11.52% | 57.60 | 2.50 |
| c4 - 英语 - SemDedup 80% - 基线 | 30.12 | 15.06% | 75.30 | 2.50 |
| c4 - 英语 - SemDedup 80% - ≥4096 token | 0.92 | 0.46% | 2.30 | 2.50 |
| RedPajama - CommonCrawl - 基线 | 8.52 | 4.26% | 21.30 | 2.50 |
| RedPajama - CommonCrawl - ≥4096 token | 12.80 | 6.40% | 32.00 | 2.50 |
| The Stack - 精选语言 - 基线 | 30.00 | 15.00% | 75.00 | 2.50 |
| The Stack - 精选语言 - ≥4096 token | 10.00 | 5.00% | 25.00 | 2.50 |
| RedPajama - Wikipedia - 基线 | 3.60 | 1.80% | 9.00 | 2.50 |
| RedPajama - Wikipedia - ≥4096 token | 1.04 | 0.52% | 2.60 | 2.50 |
| The Stack - Markdown - 基线 | 4.50 | 2.25% | 11.25 | 2.50 |
| The Stack - Markdown - ≥4096 token | 8.00 | 4.00% | 20.00 | 2.50 |
| Semantic Scholar ORC - 基线 | 3.30 | 1.65% | 8.25 | 2.50 |
| Semantic Scholar ORC - ≥4096 token | 8.00 | 4.00% | 20.00 | 2.50 |
| RedPajama - 书籍 - 基线 | 3.00 | 1.50% | 7.50 | 2.50 |
| RedPajama - 书籍 - ≥4096 token | 8.00 | 4.00% | 20.00 | 2.50 |
| RedPajama - arXiv - 基线 | 1.92 | 0.96% | 4.80 | 2.50 |
| RedPajama - arXiv - ≥4096 token | 5.40 | 2.70% | 13.50 | 2.50 |
| RedPajama - StackExchange - 基线 | 1.44 | 0.72% | 3.60 | 2.50 |
| RedPajama - StackExchange - ≥4096 token | 1.52 | 1.40% | 7.00 | 4.60 |
| 训练 token 总数 | 200 | 100.00% | 2.5 轮 * 2000 亿 = 5000 亿 token |
每个批次的样本是从上述数据集中按指定概率选择的。 每个数据集中的样本会被打乱,每个样本由该数据集中足够数量的序列组成,以填满 2048 的序列长度。
数据使用 EleutherAI/gpt-neox-20b 分词器进行分词。这种 BPE 分词器具有许多理想的特性, 其中大部分与代码分词相关: (1) 它是在包含代码的多样化数据混合(The Pile)上训练的 (2) 它应用一致的空格分隔,不像 GPT2 分词器那样会根据前缀空格的存在而进行不一致的分词 (3) 它包含重复空格字符的 token,这使得对具有大量重复空格字符的文本的压缩效果更好。
模型词汇表大小 50432 被设置为 128 的倍数(如 MEGATRON-LM 中所示),模型 FLOP 利用率(MFU)最多提高了四个百分点。
本模型在 MosaicML Platform 上使用 440 张 A100-40GB 显卡训练了约 9.5 天。 该模型采用分片数据并行技术,使用 FSDP 进行训练,并使用了 LION 优化器。
以下内容改编自 EleutherAI 的 GPT-NeoX-20B
MPT-7B-8k 不适合在未经微调的情况下直接部署。 若要将其用于面向人类的交互,必须添加进一步的安全防护措施并获得用户同意。
MPT-7B-8k 可能会产生与事实不符的输出,因此不应依赖它来提供准确的事实信息。 MPT-7B-8k 是在多种公开数据集上训练而成的。 尽管我们已尽最大努力清理预训练数据,但该模型仍有可能生成低俗、带有偏见或其他冒犯性的内容。
如果您有兴趣在 MosaicML 平台上训练和部署您自己的 MPT 或大型语言模型,请在此注册。
本模型的许可协议不构成法律建议。我们不对第三方使用本模型的行为负责。在将本模型用于商业目的前,请咨询律师。
请使用以下格式引用本模型:
@online{MosaicML2023Introducing,
author = {MosaicML NLP Team},
title = {Introducing MPT-7B: A New Standard for Open-Source,
ly Usable LLMs},
year = {2023},
url = {www.mosaicml.com/blog/mpt-7b},
note = {Accessed: 2023-03-28}, % change this date
urldate = {2023-03-28} % change this date
}