DBRX
概述
DBRX 是一款基于 Transformer 的解码器仅型大型语言模型 (LLM),其训练使用了下一个词元预测方法。它采用了一种 *细粒度* 的专家混合 (MoE) 架构,拥有 1320 亿个总参数,其中任何输入激活 360 亿个参数。它是在 12 万亿个文本和代码数据词元上进行预训练的。与其他开放的 MoE 模型(如 Mixtral-8x7B 和 Grok-1)相比,DBRX 具有细粒度,这意味着它使用了更多数量的较小专家。DBRX 拥有 16 个专家并选择 4 个,而 Mixtral-8x7B 和 Grok-1 拥有 8 个专家并选择 2 个。这提供了 65 倍更多可能的专家组合,我们发现这提高了模型质量。DBRX 使用旋转位置编码 (RoPE)、门控线性单元 (GLU) 和分组查询注意力 (GQA)。它是一个基于 BPE 的模型,并使用 GPT-4 分词器,如 tiktoken 存储库中所述。我们根据详尽的评估和扩展实验做出了这些选择。
DBRX 在精心策划的 12T 个 Token 的数据上进行了预训练,最大上下文长度为 32K 个 Token。我们估计,按每个 Token 算,这些数据至少比我们用于预训练 MPT 模型系列的数据好 2 倍。这个新的数据集是使用 Databricks 的完整工具套件开发的,包括用于数据处理的 Apache Spark™ 和 Databricks Notebook,以及用于数据管理和治理的 Unity Catalog。我们在预训练中使用了课程学习,在训练期间以我们发现能够大幅提高模型质量的方式改变数据组合。
有关 DBRX Instruct 和 DBRX Base 的更多详细信息,请参阅我们的技术博客文章。
该模型由eitan-turok 和abhi-db 贡献。原始代码可以在这里找到这里,但可能不是最新的。
使用示例
可以使用 generate()
方法使用 DBRX 生成文本。您可以使用标准注意力实现、flash-attention 和 PyTorch 标量点积注意力进行生成。最后两种注意力实现提高了速度。
from transformers import DbrxForCausalLM, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained("databricks/dbrx-instruct", token="YOUR_HF_TOKEN")
model = DbrxForCausalLM.from_pretrained(
"databricks/dbrx-instruct",
device_map="auto",
torch_dtype=torch.bfloat16,
token="YOUR_HF_TOKEN",
)
input_text = "What does it take to build a great LLM?"
messages = [{"role": "user", "content": input_text}]
input_ids = tokenizer.apply_chat_template(messages, return_dict=True, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids, max_new_tokens=200)
print(tokenizer.decode(outputs[0]))
如果您安装了 flash-attention(pip install flash-attn
),则可以更快地生成文本。(可以在这里找到 HuggingFace 的 flash-attention 文档。)
from transformers import DbrxForCausalLM, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained("databricks/dbrx-instruct", token="YOUR_HF_TOKEN")
model = DbrxForCausalLM.from_pretrained(
"databricks/dbrx-instruct",
device_map="auto",
torch_dtype=torch.bfloat16,
token="YOUR_HF_TOKEN",
attn_implementation="flash_attention_2",
)
input_text = "What does it take to build a great LLM?"
messages = [{"role": "user", "content": input_text}]
input_ids = tokenizer.apply_chat_template(messages, return_dict=True, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids, max_new_tokens=200)
print(tokenizer.decode(outputs[0]))
您还可以使用 PyTorch 标量点积注意力更快地生成文本。(可以在这里找到 HuggingFace 的标量点积注意力文档。)
from transformers import DbrxForCausalLM, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained("databricks/dbrx-instruct", token="YOUR_HF_TOKEN")
model = DbrxForCausalLM.from_pretrained(
"databricks/dbrx-instruct",
device_map="auto",
torch_dtype=torch.bfloat16,
token="YOUR_HF_TOKEN",
attn_implementation="sdpa",
)
input_text = "What does it take to build a great LLM?"
messages = [{"role": "user", "content": input_text}]
input_ids = tokenizer.apply_chat_template(messages, return_dict=True, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids, max_new_tokens=200)
print(tokenizer.decode(outputs[0]))
DbrxConfig
类 transformers.DbrxConfig
< 源代码 >( d_model: int = 2048 n_heads: int = 16 n_layers: int = 24 max_seq_len: int = 2048 vocab_size: int = 32000 resid_pdrop: float = 0.0 emb_pdrop: float = 0.0 attn_config: Optional = None ffn_config: Optional = None use_cache: bool = True initializer_range: float = 0.02 output_router_logits: bool = False **kwargs: Any )
参数
- d_model (
int
, 可选,默认为 2048) — 嵌入和隐藏状态的维度。 - n_heads (
int
, 可选,默认为 16) — Transformer 编码器中每个注意力层的注意力头的数量。 - n_layers (
int
, 可选,默认为 24) — Transformer 编码器中隐藏层的数量。 - max_seq_len (
int
, 可选,默认为 2048) — 模型的最大序列长度。 - vocab_size (
int
, 可选,默认为 32000) — Dbrx 模型的词汇量大小。定义了调用DbrxModel时可以由传递的inputs_ids
表示的不同 Token 的最大数量。 - resid_pdrop (
float
,可选,默认为 0.0) — 在与残差合并之前应用于注意力输出的 dropout 概率。 - emb_pdrop (
float
,可选,默认为 0.0) — 嵌入层的 dropout 概率。 - attn_config (
dict
,可选) — 用于配置模型注意力模块的字典。 - ffn_config (
dict
,可选) — 用于配置模型 FFN 模块的字典。 - use_cache (
bool
,可选,默认为True
) — 模型是否应该返回最后的键/值注意力(并非所有模型都使用)。 - initializer_range (
float
,可选,默认为 0.02) — 初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - output_router_logits (
bool
,可选,默认为False
) — 模型是否应该返回路由 logits。启用此选项还将允许模型输出辅助损失。有关更多详细信息,请参阅 此处。
这是用于存储 DbrxModel 配置的配置类。它用于根据指定的参数实例化 Dbrx 模型,定义模型架构。使用默认值实例化配置将产生与 databricks/dbrx-instruct 架构不同的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例
>>> from transformers import DbrxConfig, DbrxModel
>>> # Initializing a Dbrx configuration
>>> configuration = DbrxConfig(n_layers=2, d_model=256, n_heads=8, vocab_size=128)
>>> # Initializing a model (with random weights) from the configuration
>>> model = DbrxModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
DbrxModel
类 transformers.DbrxModel
< 源代码 >( config: DbrxConfig )
参数
- config (DbrxConfig) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
DbrxForCausalLM
类 transformers.DbrxForCausalLM
< 源代码 >( config: DbrxConfig )
参数
- config (DbrxConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
用于因果语言建模的 DBRX 模型转换器。此模型继承自 PreTrainedModel。查看超类文档以了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入的大小、修剪 head 等)。
此模型也是 PyTorch 的 torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与一般用法和行为相关的所有事项。
前向传播
< 源代码 > ( input_ids: 可选 = None attention_mask: 可选 = None position_ids: 可选 = None past_key_values: 可选 = None inputs_embeds: 可选 = None labels: 可选 = None use_cache: 可选 = None output_attentions: 可选 = None output_hidden_states: 可选 = None output_router_logits: 可选 = None return_dict: 可选 = None cache_position: 可选 = None num_logits_to_keep: int = 0 ) → transformers.modeling_outputs.MoeCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
参数
返回
transformers.modeling_outputs.MoeCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.MoeCausalLMOutputWithPast
或一个 torch.FloatTensor
元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含根据配置(DbrxConfig)和输入而变化的各种元素。
-
loss (
torch.FloatTensor
形状为(1,)
,可选,在提供labels
时返回) — 语言建模损失(用于下一个标记预测)。 -
logits (
torch.FloatTensor
形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模头的预测分数(SoftMax 之前每个词汇标记的分数)。 -
aux_loss (
torch.FloatTensor
,可选,在提供labels
时返回) — 稀疏模块的辅助损失。 -
router_logits (
tuple(torch.FloatTensor)
,可选,在传递output_router_probs=True
和config.add_router_probs=True
或当config.output_router_probs=True
时返回) —torch.FloatTensor
元组(每个层一个),形状为(batch_size, sequence_length, num_experts)
。由 MoE 路由器计算的原始路由器 logits(softmax 后),这些项用于计算专家混合模型的辅助损失。
-
past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,在传递use_cache=True
或当config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量。包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见
past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple(torch.FloatTensor)
,可选,在传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(一个用于嵌入的输出,如果模型具有嵌入层,以及每个层的输出),形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出处的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
该 DbrxForCausalLM 正向方法覆盖了 __call__
特殊方法。
虽然正向传递的配方需要在此函数中定义,但之后应该调用Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则静默地忽略它们。
因果语言建模的正向函数。
示例
>> from transformers import AutoTokenizer, DbrxForCausalLM
>> model = DbrxForCausalLM.from_pretrained("databricks/dbrx-instruct")
>> tokenizer = AutoTokenizer.from_pretrained("databricks/dbrx-instruct")
>> prompt = "Hey, are you conscious? Can you talk to me?"
>> inputs = tokenizer(prompt, return_tensors="pt")
>> # Generate
>> generate_ids = model.generate(inputs.input_ids, max_length=30)
>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
"Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."