英文

MPT-30B

这是MPT-30B,但是添加了peft的支持进行微调(使用qlora进行了测试)。它没有进行进一步的微调,权重与原始的MPT-30B相同。

我没有追踪整个huggingface的堆栈以确定它是否正常工作,但它确实可以使用qlora进行微调,输出是合理的。受到此处实现的启发 https://huggingface.co/cekal/mpt-7b-peft-compatible/commits/main https://huggingface.co/mosaicml/mpt-7b/discussions/42

以下是MosaicML团队对MPT-30B的原始描述:

MPT-30B是一种解码器风格的Transformer,是从头开始在1T个英文文本和代码标记上进行预训练的。这个模型是由 MosaicML 进行训练的。

MPT-30B是Mosaic预训练转换器(MPT)模型系列的一部分,它使用了优化的变压器架构,以实现高效的训练和推断。

MPT-30B具有与其他LLMs有所不同的特色,包括8k个标记的上下文窗口(可以通过微调进一步扩展;请参阅 MPT-7B-StoryWriter ),通过 ALiBi 支持上下文长度外推,以及通过FlashAttention实现高效推断+训练。由于其预训练混合,它还具有强大的编码功能。MPT模型还可以通过标准的HuggingFace pipeline和NVIDIA的 FasterTransformer 进行高效部署。MPT-30B的大小也是特意选择的,以便在单个GPU上轻松部署,可以使用1个A100-80GB(16位精度)或1个A100-40GB(8位精度)。

这个模型使用了MosaicML LLM代码库,该代码库可以在 llm-foundry repository 中找到。它由MosaicML的NLP团队在 MosaicML platform 上进行了LLM的预训练、微调和推断的训练。

这个模型有什么不同?

MPT-30B具有以下特点:

在MPT-30B基础上进行微调的模型:

以下模型是在MPT-30B上进行微调的:

模型日期

2023年6月22日

模型许可证

Apache-2.0

文档

如何使用

这个模型最好与MosaicML的 llm-foundry repository 一起使用进行训练和微调。

import transformers
model = transformers.AutoModelForCausalLM.from_pretrained(
  'mosaicml/mpt-30b',
  trust_remote_code=True
)

注意:此模型需要在from_pretrained方法中传递trust_remote_code=True。这是因为我们使用的自定义MPT模型架构尚未包含在Hugging Face transformers软件包中。MPT包括许多训练效率功能选项,例如 FlashAttention ALiBi QK LayerNorm 等。

要使用FlashAttention的优化版本,您可以使用attn_impl='triton'将模型加载到GPU(cuda:0)上,并使用bfloat16精度:

import torch
import transformers

name = 'mosaicml/mpt-30b'

config = transformers.AutoConfig.from_pretrained(name, trust_remote_code=True)
config.attn_config['attn_impl'] = 'triton'  # change this to use triton-based FlashAttention
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进行训练的,还进行了额外的预训练阶段,将序列长度适应到8192。然而,ALiBi使用户能够在微调和/或推断过程中进一步增加最大序列长度。例如:

import transformers

name = 'mosaicml/mpt-30b'

config = transformers.AutoConfig.from_pretrained(name, trust_remote_code=True)
config.max_seq_len = 16384 # (input + output) tokens can now be up to 16384

model = transformers.AutoModelForCausalLM.from_pretrained(
  name,
  config=config,
  trust_remote_code=True
)

这个模型是使用与 EleutherAI/gpt-neox-20b 分词器相同的MPT-30B分词器进行训练的。

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('mosaicml/mpt-30b')

然后,该模型可以在文本生成流水线中使用,例如:使用 torch.autocast context manager 在更低的精度下运行Torch模块是最佳实践。

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的修改版。

该模型从标准变压器中进行了以下修改:

Hyperparameter Value
n_parameters 29.95B
n_layers 48
n_heads 64
d_model 7168
vocab size 50432
sequence length 8192

训练数据

流式数据集

使用MosaicML的 StreamingDataset 库格式化数据,以在对象存储中托管数据,并在训练期间有效地将数据流式传输到计算集群。StreamingDataset使得在开始训练之前不需要下载整个数据集,并且可以从数据集中的任何点立即恢复训练。

数据组合

该模型使用以下数据组合进行了1T个标记的训练:

Data Source Number of Tokens in Source Proportion Effective Number of Tokens Epochs
mC4 3.1.0 - English (200+ words) 2417.99 B 33.50% 335 B 0.14
c4 - English - SemDedup 80% 100.42 B 29.90% 299 B 2.98
RedPajama - CommonCrawl 878.45 B 8.50% 85 B 0.097
The Stack - Selected Languages 463.78 B 10.00% 100 B 0.22
RedPajama - Wikipedia 4.87 B 4.00% 40 B 8.21
The Stack - Markdown 107.07 B 4.50% 45 B 0.42
Semantic Scholar ORC 48.95 B 3.30% 33 B 0.67
RedPajama - Books 26.02 B 3.00% 30 B 1.15
RedPajama - arXiv 28.10 B 1.90% 19 B 0.68
RedPajama - StackExchange 20.54 B 1.40% 14 B 0.68

每个批次的样本从上述数据集中的一个中选择,选择的概率如上所述。在每个数据集内进行洗牌,每个示例由来自该数据集的尽可能多的序列构成,以填充序列长度。为了将8k的支持高效地构建到MPT-30B中,我们首先使用长度为2k的序列进行了1T个标记的预训练,然后使用长度为8k的序列进行了额外的500B个标记的训练。

数据使用 EleutherAI/gpt-neox-20b 分词器进行分词。这个BPE分词器具有许多可取的特性,其中大部分与分词代码有关:(1)它是在包括代码的多样化数据混合上进行训练的(The Pile);(2)它应用一致的空格分隔,不像GPT2分词器那样,根据前缀空格的存在而分词不一致;(3)它包含用于重复空格字符的标记,这允许更好地压缩具有大量重复空格字符的文本。

模型的词汇大小设置为50432的倍数(与 MEGATRON-LM 相同)。

训练配置

该模型使用 MosaicML Platform 在三个阶段进行训练:(i)首先,在440个A100-40GB上进行训练,批量大小为1760;(ii)然后,在216个A100-40GB上进行训练,批量大小为1728;(iii)在256个H100-80GB上进行训练,批量大小为512,上下文长度为8k,标记数量为50B。该模型使用 FSDP 进行分片数据并行,并使用 LION 优化器进行训练。

限制和偏见

以下语言修改自 EleutherAI's GPT-NeoX-20B

MPT-30B(基础版)不适用于未经微调的部署。在没有进一步的保护措施和用户许可的情况下,不应将其用于面向人的交互。

MPT-30B可能会产生事实上不正确的输出,不应依赖它来产生事实准确的信息。MPT-30B是在各种公共数据集上进行训练的。尽管采取了极大的努力来清理预训练数据,但该模型可能会生成淫秽、有偏见或其他令人不悦的输出。

MosaicML平台

如果您有兴趣在MosaicML平台上根据自己的需求进行 training deploying MPT或LLMs的训练,请 sign up here

声明

该模型的许可证不构成法律建议。我们对使用此模型的第三方的行为不负责任。在商业用途上使用此模型之前,请咨询律师。

引用

请使用以下格式引用此模型:

@online{MosaicML2023Introducing,
    author    = {MosaicML NLP Team},
    title     = {Introducing MPT-30B: Raising the bar
for open-source foundation models},
    year      = {2023},
    url       = {www.mosaicml.com/blog/mpt-30b},
    note      = {Accessed: 2023-06-22},
    urldate   = {2023-06-22}
}